aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--cgeo-calendar/res/values-fr/strings.xml2
-rw-r--r--cgeo-calendar/res/values-pt/strings.xml12
-rw-r--r--crowdin/README31
-rwxr-xr-xcrowdin/credentials.template5
-rwxr-xr-xcrowdin/download87
-rwxr-xr-xcrowdin/globals44
-rwxr-xr-xcrowdin/update29
-rwxr-xr-xcrowdin/upload39
-rw-r--r--main/build.xml27
-rw-r--r--main/compile-libs/findbugs-ant.jarbin0 -> 29442 bytes
-rw-r--r--main/lint.xml4
-rw-r--r--main/project/findbugs/exclusions.xml30
-rw-r--r--main/res/drawable-hdpi/marker_disabled_oc.pngbin2266 -> 2111 bytes
-rw-r--r--main/res/drawable-hdpi/marker_oc.pngbin2406 -> 2156 bytes
-rw-r--r--main/res/drawable-mdpi/marker_disabled_oc.pngbin2897 -> 1592 bytes
-rw-r--r--main/res/drawable-mdpi/marker_oc.pngbin2511 -> 1611 bytes
-rw-r--r--main/res/layout/about_activity.xml25
-rw-r--r--main/res/values-de/strings.xml6
-rw-r--r--main/res/values-fr/strings.xml90
-rw-r--r--main/res/values-pt/strings.xml2239
-rw-r--r--main/res/values/changelog_master.xml12
-rw-r--r--main/res/values/preference_keys.xml22
-rw-r--r--main/res/values/strings.xml13
-rw-r--r--main/res/xml/preferences.xml123
-rw-r--r--main/src/cgeo/geocaching/AboutActivity.java7
-rw-r--r--main/src/cgeo/geocaching/CacheDetailActivity.java4
-rw-r--r--main/src/cgeo/geocaching/Geocache.java181
-rw-r--r--main/src/cgeo/geocaching/ImageSelectActivity.java4
-rw-r--r--main/src/cgeo/geocaching/LogCacheActivity.java1
-rw-r--r--main/src/cgeo/geocaching/LogTrackableActivity.java7
-rw-r--r--main/src/cgeo/geocaching/MainActivity.java7
-rw-r--r--main/src/cgeo/geocaching/NavigateAnyPointActivity.java28
-rw-r--r--main/src/cgeo/geocaching/SearchActivity.java1
-rw-r--r--main/src/cgeo/geocaching/SelectMapfileActivity.java2
-rw-r--r--main/src/cgeo/geocaching/StaticMapsProvider.java10
-rw-r--r--main/src/cgeo/geocaching/StoredList.java10
-rw-r--r--main/src/cgeo/geocaching/TrackableActivity.java2
-rw-r--r--main/src/cgeo/geocaching/activity/AbstractActivity.java8
-rw-r--r--main/src/cgeo/geocaching/apps/cache/GccApp.java21
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java82
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/NavigonApp.java3
-rw-r--r--main/src/cgeo/geocaching/cgData.java36
-rw-r--r--main/src/cgeo/geocaching/cgeoapplication.java39
-rw-r--r--main/src/cgeo/geocaching/cgeocaches.java26
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCConstants.java2
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCMap.java17
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCParser.java12
-rw-r--r--main/src/cgeo/geocaching/connector/gc/IconDecoder.java24
-rw-r--r--main/src/cgeo/geocaching/connector/gc/Login.java24
-rw-r--r--main/src/cgeo/geocaching/connector/gc/Tile.java16
-rw-r--r--main/src/cgeo/geocaching/connector/oc/OkapiClient.java4
-rw-r--r--main/src/cgeo/geocaching/export/FieldnoteExport.java7
-rw-r--r--main/src/cgeo/geocaching/export/GpxExport.java27
-rw-r--r--main/src/cgeo/geocaching/export/GpxSerializer.java3
-rw-r--r--main/src/cgeo/geocaching/files/AbstractFileListActivity.java84
-rw-r--r--main/src/cgeo/geocaching/files/LocalStorage.java74
-rw-r--r--main/src/cgeo/geocaching/maps/CGeoMap.java54
-rw-r--r--main/src/cgeo/geocaching/maps/PositionHistory.java63
-rw-r--r--main/src/cgeo/geocaching/maps/PositionOverlay.java82
-rw-r--r--main/src/cgeo/geocaching/maps/google/GoogleMapView.java6
-rw-r--r--main/src/cgeo/geocaching/maps/google/GoogleOverlay.java2
-rw-r--r--main/src/cgeo/geocaching/maps/interfaces/OverlayImpl.java2
-rw-r--r--main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java6
-rw-r--r--main/src/cgeo/geocaching/maps/mapsforge/MapsforgeOverlay.java2
-rw-r--r--main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeMapView024.java6
-rw-r--r--main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeOverlay.java2
-rw-r--r--main/src/cgeo/geocaching/network/HtmlImage.java11
-rw-r--r--main/src/cgeo/geocaching/settings/EditPasswordPreference.java1
-rw-r--r--main/src/cgeo/geocaching/settings/Settings.java73
-rw-r--r--main/src/cgeo/geocaching/settings/SettingsActivity.java84
-rw-r--r--main/src/cgeo/geocaching/speech/SpeechService.java19
-rw-r--r--main/src/cgeo/geocaching/ui/CacheListAdapter.java6
-rw-r--r--main/src/cgeo/geocaching/ui/EditNoteDialog.java7
-rw-r--r--main/src/cgeo/geocaching/ui/Formatter.java4
-rw-r--r--main/src/cgeo/geocaching/ui/GPXListAdapter.java3
-rw-r--r--main/src/cgeo/geocaching/ui/dialog/CoordinatesInputDialog.java14
-rw-r--r--main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java115
-rw-r--r--main/src/cgeo/geocaching/utils/FileUtils.java64
-rw-r--r--main/src/cgeo/geocaching/utils/Log.java18
-rw-r--r--main/src/cgeo/geocaching/utils/MatcherWrapper.java4
-rw-r--r--main/src/cgeo/geocaching/utils/SimpleCancellableHandler.java8
-rw-r--r--main/src/cgeo/geocaching/utils/UncertainProperty.java48
-rw-r--r--send2cgeo/send2cgeo.user.js20
-rw-r--r--tests/src/cgeo/geocaching/GeocacheTest.java134
-rw-r--r--tests/src/cgeo/geocaching/cgDataTest.java37
-rw-r--r--tests/src/cgeo/geocaching/settings/TestSettings.java2
-rw-r--r--tests/src/cgeo/geocaching/sorting/NameComparatorTest.java25
-rw-r--r--tests/src/cgeo/geocaching/test/RegExPerformanceTest.java4
-rw-r--r--tests/src/cgeo/geocaching/test/RegExRealPerformanceTest.java4
90 files changed, 2746 insertions, 1798 deletions
diff --git a/.gitignore b/.gitignore
index 3bf3b22..20b6028 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,6 +12,7 @@ gen/
/tests/hs_err_pid*.log
/cgeo-calendar/local.properties
/cgeo-calendar/private.properties
+/crowdin/credentials
.directory
org.moreunit.prefs
annotation_gen/
diff --git a/cgeo-calendar/res/values-fr/strings.xml b/cgeo-calendar/res/values-fr/strings.xml
index 8e3af6a..3921f3c 100644
--- a/cgeo-calendar/res/values-fr/strings.xml
+++ b/cgeo-calendar/res/values-fr/strings.xml
@@ -4,5 +4,5 @@
<string name="app_name">c:geo - agenda (add-on)</string>
<string name="calendars">Calendriers</string>
<string name="event_success">Cache évènement ajoutée à l\'agenda</string>
- <string name="event_fail">Échec d\'ajout de la cache événement à l\'agenda</string>
+ <string name="event_fail">Échec de l\'ajout de la cache évènement à l\'agenda</string>
</resources>
diff --git a/cgeo-calendar/res/values-pt/strings.xml b/cgeo-calendar/res/values-pt/strings.xml
index d779612..1f18488 100644
--- a/cgeo-calendar/res/values-pt/strings.xml
+++ b/cgeo-calendar/res/values-pt/strings.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.net-->
<resources>
-
- <string name="calendars">Calendários</string>
- <string name="event_success">Cache evento adiconada ao calendário</string>
- <string name="event_fail">Falha ao adicionar a cache evento ao calendário</string>
-
-</resources> \ No newline at end of file
+ <string name="app_name">c:geo - calendário (complemento)</string>
+ <string name="calendars">Calendários</string>
+ <string name="event_success">Cache-evento adiconada ao calendário</string>
+ <string name="event_fail">Falha ao adicionar a cache-evento ao calendário</string>
+</resources>
diff --git a/crowdin/README b/crowdin/README
new file mode 100644
index 0000000..d963cbb
--- /dev/null
+++ b/crowdin/README
@@ -0,0 +1,31 @@
+INSTALLATION
+
+- create a NEW local repo from the github repo
+ -> the scripts automatically run git pull, git push, git commit
+ -> DON'T DO ANY WORK ON THIS REPO!! It will be pushed automatically!
+ -> this repo can be a copy (cp -a) from an existing one
+- copy crowdin/credentials.template to crowdin/credentials
+- edit crowdin/credentials
+ -> find the API-KEY here http://crowdin.net/project/cgeo/settings#project-settings-api
+- prepare crowdin:
+ - run update manually
+ - upload language files to crowdin (values-*/strings.xml) via upload script.
+ Maybe it is best to start with one language or two and upload more later.
+- create a cronjob to run crowdin/download every 60 mins or trigger it somehow
+- create a cronjob to run crowdin/update every 60 mins or trigger it somehow
+
+THE SCRIPTS
+
+Run all scripts from within a repo.
+
+- update: no arguments
+ -> this will upload the base language file values/strings.xml to crowdin
+
+- download: no arguments
+ -> this will download the language files from crowdin and create/update a
+ pull request if necessary
+
+- upload: languages as arguments. e.g. upload cs da de es fr hu it ja nb nl pl pt sk sl sv
+ -> this will upload translations from actual branch of the repo to crowdin.
+ crowdin files will be overwritten, not merged. To merge it is best to
+ download them first, merge, then upload.
diff --git a/crowdin/credentials.template b/crowdin/credentials.template
new file mode 100755
index 0000000..5886cd2
--- /dev/null
+++ b/crowdin/credentials.template
@@ -0,0 +1,5 @@
+# copy this file to the file "credentials" and insert the credentials
+CROWDIN_APIKEY=
+GITHUB_USER=
+GITHUB_PASSWORD=
+
diff --git a/crowdin/download b/crowdin/download
new file mode 100755
index 0000000..89483c5
--- /dev/null
+++ b/crowdin/download
@@ -0,0 +1,87 @@
+#!/bin/bash
+
+#
+#
+# This script downloads all translations from crowdin,
+# and make a pull request on github if necessary
+#
+#
+
+# see: http://crowdin.net/page/api/export
+# see: http://crowdin.net/page/api/download
+
+. "`dirname $0`/globals"
+
+BRANCH=crowdin_translations
+GITHUB_PR_TITLE="crowdin: New translations"
+PR_EXISTS=0
+DDATE=`date +"%Y-%m-%d %H:%M:%S"`
+ZIPFILE=all.zip
+
+finish () {
+ debug "cleaning up"
+ # revert everything until last commit
+ _do git branch | grep -q "\* ${BRANCH}" && ( _do git checkout . ; _do git reset ; )
+ _do git checkout master || exit 1
+ [[ -f ${ZIPFILE} ]] && _do rm "${ZIPFILE}"
+}
+
+# update master
+_do git pull upstream master || die "couldn't git pull upstream master."
+
+# check for existing PR
+_do curl -i --get "https://api.github.com/repos/cgeo/cgeo/pulls" -o "${OUT}" \
+ || die "listing pull requests failed."
+grep -q "Status: 200 OK" "${OUT}" || ( cat "${OUT}" ; die "reading list of pull requests failed." ; )
+grep -qF "${GITHUB_PR_TITLE}" "${OUT}" && PR_EXISTS=1
+
+if [ $PR_EXISTS -eq 0 ]; then
+ debug "We don't have an open Pull Request on github."
+ # remove branch if exists
+ _do git checkout master || die "Couldn't git checkout master."
+ _do git branch -D "${BRANCH}"
+else
+ debug "We have an open Pull Request on github."
+fi
+
+# prepare branch
+if git branch | grep -q "${BRANCH}"; then
+ :
+else
+ _do git branch "${BRANCH}" || die "Couldn't create branch."
+fi
+_do git checkout "${BRANCH}" || die "Couldn't switch to branch."
+
+# package the language files (allowed every 30 min)
+debug "packaging language files."
+crowdin_surf "http://api.crowdin.net/api/project/cgeo/export?key=${CROWDIN_APIKEY}"
+
+# download and unpack translations
+[[ -f ${ZIPFILE} ]] && rm ${ZIPFILE}
+_do wget "http://api.crowdin.net/api/project/cgeo/download/all.zip?key=${CROWDIN_APIKEY}" -O ${ZIPFILE} \
+ || die "crowdin download failed."
+_do unzip -o ${ZIPFILE} || die "unzip of ${ZIPFILE} failed."
+
+# check for changes
+if [ -z "`git diff`" ]; then
+ debug "no changes, finishing."
+ finish
+ exit
+fi
+
+# upload changes to github
+AMEND=""
+[[ ! -z "`git log master..${BRANCH}`" ]] && AMEND="--amend"
+_do git commit -a "${AMEND}" -m \"${GITHUB_PR_TITLE}\" || die "commit failed."
+_do git push -f origin "${BRANCH}" || die "git push failed."
+
+# create pull request
+if [ $PR_EXISTS -eq 0 ]; then
+ _do curl -i -u "${GITHUB_USER}:${GITHUB_PASSWORD}" -d \'{\"title\":\"${GITHUB_PR_TITLE}\",\"body\":\"downloaded ${DDATE}\",\"head\":\"${GITHUB_USER}:${BRANCH}\",\"base\":\"master\"}\' "https://api.github.com/repos/cgeo/cgeo/pulls" -o "${OUT}" || die "creating the pull request failed."
+ grep -q "201 Created" "${OUT}" || die "pull request not created."
+fi
+
+# clean up
+# [[ -f "${OUT}" ]] && rm "${OUT}"
+finish
+
diff --git a/crowdin/globals b/crowdin/globals
new file mode 100755
index 0000000..0efd147
--- /dev/null
+++ b/crowdin/globals
@@ -0,0 +1,44 @@
+#!/bin/bash
+
+. "`dirname $0`/credentials"
+
+OUT=/tmp/crowdin.`basename $0`.`date +%Y-%m-%d.%H:%M:%S`.out
+
+crowdin_surf () {
+ _do curl -o "${OUT}" $@ || die "curl produced an error."
+ grep -q "error" "${OUT}" && (cat "${OUT}" ; die "crowdin access failed." ; )
+ debug "crowdin answer"
+ cat "${OUT}"
+}
+
+require_tools () {
+ # code taken from backup2l
+ local NOT_AVAIL=""
+ for TOOL in $@; do
+ if [ "`which $TOOL 2> /dev/null`" == "" ]; then NOT_AVAIL="$NOT_AVAIL $TOOL"; fi
+ done
+ if [[ "$NOT_AVAIL" != "" ]]; then
+ die "The following required tool(s) cannot be found: $NOT_AVAIL"
+ fi
+}
+
+map_to_crowdin_code () {
+ CODE=$1
+ [[ "$CODE" == "es" ]] && CODE="es-ES"
+ [[ "$CODE" == "sv" ]] && CODE="sv-SE"
+ [[ "$CODE" == "pt" ]] && CODE="pt-PT"
+ echo "$CODE"
+}
+
+finish () { : ; }
+die () { for i; do debug "$i"; done; finish; exit 1; }
+debug () { echo "`date +%Y-%m-%d.%H:%M:%S` `basename $0`: $@"; }
+
+# use this function for executing commands.
+_do () { debug "$@"; eval "$@"; }
+
+require_tools git curl wget unzip
+
+git rev-parse --show-toplevel >& /dev/null || die "Please start this script from within a repo. Aborting."
+cd "`git rev-parse --show-toplevel`"
+
diff --git a/crowdin/update b/crowdin/update
new file mode 100755
index 0000000..0546f97
--- /dev/null
+++ b/crowdin/update
@@ -0,0 +1,29 @@
+#/bin/sh
+
+#
+#
+# This script updates
+# main/res/values/strings.xml
+# and
+# cgeo-calendar/res/values/strings.xml
+# in crowdin by uploading the files from master to crowdin.
+#
+#
+
+# see: http://crowdin.net/page/api/update-file
+
+# update_file uploads the file in parameter 1 to the crowdin file name in parameter 2
+update_file() {
+ crowdin_surf -F "files[$2]=@$1" \
+ "http://api.crowdin.net/api/project/cgeo/update-file?key=${CROWDIN_APIKEY}"
+}
+
+. "`dirname $0`/globals"
+
+echo You must be on an up-to-date master branch to execute this script.
+echo You have 5 seconds to abort with ctrl-c if this is not the case.
+sleep 5
+
+update_file main/res/values/strings.xml /cgeo/strings.xml
+update_file cgeo-calendar/res/values/strings.xml /cgeo-calendar/strings.xml
+
diff --git a/crowdin/upload b/crowdin/upload
new file mode 100755
index 0000000..43343ef
--- /dev/null
+++ b/crowdin/upload
@@ -0,0 +1,39 @@
+#/bin/sh
+
+#
+#
+# This script uploads
+# main/res/values-xx/strings.xml
+# and
+# cgeo-calendar/res/values-xx/strings.xml
+# in crowdin by uploading the files from the current branch to crowdin.
+#
+#
+
+# see:
+
+# upload_file uploads the file in parameter 1 to the crowdin file name in parameter 2
+upload_file() {
+ if [ -f "$2" ]; then
+ CROWDIN_LANG=`map_to_crowdin_code "$1"`
+ crowdin_surf \
+ -F \"files[$3]=@$2\" \
+ -F \"language=$CROWDIN_LANG\" \
+ -F \"import_eq_suggestions=1\" \
+ \"http://api.crowdin.net/api/project/cgeo/upload-translation?key=${CROWDIN_APIKEY}\"
+ else
+ debug "$2 not found."
+ fi
+}
+
+. "`dirname $0`/globals"
+
+if [ $# -eq 0 ]; then
+ debug "no languages passed - aborting."
+fi
+
+for i in $@; do
+ upload_file $i main/res/values-$i/strings.xml /cgeo/strings.xml
+ upload_file $i cgeo-calendar/res/values-$i/strings.xml /cgeo-calendar/strings.xml
+done
+
diff --git a/main/build.xml b/main/build.xml
index b6f5170..40be059 100644
--- a/main/build.xml
+++ b/main/build.xml
@@ -61,7 +61,32 @@
description="Changes API key to debug">
</target>
- <!-- extension targets. Uncomment the ones where you want to do custom work
+ <taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask">
+ <classpath>
+ <pathelement location="./compile-libs/findbugs-ant.jar"/>
+ </classpath>
+ </taskdef>
+
+ <target name="findbugs">
+ <mkdir dir="reports" />
+ <gettarget
+ androidJarFileOut="project.target.android.jar"
+ androidAidlFileOut="project.target.framework.aidl"
+ bootClassPathOut="project.target.class.path"
+ targetApiOut="project.target.apilevel"
+ minSdkVersionOut="project.minSdkVersion" />
+ <findbugs
+ home="${findbugs.home}"
+ output="xml"
+ outputFile="reports/findbugs.xml"
+ excludefilter="project/findbugs/exclusions.xml"
+ effort="max">
+ <auxClasspath path="${project.target.android.jar}" />
+ <class location="${out.dir}" />
+ </findbugs>
+ </target>
+
+ <!-- extension targets. Uncomment the ones where you want to do custom work
in between standard targets -->
<target name="-pre-build">
<condition property="build.mode.release" else="false">
diff --git a/main/compile-libs/findbugs-ant.jar b/main/compile-libs/findbugs-ant.jar
new file mode 100644
index 0000000..269f1a5
--- /dev/null
+++ b/main/compile-libs/findbugs-ant.jar
Binary files differ
diff --git a/main/lint.xml b/main/lint.xml
index b165280..c3e66b2 100644
--- a/main/lint.xml
+++ b/main/lint.xml
@@ -5,4 +5,8 @@
<issue id="InvalidPackage" severity="ignore" />
<issue id="MissingTranslation" severity="ignore" />
<issue id="Registered" severity="ignore" />
+ <issue id="UnusedResources">
+ <ignore path="res/drawable-mdpi/attribute_maintenance.png" />
+ <ignore path="res/values/vpi__colors.xml" />
+ </issue>
</lint> \ No newline at end of file
diff --git a/main/project/findbugs/exclusions.xml b/main/project/findbugs/exclusions.xml
new file mode 100644
index 0000000..e7dc744
--- /dev/null
+++ b/main/project/findbugs/exclusions.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<FindBugsFilter>
+ <!-- generated Android resources -->
+ <Match>
+ <Class name="~.*\.R\$.*"/>
+ </Match>
+
+ <!-- third party code -->
+ <Match>
+ <Not>
+ <Class name="~.*cgeo.*"/>
+ </Not>
+ </Match>
+ <Match>
+ <Class name="~.*kxml.*"/>
+ </Match>
+
+ <!-- irrelevant findings -->
+ <Match>
+ <Bug pattern="SE_COMPARATOR_SHOULD_BE_SERIALIZABLE" />
+ </Match>
+ <Match>
+ <Bug pattern="DM_STRING_CTOR" />
+ <Or>
+ <Class name="~.*MatcherWrapper"></Class>
+ <Class name="~.*TextUtils"></Class>
+ </Or>
+ </Match>
+
+</FindBugsFilter> \ No newline at end of file
diff --git a/main/res/drawable-hdpi/marker_disabled_oc.png b/main/res/drawable-hdpi/marker_disabled_oc.png
index b759bbf..337473f 100644
--- a/main/res/drawable-hdpi/marker_disabled_oc.png
+++ b/main/res/drawable-hdpi/marker_disabled_oc.png
Binary files differ
diff --git a/main/res/drawable-hdpi/marker_oc.png b/main/res/drawable-hdpi/marker_oc.png
index 96f2987..9258737 100644
--- a/main/res/drawable-hdpi/marker_oc.png
+++ b/main/res/drawable-hdpi/marker_oc.png
Binary files differ
diff --git a/main/res/drawable-mdpi/marker_disabled_oc.png b/main/res/drawable-mdpi/marker_disabled_oc.png
index 36f2d5b..de22acd 100644
--- a/main/res/drawable-mdpi/marker_disabled_oc.png
+++ b/main/res/drawable-mdpi/marker_disabled_oc.png
Binary files differ
diff --git a/main/res/drawable-mdpi/marker_oc.png b/main/res/drawable-mdpi/marker_oc.png
index 03e1fe7..7505b8c 100644
--- a/main/res/drawable-mdpi/marker_oc.png
+++ b/main/res/drawable-mdpi/marker_oc.png
Binary files differ
diff --git a/main/res/layout/about_activity.xml b/main/res/layout/about_activity.xml
index 6925c63..542b2fd 100644
--- a/main/res/layout/about_activity.xml
+++ b/main/res/layout/about_activity.xml
@@ -264,6 +264,31 @@
android:textColor="?text_color"
android:textColorLink="?text_color_link"
android:textSize="14sp" />
+
+ <RelativeLayout style="@style/separator_horizontal_layout" >
+
+ <View style="@style/separator_horizontal" />
+
+ <TextView
+ style="@style/separator_horizontal_headline"
+ android:text="@string/about_license" />
+ </RelativeLayout>
+
+ <TextView
+ android:id="@+id/license"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="left"
+ android:layout_marginBottom="5dip"
+ android:layout_marginLeft="10dip"
+ android:layout_marginRight="10dip"
+ android:clickable="true"
+ android:focusable="true"
+ android:linksClickable="false"
+ android:text="@string/about_apache_license"
+ android:textColor="?text_color"
+ android:textColorLink="?text_color_link"
+ android:textSize="14sp" />
</LinearLayout>
</ScrollView>
diff --git a/main/res/values-de/strings.xml b/main/res/values-de/strings.xml
index 746576f..eb40c92 100644
--- a/main/res/values-de/strings.xml
+++ b/main/res/values-de/strings.xml
@@ -373,6 +373,7 @@
<string name="settings_title_basicmembers">Basic Member</string>
<string name="settings_title_navigation">Navigation</string>
<string name="settings_title_system">System</string>
+ <string name="settings_title_navigation_menu">Navigationsmenü</string>
<string name="settings_category_browser">Browser</string>
<string name="settings_category_logging_other">Andere Log-Optionen</string>
@@ -381,7 +382,7 @@
<string name="settings_title_gc">Geocaching.com</string>
<string name="settings_activate_gc">Aktivieren</string>
- <string name="settings_gc_legal_note">Um die Dienste von geocaching.com nutzen zu können, müssen die Groundspeak-Nutzungsbedingungen (englisch) akzeptiert werden.</string>
+ <string name="settings_gc_legal_note">Mit Benutzung der Dienste von geocaching.com werden die Groundspeak-Nutzungsbedingungen (englisch) akzeptiert.</string>
<string name="settings_info_facebook_login_title">Facebook-Login</string>
<string name="settings_info_facebook_login">c:geo kann sich zwar nicht per Facebook bei Geocaching.com einloggen, aber es gibt eine einfache Abhilfe …</string>
<string name="init_oc">Opencaching.de</string>
@@ -483,6 +484,7 @@
<string name="init_default_navigation_tool_description">Hier kann das bevorzugte Navigationswerkzeug festgelegt werden.</string>
<string name="init_default_navigation_tool_select">Wähle Werkzeug</string>
<string name="init_default_navigation_tool_2_description">Hier kann das zweite bevorzugte Navigationswerkzeug festgelegt werden. Es ist durch langen Klick auf das Navigationssymbol in der Titelzeile eines Caches erreichbar.</string>
+ <string name="init_navigation_menu_description">Hier kann ausgewählt werden, welche der verfügbaren Navigationswerkzeuge im Navigationsmenü für einen Cache oder Wegpunkt angezeigt werden. Nicht auswählbare Optionen sind auf diesem Gerät nicht installiert.</string>
<string name="init_debug_title">Fehlersuche</string>
<string name="init_debug_note">c:geo kann bei Bedarf viele Debuginformationen speichern. Im Normalfall ist dies nicht notwendig, jedoch kann es den Entwicklern bei der Fehlersuche helfen. In diesem Fall wird der Benutzer gebeten diese Einstellung zu aktivieren und später das Log-File zuzusenden.</string>
<string name="init_debug">Debug-Log aktivieren</string>
@@ -788,6 +790,8 @@
<string name="map_trail_hide">Spur ausblenden</string>
<string name="map_circles_show">Kreise anzeigen</string>
<string name="map_circles_hide">Kreise verbergen</string>
+ <string name="map_mycaches_show">Eigene/Gefundene anzeigen</string>
+ <string name="map_mycaches_hide">Eigene/Gefundene verbergen</string>
<string name="map_theme_builtin">Standard</string>
<string name="map_theme_select">Kartendarstellung wählen</string>
<string name="map_live_enable">Aktualisierung einschalten</string>
diff --git a/main/res/values-fr/strings.xml b/main/res/values-fr/strings.xml
index e18170d..3e19c39 100644
--- a/main/res/values-fr/strings.xml
+++ b/main/res/values-fr/strings.xml
@@ -5,12 +5,12 @@
<string name="cache">Cache</string>
<string name="detail">Détails</string>
<string name="search">Rechercher</string>
- <string name="settings_titlebar">c:geo Paramètres</string>
<string name="helpers">Aide à l\'installation</string>
<string name="about">À propos de c:geo</string>
<string name="latitude">Latitude</string>
<string name="longitude">Longitude</string>
<string name="action_bar_share_title">Partager le lien vers la cache</string>
+ <string name="settings_titlebar">Paramètres c:geo</string>
<string name="all_types">Tous les genres</string>
<string name="traditional">Traditionnelles</string>
<string name="multi">Multiples</string>
@@ -26,7 +26,7 @@
<string name="lostfound">Perdues &amp; trouvées</string>
<string name="ape">Project ape cache</string>
<string name="gchq">Groundspeak hq</string>
- <string name="gps">GPS adventures exhibit</string>
+ <string name="gps">GPS cache exhibit</string>
<string name="block">Fête locale Groundspeak</string>
<string name="unknown">Type inconnu</string>
<string name="cache_size_micro">micro</string>
@@ -115,6 +115,8 @@
<string name="log_image_caption">Légende</string>
<string name="log_image_description">Description</string>
<string name="log_image_scale">Mise à l\'échelle</string>
+ <string name="log_password_title">Mot de passe du carnet :</string>
+ <string name="log_hint_log_password">Entrez votre mot de passe pour le carnet</string>
<string name="translate_to_sys_lang">Traduire en %s</string>
<string name="translate_to_english">Traduire en anglais</string>
<string name="translate_length_warning">La traduction d\'un texte trop long peut échouer.</string>
@@ -286,6 +288,7 @@
<string name="caches_filter_clear">effacer les filtres</string>
<string name="caches_filter_modified">Avec les coordonnées modifiées</string>
<string name="caches_filter_origin">Avec les coordonées originales</string>
+ <string name="caches_filter_distance">Distance</string>
<string name="caches_removing_from_history">Effacer de l\'historique…</string>
<string name="caches_clear_offlinelogs">Effacer les entrées de carnet hors-ligne</string>
<string name="caches_clear_offlinelogs_progress">Effacement des entrées de carnet hors-ligne</string>
@@ -316,11 +319,35 @@
<string name="about_detail">Détails</string>
<string name="about_donation_more">Don\ndéveloppement</string>
<string name="about_contributors">Contributeurs</string>
+ <string name="settings_title_services">Services</string>
+ <string name="settings_title_appearance">Apparence</string>
+ <string name="settings_title_cachedetails">Détails de la cache</string>
+ <string name="settings_title_offlinedata">Données hors-ligne</string>
+ <string name="settings_title_logging">Carnet</string>
+ <string name="settings_title_map">Carte</string>
+ <string name="settings_title_map_data">Données cartographiques</string>
+ <string name="settings_title_map_content">Contenu de la carte</string>
+ <string name="settings_title_gpx">GPX</string>
+ <string name="settings_title_basicmembers">Membres de base</string>
+ <string name="settings_title_navigation">Navigation</string>
+ <string name="settings_title_system">Système</string>
+ <string name="settings_title_navigation_menu">Menu de navigation</string>
+ <string name="settings_category_browser">Navigateur</string>
+ <string name="settings_category_logging_other">Options de carnets supplémentaires</string>
+ <string name="settings_goto_url_button">plus…</string>
+ <string name="settings_title_gc">Geocaching.com</string>
+ <string name="settings_activate_gc">Activer</string>
+ <string name="settings_gc_legal_note">En utilisant les services de geocaching.com, vous acceptez les conditions d\'utilisation de Groundspeak.</string>
+ <string name="settings_info_facebook_login_title">Connexion Facebook</string>
+ <string name="settings_info_facebook_login">Vous ne pouvez pas faire que c:geo se connecte à geocaching.com avec votre compte Facebook. Mais il existe une solution simple…</string>
<string name="init_oc">opencaching.de</string>
+ <string name="settings_activate_oc">Activer</string>
<string name="init_oc_de_description">Autoriser c:geo à utiliser opencaching.de pour chercher des caches et accéder/filtrer vos caches trouvées.</string>
<string name="init_register_oc_de">Autoriser c:geo</string>
+ <string name="init_reregister_oc_de">Ré-autoriser c:geo</string>
<string name="init_gcvote">GCvote.com</string>
<string name="init_twitter">Twitter</string>
+ <string name="settings_activate_twitter">Activer</string>
<string name="init_username">Identifiant</string>
<string name="init_password">Mot de passe</string>
<string name="init_login">Vérification de l\'identifiant</string>
@@ -329,7 +356,9 @@
<string name="init_login_popup_ok">Identifiants OK</string>
<string name="init_login_popup_failed">Erreur de connexion</string>
<string name="init_login_popup_failed_reason">Erreur de connexion: </string>
+ <string name="init_login_popup_not_authorized">Non autorisé</string>
<string name="init_twitter_authorize">Autorisation de c:geo</string>
+ <string name="init_twitter_reauthorize">Ré-autoriser c:geo</string>
<string name="init_signature">Signature</string>
<string name="init_signature_help_text">Écrivez votre propre signature pour vos visites.\nLes codes spéciaux supportés sont : [DATE] , [TIME], [DATETIME], [USER] &amp; [NUMBER].\nAu moment de l\'insertion de la signature, ces codes seront remplacés par la valeur correspondante.</string>
<string name="init_signature_template_button">Insérer un modèle</string>
@@ -340,41 +369,41 @@
<string name="init_signature_template_number">Nombre</string>
<string name="init_signature_template_owner">Propriétaire</string>
<string name="init_ratingwanted">Charger la note depuis GCvote.com</string>
- <string name="init_summary_ratingwanted">Charger la note depuis GCvote.com</string>
+ <string name="init_summary_ratingwanted">Charger la note depuis GCvote.com</string>
<string name="init_friendlogswanted">Charger le carnet (amis)</string>
- <string name="init_summary_friendlogswanted">Charger le carnet (amis)</string>
+ <string name="init_summary_friendlogswanted">Charger le carnet (amis)</string>
<string name="init_openlastdetailspage">Réouvrir les détails à la dernière page ouverte</string>
- <string name="init_summary_openlastdetailspage">Réouvrir les détails à la dernière page ouverte</string>
+ <string name="init_summary_openlastdetailspage">Réouvrir les détails à la dernière page ouverte</string>
<string name="init_autoload">Afficher automatiquement les descriptions longues</string>
- <string name="init_summary_autoload">Afficher automatiquement les descriptions longues</string>
+ <string name="init_summary_autoload">Afficher automatiquement les descriptions longues</string>
<string name="init_skin">Fond clair (nécessite le redémarrage de c:geo)</string>
- <string name="init_summary_skin">Fond clair (nécessite le redémarrage de c:geo)</string>
+ <string name="init_summary_skin">Fond clair (nécessite le redémarrage de c:geo)</string>
<string name="init_address">Afficher l\'adresse sur l\'accueil</string>
- <string name="init_summary_address">Afficher l\'adresse sur l\'accueil</string>
+ <string name="init_summary_address">Afficher l\'adresse sur l\'accueil</string>
<string name="init_captcha">Afficher le CAPTCHA si nécessaire</string>
- <string name="init_summary_captcha">Afficher le CAPTCHA si nécessaire</string>
+ <string name="init_summary_captcha">Afficher le CAPTCHA si nécessaire</string>
<string name="init_useenglish">Utiliser l\'anglais dans c:geo\n(redémarrage nécessaire)</string>
- <string name="init_summary_useenglish">Utiliser l\'anglais dans c:geo\n(redémarrage nécessaire)</string>
+ <string name="init_summary_useenglish">Utiliser l\'anglais dans c:geo\n(redémarrage nécessaire)</string>
<string name="init_exclude">Exclure mes caches et les caches trouvées</string>
- <string name="init_summary_exclude">Exclure mes caches et les caches trouvées</string>
+ <string name="init_summary_exclude">Exclure mes caches et les caches trouvées</string>
<string name="init_showwaypoints">Points intermédiaires</string>
<string name="init_showwaypoint_description">Nombre de caches en-dessous duquel les points intermédiaires sont affichés sur la carte.</string>
<string name="init_disabled">Exclure les caches désactivées</string>
- <string name="init_summary_disabled">Exclure les caches désactivées</string>
+ <string name="init_summary_disabled">Exclure les caches désactivées</string>
<string name="init_offline">Enregistrer les cartes pour une utilisation hors ligne</string>
- <string name="init_summary_offline">Enregistrer les cartes pour une utilisation hors ligne</string>
+ <string name="init_summary_offline">Enregistrer les cartes pour une utilisation hors ligne</string>
<string name="init_offline_wp">Enregistrer les cartes autour des points intermédiaires pour une utilisation hors ligne</string>
- <string name="init_summary_offline_wp">Enregistrer les cartes autour des points intermédiaires pour une utilisation hors ligne</string>
+ <string name="init_summary_offline_wp">Enregistrer les cartes autour des points intermédiaires pour une utilisation hors ligne</string>
<string name="init_save_log_img">Sauver les images des visites</string>
- <string name="init_summary_save_log_img">Sauver les images des visites</string>
+ <string name="init_summary_save_log_img">Sauver les images des visites</string>
<string name="init_units">Utiliser des unités de distance impériales</string>
- <string name="init_summary_units">Utiliser des unités de distance impériales</string>
+ <string name="init_summary_units">Utiliser des unités de distance impériales</string>
<string name="init_log_offline">Toujours utiliser le mode hors-ligne, même si connecté.</string>
- <string name="init_summary_log_offline">Toujours utiliser le mode hors-ligne, même si connecté.</string>
+ <string name="init_summary_log_offline">Toujours utiliser le mode hors-ligne, même si connecté.</string>
<string name="init_choose_list">Demander dans quelle liste sauver les caches.</string>
- <string name="init_summary_choose_list">Demander dans quelle liste sauver les caches.</string>
+ <string name="init_summary_choose_list">Demander dans quelle liste sauver les caches.</string>
<string name="init_livelist">Afficher la direction des caches dans les listes</string>
- <string name="init_summary_livelist">Afficher la direction des caches dans les listes</string>
+ <string name="init_summary_livelist">Afficher la direction des caches dans les listes</string>
<string name="init_backup">Sauvegarde</string>
<string name="init_backup_backup">Sauvegarde</string>
<string name="init_backup_running">Création de la copie de sauvegarde…</string>
@@ -389,24 +418,30 @@
<string name="init_restore_confirm">La base de données est vide. Voulez-vous restaurer la copie de sauvegarde ?</string>
<string name="init_backup_last">Sauvegarde disponible depuis</string>
<string name="init_backup_last_no">Il n\'y a pas de fichier avec une sauvegarde.</string>
+ <string name="settings_info_offline_maps_title">Informations sur les cartes hors-ligne</string>
+ <string name="settings_info_offline_maps">c:geo prend en charge les cartes hors-ligne. Vous pouvez télécharger des cartes depuis Mapsforge ou même créer vos propres cartes à partir des données d\'OSM.</string>
+ <string name="settings_info_themes_title">Informations sur les thèmes de cartes</string>
+ <string name="settings_info_themes">c:geo prend en charge des thèmes personnalisés pour les cartes en mode hors-ligne. Ils peuvent être utilisés pour modifier le style de couleur de la carte (par exemple d\'avoir une vue de nuit) ou mettre en évidence certains objets comme les pistes cyclables ou les lignes de niveau.</string>
<string name="init_mapsource_select">Choisir la source des cartes</string>
<string name="init_map_directory_description">Dossier contenant les cartes hors-ligne</string>
<string name="init_gpx_exportdir">Dossier d\'exportation GPX</string>
<string name="init_gpx_importdir">Dossier d\'importation GPX</string>
<string name="init_maptrail">Montrer la trace sur la carte</string>
- <string name="init_summary_maptrail">Montrer la trace sur la carte</string>
+ <string name="init_summary_maptrail">Montrer la trace sur la carte</string>
<string name="init_share_after_export">Ouvrir le menu de partage après les exportations GPX.</string>
<string name="init_trackautovisit">Marquer automatiquement les objets voyageurs comme \"visité\"</string>
+ <string name="init_summary_trackautovisit">Marquer automatiquement les objets voyageurs comme \"visité\"</string>
<string name="init_sigautoinsert">Insérer la signature automatiquement</string>
<string name="init_loaddirectionimg">Charge la direction de l\'image si nécessaire</string>
- <string name="init_summary_loaddirectionimg">Charge la direction de l\'image si nécessaire</string>
+ <string name="init_summary_loaddirectionimg">Charge la direction de l\'image si nécessaire</string>
<string name="init_default_navigation_tool">Navigation par défaut</string>
+ <string name="init_secondary_navigation_tool">Navigation secondaire</string>
<string name="init_default_navigation_tool_description">Vous pouvez choisir ici l\'outil de navigation à utiliser par défaut.</string>
<string name="init_default_navigation_tool_select">Sélectionner l\'outil</string>
<string name="init_default_navigation_tool_2_description">Vous pouvez choisir ici votre deuxième outil de navigation préféré. Il sera activé par un appui long sur l\'icône de navigation situé près du nom de la cache.</string>
<string name="init_debug_title">Déverminage</string>
<string name="init_debug_note">c:geo est capable de générer beaucoup d\'informations peu utiles pour des utilisateurs normaux. Cependant, en cas de problème, les développeurs en charge de c:geo peuvent avoir besoin de cette information pour pouvoir l\'identifier. Dans ce cas, ils vous demanderont d\'activer cette option et d\'envoyer les fichiers de journaux.</string>
- <string name="init_debug">Générer les informations</string>
+ <string name="init_debug">Activer le débogage</string>
<string name="init_dbonsdcard_title">Emplacement de la base</string>
<string name="init_dbonsdcard_note">La base de données de c:geo peut être enregistrée sur un support externe. En choisissant cette option, vous récupérerez de l\'espace de stockage sur votre appareil au détriment de performances réduites. c:geo ne fonctionnera pas si votre carte SD est absente.</string>
<string name="init_dbonsdcard">Base de données sur stockage externe</string>
@@ -415,8 +450,9 @@
<string name="init_dbmove_success">Base de données déplacée</string>
<string name="init_dbmove_failed">Erreur lors du déplacement de la base de données</string>
<string name="init_plain_logs">Afficher les entrées de journal sans les couleurs</string>
- <string name="init_summary_plain_logs">Afficher les entrées de journal sans les couleurs</string>
+ <string name="init_summary_plain_logs">Afficher les entrées de journal sans les couleurs</string>
<string name="init_use_native_ua">S\'identifier comme le navigateur web Android. Peut résoudre des problèmes de connexion avec certains opérateurs mobiles.</string>
+ <string name="init_summary_use_native_ua">S\'identifier comme le navigateur Android. Résout les problèmes de connexion lors de l\'utilisation de certains fournisseurs d\'accès au réseau.</string>
<string name="init_rendertheme_folder">Dossier contenant les cartes hors-ligne personnelles (optionnelles).</string>
<string name="map_source_google_map">Google Maps : plan</string>
<string name="map_source_google_satellite">Google Maps : satellite</string>
@@ -424,6 +460,7 @@
<string name="map_source_osm_cyclemap">OSM : pistes cyclables</string>
<string name="map_source_osm_offline">hors-ligne</string>
<string name="init_sendToCgeo">Envoyers vers c:geo</string>
+ <string name="settings_info_send2cgeo_title">Informations sur send2cgeo</string>
<string name="init_sendToCgeo_name">Votre nom d\'appareil:</string>
<string name="init_sendToCgeo_description">Envoyers vers c:geo permet de recevoir les caches directement depuis le site Geocaching.com en utilisant une extension pour Firefox ou Chrome. Après votre inscription, veuillez lire <a href="http://send2.cgeo.org/">http://send2.cgeo.org/</a>. Pour utiliser send2cgeo, vous avez juste besoin de vous inscrire. c:geo fonctionnera aussi sans enregistrer votre appareil.</string>
<string name="init_sendToCgeo_register">Demande d\'enregistrement</string>
@@ -476,6 +513,10 @@
<string name="cache_log_image_default_title">Photo</string>
<string name="cache_personal_note">Note personnelle</string>
<string name="cache_personal_note_edit">Éditer</string>
+ <string name="cache_personal_note_upload">Envoyer</string>
+ <string name="cache_personal_note_uploading">Envoi de la note personnelle</string>
+ <string name="cache_personal_note_upload_done">Note personnelle envoyée</string>
+ <string name="cache_personal_note_upload_cancelled">Envoi de la note personnelle annulé</string>
<string name="cache_personal_note_unstored">Cache non sauvegardée localement</string>
<string name="cache_personal_note_store">La cache va être sauvegardée localement avant d\'autoriser les notes personnelles.</string>
<string name="cache_description">Description</string>
@@ -547,6 +588,7 @@
<string name="cache_menu_whereyougo">WhereYouGo</string>
<string name="cache_menu_oruxmaps">OruxMaps</string>
<string name="cache_menu_cachebeacon">Cache Beacon</string>
+ <string name="cache_menu_navigon">Navigon</string>
<string name="cache_status">Statut</string>
<string name="cache_status_offline_log">Visite sauvée hors-ligne</string>
<string name="cache_status_found">Trouvée</string>
@@ -663,6 +705,8 @@
<string name="map_trail_hide">Cacher le parcours</string>
<string name="map_circles_show">Afficher les cercles</string>
<string name="map_circles_hide">Cacher les cercles</string>
+ <string name="map_mycaches_show">Montrer les caches placées/trouvées</string>
+ <string name="map_mycaches_hide">Cacher les caches placées/trouvées</string>
<string name="map_theme_builtin">Défault</string>
<string name="map_theme_select">Sélectionner le thème</string>
<string name="map_live_enable">Activer Temps réel</string>
diff --git a/main/res/values-pt/strings.xml b/main/res/values-pt/strings.xml
index c72ba98..3e2a922 100644
--- a/main/res/values-pt/strings.xml
+++ b/main/res/values-pt/strings.xml
@@ -1,1165 +1,1078 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.net-->
<resources xmlns:tools="http://schemas.android.com/tools">
-
- <string name="app_name">c:geo</string>
-
- <!-- basics -->
- <string name="cache">Cache</string>
- <string name="detail">Detalhes</string>
- <string name="search">Pesquisar</string>
- <string name="helpers">Apps Úteis</string>
- <string name="about">Sobre c:geo</string>
- <string name="latitude">Latitude</string>
- <string name="longitude">Longitude</string>
-
- <!-- actionbar -->
- <string name="action_bar_share_title">Partilhar ligação para a cache</string>
- <string name="settings_titlebar">c:geo Definições</string>
-
- <!-- caches -->
- <string name="all_types">Todos os tipos</string>
- <string name="traditional">Cache tradicional</string>
- <string name="multi">Multi-cache</string>
- <string name="mystery">Cache mistério</string>
- <string name="letterbox">Caixa de correio híbrida</string>
- <string name="event">Cache evento</string>
- <string name="mega">Cache mega-evento</string>
- <string name="earth">Cache Terra</string>
- <string name="cito">Evento Cache In Trash Out</string>
- <string name="webcam">Cache webcam</string>
- <string name="virtual">Cache virtual</string>
- <string name="wherigo">Cache wherigo</string>
- <string name="lostfound">Perdidos e achados</string>
- <string name="ape">Cache projecto APE</string>
- <string name="gchq">Groundspeak hq</string>
- <string name="gps">Cache exposição GPS</string>
- <string name="block">Groundspeak Block Party</string>
- <string name="unknown">Tipo Desconhecido</string>
-
- <!-- cache sizes -->
- <string name="cache_size_micro">Micro</string>
- <string name="cache_size_small">Pequena</string>
- <string name="cache_size_regular">Normal</string>
- <string name="cache_size_large">Grande</string>
- <string name="cache_size_other">Outra</string>
- <string name="cache_size_virtual">Virtual</string>
- <string name="cache_size_notchosen">Não especificado</string>
- <string name="cache_size_unknown">Desconhecido</string>
-
- <!-- waypoints -->
- <string name="wp_final">Localização final</string>
- <string name="wp_stage">Estado da multi-cache</string>
- <string name="wp_puzzle">Pergunta para a resposta</string>
- <string name="wp_pkg">Parque de estacionamento</string>
- <string name="wp_trailhead">Início</string>
- <string name="wp_waypoint">Ponto de referência</string>
- <string name="wp_original">Coordenadas Originais</string>
-
- <!-- logs -->
- <string name="log_found">Encontrei</string>
- <string name="log_dnf">Não encontrei</string>
- <string name="log_note">Nota</string>
- <string name="log_published">Publicado</string>
- <string name="log_enabled">Activo</string>
- <string name="log_disabled">Desactivo</string>
- <string name="log_attend">Vou participar</string>
- <string name="log_attended">Participei</string>
- <string name="log_retrieved">Retirado</string>
- <string name="log_placed">Colocado</string>
- <string name="log_grabbed">Agarrado</string>
- <string name="log_movecollection">Mover para colecção</string>
- <string name="log_moveinventory">Mover para inventário</string>
- <string name="log_maintained">Manutenção efectuada</string>
- <string name="log_maintenance_needed">Precisa manutenção</string>
- <string name="log_update">Coordenadas actualizadas</string>
- <string name="log_archived">Arquivada</string>
- <string name="log_unarchived">Desarquivada</string>
- <string name="log_needs_archived">Precisa de arquivamento</string>
- <string name="log_discovered">Descoberta</string>
- <string name="log_reviewer">Nota de revisor</string>
- <string name="log_retractlisting">Retirar Lista</string>
- <string name="log_marked_missing">Marcado em falta</string>
- <string name="log_tb_nothing">Não fazer nada</string>
- <string name="log_tb_visit">Visitei</string>
- <string name="log_tb_drop">Deixei aqui</string>
- <string name="log_tb_changeall">Alterar todos</string>
- <string name="log_save">Gravar</string>
- <string name="log_saving">A gravar o registo…</string>
- <string name="log_saving_and_uploading">A enviar o registo e a imagem…</string>
- <string name="log_clear">Limpar</string>
- <string name="log_post">Publicar o registo</string>
- <string name="log_post_rate">Publicar registo &amp; Votar</string>
- <string name="log_post_no_rate">Publicar registo &amp; Não votar</string>
- <string name="log_post_not_possible">A carregar página de registo…</string>
- <string name="log_add">Adicionar</string>
- <string name="log_rating">Pontuação</string>
- <string name="log_no_rating">Não votar</string>
- <string name="log_stars_1">1 estrela</string>
- <string name="log_stars_15">1.5 estrelas</string>
- <string name="log_stars_2">2 estrelas</string>
- <string name="log_stars_25">2.5 estrelas</string>
- <string name="log_stars_3">3 estrelas</string>
- <string name="log_stars_35">3.5 estrelas</string>
- <string name="log_stars_4">4 estrelas</string>
- <string name="log_stars_45">4.5 estrelas</string>
- <string name="log_stars_5">5 estrelas</string>
- <string name="log_stars_1_description">Terrível</string>
- <string name="log_stars_15_description">Muito má</string>
- <string name="log_stars_2_description">Má</string>
- <string name="log_stars_25_description">Abaixo da média</string>
- <string name="log_stars_3_description">Mediana</string>
- <string name="log_stars_35_description">Acima da média</string>
- <string name="log_stars_4_description">Boa</string>
- <string name="log_stars_45_description">Muito boa</string>
- <string name="log_stars_5_description">Excelente</string>
- <string name="log_webcam">Fotografia tirada pela webcam</string>
- <string name="log_new_log">Registar</string>
- <string name="log_new_log_text">Registar texto</string>
- <string name="log_announcement">Anúncio</string>
- <string name="log_today">Hoje</string>
- <string name="log_yesterday">Ontem</string>
- <string name="log_smilies">Smilies</string>
- <string name="log_image">Imagem</string>
- <string name="log_image_attach">Anexar Imagem</string>
- <string name="log_image_edit">Editar Imagem</string>
- <string name="log_image_stored">Existente</string>
- <string name="log_image_camera">Nova</string>
- <string name="log_image_caption">Título</string>
- <string name="log_image_description">Descrição</string>
- <string name="log_image_scale">Dimensionamento</string>
- <string name="log_password_title">Password do registo:</string>
- <string name="log_hint_log_password">Inserira a password do registo</string>
-
- <string-array name="log_image_scales">
- <item>Não dimensionar</item>
- <item>512 px</item>
- <item>640 px</item>
- <item>800 px</item>
- <item>1024 px</item>
- </string-array>
-
- <!-- translation -->
- <string name="translate_to_sys_lang">Traduzir para %s</string>
- <string name="translate_to_english">Traduzir para inglês</string>
- <string name="translate_length_warning">A tradução pode falhar se o texto fôr muito grande.</string>
-
- <!-- errors, warnings, info toasts -->
- <string name="err_none">Ok</string>
- <string name="err_start">Comunicação não iniciada</string>
- <string name="err_parse">Falha na análise da página de login</string>
- <string name="err_server">Falha na ligação a Geocaching.com (servidor ou ligação em baixo?)</string>
- <string name="err_login">Informação de login não gravada</string>
- <string name="err_login_failed">O c:geo não consegue fazer login.</string>
- <string name="err_login_failed_toast">O c:geo não consegue fazer login. O c:geo funciona offline com as caches Arquivadas. Verifique as definições de login ou habilite a ligação de dados.</string>
- <string name="err_unknown">Erro desconhecido</string>
- <string name="err_comm">Erro de comunicação desconhecido</string>
- <string name="err_missing_auth">Sem nome de utilizador/password definidos.</string>
- <string name="err_wrong">Dados de login inválidos</string>
- <string name="err_maintenance">Geocaching.com está em manutenção. O c:geo funciona offline com as caches Arquivadas.</string>
- <string name="err_license">O utilizador não concordou com a licença de utilização de Geocaching.com, por isso c:geo não pode carregar as coordenadas da cache.</string>
- <string name="err_unvalidated_account">Deve validar a sua conta primeiro em Geocaching.com.</string>
- <string name="err_unpublished">A cache pedida não está publicada.</string>
- <string name="err_premium_only">Esta cache só está disponível para membros premium do Geocaching.com.</string>
- <string name="err_detail_open">O c:geo não consegue abrir os detalhes da geocache.</string>
- <string name="err_detail_cache">O c:geo não consegue mostrar a cache pretendida. É mesmo uma geocache?</string>
- <string name="err_detail_cache_find">O c:geo não encontra a geocache</string>
- <string name="err_detail_cache_find_some">O c:geo não encontra essa geocache.</string>
- <string name="err_detail_cache_find_any">O c:geo não encontra qualquer geocache.</string>
- <string name="err_detail_cache_forgot">O c:geo esqueceu a geocache pretendida.</string>
- <string name="err_detail_google_maps_limit_reached">O c:geo falhou no download dos mapas. Talvez o tenha atingido o limite do Google Maps.</string>
- <string name="err_detail_no_spoiler">O c:geo não encontrou images spoiler para esta cache.</string>
- <string name="err_detail_no_map_static">O c:geo não encontrou mapas estáticos para esta cache.</string>
- <string name="err_detail_not_load_map_static">O c:geo falhou o carregamento de mapas estáticos.</string>
- <string name="err_detail_still_working">A trabalhar noutra tarefa.</string>
- <string name="err_watchlist_still_managing">Ainda a gerir a sua watchlist.</string>
- <string name="err_watchlist_failed">A gestão da sua watchlist falhou.</string>
- <string name="err_application_no">O c:geo não encontra a aplicação correcta.</string>
- <string name="err_auth_initialize">O c:geo falhou a iniciar o processo de autorização.</string>
- <string name="err_auth_process">Processo de autorização falhou.</string>
- <string name="err_cannot_log_visit">O c:geo não tem informação suficiente para registar a visita. Por favor, faça-o a partir dos detalhes completos da cache.</string>
- <string name="err_download_fail">O c:geo falhou o download das caches porque </string>
- <string name="err_dwld_details_failed">O c:geo falhou o download dos detalhes da cache.</string>
- <string name="err_load_descr_failed">O c:geo não consegue carregar a descrição.</string>
- <string name="err_location_unknown">O c:geo não sabe a localização da cache.</string>
- <string name="err_missing_device_name">Por favor insira um nome para este dispositivo antes de registar.</string>
- <string name="err_favorite_failed">Alteração do estado de favorito falhou.</string>
- <string name="err_select_logimage_failed">Selecionar uma imagem para o registo falhado.</string>
- <string name="err_acquire_image_failed">Aquisição de uma imagem falhou.</string>
- <string name="err_tb_display">O c:geo não consegue mostrar o trackable pretendido. É mesmo um trackable?</string>
- <string name="err_tb_details_open">O c:geo não consegue abrir os detalhes do trackable.</string>
- <string name="err_tb_forgot_saw">O c:geo esqueceu o trackable que viu.</string>
- <string name="err_tb_find">O c:geo não encontra o trackable</string>
- <string name="err_tb_find_that">O c:geo não encontra esse trackable.</string>
- <string name="err_waypoint_cache_unknown">O c:geo não sabe a que cache quer adicionar o ponto de referência.</string>
- <string name="err_waypoint_add_failed">O c:geo falhou o adicionamento do seu ponto de referência.</string>
- <string name="err_point_unknown_position">O c:geo não conseguiu reconhecer a sua localização.</string>
- <string name="err_point_no_position_given_title">Informação requerida</string>
- <string name="err_point_no_position_given">Preencha pelo menos a latitude, a longitude, a distância ou a direcção. Também pode preencher os quatro campos.</string>
- <string name="err_point_curr_position_unavailable">O c:geo ainda não possui as coordenadas actuais. Por favor, aguarde um instante…</string>
- <string name="err_point_bear_and_dist_title">Precisa de ajuda?</string>
- <string name="err_point_bear_and_dist">Preencha a direcção e a distância. A direcção é o ângulo de 0 a 360 graus relativo ao norte. A distância pode ser introduzida com ou sem unidades.</string>
- <string name="err_point_location_error">O c:geo não conseguiu obter a localização do ponto de referência.</string>
- <string name="err_log_load_data">O c:geo não consegue carregar os dados necessários para registar a sua visita.</string>
- <string name="err_log_load_data_again">O c:geo não consegue carregar os dados necessários para registar a sua visita. A tentar de novo.</string>
- <string name="err_log_load_data_still">O c:geo ainda está a carregar dados necessários para publicar o registo. Por favor espere mais um pouco.</string>
- <string name="err_log_failed_server">O c:geo falhou a publicação do registo porque o servidor não responde.</string>
- <string name="err_log_post_failed">O c:geo falhou a publicação do registo.</string>
- <string name="err_logimage_post_failed">Parece que a sua imagem de registo não foi enviada. Por favor verifique em Geocaching.com.</string>
- <string name="err_search_address_forgot">O c:geo esqueceu o endereço que procura.</string>
- <string name="err_parse_lat">O c:geo não consegue analisar a latitue.</string>
- <string name="err_parse_lon">O c:geo não consegue analisar a logitude.</string>
- <string name="err_parse_dist">O c:geo não consegue analisar a distância.</string>
- <string name="err_parse_lat_lon">O c:geo não consegue analisar a latitue ou a longitude.</string>
- <string name="warn_save_nothing">Não há nada para guardar.</string>
- <string name="warn_no_cache_coord">Não há cache com coordenadas.</string>
- <string name="warn_no_coordinates">Nenhumas coordenadas fornecidas.</string>
- <string name="warn_no_keyword">Nenhuma palavra-chave fornecida.</string>
- <string name="warn_no_username">Nenhum nome de utilizador fornecido.</string>
- <string name="warn_search_help_title">Precisa de ajuda?</string>
- <string name="warn_search_help_address">"Preencha o endereço ou o nome da localização. Por exemplo o nome da rua \"Avenida da Liberdade 100, Lisboa, Portugal\", nome da cidade \"Coimbra\" ou simplesmente o nome de algo como \"Parque das Nações\".</string>
- <string name="warn_search_help_gccode">Preencha o código da geocache. Por exemplo \"GC1VCAZ\".</string>
- <string name="warn_search_help_keyword">Preencha acom uma palavra que é suposto estar algures no nome da cache que está a tentar encontrar.</string>
- <string name="warn_search_help_user">Preencha o nome de utilizador em Geocaching.com.</string>
- <string name="warn_search_help_tb">Preencha o código do trackable. Por exemplo \"TB29QMZ\".</string>
- <string name="warn_log_text_fill">Por favor, preencha algum texto para o registo.</string>
- <string name="warn_load_images">c:geo falhou ao carregar as imagens.</string>
- <string name="warn_invalid_mapfile">O ficheiro de mapa selecionado não é suportado pela versão mapsforge 0.3.0.\nMapas offline não estão disponíveis.</string>
- <string name="warn_deprecated_mapfile">Está a utilizar um ficheiro de mapa de uma versão obsoleta.\nConsidere mudar o mapa para a versão 0.3.0.\nNa próxima versão vamos deixar de suportar a 0.2.4.</string>
- <string name="warn_nonexistant_mapfile">O ficheiro de mapa selecionado não existe.\nMapas offline não estão disponíveis.</string>
- <string name="warn_rendertheme_missing">Tema de mapa não encontrado.</string>
- <string name="info_log_posted">O c:geo publicou o registo com sucesso.</string>
- <string name="info_log_saved">O c:geo gravou o registo com sucesso.</string>
- <string name="info_log_cleared">O registo foi limpo.</string>
- <string name="info_log_type_changed">O tipo de registo foi alterado!</string>
- <string name="info_select_logimage_cancelled">A selecção ou captura de imagem foi cancelada.</string>
- <string name="info_stored_image">Nova imagem guardada em:</string>
- <string name="info_storing_static_maps">A tentar arquivar mapas estáticos.</string>
-
- <!-- location service -->
- <string name="loc_last">Último conhecido</string>
- <string name="loc_net">Rede</string>
- <string name="loc_gps">GPS</string>
- <string name="loc_sat">Sat</string>
- <string name="loc_trying">A tentar localizar</string>
- <string name="loc_no_addr">Endereço desconhecido</string>
- <string name="loc_gps_disabled">GPS desactivado</string>
-
- <!-- standard menu -->
- <string name="menu_about">Sobre o c:geo</string>
- <string name="menu_helpers">Utilitários</string>
- <string name="menu_settings">Definições</string>
- <string name="menu_history">Histórico</string>
- <string name="menu_filter">Filtro</string>
- <string name="menu_scan_geo">Scan geocode</string>
-
- <!-- main screen -->
- <string name="live_map_button">Ao vivo</string>
- <string name="caches_nearby_button">Por perto</string>
- <string name="advanced_search_button">Pesquisar</string>
- <string name="stored_caches_button">Arquivo</string>
- <string name="any_button">Destino</string>
- <string name="unknown_scan">Sem resultados do scan.</string>
-
- <!-- caches -->
- <string name="caches_no_cache">Nenhuma cache</string>
- <string name="caches_more_caches">Mais caches</string>
- <string name="caches_more_caches_no">Mais nenhuma cache</string>
- <string name="caches_more_caches_loading">A carregar caches…</string>
- <string name="caches_more_caches_currently">actualmente</string>
- <string name="caches_downloading">Downloading caches…\nETE: </string>
- <string name="caches_eta_ltm">Menos de um minuto</string>
-
- <plurals name="caches_eta_mins">
- <item quantity="one">minuto</item>
- <item quantity="other">minutos</item>
- </plurals>
-
- <string name="caches_store_offline">Arquivar para uso offline</string>
- <string name="caches_store_selected">Arquivar selecionadas</string>
- <string name="caches_history">Histórico</string>
- <string name="caches_on_map">Mostrar no mapa</string>
- <string name="caches_sort">Ordenar</string>
- <string name="caches_sort_title">Ordenar por</string>
- <string name="caches_sort_distance">Distância</string>
- <string name="caches_sort_difficulty">Dificuldade</string>
- <string name="caches_sort_terrain">Terreno</string>
- <string name="caches_sort_size">Tamanho</string>
- <string name="caches_sort_favorites">Popularidade</string>
- <string name="caches_sort_name">Nome</string>
- <string name="caches_sort_geocode">Geo Código</string>
- <string name="caches_sort_rating">Pontuação</string>
- <string name="caches_sort_vote">Votos (pontuação própria)</string>
- <string name="caches_sort_inventory">Somatório do Inventário</string>
- <string name="caches_sort_date_hidden">Data</string>
- <string name="caches_sort_date_logged">Data de Registo</string>
- <string name="caches_sort_finds">Encontradas</string>
- <string name="caches_sort_state">Estado</string>
- <string name="caches_sort_storage">Data gravada no dispositivo</string>
- <string name="caches_select_mode">Modo de selecção</string>
- <string name="caches_select_mode_exit">Sair do modo de selecção</string>
- <string name="caches_select_invert">Inverter selecção</string>
- <string name="caches_nearby">Por perto</string>
- <string name="caches_manage">Gerir</string>
- <string name="caches_drop_selected">Apagar seleccionada</string>
- <string name="caches_drop_selected_ask">Quer apagar as caches seleccionadas do dispositivo?</string>
- <string name="caches_drop_all">Apagar todas</string>
- <string name="caches_drop_all_ask">Quer remover todas as caches do dispositivo?</string>
- <string name="caches_drop_stored">Apagar do arquivo</string>
- <string name="caches_drop_progress">A remover caches</string>
- <string name="caches_drop_all_and_list">Apagar todas e remover lista</string>
- <string name="caches_delete_events">Eliminar eventos passados</string>
- <string name="caches_refresh_selected">Actualizar seleccionada</string>
- <string name="caches_refresh_all">Actualizar todas</string>
- <string name="caches_move_selected">Mover seleccionadas</string>
- <string name="caches_move_all">Mover todas</string>
- <string name="caches_map_locus">Locus</string>
- <string name="caches_map_locus_export">Exportar para Locus</string>
- <string name="caches_recaptcha_title">reCAPTCHA</string>
- <string name="caches_recaptcha_explanation">Por favor, escreva o texto da imagem. É importante para fazer o download das coordenadas das caches. É opcional e pode ser desactivado nas Definições.</string>
- <string name="caches_recaptcha_hint">Texto da imagem</string>
- <string name="caches_recaptcha_continue">Continuar</string>
- <string name="caches_filter">Filtrar</string>
- <string name="caches_filter_title">Filtrar por</string>
- <string name="caches_filter_size">Tamanho</string>
- <string name="caches_filter_type">Tipo</string>
- <string name="caches_filter_track">Com trackables</string>
- <string name="caches_filter_clear">Limpar filtros</string>
- <string name="caches_filter_modified">Com as coordenadas modificadas</string>
- <string name="caches_filter_origin">Origem</string>
- <string name="caches_removing_from_history">A remover do histórico…</string>
- <string name="caches_clear_offlinelogs">Limpar registos offline</string>
- <string name="caches_clear_offlinelogs_progress">A limpar registos offline</string>
-
- <!-- caches lists -->
- <string name="list_menu">Listas</string>
- <string name="list_menu_create">Criar nova lista</string>
- <string name="list_menu_all_lists">caches todas</string>
- <string name="list_menu_drop">Apagar lista actual</string>
- <string name="list_menu_change">Mudar de lista</string>
- <string name="list_menu_rename">Mudar o nome da lista corrente.</string>
- <string name="list_title">Escolha uma lista</string>
- <string name="list_inbox">Arquivadas</string>
- <string name="list_all_lists">caches todas</string>
- <string name="list_dialog_create_title">Nova lista</string>
- <string name="list_dialog_create">Criar</string>
- <string name="list_dialog_cancel">Cancelar</string>
- <string name="list_dialog_create_ok">Nova lista criada</string>
- <string name="list_dialog_create_err">O c:geo falhou a criação da nova lista</string>
- <string name="list_dialog_remove_title">Remover lista</string>
- <string name="list_dialog_remove_description">Pretende remover a lista actual de caches? Todas as caches presentes na lista serão movidas para a lista \"Arquivadas\".</string>
- <string name="list_dialog_remove">Remover</string>
- <string name="list_dialog_remove_ok">A lista foi removida</string>
- <string name="list_dialog_remove_err">O c:geo falhou a remoção da lista actual</string>
- <string name="list_dialog_rename_title">Mudar o nome da lista</string>
- <string name="list_dialog_rename">Mudar o nome</string>
-
- <!-- about -->
- <string name="about_version">Versão</string>
- <string name="about_changelog">Changelog</string>
- <string name="about_donate">Doar</string>
- <string name="about_detail">Detalhes</string>
- <string name="about_donation_more">Doar\ndesenvolvimento</string>
- <string name="about_contributors">Contribuidores</string>
-
- <!-- settings -->
- <string name="settings_title_services">Serviços</string>
- <string name="settings_title_appearance">Aparência</string>
- <string name="settings_title_cachedetails">Detalhos da Cache</string>
- <string name="settings_title_offlinedata">Dados Offline</string>
- <string name="settings_title_logging">A fazer o registo</string>
- <string name="settings_title_map">Mapa</string>
- <string name="settings_title_map_data">Dados do Mapa</string>
- <string name="settings_title_map_content">Conteúdo do Mapa</string>
- <string name="settings_title_gpx">GPX</string>
- <string name="settings_title_basicmembers">Membros Básico</string>
-
- <string name="settings_category_browser">Browser</string>
- <string name="settings_category_logging_other">Outras Opções de Registo</string>
-
- <string name="settings_goto_url_button">mais …</string>
-
- <string name="settings_title_gc">Geocaching.com</string>
- <string name="settings_activate_gc">Activar</string>
- <string name="settings_gc_legal_note">Para utilizar os serviços de Geocaching.com tem que aceitar os termos e condições do aviso legal da Groundspeak.</string>
- <string name="settings_info_facebook_login_title">Facebook Login</string>
- <string name="settings_info_facebook_login">Não consegue que c:geo faça o login em geocaching.com com a sua conta do Facebook. Mas existe uma solução simples…</string>
- <string name="init_oc">Opencaching.de</string>
- <string name="settings_activate_oc">Activar</string>
- <string name="init_oc_de_description">Autorizar c:geo com opencaching.de para pesquisar por caches e aceder/filtrar as suas caches encontradas.</string>
- <string name="init_register_oc_de">Autorizar c:geo</string>
- <string name="init_gcvote">GCvote.com</string>
- <string name="init_twitter">Twitter</string>
- <string name="settings_activate_twitter">Activar</string>
- <string name="init_username">Nome de utilizador</string>
- <string name="init_password">Password</string>
- <string name="init_login">Verificar login</string>
- <string name="init_login_popup">Login</string>
- <string name="init_login_popup_working">Logging to Geocaching.com…</string>
- <string name="init_login_popup_ok">Login ok.</string>
- <string name="init_login_popup_failed">Login falhado.</string>
- <string name="init_login_popup_failed_reason">Login falhado porque </string>
- <string name="init_login_popup_not_authorized">Não autorizado</string>
- <string name="init_twitter_authorize">Autorize o c:geo</string>
- <string name="init_signature">Assinatura</string>
- <string name="init_signature_help_text">Escreva a sua assinatura, para adicionar ao texto de registo na cache.\nPode usar algumas palavras-chave: [DATE] , [TIME], [USER] &amp; [NUMBER].\nEstas serão expandidas quando a assinatura for inserida.</string>
- <string name="init_signature_template_button">Inserir modelo</string>
- <string name="init_signature_template_date">Data</string>
- <string name="init_signature_template_time">Hora</string>
- <string name="init_signature_template_datetime">Data &amp; Hora</string>
- <string name="init_signature_template_user">Utilizador</string>
- <string name="init_signature_template_number">Número</string>
- <string name="init_signature_template_owner">Dono</string>
- <string name="init_ratingwanted">Carregar a pontuação da cache de GCvote.com</string>
- <string name="init_summary_ratingwanted">Carregar a pontuação da cache de GCvote.com</string>
- <string name="init_friendlogswanted">Carregar página adicional de registos de amigos</string>
- <string name="init_summary_friendlogswanted">Carregar página adicional de registos de amigos</string>
- <string name="init_openlastdetailspage">Abrir detalhes da última página vizualizada</string>
- <string name="init_summary_openlastdetailspage">Abrir detalhes da última página vizualizada</string>
- <string name="init_autoload">Carregar automaticamente a descrição longa</string>
- <string name="init_summary_autoload">Carregar automaticamente a descrição longa</string>
- <string name="init_skin">Tema leve (precisa reiniciar o c:geo)</string>
- <string name="init_summary_skin">Tema leve (precisa reiniciar o c:geo)</string>
- <string name="init_address">Mostrar endereços no ecrã principal</string>
- <string name="init_summary_address">Mostrar endereços no ecrã principal</string>
- <string name="init_captcha">Mostrar CAPTCHA se necessário</string>
- <string name="init_summary_captcha">Mostrar CAPTCHA se necessário</string>
- <string name="init_useenglish">Utilizar inglês no c:geo\n(necessário reiniciar)</string>
- <string name="init_summary_useenglish">Utilizar inglês no c:geo\n(necessário reiniciar)</string>
- <string name="init_exclude">Excluir caches encontradas e minhas</string>
- <string name="init_summary_exclude">Excluir caches encontradas e minhas</string>
- <string name="init_showwaypoints">Mostrar Waypoints no mapa</string>
- <string name="init_showwaypoint_description">Se menos do que o número de caches encontradas são mostradas no mapa, os seus waypoints são mostrados adicionalmente.</string>
- <string name="init_disabled">Excluir caches desactivadas</string>
- <string name="init_summary_disabled">Excluir caches desactivadas</string>
- <string name="init_offline">Armazenar a cache de mapas estáticos para utilização offline</string>
- <string name="init_summary_offline">Armazenar a cache de mapas estáticos para utilização offline</string>
- <string name="init_offline_wp">Armazenar waypoints de mapas estáticos para utilização offline</string>
- <string name="init_summary_offline_wp">Armazenar waypoints de mapas estáticos para utilização offline</string>
- <string name="init_save_log_img">Guardar imagens dos registos</string>
- <string name="init_summary_save_log_img">Guardar imagens dos registos</string>
- <string name="init_units">Utilizar distância nas unidades do sistema imperial</string>
- <string name="init_summary_units">Utilizar distância nas unidades do sistema imperial</string>
- <string name="init_log_offline">Activar registo offline\n(Não mostrar o registo online quando fôr registar, não enviar o registo online)</string>
- <string name="init_summary_log_offline">Activar registo offline\n(Não mostrar o registo online quando fôr registar, não enviar o registo online)</string>
- <string name="init_choose_list">Pedir Lista</string>
- <string name="init_summary_choose_list">Pedir lista quando guarda as caches</string>
- <string name="init_livelist">Mostrar a direcção para a cache na lista</string>
- <string name="init_summary_livelist">Mostrar a direcção para a cache na lista</string>
- <string name="init_backup">Backup</string>
- <string name="init_backup_backup">Backup</string>
- <string name="init_backup_running">A criar um backup da base de dados de caches…</string>
- <string name="init_backup_note">Por favor note que esta opção irá fazer backup/restauro da base de dados de caches e pontos de referência, mas não das definições. A sua informação de login (passwords) não irá deixar esta aplicação.</string>
- <string name="init_backup_restore">Restaurar</string>
- <string name="init_backup_success">A base de dados do c:geo foi copiada com sucesso</string>
- <string name="init_backup_failed">O backup da base de dados do c:geo falhou.</string>
- <string name="init_backup_unnecessary">Base de dados vazia, não é necessário um backup.</string>
- <string name="init_restore_success">Restauro concluído.</string>
- <string name="init_restore_failed">O restauro falhou.</string>
- <string name="init_restore_running">A restaurar a base de dados de caches…</string>
- <string name="init_restore_confirm">Base de dados vazia. Quer restaurar o backup?</string>
- <string name="init_backup_last">Disponível backup de</string>
- <string name="init_backup_last_no">Não existe nenhum ficheiro de backup.</string>
- <string name="settings_info_offline_maps_title">Informações sobre Offline Maps</string>
- <string name="settings_info_offline_maps">c: geo suporta mapas para uso offline. Pode baixar mapas de Mapsforge ou até mesmo criar seus próprios mapas a partir de dados OSM.</string>
- <string name="settings_info_themes_title">Informações sobre Map Themes</string>
- <string name="settings_info_themes">c: geo suporta temas customizados para os mapas off-line. Estes podem ser usados ​​para alterar o estilo de cores do mapa (por exemplo, ter um mapa para visão nocturna) ou para realçar certos objetos, como ciclovias ou linhas de altura dentro do mapa.</string>
- <string name="init_mapsource_select">Seleccione a fonte de mapa</string>
- <string name="init_map_directory_description">Directório com os mapas offline</string>
- <string name="init_gpx_exportdir">Directório para exportar GPX</string>
- <string name="init_gpx_importdir">Directório para importar GPX</string>
- <string name="init_maptrail">Mostrar rasto no mapa</string>
- <string name="init_summary_maptrail">Mostrar rasto no mapa</string>
- <string name="init_share_after_export">Abrir o menu de partilha depois da exportação GPX</string>
- <string name="init_trackautovisit">Marcar automaticamente os trackables como \"visitados\"</string>
- <string name="init_summary_trackautovisit">Marcar automaticamente os trackables como \"visitados\"</string>
- <string name="init_sigautoinsert">Inserir automaticamente</string>
- <string name="init_loaddirectionimg">Carregar a imagem de dricção se necessário</string>
- <string name="init_summary_loaddirectionimg">Carregar a imagem de dricção se necessário</string>
- <string name="init_default_navigation_tool">Navegador principal</string>
- <string name="init_default_navigation_tool_description">Aqui pode selecionar o seu navegador preferido.</string>
- <string name="init_default_navigation_tool_select">Ferramenta de selecção</string>
- <string name="init_default_navigation_tool_2_description">Aqui define a sua segunda preferida ferramenta de navefação. É activada com clique longo no ícone ao lado do títula da cache.</string>
- <string name="init_debug_title">Informação de depuração</string>
- <string name="init_debug_note">O c:geo consegue gerar muita informação de depuração. Enquanto para os utilizadores esta informação não é muito importante, os desenvolvedores podem precisar para analisar um bug. Neste caso, eles pedem-lhe que marque a caixa de verificação abaixo e lhes envie o ficheiro de log.</string>
- <string name="init_debug">Gerar informação de depuração</string>
- <string name="init_dbonsdcard_title">Localização da base de dados</string>
- <string name="init_dbonsdcard_note">Pode armazenar a base de dados do c:geo no armazenamento externo. Se o fizer vai poupar memória interna, mas pode perder um pouco de performance e o c:geo pode não funcionar se o armazenamento externo não estiver disponível.</string>
- <string name="init_dbonsdcard">No armazenamento externo</string>
- <string name="init_dbmove_dbmove">A mover a base de dados</string>
- <string name="init_dbmove_running">A mover a base de dados</string>
- <string name="init_dbmove_success">Base de dados movida com sucesso.</string>
- <string name="init_dbmove_failed">Falha ao mover a base de dados.</string>
- <string name="init_plain_logs">Mostrar os logs sem as cores</string>
- <string name="init_summary_plain_logs">Mostrar os logs sem as cores</string>
- <string name="init_use_native_ua">Identificar como se fosse o browser do Android. Resolve os problemas de login em alguns provedores de rede.</string>
- <string name="init_summary_use_native_ua">Identificar como se fosse o browser do Android. Resolve os problemas de login em alguns provedores de rede.</string>
- <string name="init_rendertheme_folder">Directório de Temas de Mapas</string>
-
- <!-- map sources -->
- <string name="map_source_google_map">Google: Mapa</string>
- <string name="map_source_google_satellite">Google: Satélite</string>
- <string name="map_source_osm_mapnik">OSM: Mapnik</string>
- <string name="map_source_osm_cyclemap">OSM: Cyclemap</string>
- <string name="map_source_osm_offline">Offline</string>
- <string name="init_sendToCgeo">Enviar para o c:geo</string>
- <string name="settings_info_send2cgeo_title">Informação sobre send2cgeo</string>
- <string name="init_sendToCgeo_name">Nome do seu dispositivo</string>
- <string name="init_sendToCgeo_description">Enviar para o c: geo permite-lhe receber caches directamente do site Geocaching.com, utilizando um plugin especial para o Firefox ou Chrome. Antes de se registar, por favor leia <a href="http://send2.cgeo.org/">http://send2.cgeo.org/</a>. Apenas necessita de registar, se pretender utilizar o send2cgeo. O c:geo irá funcionar mesmo sem este registo.</string>
- <string name="init_sendToCgeo_register">Solicitar registo</string>
- <string name="init_sendToCgeo_registering">Registando o seu dispositivo para "Enviar para o c:geo"…</string>
- <string name="init_sendToCgeo_register_ok">Registo bem sucedido. O código PIN é ####. Use-o no site do c:geo para adicionar este dispositivo ao seu browser.</string>
- <string name="init_sendToCgeo_register_fail">O registo falhou.</string>
- <string name="sendToCgeo_download_fail">c:geo falhou o download das caches. Sem ligação à internet ou send2c:geo está em baixo.</string>
- <string name="sendToCgeo_no_registration">c:geo falhou o download das caches. Registo do send2c:geo expirou. Faça o registo nas definições.</string>
-
- <!-- auth twitter -->
- <string name="auth_twitter">Twitter</string>
- <string name="auth_authorize">Autorizar c:geo</string>
- <string name="auth_start">Iniciar autorização</string>
- <string name="auth_again">Iniciar de novo</string>
- <string name="auth_pin_hint">PIN atribuído pelo Twitter</string>
- <string name="auth_finish">Fim</string>
- <string name="auth_dialog_wait">A esperar pelo Twitter…</string>
- <string name="auth_dialog_pin_title">Código PIN</string>
- <string name="auth_dialog_pin_message">Por favor insira o código PIN fornecido pelo site do Twitter. É imperativo para que se complete a autorização.</string>
- <string name="auth_dialog_completed">O c:geo está agora autorizado a publicar no Twitter.</string>
- <string name="about_auth_1">O processo seguinte permite <b>c:geo</b> aceder ao Twitter - se concordar.</string>
- <string name="about_auth_2">Um clique sobre o botão \"autorizar c:geo \" irá iniciar o processo. Este processo irá abrir um navegador com uma página no Twitter. Entre nesta página e permita o <b>c:geo</b> aceder à sua conta. Se isso for aceite, o Twitter vai mostrar um código PIN numérico. Este PIN deve ser colado em <b>c:geo</b> e confirmado. É tudo.</string>
-
- <!-- auth opencaching -->
- <string name="auth_ocde">opencaching.de</string>
- <string name="auth_authorize_oc">Autorizar c:geo</string>
- <string name="auth_start_oc">Começar autorização</string>
- <string name="auth_again_oc">Iniciar de novo</string>
- <string name="auth_pin_hint_oc">PIN atribuído por %s</string>
- <string name="auth_finish_oc">Fim</string>
- <string name="auth_dialog_wait_oc">A esperar pot %s…</string>
- <string name="auth_dialog_pin_title_oc">Código PIN</string>
- <string name="auth_dialog_pin_message_oc">Por favor insira o código PIN fornecido pelo site %s. É imperativo para que se complete a autorização.</string>
- <string name="auth_dialog_completed_oc">c:geo está agora autorizado a interagir com %s.</string>
- <string name="about_auth_1_oc">O processo seguinte permite <b>c:geo</b> aceder ao Twitter - se concordar.</string>
- <string name="about_auth_2_oc">Um clique sobre o botão \"autorizar c:geo \" irá iniciar o processo. Este processo irá abrir um navegador com uma página em %s. Entre nesta página e permita o <b>c:geo</b> aceder à sua conta. Se isso for aceite, %s vai mostrar um código PIN numérico. Este PIN deve ser colado em <b>c:geo</b> e confirmado. É tudo.</string>
-
- <!-- cache -->
- <plurals name="cache_counts">
- <item quantity="one">Uma cache</item>
- <item quantity="other">%1$d Caches</item>
- </plurals>
-
- <string name="cache_offline">Arquivo</string>
- <string name="cache_offline_refresh">Actualizar</string>
- <string name="cache_offline_drop">Apagar</string>
- <string name="cache_offline_store">Arquivar</string>
- <string name="cache_offline_stored">Arquivada no dispositivo</string>
- <string name="cache_offline_not_ready">Não está pronta\npara utilização offline</string>
- <string name="cache_offline_time_about">há</string>
- <string name="cache_offline_time_mins">minutos atrás</string>
- <string name="cache_offline_time_mins_few">alguns minutos atrás</string>
- <string name="cache_offline_time_hour">uma hora atrás</string>
- <string name="cache_offline_time_hours">horas atrás</string>
- <string name="cache_offline_time_days">dias atrás</string>
- <string name="cache_premium">Premium</string>
- <string name="cache_attributes">Atributos</string>
- <string name="cache_inventory">Inventário</string>
- <string name="cache_log_offline">Registo Offline</string>
- <string name="cache_log_images_title">Imagem do registo</string>
- <string name="cache_log_image_default_title">Foto</string>
- <string name="cache_personal_note">Nota pessoal</string>
- <string name="cache_personal_note_edit">Editar</string>
- <string name="cache_personal_note_upload">Enviar</string>
- <string name="cache_personal_note_uploading">A enviar nota pessoal</string>
- <string name="cache_personal_note_upload_done">Nota pessoal enviada</string>
- <string name="cache_personal_note_upload_cancelled">Envio de nota pessoal cancelado</string>
- <string name="cache_personal_note_unstored">Cache não guaradada</string>
- <string name="cache_personal_note_store">A cache vai ser guardada primeiro para permitir notas pessoais.</string>
- <string name="cache_description">Descrição</string>
- <string name="cache_description_long">Descrição longa</string>
- <string name="cache_description_table_note">A descrição contém a formatação da tabela que pode ser necessário para ser vista correctamente em %s.</string>
- <string name="cache_watchlist_on">Esta cache está na sua lista de observação.</string>
- <string name="cache_watchlist_not_on">Esta cache não está na sua lista de observação.</string>
- <string name="cache_watchlist_add">Adicionar à lista de observação</string>
- <string name="cache_watchlist_remove">Remover da lista de observação</string>
- <string name="cache_favpoint_on">Esta cache é uma das suas favoritas.</string>
- <string name="cache_favpoint_not_on">Esta cache não é uma das suas favoritas.</string>
- <string name="cache_favpoint_add">Adicionar</string>
- <string name="cache_favpoint_remove">Remover</string>
- <string name="cache_list_text">Lista:</string>
- <string name="cache_list_change">Mover</string>
- <string name="cache_list_unknown">Não está numa lista</string>
- <string name="cache_images">Imagens</string>
- <string name="cache_waypoints">Pontos de referência</string>
-
- <plurals name="waypoints">
- <item quantity="one">1 Waypoint</item>
- <item quantity="other">%d Waypoints</item>
- </plurals>
-
- <string name="cache_waypoints_add">Adicionar ponto de referência</string>
- <string name="cache_hint">Pista</string>
- <string name="cache_logs">Logbook</string>
- <string name="cache_logsfriends">Logbook (Amigos)</string>
- <string name="cache_dialog_loading_details">A carregar os detalhes da cache…</string>
- <string name="cache_dialog_loading_details_status_loadpage">A carregar a página</string>
- <string name="cache_dialog_loading_details_status_details">A processar os detalhes</string>
- <string name="cache_dialog_loading_details_status_spoilers">A carregar as imagens spoiler</string>
- <string name="cache_dialog_loading_details_status_logs">A carregar os registo</string>
- <string name="cache_dialog_loading_details_status_waypoints">A processar os waypoints</string>
- <string name="cache_dialog_loading_details_status_gcvote">A carregar GCVote</string>
- <string name="cache_dialog_loading_details_status_cache">A carregar dados</string>
- <string name="cache_dialog_loading_details_status_render">A renderizar a vista</string>
- <string name="cache_dialog_offline_save_title">Offline</string>
- <string name="cache_dialog_offline_save_message">A gravar cache para utilizar offline…</string>
- <string name="cache_dialog_offline_drop_title">Offline</string>
- <string name="cache_dialog_offline_drop_message">A remover a cache da memória do dispositivo…</string>
- <string name="cache_dialog_refresh_title">Actualizar</string>
- <string name="cache_dialog_refresh_message">A recarregar os detalhes da cache…</string>
- <string name="cache_dialog_watchlist_add_title">Lista de observação</string>
- <string name="cache_dialog_watchlist_add_message">A adicionar cache à lista de observação…</string>
- <string name="cache_dialog_watchlist_remove_title">Lista de observação</string>
- <string name="cache_dialog_watchlist_remove_message">A remover cache da lista de observação…</string>
- <string name="cache_dialog_favorite_add_title">Favorita</string>
- <string name="cache_dialog_favorite_add_message">Adicionar cache aos favoritos…</string>
- <string name="cache_dialog_favorite_remove_title">Favorita</string>
- <string name="cache_dialog_favorite_remove_message">Remover cache dos favoritos…</string>
- <string name="cache_menu_navigate">Navegar</string>
- <string name="cache_menu_navigation_drive">Navegar (Conduzir)</string>
- <string name="cache_menu_navigation_walk">Navegar (Caminhar)</string>
- <string name="cache_menu_navigation_bike">Navegar (Andar de bicicleta)</string>
- <string name="cache_menu_maps_directions">Direcções pelo Google Maps</string>
- <string name="cache_menu_radar">Radar</string>
- <string name="cache_menu_map">Mostrar no mapa</string>
- <string name="cache_menu_map_static">Mapas estáticos</string>
- <string name="cache_menu_download_map_static">Descarregar os mapas estáticos</string>
- <string name="cache_menu_rmaps">Rmaps</string>
- <string name="cache_menu_map_ext">Mostrar no mapa ext.</string>
- <string name="cache_menu_streetview">Vista de rua</string>
- <string name="cache_menu_browser">Abrir no browser</string>
- <string name="cache_menu_visit">Registar visita</string>
- <string name="cache_menu_visit_offline">Registar visita offline</string>
- <string name="cache_menu_spoilers">Imagens spoiler</string>
- <string name="cache_menu_around">Caches próximas</string>
- <string name="cache_menu_event">Adicionar ao calendário</string>
- <string name="cache_menu_details">Detalhes</string>
- <string name="cache_menu_refresh">Actualizar</string>
- <string name="cache_menu_share">Partilhar cache</string>
- <string name="cache_menu_move_list">Mover para outra lista</string>
- <string name="cache_menu_gcc">GCC</string>
- <string name="cache_menu_whereyougo">WhereYouGo</string>
- <string name="cache_menu_oruxmaps">OruxMaps</string>
- <string name="cache_menu_cachebeacon">Cache Beacon</string>
- <string name="cache_status">Estado</string>
- <string name="cache_status_offline_log">Registo gravado</string>
- <string name="cache_status_found">Encontrada</string>
- <string name="cache_status_archived">Arquivada</string>
- <string name="cache_status_disabled">Desactivada</string>
- <string name="cache_status_premium">Apenas membros premium</string>
- <string name="cache_status_not_premium">Acesso a todos os membros</string>
- <string name="cache_status_stored">Guardada</string>
- <string name="cache_status_not_stored">Não guardada</string>
- <string name="cache_geocode">Geo Código</string>
- <string name="cache_name">Nome</string>
- <string name="cache_type">Tipo</string>
- <string name="cache_size">Tamanho</string>
- <string name="cache_distance">Distância</string>
- <string name="cache_difficulty">Dificuldade</string>
- <string name="cache_terrain">Terreno</string>
- <string name="cache_rating">Pontuação</string>
- <string name="cache_own_rating">A minha pontuação</string>
- <string name="cache_rating_of">de</string>
- <string name="cache_favorite">Favorita</string>
- <string name="cache_owner">Dono</string>
- <string name="cache_hidden">Escondida</string>
- <string name="cache_event">Data</string>
- <string name="cache_location">Localização</string>
- <string name="cache_coordinates">Coordenadas</string>
- <string name="cache_coordinates_original">Coordenadas originais</string>
- <string name="cache_spoiler_images_title">Imagens spoiler</string>
- <string name="cache_images_title">Imagens</string>
- <string name="cache_log_types">Tipos de log</string>
- <string name="cache_coordinates_no">Esta cache não tem coordenadas.</string>
- <string name="cache_clear_history">Apagar histórico</string>
- <string name="cache_remove_from_history">Remover do histórico</string>
- <string name="cache_license">Licença</string>
- <string name="cache_image">Imagem</string>
- <string name="cache_image_open_file">Abrir como ficheiro</string>
- <string name="cache_image_open_browser">Abrir no browser</string>
- <string name="cache_share_field">Partilhar</string>
- <string name="cache_time_full_hours">o\'clock</string>
- <string name="cache_listed_on">Listada em %s</string>
-
- <!-- editor dialog -->
-
- <!-- file list base -->
- <string name="file_searching_in">A procurar ficheiros\nem</string>
- <string name="file_searching_sdcard_in">Nenhum ficheiro encontrado nas pastas predefinidas:\n%1$s\n\nA procurar no cartão de memória por ficheiros:\n</string>
- <string name="file_list_no_files">O c:geo não encontrou ficheiros adequados.</string>
- <string name="file_searching">A procurar ficheiros</string>
- <string name="file_title_searching">A procurar</string>
-
- <!-- simple_dir_chooser -->
- <string name="simple_dir_chooser_title">Escolher directório</string>
- <string name="simple_dir_chooser_current_path">Caminho:</string>
-
- <!-- gpx -->
- <string name="gpx_import_loading_caches">A carregar as caches do ficheiro .gpx</string>
- <string name="gpx_import_loading_waypoints">A carregar o ficheiro dos waypoints</string>
- <string name="gpx_import_store_static_maps">A gravar mapas estáticos</string>
- <string name="gpx_import_caches_imported">caches importadas</string>
- <string name="gpx_import_static_maps_skipped">Download of static maps aborted</string>
- <string name="gpx_import_title_static_maps">Gravar mapas estáticos</string>
- <string name="gpx_import_title_reading_file">A ler o ficheiro</string>
- <string name="gpx_import_title">Importar GPX</string>
- <string name="gpx_import_title_caches_imported">Resultado</string>
- <string name="gpx_import_title_caches_import_failed">A importação falhou</string>
- <string name="gpx_import_error_io">Não consegue ler o ficheiro</string>
- <string name="gpx_import_error_parser">Formato de ficheiro errado</string>
- <string name="gpx_import_error_unexpected">Erro inesperado</string>
- <string name="gpx_import_canceled">A importação GPX foi cancelada</string>
- <string name="gpx_import_delete_title">Eliminar ficheiro</string>
- <string name="gpx_import_delete_message">Quer eliminar %s?</string>
- <string name="gpx_import_select_list_title">Importar GPX para lista</string>
-
- <!-- map file select -->
- <string name="map_file_select_title">Seleccione ficheiro de mapa</string>
-
- <!-- theme file select -->
- <!-- import -->
- <string name="web_import_title">Importar da web</string>
- <string name="web_import_waiting">À espera de novas caches da web…</string>
- <string name="web_downloading">A transferir</string>
- <string name="web_downloaded">Transferido</string>
-
- <!-- popup -->
- <string name="popup_more">Mais detalhes</string>
-
- <!-- waypoint -->
- <string name="waypoint">Ponto de referência</string>
- <string name="waypoint_cache_coordinates">Coordenadas da cache</string>
- <string name="waypoint_custom">Personalizado</string>
- <string name="waypoint_my_coordinates">Minhas coordenadas</string>
- <string name="waypoint_bearing">Direcção em º</string>
- <string name="waypoint_distance">Distância</string>
- <string name="waypoint_name">Nome</string>
- <string name="waypoint_edit">Editar</string>
- <string name="waypoint_delete">Apagar</string>
- <string name="waypoint_edit_title">Editar ponto de referência</string>
- <string name="waypoint_add_title">Adicionar ponto de referência</string>
- <string name="waypoint_note">Nota</string>
- <string name="waypoint_visited">Visitado</string>
- <string name="waypoint_save">Gravar</string>
- <string name="waypoint_loading">A carregar ponto de referência…</string>
- <string name="waypoint_do_not_touch_cache_coordinates">Nenhuma mudança às coordenadas da cache</string>
- <string name="waypoint_set_as_cache_coords">Definir como coordenadas da cache no c:geo</string>
- <string name="waypoint_save_and_modify_on_website">Definir como coordenadas da cache no c:geo e no site</string>
- <string name="waypoint_reset_cache_coords">Redefinir as coordenadas da cache</string>
- <string name="waypoint_coordinates_has_been_reset_on_website">Coordenadas da cache foram redefinidas no site.</string>
- <string name="waypoint_coordinates_being_reset_on_website">A redefinir as coordenadas da cache no site…</string>
- <string name="waypoint_reset">Redefinir</string>
- <string name="waypoint_localy_reset_cache_coords">Redefinir no c:geo</string>
- <string name="waypoint_reset_local_and_remote_cache_coords">Redefinir no c:geo e no site</string>
- <string name="waypoint_being_saved">A guardar pontos de referência…</string>
- <string name="waypoint_coordinates_couldnt_be_modified_on_website">O site não suporta modificar as coordenadas da cache.</string>
- <string name="waypoint_coordinates_upload_error">Ocorreu um erro ao modificar as coordenadas no site.</string>
- <string name="waypoint_coordinates_uploading_to_website">A enviar as coordenadas para o site %s.</string>
- <string name="waypoint_coordinates_has_been_modified_on_website">As coordenadas da cache no site foram modificados para: %s.</string>
- <string name="waypoint_done">Feito</string>
- <string name="waypoint_duplicate">Duplicar</string>
- <string name="waypoint_copy_of">Cópia de</string>
- <string name="search_history">Histórico</string>
- <string name="search_history_empty">Não existem destinos recentes</string>
- <string name="search_remove_destination">Destino removido</string>
- <string name="search_clear_history">Limpar histórico</string>
- <string name="search_history_cleared">Histórico limpo</string>
- <string name="waypoint_coordinate_formats_plain">Plano</string>
-
- <!-- visit -->
- <string name="visit_tweet">Publicar esta descoberta no Twitter</string>
-
- <!-- map -->
- <string name="map_map">Mapa</string>
- <string name="map_live">Mapa ao vivo</string>
- <string name="map_view_map">Vista de mapa</string>
- <string name="map_modes">Modos de mapa</string>
- <string name="map_trail_show">Mostrar caminho</string>
- <string name="map_trail_hide">Esconder caminho</string>
- <string name="map_circles_show">Mostrar círculos</string>
- <string name="map_circles_hide">Esconder círculos</string>
- <string name="map_theme_builtin">Padrão</string>
- <string name="map_theme_select">Selecione o tema de mapa</string>
- <string name="map_live_enable">Activar ao vivo</string>
- <string name="map_live_disable">Desactivar ao vivo</string>
- <string name="map_static_title">Mapas estáticos</string>
- <string name="map_static_loading">A carregar mapas estáticos…</string>
- <string name="map_token_err">Como o c:geo apenas pode transferir dados parciais, as coordenadas das caches podem não ser precisas.</string>
- <string name="map_as_list">Mostrar como lista</string>
- <string name="map_strategy">Estratégia</string>
- <string name="map_strategy_title">Mapa de estratégia ao vivo</string>
- <string name="map_strategy_fastest">Mais rápido</string>
- <string name="map_strategy_fast">Rápido</string>
- <string name="map_strategy_auto">Dependente da velocidade</string>
- <string name="map_strategy_detailed">Detalhado</string>
- <string name="live_map_notification">No novo mapa ao vivo as coordenadas podem nem sempre ser precisas. As coordenadas possivelmente imprecisas são marcadas com um círculo cor de laranja.\nAbrindo os detalhes da cache or gravando a cache para utilização offline fará com que obtenha as coordenadas precisas.\n\nMais informações em todas as alterações podem ser encontradas na página \"Sobre c:geo\" na aplicação.</string>
- <string name="live_map_note_dontshow">Não mostrar novamente</string>
-
- <!-- search -->
- <string name="search_bar_hint">Procurar caches</string>
- <string name="search_bar_desc">Caches (código-GC, palavra-chave), Trackables (código-TB)</string>
- <string name="search_coordinates">Coordenadas</string>
- <string name="search_coordinates_button">Pesquisar por coordenadas</string>
- <string name="search_address">Endereço</string>
- <string name="search_address_button">Pesquisar por endereço</string>
- <string name="search_geo">Geo código</string>
- <string name="search_geo_button">Pesquisar por geo código</string>
- <string name="search_kw">Palavras-chave</string>
- <string name="search_kw_prefill">Palavra-chave</string>
- <string name="search_kw_button">Pesquisar por palavra-chave</string>
- <string name="search_fbu">Encontradas pelo utilizador</string>
- <string name="search_fbu_prefill">Nome de utilizador</string>
- <string name="search_fbu_button">Pesquisar por utilizador</string>
- <string name="search_hbu">Escondida pelos utilizadores</string>
- <string name="search_hbu_prefill">Dono</string>
- <string name="search_hbu_button">Pesquisar pelo dono</string>
- <string name="search_tb">Trackable</string>
- <string name="search_tb_hint">Identificação do trackable</string>
- <string name="search_tb_button">Pesquisar por trackable</string>
- <string name="search_destination">Destino</string>
- <string name="search_direction_rel">A partir desta posição</string>
- <string name="search_address_started">Pesquisar por lugares</string>
- <string name="search_address_result">Encontrar lugares</string>
- <string name="search_own_caches">Pesquisar as minhas caches</string>
-
- <!-- trackable -->
- <string name="trackable">Trackable</string>
- <string name="trackable_details_loading">A carregar os detalhes trackable…</string>
- <string name="trackable_log_touch">Registar toque</string>
- <string name="trackable_browser_open">Abrir no browser</string>
- <string name="trackable_goal">Objectivo</string>
- <string name="trackable_details">Detalhes</string>
- <string name="trackable_image">Imagem</string>
- <string name="trackable_code">Código TB</string>
- <string name="trackable_name">Nome</string>
- <string name="trackable_type">Tipo</string>
- <string name="trackable_owner">Dono</string>
- <string name="trackable_spotted">Visto</string>
- <string name="trackable_spotted_in_cache">Em</string>
- <string name="trackable_spotted_at_user">Nas mãos de</string>
- <string name="trackable_spotted_unknown_location">Localização desconhecida</string>
- <string name="trackable_spotted_owner">Nas mãos do dono</string>
- <string name="trackable_origin">Origem</string>
- <string name="trackable_unknown">Desconhecido</string>
- <string name="trackable_released">Criado</string>
- <string name="trackable_distance">Viajado</string>
- <string name="trackable_touch">Toque</string>
- <string name="trackable_not_activated">Trackable não activado</string>
-
- <string name="geokret_type_traditional">Tradicional</string>
- <string name="geokret_type_book_or_media">Livro ou média electrónica</string>
- <string name="geokret_type_human">Humano</string>
- <string name="geokret_type_coin">Moeda</string>
- <string name="geokret_type_post">Correio</string>
-
- <!-- user -->
- <string name="user_menu_title">Sobre</string>
- <string name="user_menu_view_hidden">Caches escondidas</string>
- <string name="user_menu_view_found">Caches encontradas</string>
- <string name="user_menu_open_browser">Abrir perfil no browser</string>
- <string name="user_menu_send_message">Enviar mensagem</string>
-
- <!-- navigation -->
- <string name="navigation">Navegação</string>
- <string name="compass_title">Bússola</string>
- <string name="use_gps">Utilizar GPS</string>
- <string name="use_compass">Utilizar Bússola</string>
- <string name="destination_select">Seleccionar destino</string>
- <string name="destination_set">Definir destino</string>
- <string name="navigation_direct_navigation">Navegação directa</string>
- <string name="navigation_target">Destino</string>
-
- <!-- license -->
- <string name="license">Licença</string>
- <string name="license_show">Mostrar licença</string>
- <string name="license_dismiss">Dispensar</string>
-
- <!-- helpers -->
- <string name="helper_calendar_title">Add on calendário para c:geo </string>
- <string name="helper_calendar_missing">Add on calendário para o c:geo não está instalado.</string>
- <string name="helper_calendar_description">Permite exportar caches evento para o calendário do seu dispositivo.</string>
- <string name="helper_locus_title">Locus</string>
- <string name="helper_locus_description">Aplicação simples e útil, que mostra mapas online e permite transferi-los directamente para o modo offline (apenas mapas raster). Também suporta a gravação de caminhos, gestão de PDI e muitas outras funções úteis.</string>
- <string name="helper_gpsstatus_title">Estado do GPS</string>
- <string name="helper_gpsstatus_description">Pode usar o radar a partir desta aplicação. Também fornece muitas outras informações relacionadas com o GPS.</string>
- <string name="helper_bluetoothgps_title">GPS por bluetooth</string>
- <string name="helper_bluetoothgps_description">Permite utilizar um GPS externo, para uma melhor recepção, localização mais precisa e permite poupar a bateria do seu telemóvel.</string>
- <string name="helper_barcode_title">Barcode Scanner</string>
- <string name="helper_barcode_description">Existem scripts Greasemonkey e websites que permitem mostrar um geo código com um código barras. Com esta aplicação o c:geo consegue ler o código barras directamente do ecrã do seu computador.</string>
- <string name="helper_pocketquery_title">Criador de Pocket Query</string>
- <string name="helper_pocketquery_description">Permite a fácil criação de consultas e download de Pocket Query centrado na sua posição actual ou um ponto selecionado a partir de um mapa. Requer uma conta premium em Geocaching.com.</string>
-
- <!-- add-ons -->
- <string name="addon_missing_title">Add-On em falta</string>
- <string name="addon_download_prompt">Obter agora a partir de Google Play.</string>
-
- <!-- export -->
- <string name="export">Exportar</string>
- <string name="export_exportedto">exportado para</string>
- <string name="export_failed">Exportação falhou</string>
- <string name="export_fieldnotes">Notas de campo</string>
- <string name="export_fieldnotes_info">As notas de campo serão exportadas para /sdcard/field-notes com a data e a hora actual como nome de ficheiro.</string>
- <string name="export_fieldnotes_upload">Enviar para geocaching.com</string>
- <string name="export_fieldnotes_uploading">A enviar…</string>
- <string name="export_fieldnotes_upload_success">Envio para geocaching.com bem sucedido</string>
- <string name="export_fieldnotes_onlynew">Apenas a partir da última exportação</string>
- <string name="export_fieldnotes_creating">A criar as notas de campo…</string>
- <string name="export_gpx">GPX</string>
- <string name="export_gpx_info">O ficheiro GPX vai ser exportado para %1$s com a data e a hora actual como nome de ficheiro.</string>
- <string name="export_gpx_to">Enviar GPX exportado para</string>
-
- <!-- GC attributes -->
- <string name="attribute_dogs_yes">Cães permitidos</string>
- <string name="attribute_dogs_no">Cães não permitidos</string>
- <string name="attribute_bicycles_yes">Bicicletas permitidas</string>
- <string name="attribute_bicycles_no">Bicicletas não permitidas</string>
- <string name="attribute_motorcycles_yes">Motociclos permitidos</string>
- <string name="attribute_motorcycles_no">Motociclos não permitidos</string>
- <string name="attribute_quads_yes">Quadriciclos permitidos</string>
- <string name="attribute_quads_no">Quadriciclos não permitidos</string>
- <string name="attribute_jeeps_yes">Veículos todo-o-tereno permitidos</string>
- <string name="attribute_jeeps_no">Veículos todo-o-tereno não permitidos</string>
- <string name="attribute_snowmobiles_yes">Veículos de neve permitidos</string>
- <string name="attribute_snowmobiles_no">Veículos de neve não permitidos</string>
- <string name="attribute_horses_yes">Cavalos permitidos</string>
- <string name="attribute_horses_no">Cavalos não permitidos</string>
- <string name="attribute_campfires_yes">Fogueiras permitidas</string>
- <string name="attribute_campfires_no">Fogueiras não permitidas</string>
- <string name="attribute_rv_yes">Roulottes permitidas</string>
- <string name="attribute_rv_no">Roulottes não permitidas</string>
- <string name="attribute_kids_yes">Recomendado para crianças</string>
- <string name="attribute_kids_no">Não recomendado para crianças</string>
- <string name="attribute_onehour_yes">Demora menos de uma hora</string>
- <string name="attribute_onehour_no">Demora mais de uma hora</string>
- <string name="attribute_scenic_yes">Vista panorâmica</string>
- <string name="attribute_scenic_no">Sem vista panorâmica</string>
- <string name="attribute_hiking_yes">Caminhada considerável</string>
- <string name="attribute_hiking_no">Caminhada insignificante</string>
- <string name="attribute_climbing_yes">Subida difícil</string>
- <string name="attribute_climbing_no">Sem subida difícil</string>
- <string name="attribute_wading_yes">Pode requerer caminhar em local alagado</string>
- <string name="attribute_wading_no">Não requer caminhar em local alagado</string>
- <string name="attribute_swimming_yes">Pode ser necessário nadar</string>
- <string name="attribute_swimming_no">Não é necessário nadar</string>
- <string name="attribute_available_yes">Disponível a toda a hora</string>
- <string name="attribute_available_no">Não disponível a toda a hora</string>
- <string name="attribute_night_yes">Recomendada à noite</string>
- <string name="attribute_night_no">Não recomendada à noite</string>
- <string name="attribute_winter_yes">Disponível no Inverno</string>
- <string name="attribute_winter_no">Não disponível no Inverno</string>
- <string name="attribute_stealth_yes">É necessário ser discreto</string>
- <string name="attribute_stealth_no">Não é necessário ser discreto</string>
- <string name="attribute_firstaid_yes">Precisa de manutenção</string>
- <string name="attribute_firstaid_no">Não precisa de manutenção</string>
- <string name="attribute_cow_yes">Cuidado com o gado</string>
- <string name="attribute_cow_no">Gado inexistente</string>
- <string name="attribute_field_puzzle_yes">Quebra-cabeças de campo</string>
- <string name="attribute_field_puzzle_no">Não é um quebra-cabeças de campo</string>
- <string name="attribute_nightcache_yes">Cache nocturna</string>
- <string name="attribute_nightcache_no">Cache não nocturna</string>
- <string name="attribute_parkngrab_yes">Estacionar e encontrar</string>
- <string name="attribute_parkngrab_no">Não é só estacionar e encontrar</string>
- <string name="attribute_abandonedbuilding_yes">Estrutura abandonada</string>
- <string name="attribute_abandonedbuilding_no">Não é uma estrutura abandonada</string>
- <string name="attribute_hike_short_yes">Pequena caminhada (menos de 1 Km)</string>
- <string name="attribute_hike_short_no">Não é uma pequena caminhada</string>
- <string name="attribute_hike_med_yes">Caminhada média (1 Km a 10 Km)</string>
- <string name="attribute_hike_med_no">Não é uma caminhada média</string>
- <string name="attribute_hike_long_yes">Longa caminhada (mais de 10 Km)</string>
- <string name="attribute_hike_long_no">Não é uma longa caminhada</string>
- <string name="attribute_seasonal_yes">Acesso sazonal</string>
- <string name="attribute_seasonal_no">Não é de acesso sazonal</string>
- <string name="attribute_touristok_yes">Turística</string>
- <string name="attribute_touristok_no">Não turística</string>
- <string name="attribute_frontyard_yes">Residência privada</string>
- <string name="attribute_frontyard_no">Não é uma residência privada</string>
- <string name="attribute_teamwork_yes">Requer trabalho de equipa</string>
- <string name="attribute_teamwork_no">Não requer trabalho de equipa</string>
- <string name="attribute_landf_yes">Passeio de perdidos e achados</string>
- <string name="attribute_landf_no">Não é um passeio de perdidos e achados</string>
- <string name="attribute_partnership_yes">Cache de parceria</string>
- <string name="attribute_partnership_no">Não é uma cache de parceria</string>
- <string name="attribute_fee_yes">Taxa de acesso ou estacionamento aplicável</string>
- <string name="attribute_fee_no">Não tem taxa de acesso ou estacionamento</string>
- <string name="attribute_rappelling_yes">Requer equipamento de escalada</string>
- <string name="attribute_rappelling_no">Não requer equipamento de escalada</string>
- <string name="attribute_boat_yes">Requer barco</string>
- <string name="attribute_boat_no">Não requer barco</string>
- <string name="attribute_scuba_yes">Requer equipamento de mergulho</string>
- <string name="attribute_scuba_no">Não requer equipamento de mergulho</string>
- <string name="attribute_flashlight_yes">Requer lanterna</string>
- <string name="attribute_flashlight_no">Não requer lanterna</string>
- <string name="attribute_uv_yes">Requer luz UV</string>
- <string name="attribute_uv_no">Não requer luz UV</string>
- <string name="attribute_snowshoes_yes">Requer calçado de neve</string>
- <string name="attribute_snowshoes_no">Não requer calçado de neve</string>
- <string name="attribute_skiis_yes">Requer equipamento de esqui nórdico</string>
- <string name="attribute_skiis_no">Não requer equipamento de esqui nórdico</string>
- <string name="attribute_s_tool_yes">Requer ferramentas especiais</string>
- <string name="attribute_s_tool_no">Não requer ferramentas especiais</string>
- <string name="attribute_wirelessbeacon_yes">Sinal de rede sem fios</string>
- <string name="attribute_wirelessbeacon_no">Sem sinal de rede sem fios</string>
- <string name="attribute_treeclimbing_yes">Requer subida a árvores</string>
- <string name="attribute_treeclimbing_no">Não requer subida a árvores</string>
- <string name="attribute_poisonoak_yes">Plantas venenosas</string>
- <string name="attribute_poisonoak_no">Sem plantas venenosas</string>
- <string name="attribute_dangerousanimals_yes">Animais perigosos</string>
- <string name="attribute_dangerousanimals_no">Sem animais perigosos</string>
- <string name="attribute_ticks_yes">Carraças</string>
- <string name="attribute_ticks_no">Sem carraças</string>
- <string name="attribute_mine_yes">Minas abandonadas</string>
- <string name="attribute_mine_no">Sem minas abandonadas</string>
- <string name="attribute_cliff_yes">Falésia / queda de pedras</string>
- <string name="attribute_cliff_no">Sem falésia / queda de pedras</string>
- <string name="attribute_hunting_yes">Caça</string>
- <string name="attribute_hunting_no">Sem caça</string>
- <string name="attribute_danger_yes">Área perigosa</string>
- <string name="attribute_danger_no">Área não perigosa</string>
- <string name="attribute_thorn_yes">Espinhos</string>
- <string name="attribute_thorn_no">Sem espinhos</string>
- <string name="attribute_wheelchair_yes">Acesso a cadeiras de rodas</string>
- <string name="attribute_wheelchair_no">Sem acesso a cadeiras de rodas</string>
- <string name="attribute_parking_yes">Estacionamento disponível</string>
- <string name="attribute_parking_no">Estacionamento não disponível</string>
- <string name="attribute_public_yes">Transporte público</string>
- <string name="attribute_public_no">Sem transporte público</string>
- <string name="attribute_water_yes">Água potável por perto</string>
- <string name="attribute_water_no">Sem água potável por perto</string>
- <string name="attribute_restrooms_yes">Casas de banho públicas por perto</string>
- <string name="attribute_restrooms_no">Sem casas de banho públicas por perto</string>
- <string name="attribute_phone_yes">Telefone por perto</string>
- <string name="attribute_phone_no">Sem telefone por perto</string>
- <string name="attribute_picnic_yes">Mesas de piquenique por perto</string>
- <string name="attribute_picnic_no">Sem mesas de piquenique por perto</string>
- <string name="attribute_camping_yes">Campismo disponível</string>
- <string name="attribute_camping_no">Sem campismo disponível</string>
- <string name="attribute_stroller_yes">Acessível a carrinhos de bebé</string>
- <string name="attribute_stroller_no">Não acessível a carinhos de bebé</string>
- <string name="attribute_fuel_yes">Abastecimento de combustível por perto</string>
- <string name="attribute_fuel_no">Sem abastecimento de combustível por perto</string>
- <string name="attribute_food_yes">Comida por perto</string>
- <string name="attribute_food_no">Sem comida por perto</string>
- <string name="attribute_oc_only_yes">Só dá para registar em Opencaching</string>
- <string name="attribute_oc_only_no">Dá registar em Opencaching e não só</string>
- <string name="attribute_link_only_yes">Ligação para outro portal de caching</string>
- <string name="attribute_link_only_no">Não só ligação para outro portal de caching</string>
- <string name="attribute_letterbox_yes">Caixa de correio (precisa de selo)</string>
- <string name="attribute_letterbox_no">Caixa de correio (não precisa de selo)</string>
- <string name="attribute_railway_yes">Caminho de ferro activo próximo</string>
- <string name="attribute_railway_no">Sem caminho de ferro activo próximo</string>
- <string name="attribute_syringe_yes">Primeiros socorros disponíveis</string>
- <string name="attribute_syringe_no">Sem primeiros socorros disponíveis</string>
- <string name="attribute_swamp_yes">Pântano</string>
- <string name="attribute_swamp_no">Sem pântano</string>
- <string name="attribute_hills_yes">Área montanhosa</string>
- <string name="attribute_hills_no">Área não montanhosa</string>
- <string name="attribute_easy_climbing_yes">Escalada leve</string>
- <string name="attribute_easy_climbing_no">Escalada não leve</string>
- <string name="attribute_poi_yes">Ponto de interesse</string>
- <string name="attribute_poi_no">Não é ponto de interesse</string>
- <string name="attribute_moving_target_yes">Alvo em movimento</string>
- <string name="attribute_moving_target_no">Alvo não em movimento</string>
- <string name="attribute_webcam_yes">Webcam</string>
- <string name="attribute_webcam_no">Sem webcam</string>
- <string name="attribute_inside_yes">Dentro de locais fechados (grutas, edifícios, etc)</string>
- <string name="attribute_inside_no">Fora de locais fechados</string>
- <string name="attribute_in_water_yes">Na água</string>
- <string name="attribute_in_water_no">Fora da água</string>
- <string name="attribute_no_gps_yes">Sem GPS (caixas de correio, bússola, …)</string>
- <string name="attribute_no_gps_no">Com GPS</string>
- <string name="attribute_overnight_yes">Necessário pernoitar</string>
- <string name="attribute_overnight_no">Não necessário pernoitar</string>
- <string name="attribute_specific_times_yes">Disponível apenas em horários específicos</string>
- <string name="attribute_specific_times_no">Não só disponível em horários especificados</string>
- <string name="attribute_day_yes">Apendas de dia</string>
- <string name="attribute_day_no">Não só de dia</string>
- <string name="attribute_tide_yes">Maré</string>
- <string name="attribute_tide_no">Sem maré</string>
- <string name="attribute_all_seasons_yes">Todas as estações</string>
- <string name="attribute_all_seasons_no">Não em todas as estações</string>
- <string name="attribute_breeding_yes">Época de reprodução / natureza protegida</string>
- <string name="attribute_breeding_no">Não tem época de reprodução / natureza protegida</string>
- <string name="attribute_snow_proof_yes">Esconderijo à prova de neve</string>
- <string name="attribute_snow_proof_no">Esconderijo não à prova de neve</string>
- <string name="attribute_compass_yes">Bússola</string>
- <string name="attribute_compass_no">Sem bússola</string>
- <string name="attribute_cave_yes">Equipamento para caverna</string>
- <string name="attribute_cave_no">Sem equipamento para caverna</string>
- <string name="attribute_aircraft_yes">Aeronave</string>
- <string name="attribute_aircraft_no">Não aeronave</string>
- <string name="attribute_investigation_yes">Investigação</string>
- <string name="attribute_investigation_no">Não investigação</string>
- <string name="attribute_puzzle_yes">Puzzle / Mistério</string>
- <string name="attribute_puzzle_no">Não Puzzle / Mistério</string>
- <string name="attribute_arithmetic_yes">Problema aritmético</string>
- <string name="attribute_arithmetic_no">Sem problema aritmético</string>
- <string name="attribute_other_cache_yes">Outro tipo de cache</string>
- <string name="attribute_other_cache_no">Não é outro tipo de cache</string>
- <string name="attribute_ask_owner_yes">Pergunte ao dono as condições de início</string>
- <string name="attribute_ask_owner_no">Não pergunte ao dono as condições de início</string>
- <string name="attribute_unknown_yes">Atributo desconhecido presente</string>
- <string name="attribute_unknown_no">Sem atributo desconhecido presente</string>
- <string name="attribute_geotour_yes">Parte de GeoTour</string>
- <string name="attribute_geotour_no">Não é parte de GeoTour</string>
-
- <!-- next things -->
- <string name="quote">Para tornar o geocaching mais fácil, para tornar os utilizadores mais preguiçosos.</string>
- <string name="powered_by">carnero</string>
- <!-- Note: Links here are just for appearance. See AboutActivity to make changes -->
- <string name="support">Suporte: <a href="">support@cgeo.org</a></string>
- <string name="website">Site na internet: <a href="">cgeo.org</a></string>
- <string name="facebook">Facebook: <a href="">página do c:geo</a></string>
- <string name="twitter">Twitter: <a href="">@android_GC</a></string>
- <string name="nutshellmanual">Manual: <a href="">o essencial do c:geo</a></string>
- <string name="market">Android: <a href="">c:geo no Google Play</a></string>
- <string name="about_twitter">O <b>c:geo</b> deve publicar no Twitter de cada vez que uma cache for registada?</string>
-
- <!-- status (used via string based resource loading) -->
- <string name="status_new_release" tools:ignore="UnusedResources">Nova versão disponível.\nClique para instalar.</string>
- <string name="status_new_nightly" tools:ignore="UnusedResources">Nova \'nightly build\' disponível.\nClique para instalar.</string>
- <string name="status_new_rc" tools:ignore="UnusedResources">Nova \'release candidate\' disponível .\nClique para instalar.</string>
- <string name="status_geocaching_change" tools:ignore="UnusedResources">Alterações recentes em geocaching.com fizeram com que c:geo funcione mal.\nEstamos a trabalhar nisto, verifique de novo mais tarde.</string>
- <string name="status_geocaching_livemap" tools:ignore="UnusedResources">Alterações recentes em geocaching.com fizeram com o mapa ao vivo não funcione bem.\nEstamos a trabalhar nisto, verifique de novo mais tarde.</string>
- <string name="status_closeout_warning" tools:ignore="UnusedResources">Parece estar a utilizar uma versão do Android inferior a 2.1. Futuras versões do c: geo podem deixar de ficar disponíveis para o seu dispositivo.</string>
-
- <!-- text-to-speech for compass view -->
- <string name="tts_service">Bússola que fala</string>
- <string name="tts_start">Comece a falar</string>
- <string name="tts_stop">Páre de falar</string>
- <string name="tts_one_kilometer" tools:ignore="Typos">um quilómetro</string>
- <plurals name="tts_kilometers">
- <item quantity="one">%s quilómetro</item>
- <item quantity="other">%s quilómetro</item>
- </plurals>
- <string name="tts_one_meter">um metro</string>
- <plurals name="tts_meters">
- <item quantity="one">%s metro</item>
- <item quantity="other">%s metros</item>
- </plurals>
- <string name="tts_one_mile">uma milha</string>
- <plurals name="tts_miles">
- <item quantity="one">%s milha</item>
- <item quantity="other">%s milhas</item>
- </plurals>
- <string name="tts_one_foot">um pé</string>
- <plurals name="tts_feet">
- <item quantity="one">%s pé</item>
- <item quantity="other">%s pés</item>
- </plurals>
- <string name="tts_one_oclock">uma hora</string>
- <string name="tts_oclock">%s horas</string>
-
- <!-- various -->
- <string name="clipboard_copy_ok">Copiado para a área de transferência</string>
- <plurals name="days_ago">
- <item quantity="one">ontem</item>
- <item quantity="other">%d dias atrás</item>
- </plurals>
-
+ <string name="app_name">c:geo</string>
+ <string name="cache">Cache</string>
+ <string name="detail">Detalhes</string>
+ <string name="search">Pesquisar</string>
+ <string name="helpers">Apps Úteis</string>
+ <string name="about">Sobre c:geo</string>
+ <string name="latitude">Latitude</string>
+ <string name="longitude">Longitude</string>
+ <string name="action_bar_share_title">Partilhar ligação para a cache</string>
+ <string name="settings_titlebar">c:geo Definições</string>
+ <string name="all_types">Todos os tipos</string>
+ <string name="traditional">Cache tradicional</string>
+ <string name="multi">Multi-cache</string>
+ <string name="mystery">Cache mistério</string>
+ <string name="letterbox">Caixa de correio híbrida</string>
+ <string name="event">Cache evento</string>
+ <string name="mega">Cache mega-evento</string>
+ <string name="earth">Cache Terra</string>
+ <string name="cito">Evento Cache In Trash Out</string>
+ <string name="webcam">Cache webcam</string>
+ <string name="virtual">Cache virtual</string>
+ <string name="wherigo">Cache wherigo</string>
+ <string name="lostfound">Perdidos e achados</string>
+ <string name="ape">Cache projecto APE</string>
+ <string name="gchq">Groundspeak hq</string>
+ <string name="gps">Cache exposição GPS</string>
+ <string name="block">Groundspeak Block Party</string>
+ <string name="unknown">Tipo Desconhecido</string>
+ <string name="cache_size_micro">Micro</string>
+ <string name="cache_size_small">Pequena</string>
+ <string name="cache_size_regular">Normal</string>
+ <string name="cache_size_large">Grande</string>
+ <string name="cache_size_other">Outra</string>
+ <string name="cache_size_virtual">Virtual</string>
+ <string name="cache_size_notchosen">Não especificado</string>
+ <string name="cache_size_unknown">Desconhecido</string>
+ <string name="wp_final">Localização final</string>
+ <string name="wp_stage">Estado da multi-cache</string>
+ <string name="wp_puzzle">Pergunta para a resposta</string>
+ <string name="wp_pkg">Parque de estacionamento</string>
+ <string name="wp_trailhead">Início</string>
+ <string name="wp_waypoint">Ponto de referência</string>
+ <string name="wp_original">Coordenadas Originais</string>
+ <string name="log_found">Encontrei</string>
+ <string name="log_dnf">Não encontrei</string>
+ <string name="log_note">Nota</string>
+ <string name="log_published">Publicado</string>
+ <string name="log_enabled">Activo</string>
+ <string name="log_disabled">Desactivo</string>
+ <string name="log_attend">Vou participar</string>
+ <string name="log_attended">Participei</string>
+ <string name="log_retrieved">Retirado</string>
+ <string name="log_placed">Colocado</string>
+ <string name="log_grabbed">Agarrado</string>
+ <string name="log_movecollection">Mover para colecção</string>
+ <string name="log_moveinventory">Mover para inventário</string>
+ <string name="log_maintained">Manutenção efectuada</string>
+ <string name="log_maintenance_needed">Precisa manutenção</string>
+ <string name="log_update">Coordenadas actualizadas</string>
+ <string name="log_archived">Arquivada</string>
+ <string name="log_unarchived">Desarquivada</string>
+ <string name="log_needs_archived">Precisa de arquivamento</string>
+ <string name="log_discovered">Descoberta</string>
+ <string name="log_reviewer">Nota de revisor</string>
+ <string name="log_retractlisting">Retirar Lista</string>
+ <string name="log_marked_missing">Marcado em falta</string>
+ <string name="log_tb_nothing">Não fazer nada</string>
+ <string name="log_tb_visit">Visitei</string>
+ <string name="log_tb_drop">Deixei aqui</string>
+ <string name="log_tb_changeall">Alterar todos</string>
+ <string name="log_save">Gravar</string>
+ <string name="log_saving">A gravar o registo…</string>
+ <string name="log_saving_and_uploading">A enviar o registo e a imagem…</string>
+ <string name="log_clear">Limpar</string>
+ <string name="log_post">Publicar o registo</string>
+ <string name="log_post_rate">Publicar registo &amp; Votar</string>
+ <string name="log_post_no_rate">Publicar registo &amp; Não votar</string>
+ <string name="log_post_not_possible">A carregar página de registo…</string>
+ <string name="log_add">Adicionar</string>
+ <string name="log_rating">Pontuação</string>
+ <string name="log_no_rating">Não votar</string>
+ <string name="log_stars_1">1 estrela</string>
+ <string name="log_stars_15">1.5 estrelas</string>
+ <string name="log_stars_2">2 estrelas</string>
+ <string name="log_stars_25">2.5 estrelas</string>
+ <string name="log_stars_3">3 estrelas</string>
+ <string name="log_stars_35">3.5 estrelas</string>
+ <string name="log_stars_4">4 estrelas</string>
+ <string name="log_stars_45">4.5 estrelas</string>
+ <string name="log_stars_5">5 estrelas</string>
+ <string name="log_stars_1_description">Terrível</string>
+ <string name="log_stars_15_description">Muito má</string>
+ <string name="log_stars_2_description">Má</string>
+ <string name="log_stars_25_description">Abaixo da média</string>
+ <string name="log_stars_3_description">Mediana</string>
+ <string name="log_stars_35_description">Acima da média</string>
+ <string name="log_stars_4_description">Boa</string>
+ <string name="log_stars_45_description">Muito boa</string>
+ <string name="log_stars_5_description">Excelente</string>
+ <string name="log_webcam">Fotografia tirada pela webcam</string>
+ <string name="log_new_log">Registar</string>
+ <string name="log_new_log_text">Registar texto</string>
+ <string name="log_announcement">Anúncio</string>
+ <string name="log_today">Hoje</string>
+ <string name="log_yesterday">Ontem</string>
+ <string name="log_smilies">Smilies</string>
+ <string name="log_image">Imagem</string>
+ <string name="log_image_attach">Anexar Imagem</string>
+ <string name="log_image_edit">Editar Imagem</string>
+ <string name="log_image_stored">Existente</string>
+ <string name="log_image_camera">Nova</string>
+ <string name="log_image_caption">Título</string>
+ <string name="log_image_description">Descrição</string>
+ <string name="log_image_scale">Dimensionamento</string>
+ <string name="log_password_title">Password do registo:</string>
+ <string name="log_hint_log_password">Inserira a password do registo</string>
+ <string name="translate_to_sys_lang">Traduzir para %s</string>
+ <string name="translate_to_english">Traduzir para inglês</string>
+ <string name="translate_length_warning">A tradução pode falhar se o texto fôr muito grande.</string>
+ <string name="err_none">Ok</string>
+ <string name="err_start">Comunicação não iniciada</string>
+ <string name="err_parse">Falha na análise da página de login</string>
+ <string name="err_server">Falha na ligação a Geocaching.com (servidor ou ligação em baixo?)</string>
+ <string name="err_login">Informação de login não gravada</string>
+ <string name="err_login_failed">O c:geo não consegue fazer login.</string>
+ <string name="err_login_failed_toast">O c:geo não consegue fazer login. O c:geo funciona offline com as caches Arquivadas. Verifique as definições de login ou habilite a ligação de dados.</string>
+ <string name="err_unknown">Erro desconhecido</string>
+ <string name="err_comm">Erro de comunicação desconhecido</string>
+ <string name="err_missing_auth">Sem nome de utilizador/password definidos.</string>
+ <string name="err_wrong">Dados de login inválidos</string>
+ <string name="err_maintenance">Geocaching.com está em manutenção. O c:geo funciona offline com as caches Arquivadas.</string>
+ <string name="err_license">O utilizador não concordou com a licença de utilização de Geocaching.com, por isso c:geo não pode carregar as coordenadas da cache.</string>
+ <string name="err_unvalidated_account">Deve validar a sua conta primeiro em Geocaching.com.</string>
+ <string name="err_unpublished">A cache pedida não está publicada.</string>
+ <string name="err_premium_only">Esta cache só está disponível para membros premium do Geocaching.com.</string>
+ <string name="err_detail_open">O c:geo não consegue abrir os detalhes da geocache.</string>
+ <string name="err_detail_cache">O c:geo não consegue mostrar a cache pretendida. É mesmo uma geocache?</string>
+ <string name="err_detail_cache_find">O c:geo não encontra a geocache</string>
+ <string name="err_detail_cache_find_some">O c:geo não encontra essa geocache.</string>
+ <string name="err_detail_cache_find_any">O c:geo não encontra qualquer geocache.</string>
+ <string name="err_detail_cache_forgot">O c:geo esqueceu a geocache pretendida.</string>
+ <string name="err_detail_google_maps_limit_reached">O c:geo falhou no download dos mapas. Talvez o tenha atingido o limite do Google Maps.</string>
+ <string name="err_detail_no_spoiler">O c:geo não encontrou images spoiler para esta cache.</string>
+ <string name="err_detail_no_map_static">O c:geo não encontrou mapas estáticos para esta cache.</string>
+ <string name="err_detail_not_load_map_static">O c:geo falhou o carregamento de mapas estáticos.</string>
+ <string name="err_detail_still_working">A trabalhar noutra tarefa.</string>
+ <string name="err_watchlist_still_managing">Ainda a gerir a sua watchlist.</string>
+ <string name="err_watchlist_failed">A gestão da sua watchlist falhou.</string>
+ <string name="err_application_no">O c:geo não encontra a aplicação correcta.</string>
+ <string name="err_auth_initialize">O c:geo falhou a iniciar o processo de autorização.</string>
+ <string name="err_auth_process">Processo de autorização falhou.</string>
+ <string name="err_cannot_log_visit">O c:geo não tem informação suficiente para registar a visita. Por favor, faça-o a partir dos detalhes completos da cache.</string>
+ <string name="err_download_fail">O c:geo falhou o download das caches porque </string>
+ <string name="err_dwld_details_failed">O c:geo falhou o download dos detalhes da cache.</string>
+ <string name="err_load_descr_failed">O c:geo não consegue carregar a descrição.</string>
+ <string name="err_location_unknown">O c:geo não sabe a localização da cache.</string>
+ <string name="err_missing_device_name">Por favor insira um nome para este dispositivo antes de registar.</string>
+ <string name="err_favorite_failed">Alteração do estado de favorito falhou.</string>
+ <string name="err_select_logimage_failed">Selecionar uma imagem para o registo falhado.</string>
+ <string name="err_acquire_image_failed">Aquisição de uma imagem falhou.</string>
+ <string name="err_tb_display">O c:geo não consegue mostrar o trackable pretendido. É mesmo um trackable?</string>
+ <string name="err_tb_details_open">O c:geo não consegue abrir os detalhes do trackable.</string>
+ <string name="err_tb_forgot_saw">O c:geo esqueceu o trackable que viu.</string>
+ <string name="err_tb_find">O c:geo não encontra o trackable</string>
+ <string name="err_tb_find_that">O c:geo não encontra esse trackable.</string>
+ <string name="err_waypoint_cache_unknown">O c:geo não sabe a que cache quer adicionar o ponto de referência.</string>
+ <string name="err_waypoint_add_failed">O c:geo falhou o adicionamento do seu ponto de referência.</string>
+ <string name="err_point_unknown_position">O c:geo não conseguiu reconhecer a sua localização.</string>
+ <string name="err_point_no_position_given_title">Informação requerida</string>
+ <string name="err_point_no_position_given">Preencha pelo menos a latitude, a longitude, a distância ou a direcção. Também pode preencher os quatro campos.</string>
+ <string name="err_point_curr_position_unavailable">O c:geo ainda não possui as coordenadas actuais. Por favor, aguarde um instante…</string>
+ <string name="err_point_bear_and_dist_title">Precisa de ajuda?</string>
+ <string name="err_point_bear_and_dist">Preencha a direcção e a distância. A direcção é o ângulo de 0 a 360 graus relativo ao norte. A distância pode ser introduzida com ou sem unidades.</string>
+ <string name="err_point_location_error">O c:geo não conseguiu obter a localização do ponto de referência.</string>
+ <string name="err_log_load_data">O c:geo não consegue carregar os dados necessários para registar a sua visita.</string>
+ <string name="err_log_load_data_again">O c:geo não consegue carregar os dados necessários para registar a sua visita. A tentar de novo.</string>
+ <string name="err_log_load_data_still">O c:geo ainda está a carregar dados necessários para publicar o registo. Por favor espere mais um pouco.</string>
+ <string name="err_log_failed_server">O c:geo falhou a publicação do registo porque o servidor não responde.</string>
+ <string name="err_log_post_failed">O c:geo falhou a publicação do registo.</string>
+ <string name="err_logimage_post_failed">Parece que a sua imagem de registo não foi enviada. Por favor verifique em Geocaching.com.</string>
+ <string name="err_search_address_forgot">O c:geo esqueceu o endereço que procura.</string>
+ <string name="err_parse_lat">O c:geo não consegue analisar a latitue.</string>
+ <string name="err_parse_lon">O c:geo não consegue analisar a logitude.</string>
+ <string name="err_parse_dist">O c:geo não consegue analisar a distância.</string>
+ <string name="err_parse_lat_lon">O c:geo não consegue analisar a latitue ou a longitude.</string>
+ <string name="warn_save_nothing">Não há nada para guardar.</string>
+ <string name="warn_no_cache_coord">Não há cache com coordenadas.</string>
+ <string name="warn_no_coordinates">Nenhumas coordenadas fornecidas.</string>
+ <string name="warn_no_keyword">Nenhuma palavra-chave fornecida.</string>
+ <string name="warn_no_username">Nenhum nome de utilizador fornecido.</string>
+ <string name="warn_search_help_title">Precisa de ajuda?</string>
+ <string name="warn_search_help_address">\"Preencha o endereço ou o nome da localização. Por exemplo o nome da rua \"Avenida da Liberdade 100, Lisboa, Portugal\", nome da cidade \"Coimbra\" ou simplesmente o nome de algo como \"Parque das Nações\".</string>
+ <string name="warn_search_help_gccode">Preencha o código da geocache. Por exemplo \"GC1VCAZ\".</string>
+ <string name="warn_search_help_keyword">Preencha acom uma palavra que é suposto estar algures no nome da cache que está a tentar encontrar.</string>
+ <string name="warn_search_help_user">Preencha o nome de utilizador em Geocaching.com.</string>
+ <string name="warn_search_help_tb">Preencha o código do trackable. Por exemplo \"TB29QMZ\".</string>
+ <string name="warn_log_text_fill">Por favor, preencha algum texto para o registo.</string>
+ <string name="warn_load_images">c:geo falhou ao carregar as imagens.</string>
+ <string name="warn_invalid_mapfile">O ficheiro de mapa selecionado não é suportado pela versão mapsforge 0.3.0.\nMapas offline não estão disponíveis.</string>
+ <string name="warn_deprecated_mapfile">Está a utilizar um ficheiro de mapa de uma versão obsoleta.\nConsidere mudar o mapa para a versão 0.3.0.\nNa próxima versão vamos deixar de suportar a 0.2.4.</string>
+ <string name="warn_nonexistant_mapfile">O ficheiro de mapa selecionado não existe.\nMapas offline não estão disponíveis.</string>
+ <string name="warn_rendertheme_missing">Tema de mapa não encontrado.</string>
+ <string name="info_log_posted">O c:geo publicou o registo com sucesso.</string>
+ <string name="info_log_saved">O c:geo gravou o registo com sucesso.</string>
+ <string name="info_log_cleared">O registo foi limpo.</string>
+ <string name="info_log_type_changed">O tipo de registo foi alterado!</string>
+ <string name="info_select_logimage_cancelled">A selecção ou captura de imagem foi cancelada.</string>
+ <string name="info_stored_image">Nova imagem guardada em:</string>
+ <string name="info_storing_static_maps">A tentar arquivar mapas estáticos.</string>
+ <string name="loc_last">Último conhecido</string>
+ <string name="loc_net">Rede</string>
+ <string name="loc_gps">GPS</string>
+ <string name="loc_sat">Sat</string>
+ <string name="loc_trying">A tentar localizar</string>
+ <string name="loc_no_addr">Endereço desconhecido</string>
+ <string name="loc_gps_disabled">GPS desactivado</string>
+ <string name="menu_about">Sobre o c:geo</string>
+ <string name="menu_helpers">Utilitários</string>
+ <string name="menu_settings">Definições</string>
+ <string name="menu_history">Histórico</string>
+ <string name="menu_filter">Filtro</string>
+ <string name="menu_scan_geo">Scan geocode</string>
+ <string name="live_map_button">Ao vivo</string>
+ <string name="caches_nearby_button">Por perto</string>
+ <string name="advanced_search_button">Pesquisar</string>
+ <string name="stored_caches_button">Arquivo</string>
+ <string name="any_button">Destino</string>
+ <string name="unknown_scan">Sem resultados do scan.</string>
+ <string name="caches_no_cache">Nenhuma cache</string>
+ <string name="caches_more_caches">Mais caches</string>
+ <string name="caches_more_caches_no">Mais nenhuma cache</string>
+ <string name="caches_more_caches_loading">A carregar caches…</string>
+ <string name="caches_more_caches_currently">actualmente</string>
+ <string name="caches_downloading">Downloading caches…\nETE: </string>
+ <string name="caches_eta_ltm">Menos de um minuto</string>
+ <string name="caches_store_offline">Arquivar para uso offline</string>
+ <string name="caches_store_selected">Arquivar selecionadas</string>
+ <string name="caches_history">Histórico</string>
+ <string name="caches_on_map">Mostrar no mapa</string>
+ <string name="caches_sort">Ordenar</string>
+ <string name="caches_sort_title">Ordenar por</string>
+ <string name="caches_sort_distance">Distância</string>
+ <string name="caches_sort_difficulty">Dificuldade</string>
+ <string name="caches_sort_terrain">Terreno</string>
+ <string name="caches_sort_size">Tamanho</string>
+ <string name="caches_sort_favorites">Popularidade</string>
+ <string name="caches_sort_name">Nome</string>
+ <string name="caches_sort_geocode">Geo Código</string>
+ <string name="caches_sort_rating">Pontuação</string>
+ <string name="caches_sort_vote">Votos (pontuação própria)</string>
+ <string name="caches_sort_inventory">Somatório do Inventário</string>
+ <string name="caches_sort_date_hidden">Data</string>
+ <string name="caches_sort_date_logged">Data de Registo</string>
+ <string name="caches_sort_finds">Encontradas</string>
+ <string name="caches_sort_state">Estado</string>
+ <string name="caches_sort_storage">Data gravada no dispositivo</string>
+ <string name="caches_select_mode">Modo de selecção</string>
+ <string name="caches_select_mode_exit">Sair do modo de selecção</string>
+ <string name="caches_select_invert">Inverter selecção</string>
+ <string name="caches_nearby">Por perto</string>
+ <string name="caches_manage">Gerir</string>
+ <string name="caches_drop_selected">Apagar seleccionada</string>
+ <string name="caches_drop_selected_ask">Quer apagar as caches seleccionadas do dispositivo?</string>
+ <string name="caches_drop_all">Apagar todas</string>
+ <string name="caches_drop_all_ask">Quer remover todas as caches do dispositivo?</string>
+ <string name="caches_drop_stored">Apagar do arquivo</string>
+ <string name="caches_drop_progress">A remover caches</string>
+ <string name="caches_drop_all_and_list">Apagar todas e remover lista</string>
+ <string name="caches_delete_events">Eliminar eventos passados</string>
+ <string name="caches_refresh_selected">Actualizar seleccionada</string>
+ <string name="caches_refresh_all">Actualizar todas</string>
+ <string name="caches_move_selected">Mover seleccionadas</string>
+ <string name="caches_move_all">Mover todas</string>
+ <string name="caches_map_locus">Locus</string>
+ <string name="caches_map_locus_export">Exportar para Locus</string>
+ <string name="caches_recaptcha_title">reCAPTCHA</string>
+ <string name="caches_recaptcha_explanation">Por favor, escreva o texto da imagem. É importante para fazer o download das coordenadas das caches. É opcional e pode ser desactivado nas Definições.</string>
+ <string name="caches_recaptcha_hint">Texto da imagem</string>
+ <string name="caches_recaptcha_continue">Continuar</string>
+ <string name="caches_filter">Filtrar</string>
+ <string name="caches_filter_title">Filtrar por</string>
+ <string name="caches_filter_size">Tamanho</string>
+ <string name="caches_filter_type">Tipo</string>
+ <string name="caches_filter_track">Com trackables</string>
+ <string name="caches_filter_clear">Limpar filtros</string>
+ <string name="caches_filter_modified">Com as coordenadas modificadas</string>
+ <string name="caches_filter_origin">Origem</string>
+ <string name="caches_filter_distance">Distância</string>
+ <string name="caches_removing_from_history">A remover do histórico…</string>
+ <string name="caches_clear_offlinelogs">Limpar registos offline</string>
+ <string name="caches_clear_offlinelogs_progress">A limpar registos offline</string>
+ <string name="list_menu">Listas</string>
+ <string name="list_menu_create">Criar nova lista</string>
+ <string name="list_menu_all_lists">caches todas</string>
+ <string name="list_menu_drop">Apagar lista actual</string>
+ <string name="list_menu_change">Mudar de lista</string>
+ <string name="list_menu_rename">Mudar o nome da lista corrente.</string>
+ <string name="list_title">Escolha uma lista</string>
+ <string name="list_inbox">Arquivadas</string>
+ <string name="list_all_lists">caches todas</string>
+ <string name="list_dialog_create_title">Nova lista</string>
+ <string name="list_dialog_create">Criar</string>
+ <string name="list_dialog_cancel">Cancelar</string>
+ <string name="list_dialog_create_ok">Nova lista criada</string>
+ <string name="list_dialog_create_err">O c:geo falhou a criação da nova lista</string>
+ <string name="list_dialog_remove_title">Remover lista</string>
+ <string name="list_dialog_remove_description">Pretende remover a lista actual de caches? Todas as caches presentes na lista serão movidas para a lista \"Arquivadas\".</string>
+ <string name="list_dialog_remove">Remover</string>
+ <string name="list_dialog_remove_ok">A lista foi removida</string>
+ <string name="list_dialog_remove_err">O c:geo falhou a remoção da lista actual</string>
+ <string name="list_dialog_rename_title">Mudar o nome da lista</string>
+ <string name="list_dialog_rename">Mudar o nome</string>
+ <string name="about_version">Versão</string>
+ <string name="about_changelog">Changelog</string>
+ <string name="about_donate">Doar</string>
+ <string name="about_detail">Detalhes</string>
+ <string name="about_donation_more">Doar\ndesenvolvimento</string>
+ <string name="about_contributors">Contribuidores</string>
+ <string name="settings_title_services">Serviços</string>
+ <string name="settings_title_appearance">Aparência</string>
+ <string name="settings_title_cachedetails">Detalhos da Cache</string>
+ <string name="settings_title_offlinedata">Dados Offline</string>
+ <string name="settings_title_logging">A fazer o registo</string>
+ <string name="settings_title_map">Mapa</string>
+ <string name="settings_title_map_data">Dados do Mapa</string>
+ <string name="settings_title_map_content">Conteúdo do Mapa</string>
+ <string name="settings_title_gpx">GPX</string>
+ <string name="settings_title_basicmembers">Membros Básico</string>
+ <string name="settings_title_navigation">Navegação</string>
+ <string name="settings_title_system">Sistema</string>
+ <string name="settings_title_navigation_menu">Menu de navegação</string>
+ <string name="settings_category_browser">Browser</string>
+ <string name="settings_category_logging_other">Outras Opções de Registo</string>
+ <string name="settings_goto_url_button">mais …</string>
+ <string name="settings_title_gc">Geocaching.com</string>
+ <string name="settings_activate_gc">Activar</string>
+ <string name="settings_gc_legal_note">Quando você usa do serviço do geocaching.com, você aceita os termos de uso da Groundspeak.</string>
+ <string name="settings_info_facebook_login_title">Facebook Login</string>
+ <string name="settings_info_facebook_login">Não consegue que c:geo faça o login em geocaching.com com a sua conta do Facebook. Mas existe uma solução simples…</string>
+ <string name="init_oc">Opencaching.de</string>
+ <string name="settings_activate_oc">Activar</string>
+ <string name="init_oc_de_description">Autorizar c:geo com opencaching.de para pesquisar por caches e aceder/filtrar as suas caches encontradas.</string>
+ <string name="init_register_oc_de">Autorizar c:geo</string>
+ <string name="init_reregister_oc_de">Reautorizar c:geo</string>
+ <string name="init_gcvote">GCvote.com</string>
+ <string name="init_twitter">Twitter</string>
+ <string name="settings_activate_twitter">Activar</string>
+ <string name="init_username">Nome de utilizador</string>
+ <string name="init_password">Password</string>
+ <string name="init_login">Verificar login</string>
+ <string name="init_login_popup">Login</string>
+ <string name="init_login_popup_working">Logging to Geocaching.com…</string>
+ <string name="init_login_popup_ok">Login ok.</string>
+ <string name="init_login_popup_failed">Login falhado.</string>
+ <string name="init_login_popup_failed_reason">Login falhado porque </string>
+ <string name="init_login_popup_not_authorized">Não autorizado</string>
+ <string name="init_twitter_authorize">Autorize o c:geo</string>
+ <string name="init_twitter_reauthorize">Reautorizar c:geo</string>
+ <string name="init_signature">Assinatura</string>
+ <string name="init_signature_help_text">Escreva a sua assinatura, para adicionar ao texto de registo na cache.\nPode usar algumas palavras-chave: [DATE] , [TIME], [USER] &amp; [NUMBER].\nEstas serão expandidas quando a assinatura for inserida.</string>
+ <string name="init_signature_template_button">Inserir modelo</string>
+ <string name="init_signature_template_date">Data</string>
+ <string name="init_signature_template_time">Hora</string>
+ <string name="init_signature_template_datetime">Data &amp; Hora</string>
+ <string name="init_signature_template_user">Utilizador</string>
+ <string name="init_signature_template_number">Número</string>
+ <string name="init_signature_template_owner">Dono</string>
+ <string name="init_ratingwanted">Carregar a pontuação da cache de GCvote.com</string>
+ <string name="init_summary_ratingwanted">Carregar a pontuação da cache de GCvote.com</string>
+ <string name="init_friendlogswanted">Carregar página adicional de registos de amigos</string>
+ <string name="init_summary_friendlogswanted">Carregar página adicional de registos de amigos</string>
+ <string name="init_openlastdetailspage">Abrir detalhes da última página vizualizada</string>
+ <string name="init_summary_openlastdetailspage">Abrir detalhes da última página vizualizada</string>
+ <string name="init_autoload">Carregar automaticamente a descrição longa</string>
+ <string name="init_summary_autoload">Carregar automaticamente a descrição longa</string>
+ <string name="init_skin">Tema leve (precisa reiniciar o c:geo)</string>
+ <string name="init_summary_skin">Tema leve (precisa reiniciar o c:geo)</string>
+ <string name="init_address">Mostrar endereços no ecrã principal</string>
+ <string name="init_summary_address">Mostrar endereços no ecrã principal</string>
+ <string name="init_captcha">Mostrar CAPTCHA se necessário</string>
+ <string name="init_summary_captcha">Mostrar CAPTCHA se necessário</string>
+ <string name="init_useenglish">Utilizar inglês no c:geo\n(necessário reiniciar)</string>
+ <string name="init_summary_useenglish">Utilizar inglês no c:geo\n(necessário reiniciar)</string>
+ <string name="init_exclude">Excluir caches encontradas e minhas</string>
+ <string name="init_summary_exclude">Excluir caches encontradas e minhas</string>
+ <string name="init_showwaypoints">Mostrar Waypoints no mapa</string>
+ <string name="init_showwaypoint_description">Se menos do que o número de caches encontradas são mostradas no mapa, os seus waypoints são mostrados adicionalmente.</string>
+ <string name="init_disabled">Excluir caches desactivadas</string>
+ <string name="init_summary_disabled">Excluir caches desactivadas</string>
+ <string name="init_offline">Armazenar a cache de mapas estáticos para utilização offline</string>
+ <string name="init_summary_offline">Armazenar a cache de mapas estáticos para utilização offline</string>
+ <string name="init_offline_wp">Armazenar waypoints de mapas estáticos para utilização offline</string>
+ <string name="init_summary_offline_wp">Armazenar waypoints de mapas estáticos para utilização offline</string>
+ <string name="init_save_log_img">Guardar imagens dos registos</string>
+ <string name="init_summary_save_log_img">Guardar imagens dos registos</string>
+ <string name="init_units">Utilizar distância nas unidades do sistema imperial</string>
+ <string name="init_summary_units">Utilizar distância nas unidades do sistema imperial</string>
+ <string name="init_log_offline">Activar registo offline\n(Não mostrar o registo online quando fôr registar, não enviar o registo online)</string>
+ <string name="init_summary_log_offline">Activar registo offline\n(Não mostrar o registo online quando fôr registar, não enviar o registo online)</string>
+ <string name="init_choose_list">Pedir Lista</string>
+ <string name="init_summary_choose_list">Pedir lista quando guarda as caches</string>
+ <string name="init_livelist">Mostrar a direcção para a cache na lista</string>
+ <string name="init_summary_livelist">Mostrar a direcção para a cache na lista</string>
+ <string name="init_backup">Backup</string>
+ <string name="init_backup_backup">Backup</string>
+ <string name="init_backup_running">A criar um backup da base de dados de caches…</string>
+ <string name="init_backup_note">Por favor note que esta opção irá fazer backup/restauro da base de dados de caches e pontos de referência, mas não das definições. A sua informação de login (passwords) não irá deixar esta aplicação.</string>
+ <string name="init_backup_restore">Restaurar</string>
+ <string name="init_backup_success">A base de dados do c:geo foi copiada com sucesso</string>
+ <string name="init_backup_failed">O backup da base de dados do c:geo falhou.</string>
+ <string name="init_backup_unnecessary">Base de dados vazia, não é necessário um backup.</string>
+ <string name="init_restore_success">Restauro concluído.</string>
+ <string name="init_restore_failed">O restauro falhou.</string>
+ <string name="init_restore_running">A restaurar a base de dados de caches…</string>
+ <string name="init_restore_confirm">Base de dados vazia. Quer restaurar o backup?</string>
+ <string name="init_backup_last">Disponível backup de</string>
+ <string name="init_backup_last_no">Não existe nenhum ficheiro de backup.</string>
+ <string name="settings_info_offline_maps_title">Informações sobre Offline Maps</string>
+ <string name="settings_info_offline_maps">c: geo suporta mapas para uso offline. Pode baixar mapas de Mapsforge ou até mesmo criar seus próprios mapas a partir de dados OSM.</string>
+ <string name="settings_info_themes_title">Informações sobre Map Themes</string>
+ <string name="settings_info_themes">c: geo suporta temas customizados para os mapas off-line. Estes podem ser usados ​​para alterar o estilo de cores do mapa (por exemplo, ter um mapa para visão nocturna) ou para realçar certos objetos, como ciclovias ou linhas de altura dentro do mapa.</string>
+ <string name="init_mapsource_select">Seleccione a fonte de mapa</string>
+ <string name="init_map_directory_description">Directório com os mapas offline</string>
+ <string name="init_gpx_exportdir">Directório para exportar GPX</string>
+ <string name="init_gpx_importdir">Directório para importar GPX</string>
+ <string name="init_maptrail">Mostrar rasto no mapa</string>
+ <string name="init_summary_maptrail">Mostrar rasto no mapa</string>
+ <string name="init_share_after_export">Abrir o menu de partilha depois da exportação GPX</string>
+ <string name="init_trackautovisit">Marcar automaticamente os trackables como \"visitados\"</string>
+ <string name="init_summary_trackautovisit">Marcar automaticamente os trackables como \"visitados\"</string>
+ <string name="init_sigautoinsert">Inserir automaticamente</string>
+ <string name="init_loaddirectionimg">Carregar a imagem de dricção se necessário</string>
+ <string name="init_summary_loaddirectionimg">Carregar a imagem de dricção se necessário</string>
+ <string name="init_default_navigation_tool">Navegador principal</string>
+ <string name="init_secondary_navigation_tool">Navegação secundária</string>
+ <string name="init_default_navigation_tool_description">Aqui pode selecionar o seu navegador preferido.</string>
+ <string name="init_default_navigation_tool_select">Ferramenta de selecção</string>
+ <string name="init_default_navigation_tool_2_description">Aqui define a sua segunda preferida ferramenta de navefação. É activada com clique longo no ícone ao lado do títula da cache.</string>
+ <string name="init_debug_title">Informação de depuração</string>
+ <string name="init_debug_note">O c:geo consegue gerar muita informação de depuração. Enquanto para os utilizadores esta informação não é muito importante, os desenvolvedores podem precisar para analisar um bug. Neste caso, eles pedem-lhe que marque a caixa de verificação abaixo e lhes envie o ficheiro de log.</string>
+ <string name="init_debug">Activar depuração</string>
+ <string name="init_dbonsdcard_title">Localização da base de dados</string>
+ <string name="init_dbonsdcard_note">Pode armazenar a base de dados do c:geo no armazenamento externo. Se o fizer vai poupar memória interna, mas pode perder um pouco de performance e o c:geo pode não funcionar se o armazenamento externo não estiver disponível.</string>
+ <string name="init_dbonsdcard">No armazenamento externo</string>
+ <string name="init_dbmove_dbmove">A mover a base de dados</string>
+ <string name="init_dbmove_running">A mover a base de dados</string>
+ <string name="init_dbmove_success">Base de dados movida com sucesso.</string>
+ <string name="init_dbmove_failed">Falha ao mover a base de dados.</string>
+ <string name="init_plain_logs">Mostrar os logs sem as cores</string>
+ <string name="init_summary_plain_logs">Mostrar os logs sem as cores</string>
+ <string name="init_use_native_ua">Identificar como se fosse o browser do Android. Resolve os problemas de login em alguns provedores de rede.</string>
+ <string name="init_summary_use_native_ua">Identificar como se fosse o browser do Android. Resolve os problemas de login em alguns provedores de rede.</string>
+ <string name="init_rendertheme_folder">Directório de Temas de Mapas</string>
+ <string name="map_source_google_map">Google: Mapa</string>
+ <string name="map_source_google_satellite">Google: Satélite</string>
+ <string name="map_source_osm_mapnik">OSM: Mapnik</string>
+ <string name="map_source_osm_cyclemap">OSM: Cyclemap</string>
+ <string name="map_source_osm_offline">Offline</string>
+ <string name="init_sendToCgeo">Enviar para o c:geo</string>
+ <string name="settings_info_send2cgeo_title">Informação sobre send2cgeo</string>
+ <string name="init_sendToCgeo_name">Nome do seu dispositivo</string>
+ <string name="init_sendToCgeo_description">Enviar para o c: geo permite-lhe receber caches directamente do site Geocaching.com, utilizando um plugin especial para o Firefox ou Chrome. Antes de se registar, por favor leia <a href="http://send2.cgeo.org/">http://send2.cgeo.org/</a>. Apenas necessita de registar, se pretender utilizar o send2cgeo. O c:geo irá funcionar mesmo sem este registo.</string>
+ <string name="init_sendToCgeo_register">Solicitar registo</string>
+ <string name="init_sendToCgeo_registering">Registando o seu dispositivo para \"Enviar para o c:geo\"…</string>
+ <string name="init_sendToCgeo_register_ok">Registo bem sucedido. O código PIN é ####. Use-o no site do c:geo para adicionar este dispositivo ao seu browser.</string>
+ <string name="init_sendToCgeo_register_fail">O registo falhou.</string>
+ <string name="sendToCgeo_download_fail">c:geo falhou o download das caches. Sem ligação à internet ou send2c:geo está em baixo.</string>
+ <string name="sendToCgeo_no_registration">c:geo falhou o download das caches. Registo do send2c:geo expirou. Faça o registo nas definições.</string>
+ <string name="auth_twitter">Twitter</string>
+ <string name="auth_authorize">Autorizar c:geo</string>
+ <string name="auth_start">Iniciar autorização</string>
+ <string name="auth_again">Iniciar de novo</string>
+ <string name="auth_pin_hint">PIN atribuído pelo Twitter</string>
+ <string name="auth_finish">Fim</string>
+ <string name="auth_dialog_wait">A esperar pelo Twitter…</string>
+ <string name="auth_dialog_pin_title">Código PIN</string>
+ <string name="auth_dialog_pin_message">Por favor insira o código PIN fornecido pelo site do Twitter. É imperativo para que se complete a autorização.</string>
+ <string name="auth_dialog_completed">O c:geo está agora autorizado a publicar no Twitter.</string>
+ <string name="about_auth_1">O processo seguinte permite <b>c:geo</b> aceder ao Twitter - se concordar.</string>
+ <string name="about_auth_2">Um clique sobre o botão \"autorizar c:geo \" irá iniciar o processo. Este processo irá abrir um navegador com uma página no Twitter. Entre nesta página e permita o <b>c:geo</b> aceder à sua conta. Se isso for aceite, o Twitter vai mostrar um código PIN numérico. Este PIN deve ser colado em <b>c:geo</b> e confirmado. É tudo.</string>
+ <string name="auth_ocde">opencaching.de</string>
+ <string name="auth_authorize_oc">Autorizar c:geo</string>
+ <string name="auth_start_oc">Começar autorização</string>
+ <string name="auth_again_oc">Iniciar de novo</string>
+ <string name="auth_pin_hint_oc">PIN atribuído por %s</string>
+ <string name="auth_finish_oc">Fim</string>
+ <string name="auth_dialog_wait_oc">A esperar pot %s…</string>
+ <string name="auth_dialog_pin_title_oc">Código PIN</string>
+ <string name="auth_dialog_pin_message_oc">Por favor insira o código PIN fornecido pelo site %s. É imperativo para que se complete a autorização.</string>
+ <string name="auth_dialog_completed_oc">c:geo está agora autorizado a interagir com %s.</string>
+ <string name="about_auth_1_oc">O processo seguinte permite <b>c:geo</b> aceder ao Twitter - se concordar.</string>
+ <string name="about_auth_2_oc">Um clique sobre o botão \"autorizar c:geo \" irá iniciar o processo. Este processo irá abrir um navegador com uma página em %s. Entre nesta página e permita o <b>c:geo</b> aceder à sua conta. Se isso for aceite, %s vai mostrar um código PIN numérico. Este PIN deve ser colado em <b>c:geo</b> e confirmado. É tudo.</string>
+ <string name="cache_offline">Arquivo</string>
+ <string name="cache_offline_refresh">Actualizar</string>
+ <string name="cache_offline_drop">Apagar</string>
+ <string name="cache_offline_store">Arquivar</string>
+ <string name="cache_offline_stored">Arquivada no dispositivo</string>
+ <string name="cache_offline_not_ready">Não está pronta\npara utilização offline</string>
+ <string name="cache_offline_time_about">há</string>
+ <string name="cache_offline_time_mins">minutos atrás</string>
+ <string name="cache_offline_time_mins_few">alguns minutos atrás</string>
+ <string name="cache_offline_time_hour">uma hora atrás</string>
+ <string name="cache_offline_time_hours">horas atrás</string>
+ <string name="cache_offline_time_days">dias atrás</string>
+ <string name="cache_premium">Premium</string>
+ <string name="cache_attributes">Atributos</string>
+ <string name="cache_inventory">Inventário</string>
+ <string name="cache_log_offline">Registo Offline</string>
+ <string name="cache_log_images_title">Imagem do registo</string>
+ <string name="cache_log_image_default_title">Foto</string>
+ <string name="cache_personal_note">Nota pessoal</string>
+ <string name="cache_personal_note_edit">Editar</string>
+ <string name="cache_personal_note_upload">Enviar</string>
+ <string name="cache_personal_note_uploading">A enviar nota pessoal</string>
+ <string name="cache_personal_note_upload_done">Nota pessoal enviada</string>
+ <string name="cache_personal_note_upload_cancelled">Envio de nota pessoal cancelado</string>
+ <string name="cache_personal_note_unstored">Cache não guaradada</string>
+ <string name="cache_personal_note_store">A cache vai ser guardada primeiro para permitir notas pessoais.</string>
+ <string name="cache_description">Descrição</string>
+ <string name="cache_description_long">Descrição longa</string>
+ <string name="cache_description_table_note">A descrição contém a formatação da tabela que pode ser necessário para ser vista correctamente em %s.</string>
+ <string name="cache_watchlist_on">Esta cache está na sua lista de observação.</string>
+ <string name="cache_watchlist_not_on">Esta cache não está na sua lista de observação.</string>
+ <string name="cache_watchlist_add">Adicionar à lista de observação</string>
+ <string name="cache_watchlist_remove">Remover da lista de observação</string>
+ <string name="cache_favpoint_on">Esta cache é uma das suas favoritas.</string>
+ <string name="cache_favpoint_not_on">Esta cache não é uma das suas favoritas.</string>
+ <string name="cache_favpoint_add">Adicionar</string>
+ <string name="cache_favpoint_remove">Remover</string>
+ <string name="cache_list_text">Lista:</string>
+ <string name="cache_list_change">Mover</string>
+ <string name="cache_list_unknown">Não está numa lista</string>
+ <string name="cache_images">Imagens</string>
+ <string name="cache_waypoints">Pontos de referência</string>
+ <string name="cache_waypoints_add">Adicionar ponto de referência</string>
+ <string name="cache_hint">Pista</string>
+ <string name="cache_logs">Logbook</string>
+ <string name="cache_logsfriends">Logbook (Amigos)</string>
+ <string name="cache_dialog_loading_details">A carregar os detalhes da cache…</string>
+ <string name="cache_dialog_loading_details_status_loadpage">A carregar a página</string>
+ <string name="cache_dialog_loading_details_status_details">A processar os detalhes</string>
+ <string name="cache_dialog_loading_details_status_spoilers">A carregar as imagens spoiler</string>
+ <string name="cache_dialog_loading_details_status_logs">A carregar os registo</string>
+ <string name="cache_dialog_loading_details_status_waypoints">A processar os waypoints</string>
+ <string name="cache_dialog_loading_details_status_gcvote">A carregar GCVote</string>
+ <string name="cache_dialog_loading_details_status_cache">A carregar dados</string>
+ <string name="cache_dialog_loading_details_status_render">A renderizar a vista</string>
+ <string name="cache_dialog_offline_save_title">Offline</string>
+ <string name="cache_dialog_offline_save_message">A gravar cache para utilizar offline…</string>
+ <string name="cache_dialog_offline_drop_title">Offline</string>
+ <string name="cache_dialog_offline_drop_message">A remover a cache da memória do dispositivo…</string>
+ <string name="cache_dialog_refresh_title">Actualizar</string>
+ <string name="cache_dialog_refresh_message">A recarregar os detalhes da cache…</string>
+ <string name="cache_dialog_watchlist_add_title">Lista de observação</string>
+ <string name="cache_dialog_watchlist_add_message">A adicionar cache à lista de observação…</string>
+ <string name="cache_dialog_watchlist_remove_title">Lista de observação</string>
+ <string name="cache_dialog_watchlist_remove_message">A remover cache da lista de observação…</string>
+ <string name="cache_dialog_favorite_add_title">Favorita</string>
+ <string name="cache_dialog_favorite_add_message">Adicionar cache aos favoritos…</string>
+ <string name="cache_dialog_favorite_remove_title">Favorita</string>
+ <string name="cache_dialog_favorite_remove_message">Remover cache dos favoritos…</string>
+ <string name="cache_menu_navigate">Navegar</string>
+ <string name="cache_menu_navigation_drive">Navegar (Conduzir)</string>
+ <string name="cache_menu_navigation_walk">Navegar (Caminhar)</string>
+ <string name="cache_menu_navigation_bike">Navegar (Andar de bicicleta)</string>
+ <string name="cache_menu_maps_directions">Direcções pelo Google Maps</string>
+ <string name="cache_menu_radar">Radar</string>
+ <string name="cache_menu_map">Mostrar no mapa</string>
+ <string name="cache_menu_map_static">Mapas estáticos</string>
+ <string name="cache_menu_download_map_static">Descarregar os mapas estáticos</string>
+ <string name="cache_menu_rmaps">Rmaps</string>
+ <string name="cache_menu_map_ext">Mostrar no mapa ext.</string>
+ <string name="cache_menu_streetview">Vista de rua</string>
+ <string name="cache_menu_browser">Abrir no browser</string>
+ <string name="cache_menu_visit">Registar visita</string>
+ <string name="cache_menu_visit_offline">Registar visita offline</string>
+ <string name="cache_menu_spoilers">Imagens spoiler</string>
+ <string name="cache_menu_around">Caches próximas</string>
+ <string name="cache_menu_event">Adicionar ao calendário</string>
+ <string name="cache_menu_details">Detalhes</string>
+ <string name="cache_menu_refresh">Actualizar</string>
+ <string name="cache_menu_share">Partilhar cache</string>
+ <string name="cache_menu_move_list">Mover para outra lista</string>
+ <string name="cache_menu_gcc">GCC</string>
+ <string name="cache_menu_whereyougo">WhereYouGo</string>
+ <string name="cache_menu_oruxmaps">OruxMaps</string>
+ <string name="cache_menu_cachebeacon">Cache Beacon</string>
+ <string name="cache_menu_navigon">Navigon</string>
+ <string name="cache_status">Estado</string>
+ <string name="cache_status_offline_log">Registo gravado</string>
+ <string name="cache_status_found">Encontrada</string>
+ <string name="cache_status_archived">Arquivada</string>
+ <string name="cache_status_disabled">Desactivada</string>
+ <string name="cache_status_premium">Apenas membros premium</string>
+ <string name="cache_status_not_premium">Acesso a todos os membros</string>
+ <string name="cache_status_stored">Guardada</string>
+ <string name="cache_status_not_stored">Não guardada</string>
+ <string name="cache_geocode">Geo Código</string>
+ <string name="cache_name">Nome</string>
+ <string name="cache_type">Tipo</string>
+ <string name="cache_size">Tamanho</string>
+ <string name="cache_distance">Distância</string>
+ <string name="cache_difficulty">Dificuldade</string>
+ <string name="cache_terrain">Terreno</string>
+ <string name="cache_rating">Pontuação</string>
+ <string name="cache_own_rating">A minha pontuação</string>
+ <string name="cache_rating_of">de</string>
+ <string name="cache_favorite">Favorita</string>
+ <string name="cache_owner">Dono</string>
+ <string name="cache_hidden">Escondida</string>
+ <string name="cache_event">Data</string>
+ <string name="cache_location">Localização</string>
+ <string name="cache_coordinates">Coordenadas</string>
+ <string name="cache_coordinates_original">Coordenadas originais</string>
+ <string name="cache_spoiler_images_title">Imagens spoiler</string>
+ <string name="cache_images_title">Imagens</string>
+ <string name="cache_log_types">Tipos de log</string>
+ <string name="cache_coordinates_no">Esta cache não tem coordenadas.</string>
+ <string name="cache_clear_history">Apagar histórico</string>
+ <string name="cache_remove_from_history">Remover do histórico</string>
+ <string name="cache_license">Licença</string>
+ <string name="cache_image">Imagem</string>
+ <string name="cache_image_open_file">Abrir como ficheiro</string>
+ <string name="cache_image_open_browser">Abrir no browser</string>
+ <string name="cache_share_field">Partilhar</string>
+ <string name="cache_time_full_hours">o\'clock</string>
+ <string name="cache_listed_on">Listada em %s</string>
+ <string name="file_searching_in">A procurar ficheiros\nem</string>
+ <string name="file_searching_sdcard_in">Nenhum ficheiro encontrado nas pastas predefinidas:\n%1$s\n\nA procurar no cartão de memória por ficheiros:\n</string>
+ <string name="file_list_no_files">O c:geo não encontrou ficheiros adequados.</string>
+ <string name="file_searching">A procurar ficheiros</string>
+ <string name="file_title_searching">A procurar</string>
+ <string name="simple_dir_chooser_title">Escolher directório</string>
+ <string name="simple_dir_chooser_current_path">Caminho:</string>
+ <string name="gpx_import_loading_caches">A carregar as caches do ficheiro .gpx</string>
+ <string name="gpx_import_loading_waypoints">A carregar o ficheiro dos waypoints</string>
+ <string name="gpx_import_store_static_maps">A gravar mapas estáticos</string>
+ <string name="gpx_import_caches_imported">caches importadas</string>
+ <string name="gpx_import_static_maps_skipped">Download of static maps aborted</string>
+ <string name="gpx_import_title_static_maps">Gravar mapas estáticos</string>
+ <string name="gpx_import_title_reading_file">A ler o ficheiro</string>
+ <string name="gpx_import_title">Importar GPX</string>
+ <string name="gpx_import_title_caches_imported">Resultado</string>
+ <string name="gpx_import_title_caches_import_failed">A importação falhou</string>
+ <string name="gpx_import_error_io">Não consegue ler o ficheiro</string>
+ <string name="gpx_import_error_parser">Formato de ficheiro errado</string>
+ <string name="gpx_import_error_unexpected">Erro inesperado</string>
+ <string name="gpx_import_canceled">A importação GPX foi cancelada</string>
+ <string name="gpx_import_delete_title">Eliminar ficheiro</string>
+ <string name="gpx_import_delete_message">Quer eliminar %s?</string>
+ <string name="gpx_import_select_list_title">Importar GPX para lista</string>
+ <string name="map_file_select_title">Seleccione ficheiro de mapa</string>
+ <string name="web_import_title">Importar da web</string>
+ <string name="web_import_waiting">À espera de novas caches da web…</string>
+ <string name="web_downloading">A transferir</string>
+ <string name="web_downloaded">Transferido</string>
+ <string name="popup_more">Mais detalhes</string>
+ <string name="waypoint">Ponto de referência</string>
+ <string name="waypoint_cache_coordinates">Coordenadas da cache</string>
+ <string name="waypoint_custom">Personalizado</string>
+ <string name="waypoint_my_coordinates">Minhas coordenadas</string>
+ <string name="waypoint_bearing">Direcção em º</string>
+ <string name="waypoint_distance">Distância</string>
+ <string name="waypoint_name">Nome</string>
+ <string name="waypoint_edit">Editar</string>
+ <string name="waypoint_delete">Apagar</string>
+ <string name="waypoint_edit_title">Editar ponto de referência</string>
+ <string name="waypoint_add_title">Adicionar ponto de referência</string>
+ <string name="waypoint_note">Nota</string>
+ <string name="waypoint_visited">Visitado</string>
+ <string name="waypoint_save">Gravar</string>
+ <string name="waypoint_loading">A carregar ponto de referência…</string>
+ <string name="waypoint_do_not_touch_cache_coordinates">Nenhuma mudança às coordenadas da cache</string>
+ <string name="waypoint_set_as_cache_coords">Definir como coordenadas da cache no c:geo</string>
+ <string name="waypoint_save_and_modify_on_website">Definir como coordenadas da cache no c:geo e no site</string>
+ <string name="waypoint_reset_cache_coords">Redefinir as coordenadas da cache</string>
+ <string name="waypoint_coordinates_has_been_reset_on_website">Coordenadas da cache foram redefinidas no site.</string>
+ <string name="waypoint_coordinates_being_reset_on_website">A redefinir as coordenadas da cache no site…</string>
+ <string name="waypoint_reset">Redefinir</string>
+ <string name="waypoint_localy_reset_cache_coords">Redefinir no c:geo</string>
+ <string name="waypoint_reset_local_and_remote_cache_coords">Redefinir no c:geo e no site</string>
+ <string name="waypoint_being_saved">A guardar pontos de referência…</string>
+ <string name="waypoint_coordinates_couldnt_be_modified_on_website">O site não suporta modificar as coordenadas da cache.</string>
+ <string name="waypoint_coordinates_upload_error">Ocorreu um erro ao modificar as coordenadas no site.</string>
+ <string name="waypoint_coordinates_uploading_to_website">A enviar as coordenadas para o site %s.</string>
+ <string name="waypoint_coordinates_has_been_modified_on_website">As coordenadas da cache no site foram modificados para: %s.</string>
+ <string name="waypoint_done">Feito</string>
+ <string name="waypoint_duplicate">Duplicar</string>
+ <string name="waypoint_copy_of">Cópia de</string>
+ <string name="search_history">Histórico</string>
+ <string name="search_history_empty">Não existem destinos recentes</string>
+ <string name="search_remove_destination">Destino removido</string>
+ <string name="search_clear_history">Limpar histórico</string>
+ <string name="search_history_cleared">Histórico limpo</string>
+ <string name="waypoint_coordinate_formats_plain">Plano</string>
+ <string name="visit_tweet">Publicar esta descoberta no Twitter</string>
+ <string name="map_map">Mapa</string>
+ <string name="map_live">Mapa ao vivo</string>
+ <string name="map_view_map">Vista de mapa</string>
+ <string name="map_modes">Modos de mapa</string>
+ <string name="map_trail_show">Mostrar caminho</string>
+ <string name="map_trail_hide">Esconder caminho</string>
+ <string name="map_circles_show">Mostrar círculos</string>
+ <string name="map_circles_hide">Esconder círculos</string>
+ <string name="map_mycaches_show">Mostrar caches encontradas e minhas</string>
+ <string name="map_mycaches_hide">Esconder caches encontradas e minhas</string>
+ <string name="map_theme_builtin">Padrão</string>
+ <string name="map_theme_select">Selecione o tema de mapa</string>
+ <string name="map_live_enable">Activar ao vivo</string>
+ <string name="map_live_disable">Desactivar ao vivo</string>
+ <string name="map_static_title">Mapas estáticos</string>
+ <string name="map_static_loading">A carregar mapas estáticos…</string>
+ <string name="map_token_err">Como o c:geo apenas pode transferir dados parciais, as coordenadas das caches podem não ser precisas.</string>
+ <string name="map_as_list">Mostrar como lista</string>
+ <string name="map_strategy">Estratégia</string>
+ <string name="map_strategy_title">Mapa de estratégia ao vivo</string>
+ <string name="map_strategy_fastest">Mais rápido</string>
+ <string name="map_strategy_fast">Rápido</string>
+ <string name="map_strategy_auto">Dependente da velocidade</string>
+ <string name="map_strategy_detailed">Detalhado</string>
+ <string name="live_map_notification">No novo mapa ao vivo as coordenadas podem nem sempre ser precisas. As coordenadas possivelmente imprecisas são marcadas com um círculo cor de laranja.\nAbrindo os detalhes da cache or gravando a cache para utilização offline fará com que obtenha as coordenadas precisas.\n\nMais informações em todas as alterações podem ser encontradas na página \"Sobre c:geo\" na aplicação.</string>
+ <string name="live_map_note_dontshow">Não mostrar novamente</string>
+ <string name="search_bar_hint">Procurar caches</string>
+ <string name="search_bar_desc">Caches (código-GC, palavra-chave), Trackables (código-TB)</string>
+ <string name="search_coordinates">Coordenadas</string>
+ <string name="search_coordinates_button">Pesquisar por coordenadas</string>
+ <string name="search_address">Endereço</string>
+ <string name="search_address_button">Pesquisar por endereço</string>
+ <string name="search_geo">Geo código</string>
+ <string name="search_geo_button">Pesquisar por geo código</string>
+ <string name="search_kw">Palavras-chave</string>
+ <string name="search_kw_prefill">Palavra-chave</string>
+ <string name="search_kw_button">Pesquisar por palavra-chave</string>
+ <string name="search_fbu">Encontradas pelo utilizador</string>
+ <string name="search_fbu_prefill">Nome de utilizador</string>
+ <string name="search_fbu_button">Pesquisar por utilizador</string>
+ <string name="search_hbu">Escondida pelos utilizadores</string>
+ <string name="search_hbu_prefill">Dono</string>
+ <string name="search_hbu_button">Pesquisar pelo dono</string>
+ <string name="search_tb">Trackable</string>
+ <string name="search_tb_hint">Identificação do trackable</string>
+ <string name="search_tb_button">Pesquisar por trackable</string>
+ <string name="search_destination">Destino</string>
+ <string name="search_direction_rel">A partir desta posição</string>
+ <string name="search_address_started">Pesquisar por lugares</string>
+ <string name="search_address_result">Encontrar lugares</string>
+ <string name="search_own_caches">Pesquisar as minhas caches</string>
+ <string name="trackable">Trackable</string>
+ <string name="trackable_details_loading">A carregar os detalhes trackable…</string>
+ <string name="trackable_log_touch">Registar toque</string>
+ <string name="trackable_browser_open">Abrir no browser</string>
+ <string name="trackable_goal">Objectivo</string>
+ <string name="trackable_details">Detalhes</string>
+ <string name="trackable_image">Imagem</string>
+ <string name="trackable_code">Código TB</string>
+ <string name="trackable_name">Nome</string>
+ <string name="trackable_type">Tipo</string>
+ <string name="trackable_owner">Dono</string>
+ <string name="trackable_spotted">Visto</string>
+ <string name="trackable_spotted_in_cache">Em</string>
+ <string name="trackable_spotted_at_user">Nas mãos de</string>
+ <string name="trackable_spotted_unknown_location">Localização desconhecida</string>
+ <string name="trackable_spotted_owner">Nas mãos do dono</string>
+ <string name="trackable_origin">Origem</string>
+ <string name="trackable_unknown">Desconhecido</string>
+ <string name="trackable_released">Criado</string>
+ <string name="trackable_distance">Viajado</string>
+ <string name="trackable_touch">Toque</string>
+ <string name="trackable_not_activated">Trackable não activado</string>
+ <string name="geokret_type_traditional">Tradicional</string>
+ <string name="geokret_type_book_or_media">Livro ou média electrónica</string>
+ <string name="geokret_type_human">Humano</string>
+ <string name="geokret_type_coin">Moeda</string>
+ <string name="geokret_type_post">Correio</string>
+ <string name="user_menu_title">Sobre</string>
+ <string name="user_menu_view_hidden">Caches escondidas</string>
+ <string name="user_menu_view_found">Caches encontradas</string>
+ <string name="user_menu_open_browser">Abrir perfil no browser</string>
+ <string name="user_menu_send_message">Enviar mensagem</string>
+ <string name="navigation">Navegação</string>
+ <string name="compass_title">Bússola</string>
+ <string name="use_gps">Utilizar GPS</string>
+ <string name="use_compass">Utilizar Bússola</string>
+ <string name="destination_select">Seleccionar destino</string>
+ <string name="destination_set">Definir destino</string>
+ <string name="navigation_direct_navigation">Navegação directa</string>
+ <string name="navigation_target">Destino</string>
+ <string name="license">Licença</string>
+ <string name="license_show">Mostrar licença</string>
+ <string name="license_dismiss">Dispensar</string>
+ <string name="helper_calendar_title">Add on calendário para c:geo </string>
+ <string name="helper_calendar_missing">Add on calendário para o c:geo não está instalado.</string>
+ <string name="helper_calendar_description">Permite exportar caches evento para o calendário do seu dispositivo.</string>
+ <string name="helper_locus_title">Locus</string>
+ <string name="helper_locus_description">Aplicação simples e útil, que mostra mapas online e permite transferi-los directamente para o modo offline (apenas mapas raster). Também suporta a gravação de caminhos, gestão de PDI e muitas outras funções úteis.</string>
+ <string name="helper_gpsstatus_title">Estado do GPS</string>
+ <string name="helper_gpsstatus_description">Pode usar o radar a partir desta aplicação. Também fornece muitas outras informações relacionadas com o GPS.</string>
+ <string name="helper_bluetoothgps_title">GPS por bluetooth</string>
+ <string name="helper_bluetoothgps_description">Permite utilizar um GPS externo, para uma melhor recepção, localização mais precisa e permite poupar a bateria do seu telemóvel.</string>
+ <string name="helper_barcode_title">Barcode Scanner</string>
+ <string name="helper_barcode_description">Existem scripts Greasemonkey e websites que permitem mostrar um geo código com um código barras. Com esta aplicação o c:geo consegue ler o código barras directamente do ecrã do seu computador.</string>
+ <string name="helper_pocketquery_title">Criador de Pocket Query</string>
+ <string name="helper_pocketquery_description">Permite a fácil criação de consultas e download de Pocket Query centrado na sua posição actual ou um ponto selecionado a partir de um mapa. Requer uma conta premium em Geocaching.com.</string>
+ <string name="addon_missing_title">Add-On em falta</string>
+ <string name="addon_download_prompt">Obter agora a partir de Google Play.</string>
+ <string name="export">Exportar</string>
+ <string name="export_exportedto">exportado para</string>
+ <string name="export_failed">Exportação falhou</string>
+ <string name="export_fieldnotes">Notas de campo</string>
+ <string name="export_fieldnotes_info">As notas de campo serão exportadas para /sdcard/field-notes com a data e a hora actual como nome de ficheiro.</string>
+ <string name="export_fieldnotes_upload">Enviar para geocaching.com</string>
+ <string name="export_fieldnotes_uploading">A enviar…</string>
+ <string name="export_fieldnotes_upload_success">Envio para geocaching.com bem sucedido</string>
+ <string name="export_fieldnotes_onlynew">Apenas a partir da última exportação</string>
+ <string name="export_fieldnotes_creating">A criar as notas de campo…</string>
+ <string name="export_gpx">GPX</string>
+ <string name="export_gpx_info">O ficheiro GPX vai ser exportado para %1$s com a data e a hora actual como nome de ficheiro.</string>
+ <string name="export_gpx_to">Enviar GPX exportado para</string>
+ <string name="attribute_dogs_yes">Cães permitidos</string>
+ <string name="attribute_dogs_no">Cães não permitidos</string>
+ <string name="attribute_bicycles_yes">Bicicletas permitidas</string>
+ <string name="attribute_bicycles_no">Bicicletas não permitidas</string>
+ <string name="attribute_motorcycles_yes">Motociclos permitidos</string>
+ <string name="attribute_motorcycles_no">Motociclos não permitidos</string>
+ <string name="attribute_quads_yes">Quadriciclos permitidos</string>
+ <string name="attribute_quads_no">Quadriciclos não permitidos</string>
+ <string name="attribute_jeeps_yes">Veículos todo-o-tereno permitidos</string>
+ <string name="attribute_jeeps_no">Veículos todo-o-tereno não permitidos</string>
+ <string name="attribute_snowmobiles_yes">Veículos de neve permitidos</string>
+ <string name="attribute_snowmobiles_no">Veículos de neve não permitidos</string>
+ <string name="attribute_horses_yes">Cavalos permitidos</string>
+ <string name="attribute_horses_no">Cavalos não permitidos</string>
+ <string name="attribute_campfires_yes">Fogueiras permitidas</string>
+ <string name="attribute_campfires_no">Fogueiras não permitidas</string>
+ <string name="attribute_rv_yes">Roulottes permitidas</string>
+ <string name="attribute_rv_no">Roulottes não permitidas</string>
+ <string name="attribute_kids_yes">Recomendado para crianças</string>
+ <string name="attribute_kids_no">Não recomendado para crianças</string>
+ <string name="attribute_onehour_yes">Demora menos de uma hora</string>
+ <string name="attribute_onehour_no">Demora mais de uma hora</string>
+ <string name="attribute_scenic_yes">Vista panorâmica</string>
+ <string name="attribute_scenic_no">Sem vista panorâmica</string>
+ <string name="attribute_hiking_yes">Caminhada considerável</string>
+ <string name="attribute_hiking_no">Caminhada insignificante</string>
+ <string name="attribute_climbing_yes">Subida difícil</string>
+ <string name="attribute_climbing_no">Sem subida difícil</string>
+ <string name="attribute_wading_yes">Pode requerer caminhar em local alagado</string>
+ <string name="attribute_wading_no">Não requer caminhar em local alagado</string>
+ <string name="attribute_swimming_yes">Pode ser necessário nadar</string>
+ <string name="attribute_swimming_no">Não é necessário nadar</string>
+ <string name="attribute_available_yes">Disponível a toda a hora</string>
+ <string name="attribute_available_no">Não disponível a toda a hora</string>
+ <string name="attribute_night_yes">Recomendada à noite</string>
+ <string name="attribute_night_no">Não recomendada à noite</string>
+ <string name="attribute_winter_yes">Disponível no Inverno</string>
+ <string name="attribute_winter_no">Não disponível no Inverno</string>
+ <string name="attribute_stealth_yes">É necessário ser discreto</string>
+ <string name="attribute_stealth_no">Não é necessário ser discreto</string>
+ <string name="attribute_firstaid_yes">Precisa de manutenção</string>
+ <string name="attribute_firstaid_no">Não precisa de manutenção</string>
+ <string name="attribute_cow_yes">Cuidado com o gado</string>
+ <string name="attribute_cow_no">Gado inexistente</string>
+ <string name="attribute_field_puzzle_yes">Quebra-cabeças de campo</string>
+ <string name="attribute_field_puzzle_no">Não é um quebra-cabeças de campo</string>
+ <string name="attribute_nightcache_yes">Cache nocturna</string>
+ <string name="attribute_nightcache_no">Cache não nocturna</string>
+ <string name="attribute_parkngrab_yes">Estacionar e encontrar</string>
+ <string name="attribute_parkngrab_no">Não é só estacionar e encontrar</string>
+ <string name="attribute_abandonedbuilding_yes">Estrutura abandonada</string>
+ <string name="attribute_abandonedbuilding_no">Não é uma estrutura abandonada</string>
+ <string name="attribute_hike_short_yes">Pequena caminhada (menos de 1 Km)</string>
+ <string name="attribute_hike_short_no">Não é uma pequena caminhada</string>
+ <string name="attribute_hike_med_yes">Caminhada média (1 Km a 10 Km)</string>
+ <string name="attribute_hike_med_no">Não é uma caminhada média</string>
+ <string name="attribute_hike_long_yes">Longa caminhada (mais de 10 Km)</string>
+ <string name="attribute_hike_long_no">Não é uma longa caminhada</string>
+ <string name="attribute_seasonal_yes">Acesso sazonal</string>
+ <string name="attribute_seasonal_no">Não é de acesso sazonal</string>
+ <string name="attribute_touristok_yes">Turística</string>
+ <string name="attribute_touristok_no">Não turística</string>
+ <string name="attribute_frontyard_yes">Residência privada</string>
+ <string name="attribute_frontyard_no">Não é uma residência privada</string>
+ <string name="attribute_teamwork_yes">Requer trabalho de equipa</string>
+ <string name="attribute_teamwork_no">Não requer trabalho de equipa</string>
+ <string name="attribute_landf_yes">Passeio de perdidos e achados</string>
+ <string name="attribute_landf_no">Não é um passeio de perdidos e achados</string>
+ <string name="attribute_partnership_yes">Cache de parceria</string>
+ <string name="attribute_partnership_no">Não é uma cache de parceria</string>
+ <string name="attribute_fee_yes">Taxa de acesso ou estacionamento aplicável</string>
+ <string name="attribute_fee_no">Não tem taxa de acesso ou estacionamento</string>
+ <string name="attribute_rappelling_yes">Requer equipamento de escalada</string>
+ <string name="attribute_rappelling_no">Não requer equipamento de escalada</string>
+ <string name="attribute_boat_yes">Requer barco</string>
+ <string name="attribute_boat_no">Não requer barco</string>
+ <string name="attribute_scuba_yes">Requer equipamento de mergulho</string>
+ <string name="attribute_scuba_no">Não requer equipamento de mergulho</string>
+ <string name="attribute_flashlight_yes">Requer lanterna</string>
+ <string name="attribute_flashlight_no">Não requer lanterna</string>
+ <string name="attribute_uv_yes">Requer luz UV</string>
+ <string name="attribute_uv_no">Não requer luz UV</string>
+ <string name="attribute_snowshoes_yes">Requer calçado de neve</string>
+ <string name="attribute_snowshoes_no">Não requer calçado de neve</string>
+ <string name="attribute_skiis_yes">Requer equipamento de esqui nórdico</string>
+ <string name="attribute_skiis_no">Não requer equipamento de esqui nórdico</string>
+ <string name="attribute_s_tool_yes">Requer ferramentas especiais</string>
+ <string name="attribute_s_tool_no">Não requer ferramentas especiais</string>
+ <string name="attribute_wirelessbeacon_yes">Sinal de rede sem fios</string>
+ <string name="attribute_wirelessbeacon_no">Sem sinal de rede sem fios</string>
+ <string name="attribute_treeclimbing_yes">Requer subida a árvores</string>
+ <string name="attribute_treeclimbing_no">Não requer subida a árvores</string>
+ <string name="attribute_poisonoak_yes">Plantas venenosas</string>
+ <string name="attribute_poisonoak_no">Sem plantas venenosas</string>
+ <string name="attribute_dangerousanimals_yes">Animais perigosos</string>
+ <string name="attribute_dangerousanimals_no">Sem animais perigosos</string>
+ <string name="attribute_ticks_yes">Carraças</string>
+ <string name="attribute_ticks_no">Sem carraças</string>
+ <string name="attribute_mine_yes">Minas abandonadas</string>
+ <string name="attribute_mine_no">Sem minas abandonadas</string>
+ <string name="attribute_cliff_yes">Falésia / queda de pedras</string>
+ <string name="attribute_cliff_no">Sem falésia / queda de pedras</string>
+ <string name="attribute_hunting_yes">Caça</string>
+ <string name="attribute_hunting_no">Sem caça</string>
+ <string name="attribute_danger_yes">Área perigosa</string>
+ <string name="attribute_danger_no">Área não perigosa</string>
+ <string name="attribute_thorn_yes">Espinhos</string>
+ <string name="attribute_thorn_no">Sem espinhos</string>
+ <string name="attribute_wheelchair_yes">Acesso a cadeiras de rodas</string>
+ <string name="attribute_wheelchair_no">Sem acesso a cadeiras de rodas</string>
+ <string name="attribute_parking_yes">Estacionamento disponível</string>
+ <string name="attribute_parking_no">Estacionamento não disponível</string>
+ <string name="attribute_public_yes">Transporte público</string>
+ <string name="attribute_public_no">Sem transporte público</string>
+ <string name="attribute_water_yes">Água potável por perto</string>
+ <string name="attribute_water_no">Sem água potável por perto</string>
+ <string name="attribute_restrooms_yes">Casas de banho públicas por perto</string>
+ <string name="attribute_restrooms_no">Sem casas de banho públicas por perto</string>
+ <string name="attribute_phone_yes">Telefone por perto</string>
+ <string name="attribute_phone_no">Sem telefone por perto</string>
+ <string name="attribute_picnic_yes">Mesas de piquenique por perto</string>
+ <string name="attribute_picnic_no">Sem mesas de piquenique por perto</string>
+ <string name="attribute_camping_yes">Campismo disponível</string>
+ <string name="attribute_camping_no">Sem campismo disponível</string>
+ <string name="attribute_stroller_yes">Acessível a carrinhos de bebé</string>
+ <string name="attribute_stroller_no">Não acessível a carinhos de bebé</string>
+ <string name="attribute_fuel_yes">Abastecimento de combustível por perto</string>
+ <string name="attribute_fuel_no">Sem abastecimento de combustível por perto</string>
+ <string name="attribute_food_yes">Comida por perto</string>
+ <string name="attribute_food_no">Sem comida por perto</string>
+ <string name="attribute_oc_only_yes">Só dá para registar em Opencaching</string>
+ <string name="attribute_oc_only_no">Dá registar em Opencaching e não só</string>
+ <string name="attribute_link_only_yes">Ligação para outro portal de caching</string>
+ <string name="attribute_link_only_no">Não só ligação para outro portal de caching</string>
+ <string name="attribute_letterbox_yes">Caixa de correio (precisa de selo)</string>
+ <string name="attribute_letterbox_no">Caixa de correio (não precisa de selo)</string>
+ <string name="attribute_railway_yes">Caminho de ferro activo próximo</string>
+ <string name="attribute_railway_no">Sem caminho de ferro activo próximo</string>
+ <string name="attribute_syringe_yes">Primeiros socorros disponíveis</string>
+ <string name="attribute_syringe_no">Sem primeiros socorros disponíveis</string>
+ <string name="attribute_swamp_yes">Pântano</string>
+ <string name="attribute_swamp_no">Sem pântano</string>
+ <string name="attribute_hills_yes">Área montanhosa</string>
+ <string name="attribute_hills_no">Área não montanhosa</string>
+ <string name="attribute_easy_climbing_yes">Escalada leve</string>
+ <string name="attribute_easy_climbing_no">Escalada não leve</string>
+ <string name="attribute_poi_yes">Ponto de interesse</string>
+ <string name="attribute_poi_no">Não é ponto de interesse</string>
+ <string name="attribute_moving_target_yes">Alvo em movimento</string>
+ <string name="attribute_moving_target_no">Alvo não em movimento</string>
+ <string name="attribute_webcam_yes">Webcam</string>
+ <string name="attribute_webcam_no">Sem webcam</string>
+ <string name="attribute_inside_yes">Dentro de locais fechados (grutas, edifícios, etc)</string>
+ <string name="attribute_inside_no">Fora de locais fechados</string>
+ <string name="attribute_in_water_yes">Na água</string>
+ <string name="attribute_in_water_no">Fora da água</string>
+ <string name="attribute_no_gps_yes">Sem GPS (caixas de correio, bússola, …)</string>
+ <string name="attribute_no_gps_no">Com GPS</string>
+ <string name="attribute_overnight_yes">Necessário pernoitar</string>
+ <string name="attribute_overnight_no">Não necessário pernoitar</string>
+ <string name="attribute_specific_times_yes">Disponível apenas em horários específicos</string>
+ <string name="attribute_specific_times_no">Não só disponível em horários especificados</string>
+ <string name="attribute_day_yes">Apendas de dia</string>
+ <string name="attribute_day_no">Não só de dia</string>
+ <string name="attribute_tide_yes">Maré</string>
+ <string name="attribute_tide_no">Sem maré</string>
+ <string name="attribute_all_seasons_yes">Todas as estações</string>
+ <string name="attribute_all_seasons_no">Não em todas as estações</string>
+ <string name="attribute_breeding_yes">Época de reprodução / natureza protegida</string>
+ <string name="attribute_breeding_no">Não tem época de reprodução / natureza protegida</string>
+ <string name="attribute_snow_proof_yes">Esconderijo à prova de neve</string>
+ <string name="attribute_snow_proof_no">Esconderijo não à prova de neve</string>
+ <string name="attribute_compass_yes">Bússola</string>
+ <string name="attribute_compass_no">Sem bússola</string>
+ <string name="attribute_cave_yes">Equipamento para caverna</string>
+ <string name="attribute_cave_no">Sem equipamento para caverna</string>
+ <string name="attribute_aircraft_yes">Aeronave</string>
+ <string name="attribute_aircraft_no">Não aeronave</string>
+ <string name="attribute_investigation_yes">Investigação</string>
+ <string name="attribute_investigation_no">Não investigação</string>
+ <string name="attribute_puzzle_yes">Puzzle / Mistério</string>
+ <string name="attribute_puzzle_no">Não Puzzle / Mistério</string>
+ <string name="attribute_arithmetic_yes">Problema aritmético</string>
+ <string name="attribute_arithmetic_no">Sem problema aritmético</string>
+ <string name="attribute_other_cache_yes">Outro tipo de cache</string>
+ <string name="attribute_other_cache_no">Não é outro tipo de cache</string>
+ <string name="attribute_ask_owner_yes">Pergunte ao dono as condições de início</string>
+ <string name="attribute_ask_owner_no">Não pergunte ao dono as condições de início</string>
+ <string name="attribute_unknown_yes">Atributo desconhecido presente</string>
+ <string name="attribute_unknown_no">Sem atributo desconhecido presente</string>
+ <string name="attribute_geotour_yes">Parte de GeoTour</string>
+ <string name="attribute_geotour_no">Não é parte de GeoTour</string>
+ <string name="quote">Para tornar o geocaching mais fácil, para tornar os utilizadores mais preguiçosos.</string>
+ <string name="powered_by">carnero</string>
+ <string name="support">Suporte: <a href="">support@cgeo.org</a></string>
+ <string name="website">Site na internet: <a href="">cgeo.org</a></string>
+ <string name="facebook">Facebook: <a href="">página do c:geo</a></string>
+ <string name="twitter">Twitter: <a href="">@android_GC</a></string>
+ <string name="nutshellmanual">Manual: <a href="">o essencial do c:geo</a></string>
+ <string name="market">Android: <a href="">c:geo no Google Play</a></string>
+ <string name="about_twitter">O <b>c:geo</b> deve publicar no Twitter de cada vez que uma cache for registada?</string>
+ <string name="status_new_release" tools:ignore="UnusedResources">Nova versão disponível.\nClique para instalar.</string>
+ <string name="status_new_nightly" tools:ignore="UnusedResources">Nova \'nightly build\' disponível.\nClique para instalar.</string>
+ <string name="status_new_rc" tools:ignore="UnusedResources">Nova \'release candidate\' disponível .\nClique para instalar.</string>
+ <string name="status_geocaching_change" tools:ignore="UnusedResources">Alterações recentes em geocaching.com fizeram com que c:geo funcione mal.\nEstamos a trabalhar nisto, verifique de novo mais tarde.</string>
+ <string name="status_geocaching_livemap" tools:ignore="UnusedResources">Alterações recentes em geocaching.com fizeram com o mapa ao vivo não funcione bem.\nEstamos a trabalhar nisto, verifique de novo mais tarde.</string>
+ <string name="status_closeout_warning" tools:ignore="UnusedResources">Parece estar a utilizar uma versão do Android inferior a 2.1. Futuras versões do c: geo podem deixar de ficar disponíveis para o seu dispositivo.</string>
+ <string name="tts_service">Bússola que fala</string>
+ <string name="tts_start">Comece a falar</string>
+ <string name="tts_stop">Páre de falar</string>
+ <string name="tts_one_kilometer">um quilômetro</string>
+ <string name="tts_one_meter">um metro</string>
+ <string name="tts_one_mile">uma milha</string>
+ <string name="tts_one_foot">um pé</string>
+ <string name="tts_one_oclock">uma hora</string>
+ <string name="tts_oclock">%s horas</string>
+ <string name="clipboard_copy_ok">Copiado para a área de transferência</string>
+ <string-array name="log_image_scales">
+ <item>Não dimensionar</item>
+ <item>512 px</item>
+ <item>640 px</item>
+ <item>800 px</item>
+ <item>1024 px</item>
+ </string-array>
+ <plurals name="caches_eta_mins">
+ <item quantity="one">minuto</item>
+ <item quantity="other">minutos</item>
+ </plurals>
+ <plurals name="cache_counts">
+ <item quantity="one">Uma cache</item>
+ <item quantity="other">%1$d Caches</item>
+ </plurals>
+ <plurals name="waypoints">
+ <item quantity="one">1 Waypoint</item>
+ <item quantity="other">%d Waypoints</item>
+ </plurals>
+ <plurals name="tts_kilometers">
+ <item quantity="one">%s quilômetros</item>
+ <item quantity="other">%s quilômetros</item>
+ </plurals>
+ <plurals name="tts_meters">
+ <item quantity="one">%s metro</item>
+ <item quantity="other">%s metros</item>
+ </plurals>
+ <plurals name="tts_miles">
+ <item quantity="one">%s milha</item>
+ <item quantity="other">%s milhas</item>
+ </plurals>
+ <plurals name="tts_feet">
+ <item quantity="one">%s pé</item>
+ <item quantity="other">%s pés</item>
+ </plurals>
+ <plurals name="days_ago">
+ <item quantity="one">ontem</item>
+ <item quantity="other">%d dias atrás</item>
+ </plurals>
</resources>
diff --git a/main/res/values/changelog_master.xml b/main/res/values/changelog_master.xml
index 6989040..9f23b3a 100644
--- a/main/res/values/changelog_master.xml
+++ b/main/res/values/changelog_master.xml
@@ -10,6 +10,7 @@
Support of live map, nearby search and online logging\n
· Support uploading and merging of personal note to gc.com\n
· Improved input method for editing personal note\n
+ · Toggle hiding of own or found caches directly from live map (map settings)\n
· Removed help function integration as it is no longer maintained by the author\n
You can still access it online. Link in \"About c:geo\"\n
· Added \"Pocket Query Creator\" to the list of useful apps\n
@@ -23,13 +24,21 @@
· Support smilies also for trackable logs\n
· Starting Bike navigation for Google navigation added\n
· Support importing LOC files from waymarking.com\n
+ · Added slovenian translation\n
+ · Support reloading the reCAPTCHA (basic members)\n
+ · Field note export \"since last export\" now uses the last export date from c:geo instead of the gc.com feature\n
+ · Show event date in search results\n
+ · Added filter for several distance ranges\n
\n
<b>Bugfixes:</b>\n
+ · Improved filtering of found caches on live map\n
+ · Do not truncate the date in logbook entries\n
· Enable GPX import option also on virtual all caches list\n
· Support GeoTour attribute\n
· Support of Block Party cache type\n
· Support of GPS Adventure Exhibit cache type\n
· Circles on the map only for physical stages\n
+ · Overlay icons on map sized correctly on highres displays\m
· Cache archived status not correctly refreshed\n
· Bad title shown when invoking c:geo from email (import operation)\n
· Avoid crash when log images is too large\n
@@ -51,5 +60,8 @@
· Show basic Geokrety information for OC-caches\n
· Improved the map source selection for offline maps\n
· Avoid crashes when using the QR-code scanner\n
+ · List sorting kept when returning from cache details\n
+ · Corrected list sorting if cache name contains numbers\n
+ · Set the default \"waypoint shown on live map\" limit to 10 as many users did not recognize this feature\n
</string>
</resources>
diff --git a/main/res/values/preference_keys.xml b/main/res/values/preference_keys.xml
index 5080e1a..e82c9d6 100644
--- a/main/res/values/preference_keys.xml
+++ b/main/res/values/preference_keys.xml
@@ -7,6 +7,7 @@
<string name="pref_fakekey_ocde_authorization">fakekey_ocde_authorization</string>
<string name="pref_fakekey_ocpl_authorization">fakekey_ocpl_authorization</string>
<string name="pref_fakekey_twitter_authorization">fakekey_twitter_authorization</string>
+ <string name="pref_fakekey_navigation_menu_screen">fakekey_navigation_menu_screen</string>
<string name="pref_connectorGCActive">connectorGCActive</string>
<string name="pref_username">username</string>
<string name="pref_password">password</string>
@@ -38,7 +39,7 @@
<string name="pref_mapsource">mapsource</string>
<string name="pref_mapDirectory">mapDirectory</string>
<string name="pref_renderthemepath">renderthemepath</string>
- <string name="pref_gcshowwaypointsthreshold">gcshowwaypointsthreshold</string>
+ <string name="pref_showwaypointsthreshold">waypointsthreshold</string>
<string name="pref_maptrail">maptrail</string>
<string name="pref_defaultNavigationTool">defaultNavigationTool</string>
<string name="pref_defaultNavigationTool2">defaultNavigationTool2</string>
@@ -88,6 +89,25 @@
<string name="pref_temp_ocde_token_secret">ocde-temp-token-secret</string>
<string name="pref_temp_ocde_token_public">ocde-temp-token-public</string>
<string name="pref_fieldnoteExportDate">fieldnoteExportDate</string>
+ <string name="pref_navigation_menu_compass">navigationCompass</string>
+ <string name="pref_navigation_menu_radar">navigationRadar</string>
+ <string name="pref_navigation_menu_internal_map">navigationInternalMap</string>
+ <string name="pref_navigation_menu_static_map">navigationStatic</string>
+ <string name="pref_navigation_menu_static_map_download">navigationStaticDownload</string>
+ <string name="pref_navigation_menu_locus">navigationLocus</string>
+ <string name="pref_navigation_menu_rmaps">navigationRmaps</string>
+ <string name="pref_navigation_menu_google_maps">navigationGoogleMaps</string>
+ <string name="pref_navigation_menu_google_navigation">navigationGoogleNav</string>
+ <string name="pref_navigation_menu_google_streetview">navigationStreetView</string>
+ <string name="pref_navigation_menu_oruxmaps">navigationOruxmaps</string>
+ <string name="pref_navigation_menu_navigon">navigationNavigon</string>
+ <string name="pref_navigation_menu_sygic">navigationSygic</string>
+ <string name="pref_navigation_menu_google_walk">navigationGoogleWalk</string>
+ <string name="pref_navigation_menu_google_bike">navigationGoogleBike</string>
+ <string name="pref_navigation_menu_google_maps_directions">navigationMapsDirections</string>
+ <string name="pref_navigation_menu_cache_beacon">navigationCacheBeacon</string>
+ <string name="pref_navigation_menu_gcc">navigationGcc</string>
+ <string name="pref_navigation_menu_where_you_go">navigationWhereYouGo</string>
<string name="pref_ocpl_tokensecret">ocpl_tokensecret</string>
<string name="pref_ocpl_tokenpublic">ocpl_tokenpublic</string>
<string name="pref_temp_ocpl_token_secret">ocpl-temp-token-secret</string>
diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml
index 68cd95d..3ca5959 100644
--- a/main/res/values/strings.xml
+++ b/main/res/values/strings.xml
@@ -361,7 +361,9 @@
<string name="about_detail">Details</string>
<string name="about_donation_more">Donate\ndevelopment</string>
<string name="about_contributors">Contributors</string>
-
+ <string name="about_license">License</string>
+ <string name="about_apache_license"><a href="">Apache License, Version 2.0</a></string>
+
<!-- settings -->
<string name="settings_title_services">Services</string>
<string name="settings_title_appearance">Appearance</string>
@@ -375,7 +377,8 @@
<string name="settings_title_basicmembers">Basic Members</string>
<string name="settings_title_navigation">Navigation</string>
<string name="settings_title_system">System</string>
-
+ <string name="settings_title_navigation_menu">Navigation Menu</string>
+
<string name="settings_category_browser">Browser</string>
<string name="settings_category_logging_other">Other Logging Options</string>
@@ -383,7 +386,7 @@
<string name="settings_title_gc">Geocaching.com</string>
<string name="settings_activate_gc">Activate</string>
- <string name="settings_gc_legal_note">To use the services of geocaching.com, you must agree to the Groundspeak Terms of Use.</string>
+ <string name="settings_gc_legal_note">With using the service of geocaching.com, you accept the Groundspeak Terms of Use.</string>
<string name="settings_info_facebook_login_title">Facebook Login</string>
<string name="settings_info_facebook_login">You can\'t make c:geo login to geocaching.com with your Facebook account. But there is a simple workaround …</string>
<string name="init_oc">Opencaching.de</string>
@@ -490,9 +493,10 @@
<string name="init_default_navigation_tool_description">Here you can select your preferred navigation tool.</string>
<string name="init_default_navigation_tool_select">Select tool</string>
<string name="init_default_navigation_tool_2_description">Here you can select your second preferred navigation tool. Activate it by long pressing the navigation icon next to the title of the cache.</string>
+ <string name="init_navigation_menu_description">Here you can select which of the available navigation methods will be shown in the navigation menu for a cache or waypoint. Disabled tools are not installed on this device.</string>
<string name="init_debug_title">Debug information</string>
<string name="init_debug_note">c:geo can generate a lot of debugging information. While this information is generally not useful for c:geo users, developers may need you to generate this information in order to analyze a bug. In this case, they will ask you to check the box below and send them the resulting log file.</string>
- <string name="init_debug">Generate debug information</string>
+ <string name="init_debug">Activate debug log</string>
<string name="init_dbonsdcard_title">Database location</string>
<string name="init_dbonsdcard_note">You may store the database of c:geo on your external storage medium. Doing so will save internal memory, but you may lose a bit of performance and c:geo will not work if your SD card isn\'t available.</string>
<string name="init_dbonsdcard">On external storage</string>
@@ -659,6 +663,7 @@
<string name="cache_menu_whereyougo">WhereYouGo</string>
<string name="cache_menu_oruxmaps">OruxMaps</string>
<string name="cache_menu_cachebeacon">Cache Beacon</string>
+ <string name="cache_menu_navigon">Navigon</string>
<string name="cache_status">Status</string>
<string name="cache_status_offline_log">Saved Log</string>
<string name="cache_status_found">Found</string>
diff --git a/main/res/xml/preferences.xml b/main/res/xml/preferences.xml
index ec2e6b6..2afb1ad 100644
--- a/main/res/xml/preferences.xml
+++ b/main/res/xml/preferences.xml
@@ -175,6 +175,11 @@
android:summary="@string/init_summary_address"
android:defaultValue="true" />
<CheckBoxPreference
+ android:key="@string/pref_plainLogs"
+ android:title="@string/init_plain_logs"
+ android:summary="@string/init_summary_plain_logs"
+ android:defaultValue="false" />
+ <CheckBoxPreference
android:key="@string/pref_useenglish"
android:title="@string/init_useenglish"
android:summary="@string/init_summary_useenglish"
@@ -226,11 +231,6 @@
android:title="@string/init_disabled"
android:summary="@string/init_summary_disabled"
android:defaultValue="false" />
- <CheckBoxPreference
- android:key="@string/pref_plainLogs"
- android:title="@string/init_plain_logs"
- android:summary="@string/init_summary_plain_logs"
- android:defaultValue="false" />
</PreferenceScreen>
@@ -277,7 +277,7 @@
android:summary="@string/init_showwaypoint_description"
android:selectable="false" />
<cgeo.geocaching.settings.WpThresholdPreference
- android:key="@string/pref_gcshowwaypointsthreshold"
+ android:key="@string/pref_showwaypointsthreshold"
android:layout="@layout/wp_threshold_preference" />
<CheckBoxPreference
@@ -348,7 +348,7 @@
android:key="@string/pref_choose_list"
android:title="@string/init_choose_list"
android:summary="@string/init_summary_choose_list"
- android:defaultValue="false" />
+ android:defaultValue="true" />
</PreferenceScreen>
@@ -384,7 +384,114 @@
android:defaultValue="0" />
</PreferenceCategory>
-
+
+ <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>
</PreferenceScreen>
<PreferenceScreen
diff --git a/main/src/cgeo/geocaching/AboutActivity.java b/main/src/cgeo/geocaching/AboutActivity.java
index ef59cee..14786ec 100644
--- a/main/src/cgeo/geocaching/AboutActivity.java
+++ b/main/src/cgeo/geocaching/AboutActivity.java
@@ -22,8 +22,8 @@ public class AboutActivity extends AbstractActivity {
@ViewById(R.id.about_version_string) protected TextView version;
@ViewById(R.id.contributors) protected TextView contributors;
@ViewById(R.id.changelog_master) protected TextView changeLogMaster;
- @ViewById(R.id.changelog_release) protected TextView changeLogRelease;
+ @ViewById(R.id.changelog_release) protected TextView changeLogRelease;
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO remove this after the theme has been fixed
@@ -80,4 +80,9 @@ public class AboutActivity extends AbstractActivity {
marketIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
startActivity(marketIntent);
}
+
+ @Click(R.id.license)
+ public void license() {
+ startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.apache.org/licenses/LICENSE-2.0.html")));
+ }
}
diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java
index 45a1dd2..f43de4e 100644
--- a/main/src/cgeo/geocaching/CacheDetailActivity.java
+++ b/main/src/cgeo/geocaching/CacheDetailActivity.java
@@ -243,7 +243,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
return;
}
} else if (uriHost.contains("coord.info")) {
- if (uriPath != null && uriPath.startsWith("/gc")) {
+ if (StringUtils.startsWith(uriPath, "/gc")) {
geocode = uriPath.substring(1).toUpperCase(Locale.US);
} else {
showToast(res.getString(R.string.err_detail_open));
@@ -251,7 +251,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
return;
}
} else if (uriHost.contains("opencaching.de")) {
- if (uriPath != null && uriPath.startsWith("/oc")) {
+ if (StringUtils.startsWith(uriPath, "/oc")) {
geocode = uriPath.substring(1).toUpperCase(Locale.US);
} else {
geocode = uri.getQueryParameter("wp");
diff --git a/main/src/cgeo/geocaching/Geocache.java b/main/src/cgeo/geocaching/Geocache.java
index 3c69197..96fbc06 100644
--- a/main/src/cgeo/geocaching/Geocache.java
+++ b/main/src/cgeo/geocaching/Geocache.java
@@ -30,8 +30,10 @@ import cgeo.geocaching.utils.Log;
import cgeo.geocaching.utils.LogTemplateProvider;
import cgeo.geocaching.utils.LogTemplateProvider.LogContext;
import cgeo.geocaching.utils.MatcherWrapper;
+import cgeo.geocaching.utils.UncertainProperty;
import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import android.app.Activity;
@@ -66,7 +68,7 @@ public class Geocache implements ICache, IWaypoint {
private String geocode = "";
private String cacheId = "";
private String guid = "";
- private CacheType cacheType = CacheType.UNKNOWN;
+ private UncertainProperty<CacheType> cacheType = new UncertainProperty<CacheType>(CacheType.UNKNOWN, Tile.ZOOMLEVEL_MIN - 1);
private String name = "";
private String ownerDisplayName = "";
private String ownerUserId = "";
@@ -84,7 +86,7 @@ public class Geocache implements ICache, IWaypoint {
* lazy initialized
*/
private String location = null;
- private Geopoint coords = null;
+ private UncertainProperty<Geopoint> coords = new UncertainProperty<Geopoint>(null);
private boolean reliableLatLon = false;
private String personalNote = null;
/**
@@ -95,17 +97,18 @@ public class Geocache implements ICache, IWaypoint {
* lazy initialized
*/
private String description = null;
- private boolean disabled = false;
- private boolean archived = false;
- private boolean premiumMembersOnly = false;
- private boolean found = false;
- private boolean favorite = false;
+ private Boolean disabled = null;
+ private Boolean archived = null;
+ private Boolean premiumMembersOnly = null;
+ private Boolean found = null;
+ private Boolean favorite = null;
+ private Boolean onWatchlist = null;
+ private Boolean logOffline = null;
private int favoritePoints = 0;
private float rating = 0; // valid ratings are larger than zero
private int votes = 0;
private float myVote = 0; // valid ratings are larger than zero
private int inventoryItems = 0;
- private boolean onWatchlist = false;
private final List<String> attributes = new LazyInitializedList<String>() {
@Override
public List<String> call() {
@@ -127,7 +130,6 @@ public class Geocache implements ICache, IWaypoint {
};
private List<Trackable> inventory = null;
private Map<LogType, Integer> logCounts = new HashMap<LogType, Integer>();
- private boolean logOffline = false;
private boolean userModifiedCoords = false;
// temporary values
private boolean statusChecked = false;
@@ -136,7 +138,7 @@ public class Geocache implements ICache, IWaypoint {
private final EnumSet<StorageLocation> storageLocation = EnumSet.of(StorageLocation.HEAP);
private boolean finalDefined = false;
private boolean logPasswordRequired = false;
- private int zoomlevel = Tile.ZOOMLEVEL_MAX + 1;
+ // private int zoomlevel = Tile.ZOOMLEVEL_MIN - 1;
private static final Pattern NUMBER_PATTERN = Pattern.compile("\\d+");
@@ -192,38 +194,35 @@ public class Geocache implements ICache, IWaypoint {
updated = System.currentTimeMillis();
// if parsed cache is not yet detailed and stored is, the information of
// the parsed cache will be overwritten
- if (!detailed && (other.detailed || zoomlevel < other.zoomlevel)) {
+ if (!detailed && other.detailed) {
detailed = other.detailed;
detailedUpdate = other.detailedUpdate;
- coords = other.coords;
- cacheType = other.cacheType;
- zoomlevel = other.zoomlevel;
// boolean values must be enumerated here. Other types are assigned outside this if-statement
- // TODO: check whether a search or a live map systematically returns those, in which case
- // we want to keep the most recent one instead of getting information from the previously
- // stored data. This is the case for "archived" for example which has been taken out of this
- // list.
- premiumMembersOnly = other.premiumMembersOnly;
reliableLatLon = other.reliableLatLon;
+ finalDefined = other.finalDefined;
+ }
+
+ if (premiumMembersOnly == null) {
+ premiumMembersOnly = other.premiumMembersOnly;
+ }
+ if (found == null) {
found = other.found;
+ }
+ if (disabled == null) {
disabled = other.disabled;
+ }
+ if (favorite == null) {
favorite = other.favorite;
+ }
+ if (archived == null) {
+ archived = other.archived;
+ }
+ if (onWatchlist == null) {
onWatchlist = other.onWatchlist;
+ }
+ if (logOffline == null) {
logOffline = other.logOffline;
- finalDefined = other.finalDefined;
- archived = other.archived;
}
-
- /*
- * No gathering for boolean members if other cache is not-detailed
- * and does not have information with higher reliability (denoted by zoomlevel)
- * - found
- * - own
- * - disabled
- * - favorite
- * - onWatchlist
- * - logOffline
- */
if (visitedDate == 0) {
visitedDate = other.visitedDate;
}
@@ -239,9 +238,7 @@ public class Geocache implements ICache, IWaypoint {
if (StringUtils.isBlank(guid)) {
guid = other.guid;
}
- if (null == cacheType || CacheType.UNKNOWN == cacheType) {
- cacheType = other.cacheType;
- }
+ cacheType = UncertainProperty.getMergedProperty(cacheType, other.cacheType);
if (StringUtils.isBlank(name)) {
name = other.name;
}
@@ -275,9 +272,7 @@ public class Geocache implements ICache, IWaypoint {
if (StringUtils.isBlank(getLocation())) {
location = other.getLocation();
}
- if (coords == null) {
- coords = other.coords;
- }
+ coords = UncertainProperty.getMergedProperty(coords, other.coords);
// don't use StringUtils.isBlank here. Otherwise we cannot recognize a note which was deleted on GC
if (personalNote == null) {
personalNote = other.personalNote;
@@ -354,9 +349,6 @@ public class Geocache implements ICache, IWaypoint {
if (!reliableLatLon) {
reliableLatLon = other.reliableLatLon;
}
- if (zoomlevel == -1) {
- zoomlevel = other.zoomlevel;
- }
return isEqualTo(other);
}
@@ -374,14 +366,14 @@ public class Geocache implements ICache, IWaypoint {
StringUtils.equalsIgnoreCase(name, other.name) &&
cacheType == other.cacheType &&
size == other.size &&
- found == other.found &&
- premiumMembersOnly == other.premiumMembersOnly &&
+ ObjectUtils.equals(found, other.found) &&
+ ObjectUtils.equals(premiumMembersOnly, other.premiumMembersOnly) &&
difficulty == other.difficulty &&
terrain == other.terrain &&
(coords != null ? coords.equals(other.coords) : null == other.coords) &&
reliableLatLon == other.reliableLatLon &&
- disabled == other.disabled &&
- archived == other.archived &&
+ ObjectUtils.equals(disabled, other.disabled) &&
+ ObjectUtils.equals(archived, other.archived) &&
listId == other.listId &&
StringUtils.equalsIgnoreCase(ownerDisplayName, other.ownerDisplayName) &&
StringUtils.equalsIgnoreCase(ownerUserId, other.ownerUserId) &&
@@ -389,9 +381,9 @@ public class Geocache implements ICache, IWaypoint {
StringUtils.equalsIgnoreCase(personalNote, other.personalNote) &&
StringUtils.equalsIgnoreCase(getShortDescription(), other.getShortDescription()) &&
StringUtils.equalsIgnoreCase(getLocation(), other.getLocation()) &&
- favorite == other.favorite &&
+ ObjectUtils.equals(favorite, other.favorite) &&
favoritePoints == other.favoritePoints &&
- onWatchlist == other.onWatchlist &&
+ ObjectUtils.equals(onWatchlist, other.onWatchlist) &&
(hidden != null ? hidden.equals(other.hidden) : null == other.hidden) &&
StringUtils.equalsIgnoreCase(guid, other.guid) &&
StringUtils.equalsIgnoreCase(getHint(), other.getHint()) &&
@@ -408,7 +400,7 @@ public class Geocache implements ICache, IWaypoint {
logs == other.logs &&
inventory == other.inventory &&
logCounts == other.logCounts &&
- logOffline == other.logOffline &&
+ ObjectUtils.equals(logOffline, other.logOffline) &&
finalDefined == other.finalDefined;
}
@@ -452,7 +444,7 @@ public class Geocache implements ICache, IWaypoint {
}
public boolean isEventCache() {
- return cacheType.isEvent();
+ return cacheType.getValue().isEvent();
}
public void logVisit(final IAbstractActivity fromActivity) {
@@ -483,7 +475,7 @@ public class Geocache implements ICache, IWaypoint {
if (status) {
ActivityMixin.showToast(fromActivity, res.getString(R.string.info_log_saved));
cgData.saveVisitDate(geocode);
- logOffline = true;
+ logOffline = Boolean.TRUE;
notifyChange();
} else {
@@ -504,7 +496,7 @@ public class Geocache implements ICache, IWaypoint {
if (isOwner()) {
logTypes.add(LogType.ANNOUNCEMENT);
}
- } else if (CacheType.WEBCAM == cacheType) {
+ } else if (CacheType.WEBCAM == cacheType.getValue()) {
logTypes.add(LogType.WEBCAM_PHOTO_TAKEN);
} else {
logTypes.add(LogType.FOUND_IT);
@@ -610,21 +602,21 @@ public class Geocache implements ICache, IWaypoint {
@Override
public boolean isArchived() {
- return archived;
+ return (archived != null && archived.booleanValue());
}
@Override
public boolean isDisabled() {
- return disabled;
+ return (disabled != null && disabled.booleanValue());
}
@Override
public boolean isPremiumMembersOnly() {
- return premiumMembersOnly;
+ return (premiumMembersOnly != null && premiumMembersOnly.booleanValue());
}
public void setPremiumMembersOnly(boolean members) {
- this.premiumMembersOnly = members;
+ this.premiumMembersOnly = Boolean.valueOf(members);
}
@Override
@@ -775,16 +767,16 @@ public class Geocache implements ICache, IWaypoint {
@Override
public boolean isFound() {
- return found;
+ return (found != null && found.booleanValue());
}
@Override
public boolean isFavorite() {
- return favorite;
+ return (favorite != null && favorite.booleanValue());
}
public void setFavorite(boolean favorite) {
- this.favorite = favorite;
+ this.favorite = Boolean.valueOf(favorite);
}
@Override
@@ -830,19 +822,22 @@ public class Geocache implements ICache, IWaypoint {
@Override
public String getNameForSorting() {
if (null == nameForSorting) {
- final MatcherWrapper matcher = new MatcherWrapper(NUMBER_PATTERN, name);
- if (matcher.find()) {
- nameForSorting = name.replace(matcher.group(), StringUtils.leftPad(matcher.group(), 6, '0'));
- }
- else {
- nameForSorting = name;
+ nameForSorting = name;
+ // pad each number part to a fixed size of 6 digits, so that numerical sorting becomes equivalent to string sorting
+ MatcherWrapper matcher = new MatcherWrapper(NUMBER_PATTERN, nameForSorting);
+ int start = 0;
+ while (matcher.find(start)) {
+ final String number = matcher.group();
+ nameForSorting = StringUtils.substring(nameForSorting, 0, matcher.start()) + StringUtils.leftPad(number, 6, '0') + StringUtils.substring(nameForSorting, matcher.start() + number.length());
+ start = matcher.start() + Math.max(6, number.length());
+ matcher = new MatcherWrapper(NUMBER_PATTERN, nameForSorting);
}
}
return nameForSorting;
}
public boolean isVirtual() {
- return cacheType.isVirtual();
+ return cacheType.getValue().isVirtual();
}
public boolean showSize() {
@@ -916,11 +911,30 @@ public class Geocache implements ICache, IWaypoint {
@Override
public Geopoint getCoords() {
- return coords;
+ return coords.getValue();
+ }
+
+ public int getCoordZoomLevel() {
+ return coords.getCertaintyLevel();
}
+ /**
+ * Set reliable coordinates
+ *
+ * @param coords
+ */
public void setCoords(Geopoint coords) {
- this.coords = coords;
+ this.coords = new UncertainProperty<Geopoint>(coords);
+ }
+
+ /**
+ * Set unreliable coordinates from a certain map zoom level
+ *
+ * @param coords
+ * @param zoomlevel
+ */
+ public void setCoords(Geopoint coords, int zoomlevel) {
+ this.coords = new UncertainProperty<Geopoint>(coords, zoomlevel);
}
/**
@@ -976,11 +990,11 @@ public class Geocache implements ICache, IWaypoint {
@Override
public boolean isOnWatchlist() {
- return onWatchlist;
+ return (onWatchlist != null && onWatchlist.booleanValue());
}
public void setOnWatchlist(boolean onWatchlist) {
- this.onWatchlist = onWatchlist;
+ this.onWatchlist = Boolean.valueOf(onWatchlist);
}
/**
@@ -1049,11 +1063,11 @@ public class Geocache implements ICache, IWaypoint {
}
public boolean isLogOffline() {
- return logOffline;
+ return (logOffline != null && logOffline.booleanValue());
}
public void setLogOffline(boolean logOffline) {
- this.logOffline = logOffline;
+ this.logOffline = Boolean.valueOf(logOffline);
}
public boolean isStatusChecked() {
@@ -1126,15 +1140,15 @@ public class Geocache implements ICache, IWaypoint {
}
public void setDisabled(boolean disabled) {
- this.disabled = disabled;
+ this.disabled = Boolean.valueOf(disabled);
}
public void setArchived(boolean archived) {
- this.archived = archived;
+ this.archived = Boolean.valueOf(archived);
}
public void setFound(boolean found) {
- this.found = found;
+ this.found = Boolean.valueOf(found);
}
public void setAttributes(List<String> attributes) {
@@ -1165,14 +1179,21 @@ public class Geocache implements ICache, IWaypoint {
*/
@Override
public CacheType getType() {
- return cacheType;
+ return cacheType.getValue();
}
public void setType(CacheType cacheType) {
if (cacheType == null || CacheType.ALL == cacheType) {
throw new IllegalArgumentException("Illegal cache type");
}
- this.cacheType = cacheType;
+ this.cacheType = new UncertainProperty<CacheType>(cacheType);
+ }
+
+ public void setType(CacheType cacheType, final int zoomlevel) {
+ if (cacheType == null || CacheType.ALL == cacheType) {
+ throw new IllegalArgumentException("Illegal cache type");
+ }
+ this.cacheType = new UncertainProperty<CacheType>(cacheType, zoomlevel);
}
public boolean hasDifficulty() {
@@ -1473,14 +1494,6 @@ public class Geocache implements ICache, IWaypoint {
storeCache(this, null, newListId, false, handler);
}
- public int getZoomLevel() {
- return this.zoomlevel;
- }
-
- public void setZoomlevel(int zoomlevel) {
- this.zoomlevel = zoomlevel;
- }
-
@Override
public int getId() {
return 0;
diff --git a/main/src/cgeo/geocaching/ImageSelectActivity.java b/main/src/cgeo/geocaching/ImageSelectActivity.java
index 52f9a7e..738b9a7 100644
--- a/main/src/cgeo/geocaching/ImageSelectActivity.java
+++ b/main/src/cgeo/geocaching/ImageSelectActivity.java
@@ -6,6 +6,7 @@ import butterknife.Views;
import cgeo.geocaching.activity.AbstractActivity;
import cgeo.geocaching.compatibility.Compatibility;
import cgeo.geocaching.settings.Settings;
+import cgeo.geocaching.utils.FileUtils;
import cgeo.geocaching.utils.ImageUtils;
import cgeo.geocaching.utils.Log;
@@ -328,8 +329,7 @@ public class ImageSelectActivity extends AbstractActivity {
// Create the storage directory if it does not exist
if (!mediaStorageDir.exists()) {
- if (!mediaStorageDir.mkdirs()) {
- Log.w("Failed to create directory");
+ if (!FileUtils.mkdirs(mediaStorageDir)) {
return null;
}
}
diff --git a/main/src/cgeo/geocaching/LogCacheActivity.java b/main/src/cgeo/geocaching/LogCacheActivity.java
index e11af0f..207dce5 100644
--- a/main/src/cgeo/geocaching/LogCacheActivity.java
+++ b/main/src/cgeo/geocaching/LogCacheActivity.java
@@ -545,6 +545,7 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia
if (typeSelected == LogType.FOUND_IT || typeSelected == LogType.ATTENDED) {
cache.setFound(true);
+ cache.setVisitedDate(new Date().getTime());
}
cgData.saveChangedCache(cache);
diff --git a/main/src/cgeo/geocaching/LogTrackableActivity.java b/main/src/cgeo/geocaching/LogTrackableActivity.java
index f0dd7f9..a45d584 100644
--- a/main/src/cgeo/geocaching/LogTrackableActivity.java
+++ b/main/src/cgeo/geocaching/LogTrackableActivity.java
@@ -183,7 +183,6 @@ public class LogTrackableActivity extends AbstractLoggingActivity implements Dat
public void init() {
registerForContextMenu(typeButton);
- typeButton.setText(typeSelected.getL10n());
typeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
@@ -191,10 +190,11 @@ public class LogTrackableActivity extends AbstractLoggingActivity implements Dat
}
});
+ setType(typeSelected);
dateButton.setOnClickListener(new DateListener());
setDate(date);
- tweetCheck.setChecked(true);
+ initTwitter();
if (CollectionUtils.isEmpty(possibleLogTypes)) {
possibleLogTypes = Trackable.getPossibleLogTypes();
@@ -223,7 +223,10 @@ public class LogTrackableActivity extends AbstractLoggingActivity implements Dat
public void setType(LogType type) {
typeSelected = type;
typeButton.setText(typeSelected.getL10n());
+ }
+ private void initTwitter() {
+ tweetCheck.setChecked(true);
if (Settings.isUseTwitter() && Settings.isTwitterLoginValid()) {
tweetBox.setVisibility(View.VISIBLE);
} else {
diff --git a/main/src/cgeo/geocaching/MainActivity.java b/main/src/cgeo/geocaching/MainActivity.java
index 2d488d6..a3daf97 100644
--- a/main/src/cgeo/geocaching/MainActivity.java
+++ b/main/src/cgeo/geocaching/MainActivity.java
@@ -14,6 +14,7 @@ import cgeo.geocaching.maps.CGeoMap;
import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.settings.SettingsActivity;
import cgeo.geocaching.ui.Formatter;
+import cgeo.geocaching.utils.DatabaseBackupUtils;
import cgeo.geocaching.utils.GeoDirHandler;
import cgeo.geocaching.utils.Log;
import cgeo.geocaching.utils.ProcessUtils;
@@ -462,12 +463,12 @@ public class MainActivity extends AbstractActivity {
builder.create().show();
}
- void updateCacheCounter() {
+ public void updateCacheCounter() {
(new CountBubbleUpdateThread()).start();
}
private void checkRestore() {
- if (!cgData.isNewlyCreatedDatebase() || null == cgData.getRestoreFile()) {
+ if (!cgData.isNewlyCreatedDatebase() || null == DatabaseBackupUtils.getRestoreFile()) {
return;
}
new AlertDialog.Builder(this)
@@ -479,7 +480,7 @@ public class MainActivity extends AbstractActivity {
public void onClick(final DialogInterface dialog, final int id) {
dialog.dismiss();
cgData.resetNewlyCreatedDatabase();
- app.restoreDatabase(MainActivity.this);
+ DatabaseBackupUtils.restoreDatabase(MainActivity.this);
}
})
.setNegativeButton(getString(android.R.string.no), new DialogInterface.OnClickListener() {
diff --git a/main/src/cgeo/geocaching/NavigateAnyPointActivity.java b/main/src/cgeo/geocaching/NavigateAnyPointActivity.java
index be4ef05..741414b 100644
--- a/main/src/cgeo/geocaching/NavigateAnyPointActivity.java
+++ b/main/src/cgeo/geocaching/NavigateAnyPointActivity.java
@@ -100,13 +100,13 @@ public class NavigateAnyPointActivity extends AbstractActivity {
return rowView;
}
- private void fillViewHolder(ViewHolder viewHolder, Destination loc) {
+ private static void fillViewHolder(ViewHolder viewHolder, Destination loc) {
String lonString = loc.getCoords().format(GeopointFormatter.Format.LON_DECMINUTE);
String latString = loc.getCoords().format(GeopointFormatter.Format.LAT_DECMINUTE);
viewHolder.longitude.setText(lonString);
viewHolder.latitude.setText(latString);
- viewHolder.date.setText(Formatter.formatShortDateTime(getContext(), loc.getDate()));
+ viewHolder.date.setText(Formatter.formatShortDateTime(loc.getDate()));
}
private LayoutInflater getInflater() {
@@ -490,6 +490,7 @@ public class NavigateAnyPointActivity extends AbstractActivity {
return null;
}
+ // get base coordinates
Geopoint coords;
if (StringUtils.isNotBlank(latText) && StringUtils.isNotBlank(lonText)) {
try {
@@ -507,8 +508,8 @@ public class NavigateAnyPointActivity extends AbstractActivity {
coords = app.currentGeo().getCoords();
}
- Geopoint result;
- if (StringUtils.isNotBlank(bearingText) && StringUtils.isNotBlank(distanceText)) {
+ // apply projection
+ if (coords != null && StringUtils.isNotBlank(bearingText) && StringUtils.isNotBlank(distanceText)) {
// bearing & distance
double bearing;
try {
@@ -527,23 +528,14 @@ public class NavigateAnyPointActivity extends AbstractActivity {
return null;
}
- final Geopoint coordsDst = coords.project(bearing, distance);
-
- if (coordsDst == null) {
- showToast(res.getString(R.string.err_point_location_error));
- return null;
- }
-
- result = coordsDst;
- } else if (coords != null) {
- result = coords;
- } else {
- return null;
+ coords = coords.project(bearing, distance);
}
- saveCoords(result);
+ if (coords != null) {
+ saveCoords(coords);
+ }
- return result;
+ return coords;
}
private void saveCoords(final Geopoint coords) {
diff --git a/main/src/cgeo/geocaching/SearchActivity.java b/main/src/cgeo/geocaching/SearchActivity.java
index ccf3edf..57b391f 100644
--- a/main/src/cgeo/geocaching/SearchActivity.java
+++ b/main/src/cgeo/geocaching/SearchActivity.java
@@ -63,6 +63,7 @@ public class SearchActivity extends AbstractActivity {
// search query
final Intent intent = getIntent();
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
+ hideKeyboard();
final String query = intent.getStringExtra(SearchManager.QUERY);
final boolean keywordSearch = intent.getBooleanExtra(Intents.EXTRA_KEYWORD_SEARCH, true);
diff --git a/main/src/cgeo/geocaching/SelectMapfileActivity.java b/main/src/cgeo/geocaching/SelectMapfileActivity.java
index 8f82288..8b50c1f 100644
--- a/main/src/cgeo/geocaching/SelectMapfileActivity.java
+++ b/main/src/cgeo/geocaching/SelectMapfileActivity.java
@@ -47,7 +47,7 @@ public class SelectMapfileActivity extends AbstractFileListActivity<FileSelectio
@Override
protected List<File> getBaseFolders() {
List<File> folders = new ArrayList<File>();
- for (File dir : getStorages()) {
+ for (File dir : LocalStorage.getStorages()) {
folders.add(new File(dir, "mfmaps"));
folders.add(new File(new File(dir, "Locus"), "mapsVector"));
folders.add(new File(dir, LocalStorage.cache));
diff --git a/main/src/cgeo/geocaching/StaticMapsProvider.java b/main/src/cgeo/geocaching/StaticMapsProvider.java
index 2555b80..eb59bcb 100644
--- a/main/src/cgeo/geocaching/StaticMapsProvider.java
+++ b/main/src/cgeo/geocaching/StaticMapsProvider.java
@@ -7,6 +7,7 @@ import cgeo.geocaching.geopoint.GeopointFormatter.Format;
import cgeo.geocaching.network.Network;
import cgeo.geocaching.network.Parameters;
import cgeo.geocaching.settings.Settings;
+import cgeo.geocaching.utils.FileUtils;
import cgeo.geocaching.utils.Log;
import ch.boye.httpclientandroidlib.HttpResponse;
@@ -82,7 +83,7 @@ public final class StaticMapsProvider {
// Delete image if it has no contents
final long fileSize = file.length();
if (fileSize < MIN_MAP_IMAGE_BYTES) {
- file.delete();
+ FileUtils.deleteIgnoringFailure(file);
}
}
}
@@ -229,10 +230,9 @@ public final class StaticMapsProvider {
int waypointId = waypoint.getId();
int waypointMapHash = waypoint.getStaticMapsHashcode();
for (int level = 1; level <= MAPS_LEVEL_MAX; level++) {
- try {
- StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypointId + "_" + waypointMapHash + '_' + level, false).delete();
- } catch (Exception e) {
- Log.e("StaticMapsProvider.removeWpStaticMaps", e);
+ final File mapFile = StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypointId + "_" + waypointMapHash + '_' + level, false);
+ if (!FileUtils.delete(mapFile)) {
+ Log.e("StaticMapsProvider.removeWpStaticMaps failed for " + mapFile.getAbsolutePath());
}
}
}
diff --git a/main/src/cgeo/geocaching/StoredList.java b/main/src/cgeo/geocaching/StoredList.java
index 55a155c..ec99d0a 100644
--- a/main/src/cgeo/geocaching/StoredList.java
+++ b/main/src/cgeo/geocaching/StoredList.java
@@ -72,6 +72,10 @@ public final class StoredList {
}
public void promptForListSelection(final int titleId, final RunnableWithArgument<Integer> runAfterwards, final boolean onlyConcreteLists, final int exceptListId) {
+ promptForListSelection(titleId, runAfterwards, onlyConcreteLists, exceptListId, StringUtils.EMPTY);
+ }
+
+ public void promptForListSelection(final int titleId, final RunnableWithArgument<Integer> runAfterwards, final boolean onlyConcreteLists, final int exceptListId, final String newListName) {
final List<StoredList> lists = getSortedLists();
if (lists == null) {
@@ -106,7 +110,7 @@ public final class StoredList {
runAfterwards.run(StoredList.ALL_LIST_ID);
} else if (itemId >= lists.size()) {
// create new list on the fly
- promptForListCreation(runAfterwards);
+ promptForListCreation(runAfterwards, newListName);
}
else {
if (runAfterwards != null) {
@@ -131,8 +135,8 @@ public final class StoredList {
return lists;
}
- public void promptForListCreation(final RunnableWithArgument<Integer> runAfterwards) {
- handleListNameInput("", R.string.list_dialog_create_title, R.string.list_dialog_create, new RunnableWithArgument<String>() {
+ public void promptForListCreation(final RunnableWithArgument<Integer> runAfterwards, String newListName) {
+ handleListNameInput(newListName, R.string.list_dialog_create_title, R.string.list_dialog_create, new RunnableWithArgument<String>() {
@Override
public void run(final String listName) {
diff --git a/main/src/cgeo/geocaching/TrackableActivity.java b/main/src/cgeo/geocaching/TrackableActivity.java
index d1f323c..35ffdc6 100644
--- a/main/src/cgeo/geocaching/TrackableActivity.java
+++ b/main/src/cgeo/geocaching/TrackableActivity.java
@@ -154,7 +154,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
}
} else if (uriHost.contains("coord.info")) {
final String uriPath = uri.getPath().toLowerCase(Locale.US);
- if (uriPath != null && uriPath.startsWith("/tb")) {
+ if (StringUtils.startsWith(uriPath, "/tb")) {
geocode = uriPath.substring(1).toUpperCase(Locale.US);
guid = null;
id = null;
diff --git a/main/src/cgeo/geocaching/activity/AbstractActivity.java b/main/src/cgeo/geocaching/activity/AbstractActivity.java
index 9aca35e..28c0cdd 100644
--- a/main/src/cgeo/geocaching/activity/AbstractActivity.java
+++ b/main/src/cgeo/geocaching/activity/AbstractActivity.java
@@ -2,16 +2,18 @@ package cgeo.geocaching.activity;
import butterknife.Views;
-import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.cgeoapplication;
import cgeo.geocaching.compatibility.Compatibility;
import cgeo.geocaching.network.Cookies;
+import cgeo.geocaching.settings.Settings;
+import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.View;
+import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
public abstract class AbstractActivity extends FragmentActivity implements IAbstractActivity {
@@ -113,4 +115,8 @@ public abstract class AbstractActivity extends FragmentActivity implements IAbst
// initialize the action bar title with the activity title for single source
ActivityMixin.setTitle(this, getTitle());
}
+
+ protected void hideKeyboard() {
+ ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
+ }
}
diff --git a/main/src/cgeo/geocaching/apps/cache/GccApp.java b/main/src/cgeo/geocaching/apps/cache/GccApp.java
index b129b45..0bbc2dd 100644
--- a/main/src/cgeo/geocaching/apps/cache/GccApp.java
+++ b/main/src/cgeo/geocaching/apps/cache/GccApp.java
@@ -1,9 +1,28 @@
package cgeo.geocaching.apps.cache;
import cgeo.geocaching.R;
+import cgeo.geocaching.utils.ProcessUtils;
+
+import android.content.Intent;
public class GccApp extends AbstractGeneralApp {
+ private static final String PACKAGE = "eisbehr.gcc";
+ private static final String PACKAGE_PRO = "eisbehr.gcc.pro";
+
public GccApp() {
- super(getString(R.string.cache_menu_gcc), "eisbehr.gcc");
+ super(getString(R.string.cache_menu_gcc), null);
+ }
+
+ @Override
+ public boolean isInstalled() {
+ return ProcessUtils.isLaunchable(PACKAGE) || ProcessUtils.isLaunchable(PACKAGE_PRO);
+ }
+
+ @Override
+ protected Intent getLaunchIntent() {
+ if (ProcessUtils.isLaunchable(PACKAGE_PRO)) {
+ return ProcessUtils.getLaunchIntent(PACKAGE_PRO);
+ }
+ return ProcessUtils.getLaunchIntent(PACKAGE);
}
}
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java b/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java
index 4db889d..ec6b3e1 100644
--- a/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java
+++ b/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java
@@ -1,7 +1,6 @@
package cgeo.geocaching.apps.cache.navi;
import cgeo.geocaching.Geocache;
-import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.R;
import cgeo.geocaching.Waypoint;
import cgeo.geocaching.cgeoapplication;
@@ -15,6 +14,7 @@ import cgeo.geocaching.apps.cache.navi.GoogleNavigationApp.GoogleNavigationBikeA
import cgeo.geocaching.apps.cache.navi.GoogleNavigationApp.GoogleNavigationDrivingApp;
import cgeo.geocaching.apps.cache.navi.GoogleNavigationApp.GoogleNavigationWalkingApp;
import cgeo.geocaching.geopoint.Geopoint;
+import cgeo.geocaching.settings.Settings;
import android.app.Activity;
import android.app.AlertDialog;
@@ -30,51 +30,52 @@ public final class NavigationAppFactory extends AbstractAppFactory {
public enum NavigationAppsEnum {
/** The internal compass activity */
- COMPASS(new CompassApp(), 0),
+ COMPASS(new CompassApp(), 0, R.string.pref_navigation_menu_compass),
/** The external radar app */
- RADAR(new RadarApp(), 1),
+ RADAR(new RadarApp(), 1, R.string.pref_navigation_menu_radar),
/** The selected map */
- INTERNAL_MAP(new InternalMap(), 2),
- /** The internal static map activity */
- STATIC_MAP(new StaticMapApp(), 3),
- /** The external Locus app */
- DOWNLOAD_STATIC_MAPS(new DownloadStaticMapsApp(), 20),
+ INTERNAL_MAP(new InternalMap(), 2, R.string.pref_navigation_menu_internal_map),
+ /** The internal static map activity, when stored */
+ STATIC_MAP(new StaticMapApp(), 3, R.string.pref_navigation_menu_static_map),
+ /** The internal static map activity, when not yet stored */
+ DOWNLOAD_STATIC_MAPS(new DownloadStaticMapsApp(), 20, R.string.pref_navigation_menu_static_map_download),
/** The external Locus app */
- LOCUS(new LocusApp(), 4),
+ LOCUS(new LocusApp(), 4, R.string.pref_navigation_menu_locus),
/** The external RMaps app */
- RMAPS(new RMapsApp(), 5),
+ RMAPS(new RMapsApp(), 5, R.string.pref_navigation_menu_rmaps),
/** Google Maps */
- GOOGLE_MAPS(new GoogleMapsApp(), 6),
+ GOOGLE_MAPS(new GoogleMapsApp(), 6, R.string.pref_navigation_menu_google_maps),
/** Google Navigation */
- GOOGLE_NAVIGATION(new GoogleNavigationDrivingApp(), 7),
+ GOOGLE_NAVIGATION(new GoogleNavigationDrivingApp(), 7, R.string.pref_navigation_menu_google_navigation),
/** Google Streetview */
- GOOGLE_STREETVIEW(new StreetviewApp(), 8),
+ GOOGLE_STREETVIEW(new StreetviewApp(), 8, R.string.pref_navigation_menu_google_streetview),
/** The external OruxMaps app */
- ORUX_MAPS(new OruxMapsApp(), 9),
+ ORUX_MAPS(new OruxMapsApp(), 9, R.string.pref_navigation_menu_oruxmaps),
/** The external navigon app */
- NAVIGON(new NavigonApp(), 10),
+ NAVIGON(new NavigonApp(), 10, R.string.pref_navigation_menu_navigon),
/** The external Sygic app */
- SYGIC(new SygicNavigationApp(), 11),
+ SYGIC(new SygicNavigationApp(), 11, R.string.pref_navigation_menu_sygic),
/**
* Google Navigation in walking mode
*/
- GOOGLE_NAVIGATION_WALK(new GoogleNavigationWalkingApp(), 12),
+ GOOGLE_NAVIGATION_WALK(new GoogleNavigationWalkingApp(), 12, R.string.pref_navigation_menu_google_walk),
/**
* Google Navigation in walking mode
*/
- GOOGLE_NAVIGATION_BIKE(new GoogleNavigationBikeApp(), 21),
+ GOOGLE_NAVIGATION_BIKE(new GoogleNavigationBikeApp(), 21, R.string.pref_navigation_menu_google_bike),
/**
* Google Maps Directions
*/
- GOOGLE_MAPS_DIRECTIONS(new GoogleMapsDirectionApp(), 13),
+ GOOGLE_MAPS_DIRECTIONS(new GoogleMapsDirectionApp(), 13, R.string.pref_navigation_menu_google_maps_directions),
- CACHE_BEACON(new CacheBeaconApp(), 14),
- GCC(new GccApp(), 15),
- WHERE_YOU_GO(new WhereYouGoApp(), 16);
+ CACHE_BEACON(new CacheBeaconApp(), 14, R.string.pref_navigation_menu_cache_beacon),
+ GCC(new GccApp(), 15, R.string.pref_navigation_menu_gcc),
+ WHERE_YOU_GO(new WhereYouGoApp(), 16, R.string.pref_navigation_menu_where_you_go);
- NavigationAppsEnum(App app, int id) {
+ NavigationAppsEnum(final App app, final int id, final int preferenceKey) {
this.app = app;
this.id = id;
+ this.preferenceKey = preferenceKey;
}
/**
@@ -86,6 +87,11 @@ public final class NavigationAppFactory extends AbstractAppFactory {
*/
public final int id;
+ /**
+ * key of the related preference in the navigation menu preference screen, used for disabling the preference UI
+ */
+ public final int preferenceKey;
+
/*
* display app name in array adapter
*
@@ -142,18 +148,20 @@ public final class NavigationAppFactory extends AbstractAppFactory {
for (final NavigationAppsEnum navApp : getInstalledNavigationApps()) {
if ((showInternalMap || !(navApp.app instanceof InternalMap)) &&
(showDefaultNavigation || defaultNavigationTool != navApp.id)) {
- boolean add = false;
- if (cache != null && navApp.app instanceof CacheNavigationApp && navApp.app.isEnabled(cache)) {
- add = true;
- }
- if (waypoint != null && navApp.app instanceof WaypointNavigationApp && ((WaypointNavigationApp) navApp.app).isEnabled(waypoint)) {
- add = true;
- }
- if (destination != null && navApp.app instanceof GeopointNavigationApp) {
- add = true;
- }
- if (add) {
- items.add(navApp);
+ if (Settings.isUseNavigationApp(navApp)) {
+ boolean add = false;
+ if (cache != null && navApp.app instanceof CacheNavigationApp && navApp.app.isEnabled(cache)) {
+ add = true;
+ }
+ if (waypoint != null && navApp.app instanceof WaypointNavigationApp && ((WaypointNavigationApp) navApp.app).isEnabled(waypoint)) {
+ add = true;
+ }
+ if (destination != null && navApp.app instanceof GeopointNavigationApp) {
+ add = true;
+ }
+ if (add) {
+ items.add(navApp);
+ }
}
}
}
@@ -233,7 +241,7 @@ public final class NavigationAppFactory extends AbstractAppFactory {
for (final NavigationAppsEnum navApp : getInstalledNavigationApps()) {
if (navApp.app instanceof CacheNavigationApp) {
final CacheNavigationApp cacheApp = (CacheNavigationApp) navApp.app;
- if (cacheApp.isEnabled(cache)) {
+ if (cacheApp.isEnabled(cache) && Settings.isUseNavigationApp(navApp)) {
menu.add(0, MENU_ITEM_OFFSET + navApp.id, 0, navApp.app.getName());
}
}
@@ -244,7 +252,7 @@ public final class NavigationAppFactory extends AbstractAppFactory {
for (final NavigationAppsEnum navApp : getInstalledNavigationApps()) {
if (navApp.app instanceof WaypointNavigationApp) {
final WaypointNavigationApp waypointApp = (WaypointNavigationApp) navApp.app;
- if (waypointApp.isEnabled(waypoint)) {
+ if (waypointApp.isEnabled(waypoint) && Settings.isUseNavigationApp(navApp)) {
menu.add(0, MENU_ITEM_OFFSET + navApp.id, 0, navApp.app.getName());
}
}
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/NavigonApp.java b/main/src/cgeo/geocaching/apps/cache/navi/NavigonApp.java
index 7ea86fb..7966733 100644
--- a/main/src/cgeo/geocaching/apps/cache/navi/NavigonApp.java
+++ b/main/src/cgeo/geocaching/apps/cache/navi/NavigonApp.java
@@ -1,5 +1,6 @@
package cgeo.geocaching.apps.cache.navi;
+import cgeo.geocaching.R;
import cgeo.geocaching.geopoint.Geopoint;
import android.app.Activity;
@@ -12,7 +13,7 @@ class NavigonApp extends AbstractPointNavigationApp {
private static final String INTENT_EXTRA_KEY_LONGITUDE = "longitude";
NavigonApp() {
- super("Navigon", INTENT);
+ super(getString(R.string.cache_menu_navigon), INTENT);
}
@Override
diff --git a/main/src/cgeo/geocaching/cgData.java b/main/src/cgeo/geocaching/cgData.java
index 87710fb..9d636f9 100644
--- a/main/src/cgeo/geocaching/cgData.java
+++ b/main/src/cgeo/geocaching/cgData.java
@@ -14,6 +14,7 @@ import cgeo.geocaching.files.LocalStorage;
import cgeo.geocaching.geopoint.Geopoint;
import cgeo.geocaching.geopoint.Viewport;
import cgeo.geocaching.settings.Settings;
+import cgeo.geocaching.utils.FileUtils;
import cgeo.geocaching.utils.Log;
import org.apache.commons.collections.CollectionUtils;
@@ -310,17 +311,17 @@ public class cgData {
database = null;
}
- private static File getBackupFile() {
+ public static File getBackupFileInternal() {
return new File(LocalStorage.getStorage(), "cgeo.sqlite");
}
- public static String backupDatabase() {
+ public static String backupDatabaseInternal() {
if (!LocalStorage.isExternalStorageAvailable()) {
Log.w("Database wasn't backed up: no external memory");
return null;
}
- final File target = getBackupFile();
+ final File target = getBackupFileInternal();
closeDb();
final boolean backupDone = LocalStorage.copy(databasePath(), target);
init();
@@ -351,7 +352,9 @@ public class cgData {
return false;
}
- source.delete();
+ if (!FileUtils.delete(source)) {
+ Log.e("Original database could not be deleted during move");
+ }
Settings.setDbOnSDCard(!Settings.isDbOnSDCard());
Log.i("Database was moved to " + target);
init();
@@ -370,18 +373,13 @@ public class cgData {
return databasePath(Settings.isDbOnSDCard());
}
- public static File getRestoreFile() {
- final File fileSourceFile = getBackupFile();
- return fileSourceFile.exists() ? fileSourceFile : null;
- }
-
- public static boolean restoreDatabase() {
+ public static boolean restoreDatabaseInternal() {
if (!LocalStorage.isExternalStorageAvailable()) {
Log.w("Database wasn't restored: no external memory");
return false;
}
- final File sourceFile = getBackupFile();
+ final File sourceFile = getBackupFileInternal();
closeDb();
final boolean restoreDone = LocalStorage.copy(sourceFile, databasePath());
init();
@@ -409,7 +407,7 @@ public class cgData {
public SQLiteDatabase openOrCreateDatabase(String name, int mode,
CursorFactory factory) {
final File file = new File(name);
- file.getParentFile().mkdirs();
+ FileUtils.mkdirs(file.getParentFile());
return SQLiteDatabase.openOrCreateDatabase(file, factory);
}
@@ -778,7 +776,7 @@ public class cgData {
final File[] wrongFiles = dir.listFiles(filter);
if (wrongFiles != null) {
for (final File wrongFile : wrongFiles) {
- wrongFile.delete();
+ FileUtils.deleteIgnoringFailure(wrongFile);
}
}
}
@@ -828,7 +826,7 @@ public class cgData {
for (final File file : LocalStorage.getStorageSec().listFiles()) {
if (file.isDirectory()) {
// This will silently fail if the directory is not empty.
- file.delete();
+ FileUtils.deleteIgnoringFailure(file);
}
}
}
@@ -2748,8 +2746,6 @@ public class cgData {
/**
* checks if this is a newly created database
- *
- * @return
*/
public static boolean isNewlyCreatedDatebase() {
return newlyCreatedDatabase;
@@ -2762,6 +2758,10 @@ public class cgData {
newlyCreatedDatabase = false;
}
+ /**
+ * Creates the WHERE clause for matching multiple geocodes. This automatically converts all given codes to
+ * UPPERCASE.
+ */
private static StringBuilder whereGeocodeIn(Set<String> geocodes) {
final StringBuilder where = new StringBuilder();
@@ -2771,7 +2771,7 @@ public class cgData {
if (all.length() > 0) {
all.append(',');
}
- all.append(DatabaseUtils.sqlEscapeString(geocode));
+ all.append(DatabaseUtils.sqlEscapeString(StringUtils.upperCase(geocode)));
}
where.append("geocode in (").append(all).append(')');
@@ -3000,7 +3000,7 @@ public class cgData {
for (String geocode : cachedGeocodes) {
if (connector.canHandle(geocode)) {
Geocache geocache = cacheCache.getCacheFromCache(geocode);
- if (geocache.getZoomLevel() <= maxZoom) {
+ if (geocache.getCoordZoomLevel() <= maxZoom) {
boolean found = false;
for (Tile tile : tiles) {
if (tile.containsPoint(geocache)) {
diff --git a/main/src/cgeo/geocaching/cgeoapplication.java b/main/src/cgeo/geocaching/cgeoapplication.java
index fd5f714..5a793f5 100644
--- a/main/src/cgeo/geocaching/cgeoapplication.java
+++ b/main/src/cgeo/geocaching/cgeoapplication.java
@@ -25,7 +25,11 @@ public class cgeoapplication extends Application {
private static cgeoapplication instance;
public cgeoapplication() {
- instance = this;
+ setInstance(this);
+ }
+
+ private static void setInstance(final cgeoapplication application) {
+ instance = application;
}
public static cgeoapplication getInstance() {
@@ -86,39 +90,6 @@ public class cgeoapplication extends Application {
}
/**
- * restore the database in a new thread, showing a progress window
- *
- * @param fromActivity
- * calling activity
- */
- public void restoreDatabase(final Activity fromActivity) {
- final Resources res = this.getResources();
- final ProgressDialog dialog = ProgressDialog.show(fromActivity, res.getString(R.string.init_backup_restore), res.getString(R.string.init_restore_running), true, false);
- final AtomicBoolean atomic = new AtomicBoolean(false);
- Thread restoreThread = new Thread() {
- final Handler handler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- dialog.dismiss();
- boolean restored = atomic.get();
- String message = restored ? res.getString(R.string.init_restore_success) : res.getString(R.string.init_restore_failed);
- ActivityMixin.helpDialog(fromActivity, res.getString(R.string.init_backup_restore), message);
- if (fromActivity instanceof MainActivity) {
- ((MainActivity) fromActivity).updateCacheCounter();
- }
- }
- };
-
- @Override
- public void run() {
- atomic.set(cgData.restoreDatabase());
- handler.sendMessage(handler.obtainMessage());
- }
- };
- restoreThread.start();
- }
-
- /**
* Register an observer to receive GeoData information.
* <br/>
* If there is a chance that no observers are registered before this
diff --git a/main/src/cgeo/geocaching/cgeocaches.java b/main/src/cgeo/geocaching/cgeocaches.java
index 5d7841d..304aabe 100644
--- a/main/src/cgeo/geocaching/cgeocaches.java
+++ b/main/src/cgeo/geocaching/cgeocaches.java
@@ -396,6 +396,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity
}
};
private AbstractSearchLoader currentLoader;
+ private String newListName = StringUtils.EMPTY;
public cgeocaches() {
super(true);
@@ -503,7 +504,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity
// refresh standard list if it has changed (new caches downloaded)
if (type == CacheListType.OFFLINE && listId >= StoredList.STANDARD_LIST_ID && search != null) {
final SearchResult newSearch = cgData.getBatchOfStoredCaches(coords, Settings.getCacheType(), listId);
- if (newSearch != null && newSearch.getTotal() != search.getTotal()) {
+ if (newSearch.getTotal() != search.getTotal()) {
refreshCurrentList();
}
}
@@ -717,7 +718,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity
invalidateOptionsMenuCompatible();
return false;
case MENU_CREATE_LIST:
- new StoredList.UserInterface(this).promptForListCreation(null);
+ new StoredList.UserInterface(this).promptForListCreation(null, newListName);
invalidateOptionsMenuCompatible();
return false;
case MENU_DROP_LIST:
@@ -927,7 +928,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity
adapter.setSelectMode(false);
refreshCurrentList();
}
- }, true, listId);
+ }, true, listId, newListName);
break;
case MENU_STORE_CACHE:
case MENU_REFRESH:
@@ -1082,7 +1083,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity
public void run(final Integer selectedListId) {
refreshStored(caches, selectedListId);
}
- }, true, StoredList.TEMPORARY_LIST_ID);
+ }, true, StoredList.TEMPORARY_LIST_ID, newListName);
} else {
refreshStored(caches, this.listId);
}
@@ -1481,9 +1482,9 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity
currentLoader.reset();
((OfflineGeocacheListLoader) currentLoader).setListId(listId);
((OfflineGeocacheListLoader) currentLoader).setSearchCenter(coords);
+ adapter.setComparator(null); // delete current sorting
currentLoader.startLoading();
-
invalidateOptionsMenuCompatible();
}
@@ -1719,13 +1720,13 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity
break;
case KEYWORD:
final String keyword = extras.getString(Intents.EXTRA_KEYWORD);
- title = keyword;
+ rememberTerm(keyword);
loader = new KeywordGeocacheListLoader(app, keyword);
break;
case ADDRESS:
final String address = extras.getString(Intents.EXTRA_ADDRESS);
if (StringUtils.isNotBlank(address)) {
- title = address;
+ rememberTerm(address);
} else {
title = coords.toString();
}
@@ -1738,12 +1739,12 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity
break;
case USERNAME:
final String username = extras.getString(Intents.EXTRA_USERNAME);
- title = username;
+ rememberTerm(username);
loader = new UsernameGeocacheListLoader(app, username);
break;
case OWNER:
final String ownerName = extras.getString(Intents.EXTRA_USERNAME);
- title = ownerName;
+ rememberTerm(ownerName);
loader = new OwnerGeocacheListLoader(app, ownerName);
break;
case MAP:
@@ -1771,6 +1772,13 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity
return loader;
}
+ private void rememberTerm(String term) {
+ // set the title of the activity
+ title = term;
+ // and remember this term for potential use in list creation
+ newListName = term;
+ }
+
@Override
public void onLoadFinished(Loader<SearchResult> arg0, SearchResult searchIn) {
// The database search was moved into the UI call intentionally. If this is done before the runOnUIThread,
diff --git a/main/src/cgeo/geocaching/connector/gc/GCConstants.java b/main/src/cgeo/geocaching/connector/gc/GCConstants.java
index c2aeffd..e93df14 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCConstants.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCConstants.java
@@ -127,7 +127,7 @@ public final class GCConstants {
public final static Pattern PATTERN_SEARCH_TOTALCOUNT = Pattern.compile("<span>Total Records\\D*(\\d+)<");
public final static Pattern PATTERN_SEARCH_RECAPTCHA = Pattern.compile("<script[^>]*src=\"[^\"]*/recaptcha/api/challenge\\?k=([^\"]+)\"[^>]*>");
public final static Pattern PATTERN_SEARCH_RECAPTCHACHALLENGE = Pattern.compile("challenge : '([^']+)'");
- public final static Pattern PATTERN_SEARCH_HIDDEN_DATE = Pattern.compile("<span class=\"small\">([\\d-/]{6,10})</span>");
+ public final static Pattern PATTERN_SEARCH_HIDDEN_DATE = Pattern.compile("<td valign=\"top\"[^<]+<span class=\"small\">([^<]+)</span>");
/**
* Patterns for waypoints
diff --git a/main/src/cgeo/geocaching/connector/gc/GCMap.java b/main/src/cgeo/geocaching/connector/gc/GCMap.java
index d243306..4fdde56 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCMap.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCMap.java
@@ -209,16 +209,15 @@ public class GCMap {
cache.setReliableLatLon(false);
cache.setGeocode(id);
cache.setName(nameCache.get(id));
- cache.setZoomlevel(tile.getZoomlevel());
- cache.setCoords(tile.getCoord(xy));
+ cache.setCoords(tile.getCoord(xy), tile.getZoomLevel());
if (strategy.flags.contains(StrategyFlag.PARSE_TILES) && bitmap != null) {
for (UTFGridPosition singlePos : singlePositions.get(id)) {
- if (IconDecoder.parseMapPNG(cache, bitmap, singlePos, tile.getZoomlevel())) {
+ if (IconDecoder.parseMapPNG(cache, bitmap, singlePos, tile.getZoomLevel())) {
break; // cache parsed
}
}
} else {
- cache.setType(CacheType.UNKNOWN);
+ cache.setType(CacheType.UNKNOWN, tile.getZoomLevel());
}
boolean exclude = false;
@@ -296,7 +295,7 @@ public class GCMap {
final Set<Tile> tiles = Tile.getTilesForViewport(viewport);
if (Settings.isDebug()) {
- searchResult.setUrl(new StringBuilder().append(tiles.iterator().next().getZoomlevel()).append(Formatter.SEPARATOR).append(searchResult.getUrl()).toString());
+ searchResult.setUrl(new StringBuilder().append(tiles.iterator().next().getZoomLevel()).append(Formatter.SEPARATOR).append(searchResult.getUrl()).toString());
}
for (Tile tile : tiles) {
@@ -305,7 +304,7 @@ public class GCMap {
final Parameters params = new Parameters(
"x", String.valueOf(tile.getX()),
"y", String.valueOf(tile.getY()),
- "z", String.valueOf(tile.getZoomlevel()),
+ "z", String.valueOf(tile.getZoomLevel()),
"ep", "1",
"app", "cgeo");
if (tokens != null) {
@@ -321,7 +320,7 @@ public class GCMap {
} else if (Settings.getCacheType() == CacheType.MYSTERY) {
params.put("ect", "9,5,3,6,453,13,1304,137,11,4,2,1858");
}
- if (tile.getZoomlevel() != 14) {
+ if (tile.getZoomLevel() != 14) {
params.put("_", String.valueOf(System.currentTimeMillis()));
}
// TODO: other types t.b.d
@@ -341,7 +340,7 @@ public class GCMap {
Log.w("GCMap.searchByViewport: No data from server for tile (" + tile.getX() + "/" + tile.getY() + ")");
} else {
final SearchResult search = GCMap.parseMapJSON(data, tile, bitmap, strategy);
- if (search == null || CollectionUtils.isEmpty(search.getGeocodes())) {
+ if (CollectionUtils.isEmpty(search.getGeocodes())) {
Log.e("GCMap.searchByViewport: No cache parsed for viewport " + viewport);
}
else {
@@ -359,7 +358,7 @@ public class GCMap {
}
// Check for vanished found caches
- if (tiles.iterator().next().getZoomlevel() >= Tile.ZOOMLEVEL_MIN_PERSONALIZED) {
+ if (tiles.iterator().next().getZoomLevel() >= Tile.ZOOMLEVEL_MIN_PERSONALIZED) {
searchResult.addFilteredGeocodes(cgData.getCachedMissingFromSearch(searchResult, tiles, GCConnector.getInstance(), Tile.ZOOMLEVEL_MIN_PERSONALIZED - 1));
}
}
diff --git a/main/src/cgeo/geocaching/connector/gc/GCParser.java b/main/src/cgeo/geocaching/connector/gc/GCParser.java
index 7dc048a..0dc4242 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCParser.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCParser.java
@@ -529,9 +529,7 @@ public abstract class GCParser {
if (result != null) {
// replace linebreak and paragraph tags
final String hint = GCConstants.PATTERN_LINEBREAK.matcher(result).replaceAll("\n");
- if (hint != null) {
- cache.setHint(StringUtils.replace(hint, "</p>", "").trim());
- }
+ cache.setHint(StringUtils.replace(hint, "</p>", "").trim());
}
cache.checkFields();
@@ -766,7 +764,7 @@ public abstract class GCParser {
public static SearchResult searchByNextPage(final SearchResult search, boolean showCaptcha, RecaptchaReceiver recaptchaReceiver) {
if (search == null) {
- return search;
+ return null;
}
final String[] viewstates = search.getViewstates();
@@ -1131,9 +1129,9 @@ public abstract class GCParser {
* @return status code to indicate success or failure
*/
public static ImmutablePair<StatusCode, String> uploadLogImage(final String logId, final String caption, final String description, final Uri imageUri) {
- final String uri = new Uri.Builder().scheme("http").authority("www.geocaching.com").path("/seek/upload.aspx").build().toString();
+ final String uri = new Uri.Builder().scheme("http").authority("www.geocaching.com").path("/seek/upload.aspx").encodedQuery("LID=" + logId).build().toString();
- final String page = Login.getRequestLogged(uri, new Parameters("LID=", logId));
+ final String page = Login.getRequestLogged(uri, null);
if (StringUtils.isBlank(page)) {
Log.e("GCParser.uploadLogImage: No data from server");
return new ImmutablePair<StatusCode, String>(StatusCode.UNKNOWN_ERROR, null);
@@ -1717,7 +1715,7 @@ public abstract class GCParser {
try {
final Integer ctl = Integer.valueOf(trackableMatcher.group(3));
final Integer id = Integer.valueOf(trackableMatcher.group(5));
- if (trackCode != null && name != null && ctl != null && id != null) {
+ if (trackCode != null && ctl != null && id != null) {
final TrackableLog entry = new TrackableLog(trackCode, name, id, ctl);
Log.i("Trackable in inventory (#" + entry.ctl + "/" + entry.id + "): " + entry.trackCode + " - " + entry.name);
diff --git a/main/src/cgeo/geocaching/connector/gc/IconDecoder.java b/main/src/cgeo/geocaching/connector/gc/IconDecoder.java
index ed44392..c7b470a 100644
--- a/main/src/cgeo/geocaching/connector/gc/IconDecoder.java
+++ b/main/src/cgeo/geocaching/connector/gc/IconDecoder.java
@@ -1,8 +1,8 @@
package cgeo.geocaching.connector.gc;
import cgeo.geocaching.Geocache;
-import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.enumerations.CacheType;
+import cgeo.geocaching.settings.Settings;
import android.graphics.Bitmap;
@@ -87,19 +87,19 @@ public abstract class IconDecoder {
if (count > 1) { // 2 pixels need to detect same type and we say good to go
switch (type) {
case CT_TRADITIONAL:
- cache.setType(CacheType.TRADITIONAL);
+ cache.setType(CacheType.TRADITIONAL, zoomlevel);
return true;
case CT_MULTI:
- cache.setType(CacheType.MULTI);
+ cache.setType(CacheType.MULTI, zoomlevel);
return true;
case CT_MYSTERY:
- cache.setType(CacheType.MYSTERY);
+ cache.setType(CacheType.MYSTERY, zoomlevel);
return true;
case CT_EVENT:
- cache.setType(CacheType.EVENT);
+ cache.setType(CacheType.EVENT, zoomlevel);
return true;
case CT_EARTH:
- cache.setType(CacheType.EARTH);
+ cache.setType(CacheType.EARTH, zoomlevel);
return true;
case CT_FOUND:
cache.setFound(true);
@@ -108,22 +108,22 @@ public abstract class IconDecoder {
cache.setOwnerUserId(Settings.getUsername());
return true;
case CT_MEGAEVENT:
- cache.setType(CacheType.MEGA_EVENT);
+ cache.setType(CacheType.MEGA_EVENT, zoomlevel);
return true;
case CT_CITO:
- cache.setType(CacheType.CITO);
+ cache.setType(CacheType.CITO, zoomlevel);
return true;
case CT_WEBCAM:
- cache.setType(CacheType.WEBCAM);
+ cache.setType(CacheType.WEBCAM, zoomlevel);
return true;
case CT_WHERIGO:
- cache.setType(CacheType.WHERIGO);
+ cache.setType(CacheType.WHERIGO, zoomlevel);
return true;
case CT_VIRTUAL:
- cache.setType(CacheType.VIRTUAL);
+ cache.setType(CacheType.VIRTUAL, zoomlevel);
return true;
case CT_LETTERBOX:
- cache.setType(CacheType.LETTERBOX);
+ cache.setType(CacheType.LETTERBOX, zoomlevel);
return true;
}
}
diff --git a/main/src/cgeo/geocaching/connector/gc/Login.java b/main/src/cgeo/geocaching/connector/gc/Login.java
index 2629339..0d8fb05 100644
--- a/main/src/cgeo/geocaching/connector/gc/Login.java
+++ b/main/src/cgeo/geocaching/connector/gc/Login.java
@@ -30,20 +30,22 @@ import java.util.Map;
public abstract class Login {
+ private static final String DEFAULT_CUSTOM_DATE_FORMAT = "MM/dd/yyyy";
+
private final static String ENGLISH = "<a href=\"#\">English&#9660;</a>";
// false = not logged in
private static boolean actualLoginStatus = false;
- private static String actualUserName = "";
+ private static String actualUserName = StringUtils.EMPTY;
private static int actualCachesFound = -1;
- private static String actualStatus = "";
+ private static String actualStatus = StringUtils.EMPTY;
- private final static Map<String, SimpleDateFormat> gcCustomDateFormats;
+ private final static Map<String, SimpleDateFormat> GC_CUSTOM_DATE_FORMATS;
public static final String LANGUAGE_CHANGE_URI = "http://www.geocaching.com/my/souvenirs.aspx";
static {
final String[] formats = new String[] {
- "MM/dd/yyyy",
+ DEFAULT_CUSTOM_DATE_FORMAT,
"yyyy-MM-dd",
"yyyy/MM/dd",
"dd/MMM/yyyy",
@@ -58,7 +60,7 @@ public abstract class Login {
map.put(format, new SimpleDateFormat(format, Locale.ENGLISH));
}
- gcCustomDateFormats = Collections.unmodifiableMap(map);
+ GC_CUSTOM_DATE_FORMATS = Collections.unmodifiableMap(map);
}
public static StatusCode login() {
@@ -321,14 +323,14 @@ public abstract class Login {
final String trimmed = input.trim();
- if (gcCustomDateFormats.containsKey(format)) {
+ if (GC_CUSTOM_DATE_FORMATS.containsKey(format)) {
try {
- return gcCustomDateFormats.get(format).parse(trimmed);
+ return GC_CUSTOM_DATE_FORMATS.get(format).parse(trimmed);
} catch (final ParseException e) {
}
}
- for (final SimpleDateFormat sdf : gcCustomDateFormats.values()) {
+ for (final SimpleDateFormat sdf : GC_CUSTOM_DATE_FORMATS.values()) {
try {
return sdf.parse(trimmed);
} catch (final ParseException e) {
@@ -344,11 +346,11 @@ public abstract class Login {
public static SimpleDateFormat getCustomGcDateFormat() {
final String format = Settings.getGcCustomDate();
- if (gcCustomDateFormats.containsKey(format)) {
- return gcCustomDateFormats.get(format);
+ if (GC_CUSTOM_DATE_FORMATS.containsKey(format)) {
+ return GC_CUSTOM_DATE_FORMATS.get(format);
}
- return gcCustomDateFormats.get("MM/dd/yyyy");
+ return GC_CUSTOM_DATE_FORMATS.get(DEFAULT_CUSTOM_DATE_FORMAT);
}
/**
diff --git a/main/src/cgeo/geocaching/connector/gc/Tile.java b/main/src/cgeo/geocaching/connector/gc/Tile.java
index 3177f2c..4ed53c9 100644
--- a/main/src/cgeo/geocaching/connector/gc/Tile.java
+++ b/main/src/cgeo/geocaching/connector/gc/Tile.java
@@ -50,7 +50,7 @@ public class Tile {
private final int tileX;
private final int tileY;
- private final int zoomlevel;
+ private final int zoomLevel;
private final Viewport viewPort;
public Tile(Geopoint origin, int zoomlevel) {
@@ -59,7 +59,7 @@ public class Tile {
private Tile(int tileX, int tileY, int zoomlevel) {
- this.zoomlevel = clippedZoomlevel(zoomlevel);
+ this.zoomLevel = clippedZoomlevel(zoomlevel);
this.tileX = tileX;
this.tileY = tileY;
@@ -67,8 +67,8 @@ public class Tile {
viewPort = new Viewport(getCoord(new UTFGridPosition(0, 0)), getCoord(new UTFGridPosition(63, 63)));
}
- public int getZoomlevel() {
- return zoomlevel;
+ public int getZoomLevel() {
+ return zoomLevel;
}
private static int clippedZoomlevel(int zoomlevel) {
@@ -120,14 +120,14 @@ public class Tile {
double pixX = tileX * TILE_SIZE + pos.x * 4;
double pixY = tileY * TILE_SIZE + pos.y * 4;
- double lonDeg = ((360.0 * pixX) / NUMBER_OF_PIXELS[this.zoomlevel]) - 180.0;
- double latRad = Math.atan(Math.sinh(Math.PI * (1 - 2 * pixY / NUMBER_OF_PIXELS[this.zoomlevel])));
+ double lonDeg = ((360.0 * pixX) / NUMBER_OF_PIXELS[this.zoomLevel]) - 180.0;
+ double latRad = Math.atan(Math.sinh(Math.PI * (1 - 2 * pixY / NUMBER_OF_PIXELS[this.zoomLevel])));
return new Geopoint(Math.toDegrees(latRad), lonDeg);
}
@Override
public String toString() {
- return String.format(Locale.US, "(%d/%d), zoom=%d", tileX, tileY, zoomlevel);
+ return String.format(Locale.US, "(%d/%d), zoom=%d", tileX, tileY, zoomLevel);
}
/**
@@ -225,7 +225,7 @@ public class Tile {
}
return (this.tileX == ((Tile) o).tileX)
&& (this.tileY == ((Tile) o).tileY)
- && (this.zoomlevel == ((Tile) o).zoomlevel);
+ && (this.zoomLevel == ((Tile) o).zoomLevel);
}
@Override
diff --git a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java
index be7b3a4..139a48e 100644
--- a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java
+++ b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java
@@ -247,9 +247,7 @@ final class OkapiClient {
while (keys.hasNext()) {
final String key = keys.next();
final Geocache cache = parseSmallCache(cachesResponse.getJSONObject(key));
- if (cache != null) {
- caches.add(cache);
- }
+ caches.add(cache);
}
return caches;
}
diff --git a/main/src/cgeo/geocaching/export/FieldnoteExport.java b/main/src/cgeo/geocaching/export/FieldnoteExport.java
index 38cd43e..d0040a9 100644
--- a/main/src/cgeo/geocaching/export/FieldnoteExport.java
+++ b/main/src/cgeo/geocaching/export/FieldnoteExport.java
@@ -12,6 +12,7 @@ import cgeo.geocaching.network.Parameters;
import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.ui.Formatter;
import cgeo.geocaching.utils.AsyncTaskWithProgress;
+import cgeo.geocaching.utils.FileUtils;
import cgeo.geocaching.utils.IOUtils;
import cgeo.geocaching.utils.Log;
@@ -82,7 +83,7 @@ class FieldnoteExport extends AbstractExport {
final CheckBox onlyNewOption = (CheckBox) layout.findViewById(R.id.onlynew);
if (Settings.getFieldnoteExportDate() > 0) {
- onlyNewOption.setText(getString(R.string.export_fieldnotes_onlynew) + "\n(" + Formatter.formatShortDateTime(activity, Settings.getFieldnoteExportDate()) + ')');
+ onlyNewOption.setText(getString(R.string.export_fieldnotes_onlynew) + "\n(" + Formatter.formatShortDateTime(Settings.getFieldnoteExportDate()) + ')');
}
builder.setPositiveButton(R.string.export, new DialogInterface.OnClickListener() {
@@ -134,7 +135,7 @@ class FieldnoteExport extends AbstractExport {
for (final Geocache cache : caches) {
if (cache.isLogOffline()) {
final LogEntry log = cgData.loadLogOffline(cache.getGeocode());
- if (!onlyNew || onlyNew && log.date > Settings.getFieldnoteExportDate()) {
+ if (!onlyNew || log.date > Settings.getFieldnoteExportDate()) {
appendFieldNote(fieldNoteBuffer, cache, log);
}
}
@@ -151,7 +152,7 @@ class FieldnoteExport extends AbstractExport {
return false;
}
- exportLocation.mkdirs();
+ FileUtils.mkdirs(exportLocation);
final SimpleDateFormat fileNameDateFormat = new SimpleDateFormat("yyyyMMddHHmmss", Locale.US);
exportFile = new File(exportLocation.toString() + '/' + fileNameDateFormat.format(new Date()) + ".txt");
diff --git a/main/src/cgeo/geocaching/export/GpxExport.java b/main/src/cgeo/geocaching/export/GpxExport.java
index 61be3c5..821a3f6 100644
--- a/main/src/cgeo/geocaching/export/GpxExport.java
+++ b/main/src/cgeo/geocaching/export/GpxExport.java
@@ -1,13 +1,16 @@
package cgeo.geocaching.export;
import cgeo.geocaching.Geocache;
-import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.R;
import cgeo.geocaching.cgeoapplication;
import cgeo.geocaching.activity.ActivityMixin;
+import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.utils.AsyncTaskWithProgress;
+import cgeo.geocaching.utils.FileUtils;
import cgeo.geocaching.utils.Log;
+import org.apache.commons.lang3.CharEncoding;
+
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
@@ -22,8 +25,9 @@ import android.widget.TextView;
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.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
@@ -106,6 +110,12 @@ class GpxExport extends AbstractExport {
this.activity = activity;
}
+ private File getExportFile() {
+ final SimpleDateFormat fileNameDateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
+ final Date now = new Date();
+ return FileUtils.getUniqueNamedFile(Settings.getGpxExportDir() + File.separatorChar + "export_" + fileNameDateFormat.format(now) + ".gpx");
+ }
+
@Override
protected File doInBackgroundInternal(String[] geocodes) {
// quick check for being able to write the GPX file
@@ -117,18 +127,17 @@ class GpxExport extends AbstractExport {
setMessage(cgeoapplication.getInstance().getResources().getQuantityString(R.plurals.cache_counts, allGeocodes.size(), allGeocodes.size()));
- final SimpleDateFormat fileNameDateFormat = new SimpleDateFormat("yyyyMMddHHmmss", Locale.US);
- final File exportFile = new File(Settings.getGpxExportDir() + File.separatorChar + "export_" + fileNameDateFormat.format(new Date()) + ".gpx");
+ final File exportFile = getExportFile();
BufferedWriter writer = null;
try {
final File exportLocation = new File(Settings.getGpxExportDir());
- exportLocation.mkdirs();
+ FileUtils.mkdirs(exportLocation);
- writer = new BufferedWriter(new FileWriter(exportFile));
+ writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(exportFile), CharEncoding.UTF_8));
new GpxSerializer().writeGPX(allGeocodes, writer, new GpxSerializer.ProgressListener() {
@Override
- public void publishProgress(int countExported) {
+ public void publishProgress(final int countExported) {
ExportTask.this.publishProgress(countExported);
}
});
@@ -142,9 +151,9 @@ class GpxExport extends AbstractExport {
// Ignore double error
}
}
- // delete partial gpx file on error
+ // delete partial GPX file on error
if (exportFile.exists()) {
- exportFile.delete();
+ FileUtils.deleteIgnoringFailure(exportFile);
}
return null;
diff --git a/main/src/cgeo/geocaching/export/GpxSerializer.java b/main/src/cgeo/geocaching/export/GpxSerializer.java
index 2d25296..1e39be4 100644
--- a/main/src/cgeo/geocaching/export/GpxSerializer.java
+++ b/main/src/cgeo/geocaching/export/GpxSerializer.java
@@ -11,6 +11,7 @@ import cgeo.geocaching.utils.TextUtils;
import cgeo.geocaching.utils.XmlUtils;
import cgeo.org.kxml2.io.KXmlSerializer;
+import org.apache.commons.lang3.CharEncoding;
import org.apache.commons.lang3.StringUtils;
import org.xmlpull.v1.XmlSerializer;
@@ -56,7 +57,7 @@ public final class GpxSerializer {
this.progressListener = progressListener;
gpx.setOutput(writer);
- gpx.startDocument("UTF-8", true);
+ gpx.startDocument(CharEncoding.UTF_8, true);
gpx.setPrefix("", PREFIX_GPX);
gpx.setPrefix("xsi", PREFIX_XSI);
gpx.setPrefix("groundspeak", PREFIX_GROUNDSPEAK);
diff --git a/main/src/cgeo/geocaching/files/AbstractFileListActivity.java b/main/src/cgeo/geocaching/files/AbstractFileListActivity.java
index 8b02eeb..b0aba58 100644
--- a/main/src/cgeo/geocaching/files/AbstractFileListActivity.java
+++ b/main/src/cgeo/geocaching/files/AbstractFileListActivity.java
@@ -5,7 +5,6 @@ import cgeo.geocaching.R;
import cgeo.geocaching.StoredList;
import cgeo.geocaching.activity.AbstractListActivity;
import cgeo.geocaching.utils.FileUtils;
-import cgeo.geocaching.utils.IOUtils;
import cgeo.geocaching.utils.Log;
import org.apache.commons.collections.CollectionUtils;
@@ -19,10 +18,7 @@ import android.os.Handler;
import android.os.Message;
import android.widget.ArrayAdapter;
-import java.io.BufferedReader;
import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -55,15 +51,11 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext
}
private String getDefaultFolders() {
- StringBuilder sb = new StringBuilder();
- for (File f : getBaseFolders()) {
- String fName = f.getPath();
- if (sb.length() > 0) {
- sb.append('\n');
- }
- sb.append(fName);
+ final ArrayList<String> names = new ArrayList<String>();
+ for (File dir : getExistingBaseFolders()) {
+ names.add(dir.getPath());
}
- return sb.toString();
+ return StringUtils.join(names, '\n');
}
};
@@ -160,19 +152,16 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext
try {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
boolean loaded = false;
- for (final File dir : getBaseFolders())
- {
- if (dir.exists() && dir.isDirectory()) {
- FileUtils.listDir(list, dir,selector,changeWaitDialogHandler);
- if (!list.isEmpty()) {
- loaded = true;
- break;
- }
+ for (final File dir : getExistingBaseFolders()) {
+ FileUtils.listDir(list, dir, selector, changeWaitDialogHandler);
+ if (!list.isEmpty()) {
+ loaded = true;
+ break;
}
}
if (!loaded) {
changeWaitDialogHandler.sendMessage(Message.obtain(changeWaitDialogHandler, MSG_SEARCH_WHOLE_SD_CARD, Environment.getExternalStorageDirectory().getName()));
- listDirs(list, getStorages(), selector, changeWaitDialogHandler);
+ listDirs(list, LocalStorage.getStorages(), selector, changeWaitDialogHandler);
}
} else {
Log.w("No external media mounted.");
@@ -202,49 +191,6 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext
}
}
- /*
- * Get all storages available on the device.
- * Will include paths like /mnt/sdcard /mnt/usbdisk /mnt/ext_card /mnt/sdcard/ext_card
- */
- protected static List<File> getStorages() {
-
- String extStorage = Environment.getExternalStorageDirectory().getAbsolutePath();
- List<File> storages = new ArrayList<File>();
- storages.add(new File(extStorage));
- File file = new File("/system/etc/vold.fstab");
- if (file.canRead()) {
- FileReader fr = null;
- BufferedReader br = null;
- try {
- fr = new FileReader(file);
- br = new BufferedReader(fr);
- String s = br.readLine();
- while (s != null) {
- if (s.startsWith("dev_mount")) {
- String[] tokens = StringUtils.split(s);
- if (tokens.length >= 3) {
- String path = tokens[2]; // mountpoint
- if (!extStorage.equals(path)) {
- File directory = new File(path);
- if (directory.exists() && directory.isDirectory()) {
- storages.add(directory);
- }
- }
- }
- }
- s = br.readLine();
- }
- } catch (IOException e) {
- Log.e("Could not get additional mount points for user content. " +
- "Proceeding with external storage only (" + extStorage + ")");
- } finally {
- IOUtils.closeQuietly(fr);
- IOUtils.closeQuietly(br);
- }
- }
- return storages;
- }
-
/**
* Check if a filename belongs to the AbstractFileListActivity. This implementation checks for file extensions.
* Subclasses may override this method to filter out specific files.
@@ -261,6 +207,16 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext
return false;
}
+ protected List<File> getExistingBaseFolders() {
+ ArrayList<File> result = new ArrayList<File>();
+ for (final File dir : getBaseFolders()) {
+ if (dir.exists() && dir.isDirectory()) {
+ result.add(dir);
+ }
+ }
+ return result;
+ }
+
protected AbstractFileListActivity(final String extension) {
setExtensions(new String[] { extension });
}
diff --git a/main/src/cgeo/geocaching/files/LocalStorage.java b/main/src/cgeo/geocaching/files/LocalStorage.java
index ec09433..57f586e 100644
--- a/main/src/cgeo/geocaching/files/LocalStorage.java
+++ b/main/src/cgeo/geocaching/files/LocalStorage.java
@@ -2,6 +2,7 @@ package cgeo.geocaching.files;
import cgeo.geocaching.cgeoapplication;
import cgeo.geocaching.utils.CryptUtils;
+import cgeo.geocaching.utils.FileUtils;
import cgeo.geocaching.utils.IOUtils;
import cgeo.geocaching.utils.Log;
@@ -14,6 +15,7 @@ import android.os.Environment;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
@@ -24,12 +26,14 @@ import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
/**
* Handle local storage issues on phone and SD card.
*
*/
-public class LocalStorage {
+public final class LocalStorage {
public static final String HEADER_LAST_MODIFIED = "last-modified";
public static final String HEADER_ETAG = "etag";
@@ -39,6 +43,10 @@ public class LocalStorage {
private static File internalStorageBase;
+ private LocalStorage() {
+ // utility class
+ }
+
/**
* Return the primary storage cache root (external media if mounted, phone otherwise).
*
@@ -159,7 +167,7 @@ public class LocalStorage {
private static File buildFile(final File base, final String fileName, final boolean isUrl, final boolean createDirs) {
if (createDirs) {
- base.mkdirs();
+ FileUtils.mkdirs(base);
}
return new File(base, isUrl ? CryptUtils.md5(fileName) + getExtension(fileName) : fileName);
}
@@ -194,7 +202,7 @@ public class LocalStorage {
final Header header = response != null ? response.getFirstHeader(name) : null;
final File file = filenameForHeader(baseFile, name);
if (header == null) {
- file.delete();
+ FileUtils.deleteIgnoringFailure(file);
} else {
saveToFile(new ByteArrayInputStream(header.getValue().getBytes()), file);
}
@@ -256,15 +264,15 @@ public class LocalStorage {
final boolean written = copy(inputStream, fos);
fos.close();
if (!written) {
- targetFile.delete();
+ FileUtils.deleteIgnoringFailure(targetFile);
}
return written;
} finally {
- inputStream.close();
+ IOUtils.closeQuietly(inputStream);
}
} catch (IOException e) {
Log.e("LocalStorage.saveToFile", e);
- targetFile.delete();
+ FileUtils.deleteIgnoringFailure(targetFile);
}
return false;
}
@@ -279,7 +287,7 @@ public class LocalStorage {
* @return true if the copy happened without error, false otherwise
*/
public static boolean copy(final File source, final File destination) {
- destination.getParentFile().mkdirs();
+ FileUtils.mkdirs(destination.getParentFile());
InputStream input = null;
OutputStream output = null;
@@ -288,9 +296,10 @@ public class LocalStorage {
output = new BufferedOutputStream(new FileOutputStream(destination));
} catch (FileNotFoundException e) {
Log.e("LocalStorage.copy: could not open file", e);
+ return false;
+ } finally {
IOUtils.closeQuietly(input);
IOUtils.closeQuietly(output);
- return false;
}
boolean copyDone = copy(input, output);
@@ -338,12 +347,12 @@ public class LocalStorage {
if (file.isDirectory()) {
deleteDirectory(file);
} else {
- file.delete();
+ FileUtils.delete(file);
}
}
}
- return path.delete();
+ return FileUtils.delete(path);
}
/**
@@ -361,7 +370,7 @@ public class LocalStorage {
}
for (final File file : filesToDelete) {
try {
- if (!file.delete()) {
+ if (!FileUtils.delete(file)) {
Log.w("LocalStorage.deleteFilesPrefix: Can't delete file " + file.getName());
}
} catch (Exception e) {
@@ -389,4 +398,47 @@ public class LocalStorage {
};
return LocalStorage.getStorageDir(geocode).listFiles(filter);
}
+
+ /**
+ * Get all storages available on the device.
+ * Will include paths like /mnt/sdcard /mnt/usbdisk /mnt/ext_card /mnt/sdcard/ext_card
+ */
+ public static List<File> getStorages() {
+
+ String extStorage = Environment.getExternalStorageDirectory().getAbsolutePath();
+ List<File> storages = new ArrayList<File>();
+ storages.add(new File(extStorage));
+ File file = new File("/system/etc/vold.fstab");
+ if (file.canRead()) {
+ FileReader fr = null;
+ BufferedReader br = null;
+ try {
+ fr = new FileReader(file);
+ br = new BufferedReader(fr);
+ String s = br.readLine();
+ while (s != null) {
+ if (s.startsWith("dev_mount")) {
+ String[] tokens = StringUtils.split(s);
+ if (tokens.length >= 3) {
+ String path = tokens[2]; // mountpoint
+ if (!extStorage.equals(path)) {
+ File directory = new File(path);
+ if (directory.exists() && directory.isDirectory()) {
+ storages.add(directory);
+ }
+ }
+ }
+ }
+ s = br.readLine();
+ }
+ } catch (IOException e) {
+ Log.e("Could not get additional mount points for user content. " +
+ "Proceeding with external storage only (" + extStorage + ")");
+ } finally {
+ IOUtils.closeQuietly(fr);
+ IOUtils.closeQuietly(br);
+ }
+ }
+ return storages;
+ }
}
diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java
index f892622..0817170 100644
--- a/main/src/cgeo/geocaching/maps/CGeoMap.java
+++ b/main/src/cgeo/geocaching/maps/CGeoMap.java
@@ -156,12 +156,12 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
private ScaleOverlay overlayScale = null;
private PositionOverlay overlayPosition = null;
// data for overlays
- private static final int[][] INSET_RELIABLE = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }; // center, 33x40 / 45x51
- private static final int[][] INSET_TYPE = { { 5, 8, 6, 10 }, { 4, 4, 5, 11 } }; // center, 22x22 / 36x36
- private static final int[][] INSET_OWN = { { 21, 0, 0, 26 }, { 25, 0, 0, 35 } }; // top right, 12x12 / 16x16
- private static final int[][] INSET_FOUND = { { 0, 0, 21, 28 }, { 0, 0, 25, 35 } }; // top left, 12x12 / 16x16
- private static final int[][] INSET_USERMODIFIEDCOORDS = { { 21, 28, 0, 0 }, { 19, 25, 0, 0 } }; // bottom right, 12x12 / 26x26
- private static final int[][] INSET_PERSONALNOTE = { { 0, 28, 21, 0 }, { 0, 25, 19, 0 } }; // bottom left, 12x12 / 26x26
+ private static final int[][] INSET_RELIABLE = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }; // center, 33x40 / 45x51 / 60x68
+ private static final int[][] INSET_TYPE = { { 5, 8, 6, 10 }, { 4, 4, 5, 11 }, { 4, 4, 5, 11 } }; // center, 22x22 / 36x36
+ private static final int[][] INSET_OWN = { { 21, 0, 0, 26 }, { 25, 0, 0, 35 }, { 40, 0, 0, 48 } }; // top right, 12x12 / 16x16 / 20x20
+ private static final int[][] INSET_FOUND = { { 0, 0, 21, 28 }, { 0, 0, 25, 35 }, { 0, 0, 40, 48 } }; // top left, 12x12 / 16x16 / 20x20
+ private static final int[][] INSET_USERMODIFIEDCOORDS = { { 21, 28, 0, 0 }, { 19, 25, 0, 0 }, { 25, 33, 0, 0 } }; // bottom right, 12x12 / 26x26 / 35x35
+ private static final int[][] INSET_PERSONALNOTE = { { 0, 28, 21, 0 }, { 0, 25, 19, 0 }, { 0, 33, 25, 0 } }; // bottom left, 12x12 / 26x26 / 35x35
private SparseArray<LayerDrawable> overlaysCache = new SparseArray<LayerDrawable>();
/** Count of caches currently visible */
@@ -1179,33 +1179,29 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
}
searchResult = ConnectorFactory.searchByViewport(viewport.resize(0.8), tokens);
- if (searchResult != null) {
- downloaded = true;
- if (searchResult.getError() == StatusCode.NOT_LOGGED_IN && Settings.isGCConnectorActive()) {
- Login.login();
- tokens = null;
- } else {
- break;
- }
+ downloaded = true;
+ if (searchResult.getError() == StatusCode.NOT_LOGGED_IN && Settings.isGCConnectorActive()) {
+ Login.login();
+ tokens = null;
+ } else {
+ break;
}
count++;
} while (count < 2);
- if (searchResult != null) {
- Set<Geocache> result = searchResult.getCachesFromSearchResult(LoadFlags.LOAD_CACHE_OR_DB);
- CGeoMap.filter(result);
- // update the caches
- // first remove filtered out
- final Set<String> filteredCodes = searchResult.getFilteredGeocodes();
- Log.d("Filtering out " + filteredCodes.size() + " caches: " + filteredCodes.toString());
- caches.removeAll(cgData.loadCaches(filteredCodes, LoadFlags.LOAD_CACHE_ONLY));
- cgData.removeCaches(filteredCodes, EnumSet.of(RemoveFlag.REMOVE_CACHE));
- // new collection type needs to remove first to refresh
- caches.removeAll(result);
- caches.addAll(result);
- lastSearchResult = searchResult;
- }
+ Set<Geocache> result = searchResult.getCachesFromSearchResult(LoadFlags.LOAD_CACHE_OR_DB);
+ CGeoMap.filter(result);
+ // update the caches
+ // first remove filtered out
+ final Set<String> filteredCodes = searchResult.getFilteredGeocodes();
+ Log.d("Filtering out " + filteredCodes.size() + " caches: " + filteredCodes.toString());
+ caches.removeAll(cgData.loadCaches(filteredCodes, LoadFlags.LOAD_CACHE_ONLY));
+ cgData.removeCaches(filteredCodes, EnumSet.of(RemoveFlag.REMOVE_CACHE));
+ // new collection type needs to remove first to refresh
+ caches.removeAll(result);
+ caches.addAll(result);
+ lastSearchResult = searchResult;
//render
displayExecutor.execute(new DisplayRunnable(viewport));
@@ -1677,7 +1673,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
// background: disabled or not
final Drawable marker = getResources().getDrawable(cache.getMapMarkerId());
layers.add(marker);
- final int resolution = marker.getIntrinsicWidth() > 40 ? 1 : 0;
+ final int resolution = marker.getIntrinsicWidth() > 40 ? (marker.getIntrinsicWidth() > 50 ? 2 : 1) : 0;
// reliable or not
if (!cache.isReliableLatLon()) {
insets.add(INSET_RELIABLE[resolution]);
diff --git a/main/src/cgeo/geocaching/maps/PositionHistory.java b/main/src/cgeo/geocaching/maps/PositionHistory.java
new file mode 100644
index 0000000..9b090fc
--- /dev/null
+++ b/main/src/cgeo/geocaching/maps/PositionHistory.java
@@ -0,0 +1,63 @@
+package cgeo.geocaching.maps;
+
+import android.location.Location;
+
+import java.util.ArrayList;
+
+/**
+ * Map trail history
+ */
+public class PositionHistory {
+
+ /**
+ * minimum distance between two recorded points of the trail
+ */
+ private static final double MINIMUM_DISTANCE_METERS = 10.0;
+
+ /**
+ * maximum number of positions to remember
+ */
+ private static final int MAX_POSITIONS = 700;
+
+ private ArrayList<Location> history = new ArrayList<Location>();
+
+ /**
+ * Adds the current position to the trail history to be able to show the trail on the map.
+ */
+ void rememberTrailPosition(Location coordinates) {
+ if (coordinates.getAccuracy() >= 50f) {
+ return;
+ }
+ if (coordinates.getLatitude() == 0.0 && coordinates.getLatitude() == 0.0) {
+ return;
+ }
+ if (history.isEmpty()) {
+ history.add(coordinates);
+ return;
+ }
+
+ Location historyRecent = history.get(history.size() - 1);
+ if (historyRecent.distanceTo(coordinates) <= MINIMUM_DISTANCE_METERS) {
+ return;
+ }
+
+ history.add(coordinates);
+
+ // avoid running out of memory
+ final int itemsToRemove = getHistory().size() - MAX_POSITIONS;
+ if (itemsToRemove > 0) {
+ for (int i = 0; i < itemsToRemove; i++) {
+ getHistory().remove(0);
+ }
+ }
+ }
+
+ public ArrayList<Location> getHistory() {
+ return history;
+ }
+
+ public void setHistory(ArrayList<Location> history) {
+ this.history = history;
+ }
+
+} \ No newline at end of file
diff --git a/main/src/cgeo/geocaching/maps/PositionOverlay.java b/main/src/cgeo/geocaching/maps/PositionOverlay.java
index c3a0834..39f4987 100644
--- a/main/src/cgeo/geocaching/maps/PositionOverlay.java
+++ b/main/src/cgeo/geocaching/maps/PositionOverlay.java
@@ -1,7 +1,6 @@
package cgeo.geocaching.maps;
import cgeo.geocaching.R;
-import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.geopoint.Geopoint;
import cgeo.geocaching.maps.interfaces.GeneralOverlay;
import cgeo.geocaching.maps.interfaces.GeoPointImpl;
@@ -9,6 +8,7 @@ import cgeo.geocaching.maps.interfaces.MapItemFactory;
import cgeo.geocaching.maps.interfaces.MapProjectionImpl;
import cgeo.geocaching.maps.interfaces.MapViewImpl;
import cgeo.geocaching.maps.interfaces.OverlayImpl;
+import cgeo.geocaching.settings.Settings;
import android.app.Activity;
import android.graphics.Bitmap;
@@ -37,10 +37,7 @@ public class PositionOverlay implements GeneralOverlay {
private int heightArrowHalf = 0;
private PaintFlagsDrawFilter setfil = null;
private PaintFlagsDrawFilter remfil = null;
- private Location historyRecent = null;
- private ArrayList<Location> history = new ArrayList<Location>();
- private Point historyPointN = new Point();
- private Point historyPointP = new Point();
+ private PositionHistory positionHistory = new PositionHistory();
private Activity activity;
private MapItemFactory mapItemFactory = null;
private OverlayImpl ovlImpl = null;
@@ -139,67 +136,40 @@ public class PositionOverlay implements GeneralOverlay {
accuracyCircle.setStyle(Style.FILL);
canvas.drawCircle(center.x, center.y, radius, accuracyCircle);
- if (coordinates.getAccuracy() < 50f && ((historyRecent != null && historyRecent.distanceTo(coordinates) > 5.0) || historyRecent == null)) {
- if (historyRecent != null) {
- history.add(historyRecent);
- }
- historyRecent = coordinates;
-
- int toRemove = history.size() - 700;
-
- if (toRemove > 0) {
- for (int cnt = 0; cnt < toRemove; cnt++) {
- history.remove(cnt);
- }
- }
- }
+ positionHistory.rememberTrailPosition(coordinates);
if (Settings.isMapTrail()) {
- int size = history.size();
+ int size = positionHistory.getHistory().size();
if (size > 1) {
int alphaCnt = size - 201;
if (alphaCnt < 1) {
alphaCnt = 1;
}
+ Point pointNow = new Point();
+ Point pointPrevious = new Point();
+ Location prev = positionHistory.getHistory().get(0);
+ projection.toPixels(mapItemFactory.getGeoPointBase(new Geopoint(prev)), pointPrevious);
+
for (int cnt = 1; cnt < size; cnt++) {
- Location prev = history.get(cnt - 1);
- Location now = history.get(cnt);
-
- if (prev != null && now != null) {
- projection.toPixels(mapItemFactory.getGeoPointBase(new Geopoint(prev)), historyPointP);
- projection.toPixels(mapItemFactory.getGeoPointBase(new Geopoint(now)), historyPointN);
-
- int alpha;
- if ((alphaCnt - cnt) > 0) {
- alpha = 255 / (alphaCnt - cnt);
- }
- else {
- alpha = 255;
- }
-
- historyLineShadow.setAlpha(alpha);
- historyLine.setAlpha(alpha);
-
- canvas.drawLine(historyPointP.x, historyPointP.y, historyPointN.x, historyPointN.y, historyLineShadow);
- canvas.drawLine(historyPointP.x, historyPointP.y, historyPointN.x, historyPointN.y, historyLine);
- }
- }
- }
+ Location now = positionHistory.getHistory().get(cnt);
+ projection.toPixels(mapItemFactory.getGeoPointBase(new Geopoint(now)), pointNow);
- if (size > 0) {
- Location prev = history.get(size - 1);
- Location now = coordinates;
+ int alpha;
+ if ((alphaCnt - cnt) > 0) {
+ alpha = 255 / (alphaCnt - cnt);
+ }
+ else {
+ alpha = 255;
+ }
- if (prev != null && now != null) {
- projection.toPixels(mapItemFactory.getGeoPointBase(new Geopoint(prev)), historyPointP);
- projection.toPixels(mapItemFactory.getGeoPointBase(new Geopoint(now)), historyPointN);
+ historyLineShadow.setAlpha(alpha);
+ historyLine.setAlpha(alpha);
- historyLineShadow.setAlpha(255);
- historyLine.setAlpha(255);
+ canvas.drawLine(pointPrevious.x, pointPrevious.y, pointNow.x, pointNow.y, historyLineShadow);
+ canvas.drawLine(pointPrevious.x, pointPrevious.y, pointNow.x, pointNow.y, historyLine);
- canvas.drawLine(historyPointP.x, historyPointP.y, historyPointN.x, historyPointN.y, historyLineShadow);
- canvas.drawLine(historyPointP.x, historyPointP.y, historyPointN.x, historyPointN.y, historyLine);
+ pointPrevious.set(pointNow.x, pointNow.y);
}
}
}
@@ -230,10 +200,10 @@ public class PositionOverlay implements GeneralOverlay {
}
public ArrayList<Location> getHistory() {
- return history;
+ return positionHistory.getHistory();
}
- public void setHistory(ArrayList<Location> inHistory) {
- history = inHistory;
+ public void setHistory(ArrayList<Location> history) {
+ positionHistory.setHistory(history);
}
}
diff --git a/main/src/cgeo/geocaching/maps/google/GoogleMapView.java b/main/src/cgeo/geocaching/maps/google/GoogleMapView.java
index 6e5406e..3cf258e 100644
--- a/main/src/cgeo/geocaching/maps/google/GoogleMapView.java
+++ b/main/src/cgeo/geocaching/maps/google/GoogleMapView.java
@@ -14,7 +14,7 @@ import cgeo.geocaching.maps.interfaces.MapProjectionImpl;
import cgeo.geocaching.maps.interfaces.MapViewImpl;
import cgeo.geocaching.maps.interfaces.OnMapDragListener;
import cgeo.geocaching.maps.interfaces.OverlayImpl;
-import cgeo.geocaching.maps.interfaces.OverlayImpl.overlayType;
+import cgeo.geocaching.maps.interfaces.OverlayImpl.OverlayType;
import cgeo.geocaching.utils.Log;
import com.google.android.maps.GeoPoint;
@@ -121,7 +121,7 @@ public class GoogleMapView extends MapView implements MapViewImpl {
@Override
public PositionOverlay createAddPositionOverlay(Activity activity) {
- GoogleOverlay ovl = new GoogleOverlay(activity, overlayType.PositionOverlay);
+ GoogleOverlay ovl = new GoogleOverlay(activity, OverlayType.PositionOverlay);
getOverlays().add(ovl);
return (PositionOverlay) ovl.getBase();
}
@@ -129,7 +129,7 @@ public class GoogleMapView extends MapView implements MapViewImpl {
@Override
public ScaleOverlay createAddScaleOverlay(Activity activity) {
- GoogleOverlay ovl = new GoogleOverlay(activity, overlayType.ScaleOverlay);
+ GoogleOverlay ovl = new GoogleOverlay(activity, OverlayType.ScaleOverlay);
getOverlays().add(ovl);
return (ScaleOverlay) ovl.getBase();
}
diff --git a/main/src/cgeo/geocaching/maps/google/GoogleOverlay.java b/main/src/cgeo/geocaching/maps/google/GoogleOverlay.java
index 773f9ff..bf4f606 100644
--- a/main/src/cgeo/geocaching/maps/google/GoogleOverlay.java
+++ b/main/src/cgeo/geocaching/maps/google/GoogleOverlay.java
@@ -20,7 +20,7 @@ public class GoogleOverlay extends Overlay implements OverlayImpl {
private GeneralOverlay overlayBase = null;
private Lock lock = new ReentrantLock();
- public GoogleOverlay(Activity activityIn, overlayType ovlType) {
+ public GoogleOverlay(Activity activityIn, OverlayType ovlType) {
switch (ovlType) {
case PositionOverlay:
overlayBase = new PositionOverlay(activityIn, this);
diff --git a/main/src/cgeo/geocaching/maps/interfaces/OverlayImpl.java b/main/src/cgeo/geocaching/maps/interfaces/OverlayImpl.java
index 115b692..a17b5fb 100644
--- a/main/src/cgeo/geocaching/maps/interfaces/OverlayImpl.java
+++ b/main/src/cgeo/geocaching/maps/interfaces/OverlayImpl.java
@@ -6,7 +6,7 @@ package cgeo.geocaching.maps.interfaces;
*/
public interface OverlayImpl {
- public enum overlayType {
+ public enum OverlayType {
PositionOverlay,
ScaleOverlay
}
diff --git a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java
index 2b0c1f7..aa11405 100644
--- a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java
+++ b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java
@@ -14,7 +14,7 @@ import cgeo.geocaching.maps.interfaces.MapSource;
import cgeo.geocaching.maps.interfaces.MapViewImpl;
import cgeo.geocaching.maps.interfaces.OnMapDragListener;
import cgeo.geocaching.maps.interfaces.OverlayImpl;
-import cgeo.geocaching.maps.interfaces.OverlayImpl.overlayType;
+import cgeo.geocaching.maps.interfaces.OverlayImpl.OverlayType;
import cgeo.geocaching.utils.Log;
import org.apache.commons.lang3.StringUtils;
@@ -109,14 +109,14 @@ public class MapsforgeMapView extends MapView implements MapViewImpl {
@Override
public PositionOverlay createAddPositionOverlay(Activity activity) {
- MapsforgeOverlay ovl = new MapsforgeOverlay(activity, overlayType.PositionOverlay);
+ MapsforgeOverlay ovl = new MapsforgeOverlay(activity, OverlayType.PositionOverlay);
getOverlays().add(ovl);
return (PositionOverlay) ovl.getBase();
}
@Override
public ScaleOverlay createAddScaleOverlay(Activity activity) {
- MapsforgeOverlay ovl = new MapsforgeOverlay(activity, overlayType.ScaleOverlay);
+ MapsforgeOverlay ovl = new MapsforgeOverlay(activity, OverlayType.ScaleOverlay);
getOverlays().add(ovl);
return (ScaleOverlay) ovl.getBase();
}
diff --git a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeOverlay.java b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeOverlay.java
index dd7fb75..a94b988 100644
--- a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeOverlay.java
+++ b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeOverlay.java
@@ -21,7 +21,7 @@ public class MapsforgeOverlay extends Overlay implements OverlayImpl {
private GeneralOverlay overlayBase = null;
private Lock lock = new ReentrantLock();
- public MapsforgeOverlay(Activity activityIn, OverlayImpl.overlayType ovlType) {
+ public MapsforgeOverlay(Activity activityIn, OverlayImpl.OverlayType ovlType) {
switch (ovlType) {
case PositionOverlay:
diff --git a/main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeMapView024.java b/main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeMapView024.java
index 8e3a4d8..a074e70 100644
--- a/main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeMapView024.java
+++ b/main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeMapView024.java
@@ -13,7 +13,7 @@ import cgeo.geocaching.maps.interfaces.MapProjectionImpl;
import cgeo.geocaching.maps.interfaces.MapViewImpl;
import cgeo.geocaching.maps.interfaces.OnMapDragListener;
import cgeo.geocaching.maps.interfaces.OverlayImpl;
-import cgeo.geocaching.maps.interfaces.OverlayImpl.overlayType;
+import cgeo.geocaching.maps.interfaces.OverlayImpl.OverlayType;
import cgeo.geocaching.utils.Log;
import org.mapsforge.android.mapsold.GeoPoint;
@@ -103,14 +103,14 @@ public class MapsforgeMapView024 extends MapView implements MapViewImpl {
@Override
public PositionOverlay createAddPositionOverlay(Activity activity) {
- MapsforgeOverlay ovl = new MapsforgeOverlay(activity, overlayType.PositionOverlay);
+ MapsforgeOverlay ovl = new MapsforgeOverlay(activity, OverlayType.PositionOverlay);
getOverlays().add(ovl);
return (PositionOverlay) ovl.getBase();
}
@Override
public ScaleOverlay createAddScaleOverlay(Activity activity) {
- MapsforgeOverlay ovl = new MapsforgeOverlay(activity, overlayType.ScaleOverlay);
+ MapsforgeOverlay ovl = new MapsforgeOverlay(activity, OverlayType.ScaleOverlay);
getOverlays().add(ovl);
return (ScaleOverlay) ovl.getBase();
}
diff --git a/main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeOverlay.java b/main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeOverlay.java
index d40b539..bdaac98 100644
--- a/main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeOverlay.java
+++ b/main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeOverlay.java
@@ -21,7 +21,7 @@ public class MapsforgeOverlay extends Overlay implements OverlayImpl {
private GeneralOverlay overlayBase = null;
private Lock lock = new ReentrantLock();
- public MapsforgeOverlay(Activity activityIn, OverlayImpl.overlayType ovlType) {
+ public MapsforgeOverlay(Activity activityIn, OverlayImpl.OverlayType ovlType) {
switch (ovlType) {
case PositionOverlay:
diff --git a/main/src/cgeo/geocaching/network/HtmlImage.java b/main/src/cgeo/geocaching/network/HtmlImage.java
index 0649e12..797e67d 100644
--- a/main/src/cgeo/geocaching/network/HtmlImage.java
+++ b/main/src/cgeo/geocaching/network/HtmlImage.java
@@ -6,6 +6,7 @@ import cgeo.geocaching.cgeoapplication;
import cgeo.geocaching.compatibility.Compatibility;
import cgeo.geocaching.connector.ConnectorFactory;
import cgeo.geocaching.files.LocalStorage;
+import cgeo.geocaching.utils.FileUtils;
import cgeo.geocaching.utils.IOUtils;
import cgeo.geocaching.utils.ImageUtils;
import cgeo.geocaching.utils.Log;
@@ -146,9 +147,13 @@ public class HtmlImage implements Html.ImageGetter {
*/
private static void makeFreshCopy(final File file) {
final File tempFile = new File(file.getParentFile(), file.getName() + "-temp");
- file.renameTo(tempFile);
- LocalStorage.copy(tempFile, file);
- tempFile.delete();
+ if (file.renameTo(tempFile)) {
+ LocalStorage.copy(tempFile, file);
+ FileUtils.deleteIgnoringFailure(tempFile);
+ }
+ else {
+ Log.e("Could not reset timestamp of file " + file.getAbsolutePath());
+ }
}
private Bitmap getTransparent1x1Image() {
diff --git a/main/src/cgeo/geocaching/settings/EditPasswordPreference.java b/main/src/cgeo/geocaching/settings/EditPasswordPreference.java
index d89f128..20d0250 100644
--- a/main/src/cgeo/geocaching/settings/EditPasswordPreference.java
+++ b/main/src/cgeo/geocaching/settings/EditPasswordPreference.java
@@ -10,7 +10,6 @@ import android.util.AttributeSet;
* Use it exactly as an EditTextPreference
*
* @see SettingsActivity - search for EditPasswordPreference
- * @author koem
*/
public class EditPasswordPreference extends EditTextPreference {
diff --git a/main/src/cgeo/geocaching/settings/Settings.java b/main/src/cgeo/geocaching/settings/Settings.java
index a4b2563..0e6158f 100644
--- a/main/src/cgeo/geocaching/settings/Settings.java
+++ b/main/src/cgeo/geocaching/settings/Settings.java
@@ -43,7 +43,7 @@ import java.util.Locale;
*/
public final class Settings {
- public static final int SHOW_WP_THRESHOLD_DEFAULT = 5;
+ public static final int SHOW_WP_THRESHOLD_DEFAULT = 10;
public static final int SHOW_WP_THRESHOLD_MAX = 50;
private static final int MAP_SOURCE_DEFAULT = GoogleMapProvider.GOOGLE_MAP_ID.hashCode();
@@ -53,14 +53,14 @@ public final class Settings {
private final static String keyConsumerPublic = CryptUtils.rot13("ESnsCvAv3kEupF1GCR3jGj");
private final static String keyConsumerSecret = CryptUtils.rot13("7vQWceACV9umEjJucmlpFe9FCMZSeqIqfkQ2BnhV9x");
- public enum coordInputFormatEnum {
+ public enum CoordInputFormatEnum {
Plain,
Deg,
Min,
Sec;
- public static coordInputFormatEnum fromInt(int id) {
- final coordInputFormatEnum[] values = coordInputFormatEnum.values();
+ public static CoordInputFormatEnum fromInt(int id) {
+ final CoordInputFormatEnum[] values = CoordInputFormatEnum.values();
if (id < 0 || id >= values.length) {
return Min;
}
@@ -75,8 +75,11 @@ public final class Settings {
Log.setDebug(sharedPrefs.getBoolean(getKey(R.string.pref_debug), false));
}
- // maps
- private static MapProvider mapProvider = null;
+ /**
+ * Cache the mapsource locally. If that is an offline map source, each request would potentially access the
+ * underlying map file, leading to delays.
+ */
+ private static MapSource mapSource;
private Settings() {
// this class is not to be instantiated;
@@ -132,10 +135,10 @@ public final class Settings {
e.putString(getKey(R.string.pref_memberstatus), old.getString(getKey(R.string.pref_memberstatus), ""));
e.putInt(getKey(R.string.pref_coordinputformat), old.getInt(getKey(R.string.pref_coordinputformat), 0));
e.putBoolean(getKey(R.string.pref_log_offline), old.getBoolean(getKey(R.string.pref_log_offline), false));
- e.putBoolean(getKey(R.string.pref_choose_list), old.getBoolean(getKey(R.string.pref_choose_list), false));
+ e.putBoolean(getKey(R.string.pref_choose_list), old.getBoolean(getKey(R.string.pref_choose_list), true));
e.putBoolean(getKey(R.string.pref_loaddirectionimg), old.getBoolean(getKey(R.string.pref_loaddirectionimg), true));
e.putString(getKey(R.string.pref_gccustomdate), old.getString(getKey(R.string.pref_gccustomdate), null));
- e.putInt(getKey(R.string.pref_gcshowwaypointsthreshold), old.getInt(getKey(R.string.pref_gcshowwaypointsthreshold), 0));
+ e.putInt(getKey(R.string.pref_showwaypointsthreshold), old.getInt(getKey(R.string.pref_showwaypointsthreshold), SHOW_WP_THRESHOLD_DEFAULT));
e.putString(getKey(R.string.pref_cookiestore), old.getString(getKey(R.string.pref_cookiestore), null));
e.putBoolean(getKey(R.string.pref_opendetailslastpage), old.getBoolean(getKey(R.string.pref_opendetailslastpage), false));
e.putInt(getKey(R.string.pref_lastdetailspage), old.getInt(getKey(R.string.pref_lastdetailspage), 1));
@@ -163,7 +166,7 @@ public final class Settings {
} else if (wpThreshold > SHOW_WP_THRESHOLD_MAX) {
wpThreshold = SHOW_WP_THRESHOLD_MAX;
}
- e.putInt(getKey(R.string.pref_gcshowwaypointsthreshold), wpThreshold);
+ e.putInt(getKey(R.string.pref_showwaypointsthreshold), wpThreshold);
// KEY_MAP_SOURCE must be string, because it is the key for a ListPreference now
int ms = sharedPrefs.getInt(getKey(R.string.pref_mapsource), MAP_SOURCE_DEFAULT);
@@ -397,10 +400,7 @@ public final class Settings {
}
public static MapProvider getMapProvider() {
- if (mapProvider == null) {
- mapProvider = getMapSource().getMapProvider();
- }
- return mapProvider;
+ return getMapSource().getMapProvider();
}
public static String getMapFile() {
@@ -441,11 +441,11 @@ public final class Settings {
return MapsforgeMapProvider.isValidMapFile(mapFileIn);
}
- public static coordInputFormatEnum getCoordInputFormat() {
- return coordInputFormatEnum.fromInt(getInt(R.string.pref_coordinputformat, 0));
+ public static CoordInputFormatEnum getCoordInputFormat() {
+ return CoordInputFormatEnum.fromInt(getInt(R.string.pref_coordinputformat, 0));
}
- public static void setCoordInputFormat(final coordInputFormatEnum format) {
+ public static void setCoordInputFormat(final CoordInputFormatEnum format) {
putInt(R.string.pref_coordinputformat, format.ordinal());
}
@@ -543,7 +543,21 @@ public final class Settings {
}
public static boolean isUseImperialUnits() {
- return getBoolean(R.string.pref_units, false);
+ return getBoolean(R.string.pref_units, getImperialUnitsDefault());
+ }
+
+ 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;
}
public static boolean isLiveMap() {
@@ -582,12 +596,15 @@ public final class Settings {
}
public static MapSource getMapSource() {
+ if (mapSource != null) {
+ return mapSource;
+ }
final int id = getConvertedMapId();
- final MapSource map = MapProviderFactory.getMapSource(id);
- if (map != null) {
+ mapSource = MapProviderFactory.getMapSource(id);
+ if (mapSource != null) {
// don't use offline maps if the map file is not valid
- if ((!(map instanceof OfflineMapSource)) || (isValidMapFile())) {
- return map;
+ if ((!(mapSource instanceof OfflineMapSource)) || (isValidMapFile())) {
+ return mapSource;
}
}
// fallback to first available map
@@ -636,13 +653,12 @@ public final class Settings {
}
public static void setMapSource(final MapSource newMapSource) {
- if (!MapProviderFactory.isSameActivity(getMapSource(), newMapSource)) {
- mapProvider = null;
- }
putString(R.string.pref_mapsource, String.valueOf(newMapSource.getNumericalId()));
if (newMapSource instanceof OfflineMapSource) {
setMapFile(((OfflineMapSource) newMapSource).getFileName());
}
+ // cache the value
+ mapSource = newMapSource;
}
public static void setAnyCoordinates(final Geopoint coords) {
@@ -704,11 +720,11 @@ public final class Settings {
* The Threshold for the showing of child waypoints
*/
public static int getWayPointsThreshold() {
- return getInt(R.string.pref_gcshowwaypointsthreshold, SHOW_WP_THRESHOLD_DEFAULT);
+ return getInt(R.string.pref_showwaypointsthreshold, SHOW_WP_THRESHOLD_DEFAULT);
}
public static void setShowWaypointsThreshold(final int threshold) {
- putInt(R.string.pref_gcshowwaypointsthreshold, threshold);
+ putInt(R.string.pref_showwaypointsthreshold, threshold);
}
public static boolean isUseTwitter() {
@@ -974,4 +990,9 @@ public final class Settings {
public static void setFieldnoteExportDate(final long date) {
putLong(R.string.pref_fieldnoteExportDate, date);
}
+
+ public static boolean isUseNavigationApp(NavigationAppsEnum navApp) {
+ return getBoolean(navApp.preferenceKey, true);
+ }
+
}
diff --git a/main/src/cgeo/geocaching/settings/SettingsActivity.java b/main/src/cgeo/geocaching/settings/SettingsActivity.java
index daef9af..42f6074 100644
--- a/main/src/cgeo/geocaching/settings/SettingsActivity.java
+++ b/main/src/cgeo/geocaching/settings/SettingsActivity.java
@@ -3,7 +3,6 @@ package cgeo.geocaching.settings;
import cgeo.geocaching.Intents;
import cgeo.geocaching.R;
import cgeo.geocaching.SelectMapfileActivity;
-import cgeo.geocaching.cgData;
import cgeo.geocaching.cgeoapplication;
import cgeo.geocaching.activity.ActivityMixin;
import cgeo.geocaching.apps.cache.navi.NavigationAppFactory;
@@ -13,7 +12,7 @@ import cgeo.geocaching.connector.gc.Login;
import cgeo.geocaching.files.SimpleDirChooser;
import cgeo.geocaching.maps.MapProviderFactory;
import cgeo.geocaching.maps.interfaces.MapSource;
-import cgeo.geocaching.ui.Formatter;
+import cgeo.geocaching.utils.DatabaseBackupUtils;
import cgeo.geocaching.utils.Log;
import cgeo.geocaching.utils.LogTemplateProvider;
import cgeo.geocaching.utils.LogTemplateProvider.LogTemplate;
@@ -21,7 +20,6 @@ import cgeo.geocaching.utils.LogTemplateProvider.LogTemplate;
import org.apache.commons.lang3.StringUtils;
import org.openintents.intents.FileManagerIntents;
-import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
@@ -58,7 +56,6 @@ import java.util.Locale;
* guidelines and the <a href="http://developer.android.com/guide/topics/ui/settings.html">Settings API Guide</a> for
* more information on developing a Settings UI.
*
- * @author koem (initial author)
*/
public class SettingsActivity extends PreferenceActivity {
@@ -123,6 +120,7 @@ public class SettingsActivity extends PreferenceActivity {
initBasicMemberPreferences();
initSend2CgeoPreferences();
initServicePreferences();
+ initNavigationMenuPreferences();
for (int k : new int[] { R.string.pref_username, R.string.pref_password,
R.string.pref_pass_vote, R.string.pref_signature,
@@ -133,6 +131,18 @@ public class SettingsActivity extends PreferenceActivity {
R.string.pref_fakekey_preference_backup_info, }) {
bindSummaryToStringValue(k);
}
+ getPreference(R.string.pref_units).setDefaultValue(Settings.getImperialUnitsDefault());
+ }
+
+ private void initNavigationMenuPreferences() {
+ for (NavigationAppsEnum appEnum : NavigationAppsEnum.values()) {
+ if (appEnum.app.isInstalled()) {
+ getPreference(appEnum.preferenceKey).setEnabled(true);
+ }
+ }
+ getPreference(R.string.pref_fakekey_basicmembers_screen)
+ .setEnabled(!Settings.isPremiumMember());
+ redrawScreen(R.string.pref_fakekey_navigation_menu_screen);
}
private void initServicePreferences() {
@@ -298,39 +308,13 @@ public class SettingsActivity extends PreferenceActivity {
backup.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(final Preference preference) {
- final Context context = preference.getContext();
- // avoid overwriting an existing backup with an empty database
- // (can happen directly after reinstalling the app)
- if (cgData.getAllCachesCount() == 0) {
- ActivityMixin.helpDialog(SettingsActivity.this,
- context.getString(R.string.init_backup),
- context.getString(R.string.init_backup_unnecessary));
- return false;
- }
+ return DatabaseBackupUtils.createBackup(SettingsActivity.this, new Runnable() {
- final ProgressDialog dialog = ProgressDialog.show(context,
- context.getString(R.string.init_backup),
- context.getString(R.string.init_backup_running), true, false);
- new Thread() {
@Override
public void run() {
- final String backupFileName = cgData.backupDatabase();
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- dialog.dismiss();
- ActivityMixin.helpDialog(SettingsActivity.this,
- context.getString(R.string.init_backup_backup),
- backupFileName != null
- ? context.getString(R.string.init_backup_success)
- + "\n" + backupFileName
- : context.getString(R.string.init_backup_failed));
- VALUE_CHANGE_LISTENER.onPreferenceChange(SettingsActivity.this.getPreference(R.string.pref_fakekey_preference_backup_info), "");
- }
- });
+ VALUE_CHANGE_LISTENER.onPreferenceChange(SettingsActivity.this.getPreference(R.string.pref_fakekey_preference_backup_info), "");
}
- }.start();
- return true;
+ });
}
});
@@ -338,8 +322,7 @@ public class SettingsActivity extends PreferenceActivity {
restore.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(final Preference preference) {
- ((cgeoapplication) SettingsActivity.this.getApplication())
- .restoreDatabase(SettingsActivity.this);
+ DatabaseBackupUtils.restoreDatabase(SettingsActivity.this);
return true;
}
});
@@ -492,10 +475,19 @@ public class SettingsActivity extends PreferenceActivity {
if (preference instanceof EditPasswordPreference) {
if (StringUtils.isBlank((String) value)) {
- preference.setSummary("");
+ preference.setSummary(StringUtils.EMPTY);
} else {
- preference.setSummary("\u2022 \u2022 \u2022 \u2022 \u2022 \u2022 \u2022 \u2022 \u2022 \u2022");
+ preference.setSummary(StringUtils.repeat("\u2022 ", 10));
}
+ } else if (isPreference(preference, R.string.pref_mapsource)) {
+ // reset the cached map source
+ int mapSourceId = Integer.valueOf(stringValue);
+ final MapSource mapSource = MapProviderFactory.getMapSource(mapSourceId);
+ Settings.setMapSource(mapSource);
+ preference.setSummary(mapSource.getName());
+ } else if (isPreference(preference, R.string.pref_connectorOCActive) || isPreference(preference, R.string.pref_connectorOCPLActive) || isPreference(preference, R.string.pref_connectorGCActive)) {
+ // // reset log-in status if connector activation was changed
+ cgeoapplication.getInstance().checkLogin = true;
} else if (preference instanceof ListPreference) {
// For list preferences, look up the correct display value in
// the preference's 'entries' list.
@@ -507,13 +499,11 @@ public class SettingsActivity extends PreferenceActivity {
index >= 0
? listPreference.getEntries()[index]
: null);
- } else if (getKey(R.string.pref_fakekey_preference_backup_info).equals(preference.getKey())) {
- File lastBackupFile = cgData.getRestoreFile();
- String text;
- if (lastBackupFile != null) {
+ } else if (isPreference(preference, R.string.pref_fakekey_preference_backup_info)) {
+ final String text;
+ if (DatabaseBackupUtils.hasBackup()) {
text = preference.getContext().getString(R.string.init_backup_last) + " "
- + Formatter.formatTime(lastBackupFile.lastModified())
- + ", " + Formatter.formatDate(lastBackupFile.lastModified());
+ + DatabaseBackupUtils.getBackupDateTime();
} else {
text = preference.getContext().getString(R.string.init_backup_last_no);
}
@@ -523,17 +513,13 @@ public class SettingsActivity extends PreferenceActivity {
// simple string representation.
preference.setSummary(stringValue);
}
- // reset log-in if gc user or password is changed
- if (isPreference(preference, R.string.pref_username) || isPreference(preference, R.string.pref_password)) {
+ if ((isPreference(preference, R.string.pref_username) && !stringValue.equals(Settings.getUsername())) || (isPreference(preference, R.string.pref_password) && !stringValue.equals(Settings.getGcLogin().getRight()))) {
+ // reset log-in if gc user or password is changed
if (Login.isActualLoginStatus()) {
Login.logout();
}
cgeoapplication.getInstance().checkLogin = true;
}
- // reset log-in status if connector activation was changed
- if (isPreference(preference, R.string.pref_connectorOCActive) || isPreference(preference, R.string.pref_connectorOCPLActive) || isPreference(preference, R.string.pref_connectorGCActive)) {
- cgeoapplication.getInstance().checkLogin = true;
- }
return true;
}
};
diff --git a/main/src/cgeo/geocaching/speech/SpeechService.java b/main/src/cgeo/geocaching/speech/SpeechService.java
index 634f1c4..ae289ed 100644
--- a/main/src/cgeo/geocaching/speech/SpeechService.java
+++ b/main/src/cgeo/geocaching/speech/SpeechService.java
@@ -1,8 +1,9 @@
package cgeo.geocaching.speech;
import cgeo.geocaching.DirectionProvider;
-import cgeo.geocaching.settings.Settings;
+import cgeo.geocaching.cgeoapplication;
import cgeo.geocaching.geopoint.Geopoint;
+import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.utils.GeoDirHandler;
import cgeo.geocaching.utils.Log;
@@ -44,16 +45,18 @@ public class SpeechService extends Service implements OnInitListener {
GeoDirHandler geoHandler = new GeoDirHandler() {
@Override
protected void updateDirection(float newDirection) {
- direction = DirectionProvider.getDirectionNow(startingActivity, newDirection);
- directionInitialized = true;
- updateCompass();
+ if (cgeoapplication.getInstance().currentGeo().getSpeed() <= 5) {
+ direction = DirectionProvider.getDirectionNow(startingActivity, newDirection);
+ directionInitialized = true;
+ updateCompass();
+ }
}
@Override
protected void updateGeoData(cgeo.geocaching.IGeoData newGeo) {
position = newGeo.getCoords();
positionInitialized = true;
- if (newGeo.getSpeed() > 5) {
+ if (!Settings.isUseCompass() || newGeo.getSpeed() > 5) {
direction = newGeo.getBearing();
directionInitialized = true;
}
@@ -151,7 +154,11 @@ public class SpeechService extends Service implements OnInitListener {
initialized = true;
- geoHandler.startGeoAndDir();
+ if (Settings.isUseCompass()) {
+ geoHandler.startGeoAndDir();
+ } else {
+ geoHandler.startGeo();
+ }
}
@Override
diff --git a/main/src/cgeo/geocaching/ui/CacheListAdapter.java b/main/src/cgeo/geocaching/ui/CacheListAdapter.java
index 3179857..c6aeaa6 100644
--- a/main/src/cgeo/geocaching/ui/CacheListAdapter.java
+++ b/main/src/cgeo/geocaching/ui/CacheListAdapter.java
@@ -6,12 +6,12 @@ import cgeo.geocaching.CacheDetailActivity;
import cgeo.geocaching.Geocache;
import cgeo.geocaching.IGeoData;
import cgeo.geocaching.R;
-import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.cgeoapplication;
import cgeo.geocaching.enumerations.CacheListType;
import cgeo.geocaching.enumerations.CacheType;
import cgeo.geocaching.filter.IFilter;
import cgeo.geocaching.geopoint.Geopoint;
+import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.sorting.CacheComparator;
import cgeo.geocaching.sorting.DistanceComparator;
import cgeo.geocaching.sorting.EventDateComparator;
@@ -645,6 +645,10 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> {
}
public void setInitialComparator() {
+ // will be called repeatedly when coming back to the list, therefore check first for an already existing sorting
+ if (cacheComparator != null) {
+ return;
+ }
CacheComparator comparator = null; // a null comparator will automatically sort by distance
if (cacheListType == CacheListType.HISTORY) {
comparator = new VisitComparator();
diff --git a/main/src/cgeo/geocaching/ui/EditNoteDialog.java b/main/src/cgeo/geocaching/ui/EditNoteDialog.java
index 50cf57a..2af1cb8 100644
--- a/main/src/cgeo/geocaching/ui/EditNoteDialog.java
+++ b/main/src/cgeo/geocaching/ui/EditNoteDialog.java
@@ -7,7 +7,7 @@ import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
-import android.view.LayoutInflater;
+import android.view.ContextThemeWrapper;
import android.view.View;
import android.widget.EditText;
@@ -35,13 +35,12 @@ public class EditNoteDialog extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
- LayoutInflater inflater = getActivity().getLayoutInflater();
- View view = inflater.inflate(R.layout.fragment_edit_note, null);
+ View view = View.inflate(new ContextThemeWrapper(getActivity(), R.style.dark), R.layout.fragment_edit_note, null);
mEditText = (EditText) view.findViewById(R.id.note);
String initialNote = getArguments().getString(ARGUMENT_INITIAL_NOTE);
if (initialNote != null) {
mEditText.setText(initialNote);
- initialNote = null;
+ getArguments().remove(ARGUMENT_INITIAL_NOTE);
}
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
diff --git a/main/src/cgeo/geocaching/ui/Formatter.java b/main/src/cgeo/geocaching/ui/Formatter.java
index 92a0defc..ecae9ea 100644
--- a/main/src/cgeo/geocaching/ui/Formatter.java
+++ b/main/src/cgeo/geocaching/ui/Formatter.java
@@ -99,13 +99,11 @@ public abstract class Formatter {
* Generate a numeric date and time string according to system-wide settings (locale,
* date format) such as "7 sept. at 12:35".
*
- * @param context
- * a Context
* @param date
* milliseconds since the epoch
* @return the formatted string
*/
- public static String formatShortDateTime(Context context, long date) {
+ public static String formatShortDateTime(long date) {
return DateUtils.formatDateTime(context, date, DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_ABBREV_ALL);
}
diff --git a/main/src/cgeo/geocaching/ui/GPXListAdapter.java b/main/src/cgeo/geocaching/ui/GPXListAdapter.java
index 7f3c33f..988bb81 100644
--- a/main/src/cgeo/geocaching/ui/GPXListAdapter.java
+++ b/main/src/cgeo/geocaching/ui/GPXListAdapter.java
@@ -5,6 +5,7 @@ import butterknife.InjectView;
import cgeo.geocaching.GpxFileListActivity;
import cgeo.geocaching.R;
import cgeo.geocaching.files.GPXImporter;
+import cgeo.geocaching.utils.FileUtils;
import cgeo.geocaching.utils.Log;
import android.app.Activity;
@@ -80,7 +81,7 @@ public class GPXListAdapter extends ArrayAdapter<File> {
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
- file.delete();
+ FileUtils.deleteIgnoringFailure(file);
GPXListAdapter.this.remove(file);
}
})
diff --git a/main/src/cgeo/geocaching/ui/dialog/CoordinatesInputDialog.java b/main/src/cgeo/geocaching/ui/dialog/CoordinatesInputDialog.java
index 959cb14..91ce7e3 100644
--- a/main/src/cgeo/geocaching/ui/dialog/CoordinatesInputDialog.java
+++ b/main/src/cgeo/geocaching/ui/dialog/CoordinatesInputDialog.java
@@ -4,7 +4,7 @@ import cgeo.geocaching.Geocache;
import cgeo.geocaching.IGeoData;
import cgeo.geocaching.R;
import cgeo.geocaching.settings.Settings;
-import cgeo.geocaching.settings.Settings.coordInputFormatEnum;
+import cgeo.geocaching.settings.Settings.CoordInputFormatEnum;
import cgeo.geocaching.activity.AbstractActivity;
import cgeo.geocaching.activity.ActivityMixin;
import cgeo.geocaching.compatibility.Compatibility;
@@ -41,7 +41,7 @@ public class CoordinatesInputDialog extends NoTitleDialog {
private CoordinateUpdate cuListener;
- private coordInputFormatEnum currentFormat = null;
+ private CoordInputFormatEnum currentFormat = null;
public CoordinatesInputDialog(final AbstractActivity context, final Geocache cache, final Geopoint gp, final IGeoData geo) {
super(context, ActivityMixin.getDialogTheme());
@@ -272,7 +272,7 @@ public class CoordinatesInputDialog extends NoTitleDialog {
* formatSec 2/3 2 2 3
*/
- if (currentFormat == coordInputFormatEnum.Plain) {
+ if (currentFormat == CoordInputFormatEnum.Plain) {
return;
}
@@ -325,7 +325,7 @@ public class CoordinatesInputDialog extends NoTitleDialog {
}
private boolean calc(final boolean signalError) {
- if (currentFormat == coordInputFormatEnum.Plain) {
+ if (currentFormat == CoordInputFormatEnum.Plain) {
try {
gp = new Geopoint(eLat.getText().toString(), eLon.getText().toString());
} catch (final Geopoint.ParseException e) {
@@ -375,10 +375,10 @@ public class CoordinatesInputDialog extends NoTitleDialog {
if (editText == eLonDeg || editText == eLatSub || editText == eLonSub) {
return 3;
}
- if ((editText == eLatMin || editText == eLonMin) && currentFormat == coordInputFormatEnum.Deg) {
+ if ((editText == eLatMin || editText == eLonMin) && currentFormat == CoordInputFormatEnum.Deg) {
return 5;
}
- if ((editText == eLatSec || editText == eLonSec) && currentFormat == coordInputFormatEnum.Min) {
+ if ((editText == eLatSec || editText == eLonSec) && currentFormat == CoordInputFormatEnum.Min) {
return 3;
}
return 2;
@@ -402,7 +402,7 @@ public class CoordinatesInputDialog extends NoTitleDialog {
}
}
- currentFormat = coordInputFormatEnum.fromInt(pos);
+ currentFormat = CoordInputFormatEnum.fromInt(pos);
Settings.setCoordInputFormat(currentFormat);
updateGUI();
}
diff --git a/main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java b/main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java
new file mode 100644
index 0000000..24f375d
--- /dev/null
+++ b/main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java
@@ -0,0 +1,115 @@
+package cgeo.geocaching.utils;
+
+import cgeo.geocaching.MainActivity;
+import cgeo.geocaching.R;
+import cgeo.geocaching.cgData;
+import cgeo.geocaching.activity.ActivityMixin;
+import cgeo.geocaching.ui.Formatter;
+
+import org.apache.commons.lang3.StringUtils;
+
+import android.app.Activity;
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.content.res.Resources;
+import android.os.Handler;
+import android.os.Message;
+
+import java.io.File;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+public class DatabaseBackupUtils {
+
+ private DatabaseBackupUtils() {
+ // utility class
+ }
+
+ /**
+ * restore the database in a new thread, showing a progress window
+ *
+ * @param activity
+ * calling activity
+ */
+ public static void restoreDatabase(final Activity activity) {
+ final Resources res = activity.getResources();
+ final ProgressDialog dialog = ProgressDialog.show(activity, res.getString(R.string.init_backup_restore), res.getString(R.string.init_restore_running), true, false);
+ final AtomicBoolean restoreSuccessful = new AtomicBoolean(false);
+ Thread restoreThread = new Thread() {
+ final Handler handler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ dialog.dismiss();
+ boolean restored = restoreSuccessful.get();
+ String message = restored ? res.getString(R.string.init_restore_success) : res.getString(R.string.init_restore_failed);
+ ActivityMixin.helpDialog(activity, res.getString(R.string.init_backup_restore), message);
+ if (activity instanceof MainActivity) {
+ ((MainActivity) activity).updateCacheCounter();
+ }
+ }
+ };
+
+ @Override
+ public void run() {
+ restoreSuccessful.set(cgData.restoreDatabaseInternal());
+ handler.sendMessage(handler.obtainMessage());
+ }
+ };
+ restoreThread.start();
+ }
+
+ public static boolean createBackup(final Activity activity, final Runnable runAfterwards) {
+ final Context context = activity;
+ // avoid overwriting an existing backup with an empty database
+ // (can happen directly after reinstalling the app)
+ if (cgData.getAllCachesCount() == 0) {
+ ActivityMixin.helpDialog(activity,
+ context.getString(R.string.init_backup),
+ context.getString(R.string.init_backup_unnecessary));
+ return false;
+ }
+
+ final ProgressDialog dialog = ProgressDialog.show(context,
+ context.getString(R.string.init_backup),
+ context.getString(R.string.init_backup_running), true, false);
+ new Thread() {
+ @Override
+ public void run() {
+ final String backupFileName = cgData.backupDatabaseInternal();
+ activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ dialog.dismiss();
+ ActivityMixin.helpDialog(activity,
+ context.getString(R.string.init_backup_backup),
+ backupFileName != null
+ ? context.getString(R.string.init_backup_success)
+ + "\n" + backupFileName
+ : context.getString(R.string.init_backup_failed));
+ if (runAfterwards != null) {
+ runAfterwards.run();
+ }
+ }
+ });
+ }
+ }.start();
+ return true;
+ }
+
+ public static File getRestoreFile() {
+ final File fileSourceFile = cgData.getBackupFileInternal();
+ return fileSourceFile.exists() ? fileSourceFile : null;
+ }
+
+ public static boolean hasBackup() {
+ return getRestoreFile() != null;
+ }
+
+ public static String getBackupDateTime() {
+ final File restoreFile = getRestoreFile();
+ if (restoreFile == null) {
+ return StringUtils.EMPTY;
+ }
+ return Formatter.formatShortDateTime(restoreFile.lastModified());
+ }
+
+}
diff --git a/main/src/cgeo/geocaching/utils/FileUtils.java b/main/src/cgeo/geocaching/utils/FileUtils.java
index 5ab8fcc..edb8102 100644
--- a/main/src/cgeo/geocaching/utils/FileUtils.java
+++ b/main/src/cgeo/geocaching/utils/FileUtils.java
@@ -1,6 +1,7 @@
package cgeo.geocaching.utils;
import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
import android.os.Handler;
import android.os.Message;
@@ -11,8 +12,6 @@ import java.util.List;
/**
* Utility class for files
*
- * @author rsudev
- *
*/
public final class FileUtils {
@@ -65,4 +64,65 @@ public final class FileUtils {
public abstract boolean shouldEnd();
}
+
+ /**
+ * Create a unique non existing file named like the given file name. If a file with the given name already exists,
+ * add a number as suffix to the file name.<br>
+ * Example: For the file name "file.ext" this will return the first file of the list
+ * <ul>
+ * <li>file.ext</li>
+ * <li>file_2.ext</li>
+ * <li>file_3.ext</li>
+ * </ul>
+ * which does not yet exist.
+ */
+ public static File getUniqueNamedFile(final String baseNameAndPath) {
+ String extension = StringUtils.substringAfterLast(baseNameAndPath, ".");
+ String pathName = StringUtils.substringBeforeLast(baseNameAndPath, ".");
+ int number = 1;
+ while (new File(getNumberedFileName(pathName, extension, number)).exists()) {
+ number++;
+ }
+ return new File(getNumberedFileName(pathName, extension, number));
+ }
+
+ private static String getNumberedFileName(String pathName, String extension, int number) {
+ return pathName + (number > 1 ? "_" + Integer.toString(number) : "") + "." + extension;
+ }
+
+ /**
+ * This usage of this method indicates that the return value of File.delete() can safely be ignored.
+ */
+ public static void deleteIgnoringFailure(final File file) {
+ if (!file.delete()) {
+ Log.i("Could not delete " + file.getAbsolutePath());
+ }
+ }
+
+ /**
+ * Deletes a file and logs deletion failures.
+ *
+ * @return <code> true</code> if this file was deleted, <code>false</code> otherwise.
+ */
+ public static boolean delete(final File file) {
+ final boolean success = file.delete();
+ if (!success) {
+ Log.e("Could not delete " + file.getAbsolutePath());
+ }
+ return success;
+ }
+
+ /**
+ * Creates the directory named by the given file, creating any missing parent directories in the process.
+ *
+ * @return <code>true</code> if the directory was created, <code>false</code> on failure or if the directory already
+ * existed.
+ */
+ public static boolean mkdirs(File file) {
+ final boolean success = file.mkdirs();
+ if (!success) {
+ Log.e("Could not make directories " + file.getAbsolutePath());
+ }
+ return success;
+ }
}
diff --git a/main/src/cgeo/geocaching/utils/Log.java b/main/src/cgeo/geocaching/utils/Log.java
index f7f33d9..aa8dbd1 100644
--- a/main/src/cgeo/geocaching/utils/Log.java
+++ b/main/src/cgeo/geocaching/utils/Log.java
@@ -8,26 +8,30 @@ import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
-final public class Log {
+public final class Log {
private static final String TAG = "cgeo";
/**
- * the debug flag is cached here so that we don't need to access the settings every time we have to evaluate it
+ * The debug flag is cached here so that we don't need to access the settings every time we have to evaluate it.
*/
private static boolean isDebug = true;
private static boolean first = true;
+ private Log() {
+ // utility class
+ }
+
public static boolean isDebug() {
return isDebug;
}
/**
- * save a copy of the debug flag from the settings for performance reasons
- *
+ * Save a copy of the debug flag from the settings for performance reasons.
+ *
* @param isDebug
*/
- public static void setDebug(boolean isDebug) {
+ public static void setDebug(final boolean isDebug) {
Log.isDebug = isDebug;
}
@@ -95,11 +99,11 @@ final public class Log {
*
* @param msg the message to log, or to add to the log if other messages have been stored in the same run
*/
- public synchronized static void logToFile(final String msg) {
+ public static synchronized void logToFile(final String msg) {
final File file = new File(Environment.getExternalStorageDirectory(), "cgeo-debug.log");
if (first) {
first = false;
- file.delete();
+ FileUtils.delete(file);
}
Writer writer = null;
try {
diff --git a/main/src/cgeo/geocaching/utils/MatcherWrapper.java b/main/src/cgeo/geocaching/utils/MatcherWrapper.java
index c3c1663..78b1170 100644
--- a/main/src/cgeo/geocaching/utils/MatcherWrapper.java
+++ b/main/src/cgeo/geocaching/utils/MatcherWrapper.java
@@ -22,6 +22,10 @@ public class MatcherWrapper {
return matcher.find();
}
+ public boolean find(int start) {
+ return matcher.find(start);
+ }
+
/**
* see {@link Matcher#group(int)}
*/
diff --git a/main/src/cgeo/geocaching/utils/SimpleCancellableHandler.java b/main/src/cgeo/geocaching/utils/SimpleCancellableHandler.java
index 75c10ab..9207c74 100644
--- a/main/src/cgeo/geocaching/utils/SimpleCancellableHandler.java
+++ b/main/src/cgeo/geocaching/utils/SimpleCancellableHandler.java
@@ -20,7 +20,7 @@ public class SimpleCancellableHandler extends CancellableHandler {
}
@Override
- public void handleRegularMessage(final Message msg) {
+ protected void handleRegularMessage(final Message msg) {
AbstractActivity activity = activityRef.get();
if (activity != null && msg.getData() != null && msg.getData().getString(MESSAGE_TEXT) != null) {
activity.showToast(msg.getData().getString(MESSAGE_TEXT));
@@ -30,7 +30,7 @@ public class SimpleCancellableHandler extends CancellableHandler {
}
@Override
- public void handleCancel(final Object extra) {
+ protected void handleCancel(final Object extra) {
AbstractActivity activity = activityRef.get();
if (activity != null) {
activity.showToast((String) extra);
@@ -38,7 +38,7 @@ public class SimpleCancellableHandler extends CancellableHandler {
dismissProgress();
}
- public final void showToast(int resId) {
+ protected final void showToast(int resId) {
AbstractActivity activity = activityRef.get();
if (activity != null) {
Resources res = activity.getResources();
@@ -46,7 +46,7 @@ public class SimpleCancellableHandler extends CancellableHandler {
}
}
- public final void dismissProgress() {
+ protected final void dismissProgress() {
Progress progressDialog = progressDialogRef.get();
if (progressDialog != null) {
progressDialog.dismiss();
diff --git a/main/src/cgeo/geocaching/utils/UncertainProperty.java b/main/src/cgeo/geocaching/utils/UncertainProperty.java
new file mode 100644
index 0000000..5f86662
--- /dev/null
+++ b/main/src/cgeo/geocaching/utils/UncertainProperty.java
@@ -0,0 +1,48 @@
+package cgeo.geocaching.utils;
+
+import cgeo.geocaching.connector.gc.Tile;
+
+public class UncertainProperty<T> {
+
+ private final T value;
+ private final int certaintyLevel;
+
+ public UncertainProperty(T value) {
+ this(value, Tile.ZOOMLEVEL_MAX + 1);
+ }
+
+ public UncertainProperty(T value, int certaintyLevel) {
+ this.value = value;
+ this.certaintyLevel = certaintyLevel;
+ }
+
+ public T getValue() {
+ return value;
+ }
+
+ public int getCertaintyLevel() {
+ return certaintyLevel;
+ }
+
+ public UncertainProperty<T> getMergedProperty(final UncertainProperty<T> other) {
+ if (null == other || null == other.value) {
+ return this;
+ }
+ if (null == this.value) {
+ return other;
+ }
+ if (other.certaintyLevel > certaintyLevel) {
+ return other;
+ }
+
+ return this;
+ }
+
+ public static <T> UncertainProperty<T> getMergedProperty(UncertainProperty<T> property, UncertainProperty<T> otherProperty) {
+ if (null == property) {
+ return otherProperty;
+ }
+ return property.getMergedProperty(otherProperty);
+ }
+
+}
diff --git a/send2cgeo/send2cgeo.user.js b/send2cgeo/send2cgeo.user.js
index bd20f3a..3a7f6c7 100644
--- a/send2cgeo/send2cgeo.user.js
+++ b/send2cgeo/send2cgeo.user.js
@@ -5,9 +5,11 @@
// @include http://www.geocaching.com/seek/cache_details*
// @include http://www.geocaching.com/map/*
// @include http://www.geocaching.com/geocache/*
+// @include http://www.geocaching.com/my/recentlyviewedcaches*
+// @include http://www.geocaching.com/seek/nearest*
// @icon http://send2.cgeo.org/content/images/logo.png
// @updateURL http://send2.cgeo.org/send2cgeo.user.js
-// @version 0.27
+// @version 0.29
// ==/UserScript==
// Inserts javascript that will be called by the s2cgeo button. The closure
@@ -32,7 +34,7 @@ s.textContent = '(' + function() {
// hide "please wait text" and show iframe
$('#send2cgeo div').hide();
// hide box after 3 seconds
- $(this).show().parent().delay(3000).fadeOut();
+ $(this).css('display', 'block').parent().delay(3000).fadeOut();
});
};
@@ -70,7 +72,7 @@ s.textContent = '(' + function() {
+ '<span>Send to c:geo</span>';
map.innerHTML = map.innerHTML.replace('Log Visit</span>', html);
- } else {
+ } else if(document.getElementById('ctl00_ContentBody_CoordInfoLinkControl1_uxCoordInfoCode') != null){
// geocaching.com cache detail page
var GCCode = $('#ctl00_ContentBody_CoordInfoLinkControl1_uxCoordInfoCode')
.html();
@@ -83,6 +85,18 @@ s.textContent = '(' + function() {
$('#Download p:last').append(html);
$('#Download dd:last').append(html);
+ } else {
+ // geocaching.com recentlyviewed
+ $('img[src="/images/icons/16/send_to_gps.png"]').each(function(){
+ $(this).attr('alt', "Send to c:geo").attr('title', "Send to c:geo");
+ });
+ $('a[title="Send to GPS"]').each(function(){
+ var text = $(this).parent().parent().find(".Merge").last().find(".small").first().text().split("|");
+ var GCCode = text[text.length - 2].trim();
+ this.href="javascript:window.s2geo('"+GCCode+"')";
+ this.title = "Send to c:geo";
+ });
+
}
} + ')();';
diff --git a/tests/src/cgeo/geocaching/GeocacheTest.java b/tests/src/cgeo/geocaching/GeocacheTest.java
index 5431835..4c09594 100644
--- a/tests/src/cgeo/geocaching/GeocacheTest.java
+++ b/tests/src/cgeo/geocaching/GeocacheTest.java
@@ -78,4 +78,138 @@ public class GeocacheTest extends AndroidTestCase {
}
cache.drop(new Handler());
}
+
+ public static void testMergeDownloadedStored() {
+
+ Geocache stored = new Geocache();
+ stored.setGeocode("GC12345");
+ stored.setDetailed(true);
+ stored.setDisabled(true);
+ stored.setType(CacheType.TRADITIONAL);
+ stored.setCoords(new Geopoint(40.0, 8.0));
+ stored.setDescription("Test1");
+
+ Geocache download = new Geocache();
+ download.setGeocode("GC12345");
+ download.setDetailed(true);
+ download.setDisabled(false);
+ download.setType(CacheType.MULTI);
+ download.setCoords(new Geopoint(41.0, 9.0));
+ download.setDescription("Test2");
+
+ download.gatherMissingFrom(stored);
+
+ assertTrue("Detailed not merged correctly", download.isDetailed());
+ assertFalse("Disabled not merged correctly", download.isDisabled());
+ assertEquals("Type not merged correctly", CacheType.MULTI, download.getType());
+ assertEquals("Longitude not merged correctly", 9.0, download.getCoords().getLongitude(), 0.1);
+ assertEquals("Latitude not merged correctly", 41.0, download.getCoords().getLatitude(), 0.1);
+ assertEquals("Description not merged correctly", "Test2", download.getDescription());
+ }
+
+ public static void testMergeLivemapStored() {
+
+ Geocache stored = new Geocache();
+ stored.setGeocode("GC12345");
+ stored.setDetailed(true);
+ stored.setDisabled(true);
+ stored.setType(CacheType.TRADITIONAL);
+ stored.setCoords(new Geopoint(40.0, 8.0));
+
+ Geocache livemap = new Geocache();
+ livemap.setGeocode("GC12345");
+ livemap.setType(CacheType.MULTI, 12);
+ livemap.setCoords(new Geopoint(41.0, 9.0), 12);
+
+ livemap.gatherMissingFrom(stored);
+
+ assertTrue("Detailed not merged correctly", livemap.isDetailed());
+ assertTrue("Disabled not merged correctly", livemap.isDisabled());
+ assertEquals("Type not merged correctly", CacheType.TRADITIONAL, livemap.getType());
+ assertEquals("Longitude not merged correctly", 8.0, livemap.getCoords().getLongitude(), 0.1);
+ assertEquals("Latitude not merged correctly", 40.0, livemap.getCoords().getLatitude(), 0.1);
+ assertEquals("Zoomlevel not merged correctly", stored.getCoordZoomLevel(), livemap.getCoordZoomLevel());
+ }
+
+ public static void testMergeLivemapZoomin() {
+
+ Geocache livemapFirst = new Geocache();
+ livemapFirst.setGeocode("GC12345");
+ livemapFirst.setType(CacheType.TRADITIONAL);
+ livemapFirst.setCoords(new Geopoint(40.0, 8.0), 11);
+
+ Geocache livemapSecond = new Geocache();
+ livemapSecond.setGeocode("GC12345");
+ livemapSecond.setType(CacheType.MULTI);
+ livemapSecond.setCoords(new Geopoint(41.0, 9.0), 12);
+
+ livemapSecond.gatherMissingFrom(livemapFirst);
+
+ assertEquals("Type not merged correctly", CacheType.MULTI, livemapSecond.getType());
+ assertEquals("Longitude not merged correctly", 9.0, livemapSecond.getCoords().getLongitude(), 0.1);
+ assertEquals("Latitude not merged correctly", 41.0, livemapSecond.getCoords().getLatitude(), 0.1);
+ assertEquals("Zoomlevel not merged correctly", 12, livemapSecond.getCoordZoomLevel());
+ }
+
+ public static void testMergeLivemapZoomout() {
+
+ Geocache livemapFirst = new Geocache();
+ livemapFirst.setGeocode("GC12345");
+ livemapFirst.setType(CacheType.TRADITIONAL, 12);
+ livemapFirst.setCoords(new Geopoint(40.0, 8.0), 12);
+
+ Geocache livemapSecond = new Geocache();
+ livemapSecond.setGeocode("GC12345");
+ livemapSecond.setType(CacheType.MULTI, 11);
+ livemapSecond.setCoords(new Geopoint(41.0, 9.0), 11);
+
+ livemapSecond.gatherMissingFrom(livemapFirst);
+
+ assertEquals("Type not merged correctly", CacheType.TRADITIONAL, livemapSecond.getType());
+ assertEquals("Longitude not merged correctly", 8.0, livemapSecond.getCoords().getLongitude(), 0.1);
+ assertEquals("Latitude not merged correctly", 40.0, livemapSecond.getCoords().getLatitude(), 0.1);
+ assertEquals("Zoomlevel not merged correctly", 12, livemapSecond.getCoordZoomLevel());
+ }
+
+ public static void testMergePopupLivemap() {
+
+ Geocache livemap = new Geocache();
+ livemap.setGeocode("GC12345");
+ livemap.setCoords(new Geopoint(40.0, 8.0), 12);
+ livemap.setFound(true);
+
+ Geocache popup = new Geocache();
+ popup.setGeocode("GC12345");
+ popup.setType(CacheType.MULTI);
+
+ popup.gatherMissingFrom(livemap);
+
+ assertEquals("Type not merged correctly", CacheType.MULTI, popup.getType());
+ assertEquals("Longitude not merged correctly", 8.0, popup.getCoords().getLongitude(), 0.1);
+ assertEquals("Latitude not merged correctly", 40.0, popup.getCoords().getLatitude(), 0.1);
+ assertTrue("Found not merged correctly", popup.isFound());
+ assertEquals("Zoomlevel not merged correctly", 12, popup.getCoordZoomLevel());
+ }
+
+ public static void testMergeLivemapBMSearched() {
+
+ Geocache bmsearched = new Geocache();
+ bmsearched.setGeocode("GC12345");
+
+ Geocache livemap = new Geocache();
+ livemap.setGeocode("GC12345");
+ livemap.setCoords(new Geopoint(40.0, 8.0), 12);
+
+ livemap.gatherMissingFrom(bmsearched);
+
+ assertEquals("Longitude not merged correctly", 8.0, livemap.getCoords().getLongitude(), 0.1);
+ assertEquals("Latitude not merged correctly", 40.0, livemap.getCoords().getLatitude(), 0.1);
+ assertEquals("Zoomlevel not merged correctly", 12, livemap.getCoordZoomLevel());
+ }
+
+ public static void testNameForSorting() {
+ Geocache cache = new Geocache();
+ cache.setName("GR8 01-01");
+ assertEquals("GR000008 000001-000001", cache.getNameForSorting());
+ }
}
diff --git a/tests/src/cgeo/geocaching/cgDataTest.java b/tests/src/cgeo/geocaching/cgDataTest.java
index e175603..cacf061 100644
--- a/tests/src/cgeo/geocaching/cgDataTest.java
+++ b/tests/src/cgeo/geocaching/cgDataTest.java
@@ -9,6 +9,8 @@ import cgeo.geocaching.enumerations.LoadFlags.SaveFlag;
import cgeo.geocaching.geopoint.Geopoint;
import cgeo.geocaching.geopoint.Viewport;
+import org.apache.commons.lang3.StringUtils;
+
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
@@ -125,6 +127,35 @@ public class cgDataTest extends CGeoTestCase {
}
}
+ // Check that loading a cache by case insensitive geo code works correctly (see #3139)
+ public static void testGeocodeCaseInsensitive() {
+
+ final String GEOCODE_CACHE = "TEST";
+ final String upperCase = GEOCODE_CACHE;
+ final String lowerCase = StringUtils.lowerCase(upperCase);
+ assertFalse(upperCase.equals(lowerCase));
+
+ // create cache and trackable
+ final Geocache cache = new Geocache();
+ cache.setGeocode(upperCase);
+ cache.setDetailed(true);
+
+ try {
+ final Geocache oldCache = cgData.loadCache(upperCase, LoadFlags.LOAD_ALL_DB_ONLY);
+ assertNull("Database contained old cache!", oldCache);
+
+ cgData.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB));
+ final Geocache cacheWithOriginalCode = cgData.loadCache(upperCase, LoadFlags.LOAD_ALL_DB_ONLY);
+ assertNotNull("Cache was not saved correctly!", cacheWithOriginalCode);
+
+ final Geocache cacheLowerCase = cgData.loadCache(lowerCase, LoadFlags.LOAD_ALL_DB_ONLY);
+ assertNotNull("Could not find cache by case insensitive geocode", cacheLowerCase);
+
+ } finally {
+ cgData.removeCache(upperCase, LoadFlags.REMOVE_ALL);
+ }
+ }
+
// Loading logs for an empty geocode should return an empty list, not null!
public static void testLoadLogsFromEmptyGeocode() {
@@ -165,8 +196,7 @@ public class cgDataTest extends CGeoTestCase {
main.setCoords(new Geopoint("N49 44.0 E8 37.0"));
final Geocache inTileLowZoom = new Geocache();
inTileLowZoom.setGeocode("GC12346");
- inTileLowZoom.setCoords(new Geopoint("N49 44.001 E8 37.001"));
- inTileLowZoom.setZoomlevel(Tile.ZOOMLEVEL_MIN_PERSONALIZED - 5);
+ inTileLowZoom.setCoords(new Geopoint("N49 44.001 E8 37.001"), Tile.ZOOMLEVEL_MIN_PERSONALIZED - 5);
final Geocache outTile = new Geocache();
outTile.setGeocode("GC12347");
outTile.setCoords(new Geopoint(tile.getViewport().getLatitudeMin() - 0.1, tile.getViewport().getLongitudeMin() - 0.1));
@@ -175,8 +205,7 @@ public class cgDataTest extends CGeoTestCase {
otherConnector.setCoords(new Geopoint("N49 44.0 E8 37.0"));
final Geocache inTileHighZoom = new Geocache();
inTileHighZoom.setGeocode("GC12348");
- inTileHighZoom.setCoords(new Geopoint("N49 44.001 E8 37.001"));
- inTileHighZoom.setZoomlevel(Tile.ZOOMLEVEL_MIN_PERSONALIZED + 1);
+ inTileHighZoom.setCoords(new Geopoint("N49 44.001 E8 37.001"), Tile.ZOOMLEVEL_MIN_PERSONALIZED + 1);
// put in cache
cgData.saveCache(main, EnumSet.of(SaveFlag.SAVE_CACHE));
diff --git a/tests/src/cgeo/geocaching/settings/TestSettings.java b/tests/src/cgeo/geocaching/settings/TestSettings.java
index 6585ee4..6c31dcc 100644
--- a/tests/src/cgeo/geocaching/settings/TestSettings.java
+++ b/tests/src/cgeo/geocaching/settings/TestSettings.java
@@ -4,8 +4,6 @@ package cgeo.geocaching.settings;
/**
* provide write-access proxy to settings for testing purposes
*
- * @author rschuman
- *
*/
public class TestSettings {
diff --git a/tests/src/cgeo/geocaching/sorting/NameComparatorTest.java b/tests/src/cgeo/geocaching/sorting/NameComparatorTest.java
index 18db4b7..8e020c4 100644
--- a/tests/src/cgeo/geocaching/sorting/NameComparatorTest.java
+++ b/tests/src/cgeo/geocaching/sorting/NameComparatorTest.java
@@ -4,6 +4,9 @@ import cgeo.geocaching.Geocache;
import android.test.AndroidTestCase;
+import java.util.ArrayList;
+import java.util.Collections;
+
public class NameComparatorTest extends AndroidTestCase {
private static class NamedCache extends Geocache {
@@ -26,9 +29,29 @@ public class NameComparatorTest extends AndroidTestCase {
assertSorted(new NamedCache("2"), new NamedCache("11"));
}
+ public void testDuplicateNumericalParts() {
+ assertSortedNames("GR8 01-01", "GR8 01-02", "GR8 01-03", "GR8 01-04", "GR8 01-05", "GR8 01-06", "GR8 01-07", "GR8 01-08", "GR8 01-09");
+ }
+
+ /**
+ * Assert that a given collection of names is already sorted correctly.
+ *
+ * @param names
+ */
+ private void assertSortedNames(String... names) {
+ ArrayList<Geocache> caches = new ArrayList<Geocache>(names.length);
+ for (String name : names) {
+ caches.add(new NamedCache(name));
+ }
+ Collections.sort(caches, comp);
+ for (int i = 0; i < caches.size(); i++) {
+ assertEquals(names[i], caches.get(i).getName());
+ }
+ }
+
public void testNumericalWithSuffix() {
assertSorted(new NamedCache("abc123def"), new NamedCache("abc123xyz"));
- assertEquals("abc000123def456", (new NamedCache("abc123def456")).getNameForSorting());
+ assertEquals("abc000123def000456", (new NamedCache("abc123def456")).getNameForSorting());
}
private void assertSorted(final Geocache cache1, final Geocache cache2) {
diff --git a/tests/src/cgeo/geocaching/test/RegExPerformanceTest.java b/tests/src/cgeo/geocaching/test/RegExPerformanceTest.java
index 03ca18f..7c3b195 100644
--- a/tests/src/cgeo/geocaching/test/RegExPerformanceTest.java
+++ b/tests/src/cgeo/geocaching/test/RegExPerformanceTest.java
@@ -16,10 +16,8 @@ import junit.framework.TestCase;
/**
* Test class to compare the performance of two regular expressions on given data.
- * Can be used to improve the time needed to parse the cache data
+ * Can be used to improve the time needed to parse the cache data.
* Run As "JUnit Test"
- *
- * @author blafoo
*/
public class RegExPerformanceTest extends TestCase {
diff --git a/tests/src/cgeo/geocaching/test/RegExRealPerformanceTest.java b/tests/src/cgeo/geocaching/test/RegExRealPerformanceTest.java
index 1793722..fd47e5b 100644
--- a/tests/src/cgeo/geocaching/test/RegExRealPerformanceTest.java
+++ b/tests/src/cgeo/geocaching/test/RegExRealPerformanceTest.java
@@ -8,9 +8,7 @@ import java.util.List;
/**
* Test class to compare the performance of two regular expressions on given data.
- * Can be used to improve the time needed to parse the cache data
- *
- * @author blafoo
+ * Can be used to improve the time needed to parse the cache data.
*/
public class RegExRealPerformanceTest extends AndroidTestCase {