forked from upstream-mirrors/OpenTracks
Compare commits
47 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d9de56be33 | |||
| fa1496d130 | |||
| 89059caec2 | |||
| 8f1d8e2881 | |||
| 54e456046e | |||
| 1775c52291 | |||
| b50965f0e8 | |||
| d9bba7852c | |||
| 5ff91a98f4 | |||
| 79f62bd3db | |||
| c387729301 | |||
| 1094059fb8 | |||
| affb4e1053 | |||
| 0547a14fbd | |||
| 39d6c9a298 | |||
| 9c51a31b01 | |||
| f7f58141de | |||
| e46d3cd06c | |||
| a40b87efb6 | |||
| e98dff55ae | |||
| f0b7de4c7c | |||
| f0f571480b | |||
| 072fdb12ed | |||
| fda2fae02b | |||
| a09fa93887 | |||
| 8f0ed91f80 | |||
| e5a60a8141 | |||
| c7d3c19919 | |||
| 594a34980b | |||
| 95b070bb58 | |||
| 66e3f000e9 | |||
| 1a381562e5 | |||
| b72bd60586 | |||
| 4e9c27af6f | |||
| 1638fab0df | |||
| e3cba91bf1 | |||
| bf1746fcd1 | |||
| d19ca3851c | |||
| 1b868bd71d | |||
| d8bcbcc183 | |||
| 294cbc12ef | |||
| 1d2abf07bf | |||
| 86dfa5df67 | |||
| ed70b0d982 | |||
| 0afe4c5149 | |||
| 2e7a3b7465 | |||
| ca92666176 |
@@ -18,7 +18,7 @@ jobs:
|
||||
java-version: '17'
|
||||
|
||||
- name: run tests
|
||||
uses: reactivecircus/android-emulator-runner@v2.32.0
|
||||
uses: reactivecircus/android-emulator-runner@v2.33.0
|
||||
with:
|
||||
arch: x86_64
|
||||
api-level: 34
|
||||
|
||||
+11
-10
@@ -6,7 +6,7 @@ buildscript {
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:8.6.0'
|
||||
classpath 'com.android.tools.build:gradle:8.6.1'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@ android {
|
||||
targetCompatibility JavaVersion.VERSION_17
|
||||
}
|
||||
|
||||
compileSdk 34
|
||||
compileSdk 35
|
||||
|
||||
buildFeatures {
|
||||
viewBinding true
|
||||
@@ -64,13 +64,13 @@ android {
|
||||
|
||||
defaultConfig {
|
||||
applicationId "de.dennisguse.opentracks"
|
||||
versionCode 5870
|
||||
versionName "v4.13.1"
|
||||
versionCode 5917
|
||||
versionName "v4.14.2"
|
||||
|
||||
buildConfigField "String", "VERSION_NAME_FULL", "\"${getVersionName()}\""
|
||||
|
||||
minSdk 26
|
||||
targetSdk 34
|
||||
targetSdk 35
|
||||
|
||||
testInstrumentationRunner "de.dennisguse.opentracks.TestRunner"
|
||||
testInstrumentationRunnerArguments clearPackageData: 'true'
|
||||
@@ -125,24 +125,25 @@ android {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.2'
|
||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.3'
|
||||
|
||||
implementation 'androidx.appcompat:appcompat:1.7.0'
|
||||
implementation 'androidx.preference:preference:1.2.1'
|
||||
implementation 'androidx.documentfile:documentfile:1.0.1'
|
||||
implementation 'androidx.gridlayout:gridlayout:1.0.0'
|
||||
implementation 'com.google.android.material:material:1.12.0'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
||||
implementation 'androidx.core:core:1.13.1'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.2.0'
|
||||
implementation 'androidx.core:core:1.15.0'
|
||||
implementation 'androidx.core:core-splashscreen:1.0.1'
|
||||
implementation 'androidx.mediarouter:mediarouter:1.7.0'
|
||||
implementation 'androidx.core:core-location-altitude:1.0.0-alpha03'
|
||||
|
||||
androidTestImplementation 'androidx.test:core:1.6.1'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
|
||||
androidTestImplementation 'androidx.test:rules:1.6.1'
|
||||
androidTestImplementation 'androidx.test:runner:1.6.2'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
|
||||
androidTestImplementation 'org.mockito:mockito-android:5.13.0'
|
||||
androidTestImplementation 'org.mockito:mockito-android:5.14.2'
|
||||
|
||||
androidTestUtil 'androidx.test:orchestrator:1.5.0'
|
||||
androidTestUtil 'androidx.test:orchestrator:1.5.1'
|
||||
}
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
height="188"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
viewBox="0 0 78 188"
|
||||
width="78"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<defs id="defs6" />
|
||||
<g id="layer1" />
|
||||
<g
|
||||
style="display:inline"
|
||||
id="layer2" />
|
||||
<metadata id="metadata8">
|
||||
<rdf:RDF>
|
||||
<cc:Work rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:title />
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<path
|
||||
style="fill:#cccccc;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:0.7019608"
|
||||
d="m 1,150 38,37 39,-37 H 50 V 97 L 29,81 v 69 z"
|
||||
id="path31161" />
|
||||
<path
|
||||
style="fill:#cccccc;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:0.7019608"
|
||||
d="M 29,51 V 70 L 50,86 V 67 Z"
|
||||
id="path31169" />
|
||||
<path
|
||||
style="fill:#cccccc;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:0.7019608"
|
||||
d="M 29,23 V 40 L 50,56 V 39 Z"
|
||||
id="path31192" />
|
||||
<path
|
||||
style="fill:#cccccc;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:0.7019608"
|
||||
d="M 29,0 V 14 L 50,29 V 16 Z"
|
||||
id="path31194" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,9 @@
|
||||
v4.13.1: OpenTracks
|
||||
|
||||
Změny:
|
||||
- Kalendář agregovaných statistik využívá regionální preference (Android 14+)
|
||||
|
||||
Opravy chyb:
|
||||
- KML 2.3: standardizovaný název pole pro srdeční tep
|
||||
- Seznam stop: stav nahrávání nebyl správně aktualizován
|
||||
- Opravy rozhraní související s Material 3
|
||||
@@ -0,0 +1,7 @@
|
||||
v4.14.0: OpenTracks
|
||||
|
||||
Změny:
|
||||
- Použití dat Androidx EGM2008 (namísto přibalení našeho vlastního řešení).
|
||||
|
||||
Vývojář:
|
||||
- Cíl Android 15 / SDK 35
|
||||
@@ -0,0 +1,7 @@
|
||||
v4.14.1: OpenTracks
|
||||
|
||||
Změny:
|
||||
- Detekce zastavení může být zakázána
|
||||
|
||||
Oprava chyby:
|
||||
- Rozhraní přidávání obrázků ke značkám bylo skryto
|
||||
@@ -0,0 +1,7 @@
|
||||
v4.14.0: OpenTracks
|
||||
|
||||
Changes:
|
||||
- Use Androidx' EGM2008 data (instead of bundling our custom solution).
|
||||
|
||||
Developer:
|
||||
- Target Android15/ SDK35
|
||||
@@ -0,0 +1,8 @@
|
||||
v4.14.1: OpenTracks
|
||||
|
||||
Changes:
|
||||
- Idle detection can be disabled
|
||||
|
||||
Bugfix:
|
||||
- UI for adding pictures to markers was hidden
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
v4.14.2: OpenTracks
|
||||
|
||||
Bugfix:
|
||||
- Android 15: UI is not overflowing anymore (edge-to-edge)
|
||||
@@ -0,0 +1,15 @@
|
||||
v3.0.0: OpenTracks
|
||||
|
||||
Primer lanzamiento de OpenTracks (es decir, una bifurcación de MyTracks)
|
||||
|
||||
Cambios:
|
||||
- Cambio de nombre de MyTracks a OpenTracks
|
||||
- Se agregó un sensor de frecuencia cardíaca Bluetooth LE
|
||||
- Se eliminaron todas las funciones que requieren acceso a Internet.
|
||||
- Se eliminó la integración de Google Maps
|
||||
- Se eliminó el uso de los servicios de Google Play.
|
||||
- Se eliminaron los sensores ANT+
|
||||
- Se eliminaron los sensores clásicos de Bluetooth.
|
||||
- Se eliminó Protobuf
|
||||
- Se eliminaron la estimación de calorías y la estimación de actividad.
|
||||
- Se eliminó la API del servicio MyTracks (es decir, no hay integración con otras aplicaciones)
|
||||
@@ -0,0 +1,7 @@
|
||||
v4.14.1: OpenTracks
|
||||
|
||||
Cambios:
|
||||
- Detección de inactividad se puede desactivar
|
||||
|
||||
Correcciones de errores:
|
||||
- UI para añadir imágenes a los marcadores estaba oculto
|
||||
@@ -0,0 +1,15 @@
|
||||
v3.0.0 : OpenTracks
|
||||
|
||||
Première édition de OpenTracks (c'est-à-dire bifurcation du dépôt depuis MyTracks)
|
||||
|
||||
Changements:
|
||||
- Renommé de MyTracks à OpenTracks
|
||||
- Capteur de fréquence cardiaque par Bluetooth LE ajouté
|
||||
- Toutes les fonctionnalités nécessitant une connexion Internet ont été enlevées
|
||||
- Intégration Google Maps enlevée
|
||||
- Toutes les utilisations des services Google Play ont été enlevées
|
||||
- Capteurs ANT+ enlevés
|
||||
- Capteurs Bluetooth classiques enlevés
|
||||
- Protobuf enlevé
|
||||
- Estimations de calories et d'activité enlevés
|
||||
- API Service MyTracks enlevée (c'est-à-dire, pas d'intégration avec les autres applications)
|
||||
@@ -0,0 +1,17 @@
|
||||
v3.0.1 : OpenTracks
|
||||
|
||||
Changements :
|
||||
− Partage des marqueurs
|
||||
− Restructuration des paramètres
|
||||
− Suppression du bouton retour de la barre d'action
|
||||
− Exportation : suppression de l'option de paramétrage de la taille de photo
|
||||
− Exportation : KML est désormais sélectionnable en tant que format
|
||||
|
||||
Correction de bogues :
|
||||
− Le répertoire d'export est désormais /OpenTracks/
|
||||
− Le mode paysage ne plante plus
|
||||
− Correction de l'export KML/KMZ
|
||||
|
||||
Développeurs :
|
||||
− Les tests sont exécutables (mais beaucoup d'échecs)
|
||||
− Activation de l'intégration continue avec TravisCI (pas de tests)
|
||||
@@ -0,0 +1,14 @@
|
||||
v3.1.0 : OpenTracks
|
||||
|
||||
Changements :
|
||||
− Ajout de l'option pour montrer les traces sur une application de carte (testé avec OsmAnd et Maps.ME)
|
||||
− Ajout des statistiques de la trace sans débloquer l'appareil, durant le tracé
|
||||
− Suppression du mode paysage pour la vue détaillée de la trace (était bogué)
|
||||
− Suppression des suggestions pour l'historique de recherche
|
||||
|
||||
Correction de bogue :
|
||||
− Demande des permissions de stockage pour tout importer / tout exporter
|
||||
|
||||
Développeurs :
|
||||
− Mise à niveau vers Gradle 5.6
|
||||
− Ne pas minifier les compilations release
|
||||
@@ -0,0 +1,16 @@
|
||||
v3.2.0 : OpenTracks
|
||||
|
||||
Changements :
|
||||
− Suppression Widget
|
||||
− Introduction des icons material design
|
||||
− Suppression du snowboard et du ski (besoin de nouveaux icons)
|
||||
|
||||
Correction de bogue :
|
||||
− Correction de la fonctionnalité de recherche
|
||||
|
||||
Développeurs :
|
||||
− Correction de (quelques) cas de test
|
||||
− Suppression de fonctionnalités parcelable
|
||||
− Nettoyage majeur et reformatage
|
||||
− Ne pas utiliser la diffusion pour la communication app widget
|
||||
− stats_content.xml ne contient pas d'autres fichiers
|
||||
@@ -0,0 +1,7 @@
|
||||
v3.2.1 : OpenTracks
|
||||
|
||||
Changements :
|
||||
− Les paramètres sont désormais une page unique
|
||||
|
||||
Développeurs :
|
||||
− Paramètres passé à Androidx compat (utilisation de fragments)
|
||||
@@ -0,0 +1,13 @@
|
||||
v3.2.2 : OpenTracks
|
||||
|
||||
Changements :
|
||||
− Suppression des statistiques agrégées
|
||||
− Migré vers Material Design
|
||||
|
||||
Correction de bogues :
|
||||
− Correction de l'export de données de capteurs
|
||||
− Correction de l'import de données de capteurs incomplètes
|
||||
|
||||
Développeurs :
|
||||
− Remplacement de la barre d'action par une barre d'outil
|
||||
− Migré vers androidx appcompat (incluant Material Design)
|
||||
@@ -0,0 +1,14 @@
|
||||
v3.2.3 : OpenTracks
|
||||
|
||||
Changements :
|
||||
− Partage : utilise Android Sharesheet
|
||||
− Partage : partage de plusieurs tracés en tant que fichier individuel
|
||||
− Utilisation d'Android ShareSheet
|
||||
− Capteur de fréquence cardiaque (Bluetooth LE) : reconnexion automatique
|
||||
|
||||
Correction de bogues :
|
||||
− Capteur de fréquence cardiaque (Bluetooth LE) : déconnecte correctement
|
||||
− La fréquence cardiaque n'était pas toujours montrée lors de l'enregistrement
|
||||
|
||||
Développeurs :
|
||||
− Activation des tests d'instrumentation de TravisCI
|
||||
@@ -0,0 +1,5 @@
|
||||
v3.2.4 : OpenTracks
|
||||
|
||||
Correction de bogue :
|
||||
− Plantage activité paramètres
|
||||
Suppression de la possibilité de change la voix / la fréquence de division depuis le menu contextuel
|
||||
@@ -0,0 +1,15 @@
|
||||
v3.2.5 : OpenTracks
|
||||
|
||||
Changements :
|
||||
− Désactivation du changement d'activité
|
||||
− Ajout des permissions pour Android 10 : enregistrement des données de localisation
|
||||
|
||||
Correction de bogue :
|
||||
− Correction des paramètres de réinitialisation
|
||||
|
||||
Développeurs :
|
||||
− Préférences
|
||||
− Si les paramètres ne peuvent être chargés, remise à zéro de toutes les préférences
|
||||
− Déplacement de l'accès des préférences vers PreferencesUtil
|
||||
− Déplacement paramètres défaut préférences de code à XML
|
||||
− Utilise SummaryProvider
|
||||
@@ -0,0 +1,8 @@
|
||||
v3.2.6 : OpenTracks
|
||||
|
||||
Changements :
|
||||
− Moniteur de fréquence cardiaque : scanne les appareils disponibles
|
||||
− Suppression du raccourci vers les paramètres Bluetooth
|
||||
|
||||
Développeurs :
|
||||
− Préférences : défaut de préférences déplacé de code à XML
|
||||
@@ -0,0 +1,10 @@
|
||||
v3.2.7 : OpenTracks
|
||||
|
||||
Changements :
|
||||
− Notification montre la précision GPS
|
||||
− Montre une notification d'avertissement si la précision GPS descend en dessous du seuil
|
||||
− Montre toujours les graphiques en fonction du temps, ainsi que par la distance
|
||||
− Ajout de l'aide (dans les paramètres)
|
||||
|
||||
Correction de bogue :
|
||||
- TrackDetailActivity : désactivation du mode paysage non fonctionnel (temporaire)
|
||||
@@ -0,0 +1,10 @@
|
||||
v3.2.8 : OpenTracks
|
||||
|
||||
Changements :
|
||||
− Graphique : zoom en effectuant des gestes
|
||||
|
||||
Correction de bogues :
|
||||
− L'export via KMZ n'exportait pas le nom des images correctement
|
||||
− Le partage de plusieurs tracés n'incluait pas les fichiers KMZ
|
||||
− L'IU de MarkerDetailActivity n'était pas montré
|
||||
− Les paramètres plantaient si les préférences pour le rythme cardiaque n'étaient pas initialisées
|
||||
@@ -0,0 +1,10 @@
|
||||
v3.2.9 : OpenTracks
|
||||
|
||||
Changements :
|
||||
− Option pour garder l'écran allumé lors de l'enregistrement
|
||||
− Marqueurs : suppression des marqueurs divisés
|
||||
− L'annonceur vocal fonctionne désormais sans la permission READ_PHONE_STATE
|
||||
|
||||
Correction de bogues :
|
||||
− Statistiques : le rythme cardiaque n'était pas montré
|
||||
− Statistiques : le temps était brièvement remis à 0s
|
||||
@@ -0,0 +1,11 @@
|
||||
v3.2.10 : OpenTracks
|
||||
|
||||
Changements :
|
||||
− ChartView n'est désormais plus configurable
|
||||
− Après redémarrage : suppression du redémarrage automatique d'un enregistrement incomplet
|
||||
|
||||
Correction de bogues :
|
||||
− L'annonceur vocal utilise MAY_DUCK (à nouveau)
|
||||
− ChartView montre les marqueurs (à nouveau)
|
||||
− Correction du paysage de recordingLayout pour TrackListActivity
|
||||
− Demande du comportement de l'API des fichiers obsolètes (nécessaire pour Android 10)
|
||||
@@ -0,0 +1,12 @@
|
||||
v3.2.11 : OpenTracks
|
||||
|
||||
Bogues :
|
||||
− La vitesse maximale est égale à la vitesse moyenne
|
||||
|
||||
Correction de bogue :
|
||||
− Plantage lors de la sélection du capteur de rythme cardiaque
|
||||
|
||||
Développeurs :
|
||||
− Remplacement de TabHost par TabsLayout
|
||||
− Suppression premier point de cheminement spécial
|
||||
− Suppression des traductions dupliquées
|
||||
@@ -0,0 +1,12 @@
|
||||
v3.3.1 : OpenTracks
|
||||
|
||||
Changements :
|
||||
− Android 10 : lors de la désinstallation, permet la conservation des données de l'app
|
||||
− Introduction de l'API du tableau de bord : l'icon de la carte peut être utilisé pour ouvrir le tracé actuel dans une app externe
|
||||
(nécessite l'installation d'une app comme OSMDashboard)
|
||||
|
||||
Correction de bogue :
|
||||
− Le label de l'app était cassé (introduit en v3.3.0)
|
||||
|
||||
Développeurs :
|
||||
− La documentation pour l'API du tableau de bord se situe dans README_DEVELOPER.md
|
||||
@@ -0,0 +1,11 @@
|
||||
v3.3.2 : OpenTracks
|
||||
|
||||
Changements :
|
||||
− Export : écrase désormais les fichiers
|
||||
|
||||
Correction de bogue :
|
||||
− Supprime toujours la notification d'enregistrement
|
||||
|
||||
Développeurs :
|
||||
− Sur l'API 26+, java.time est utilisé pour analyser et écrire les dates
|
||||
− Réusinage de TrackRecordingService
|
||||
@@ -0,0 +1,12 @@
|
||||
v3.4.0 : OpenTracks
|
||||
|
||||
Changements :
|
||||
− API tableau de bord : plusieurs tracés
|
||||
− Mise à jour de l'aide
|
||||
|
||||
Correction de bogues :
|
||||
− Correction du plantage lors de la recréation de fragment
|
||||
− Lors d'une pause : empêche l'app de s'arrêter
|
||||
|
||||
Développeurs :
|
||||
− Activation de tests via CI (Github Actions et TravisCI)
|
||||
@@ -0,0 +1,14 @@
|
||||
v3.5.0 : OpenTracks
|
||||
|
||||
Changements :
|
||||
− Marqueur : sélection d'une image depuis la galerie
|
||||
− Marqueur : partager une image
|
||||
− Utilisation du nom de la trace lors du partage
|
||||
− Suppression de l’élévation min et max (était imprécise)
|
||||
|
||||
Correction de bogue :
|
||||
− Les graphiques utilisent les unités et quantités préférées
|
||||
|
||||
Développeurs :
|
||||
− Base de données : suppression des colonnes inutilisées
|
||||
− Base de données : Ajout d'index
|
||||
@@ -0,0 +1,10 @@
|
||||
v3.6.0 : OpenTracks
|
||||
|
||||
Changements :
|
||||
− Les traces arrêtées peuvent être reprises
|
||||
|
||||
Correction de bogue :
|
||||
− L'import de KMZ ne traitait pas les URL de photos correctement
|
||||
|
||||
Développeurs :
|
||||
− Simplification du traitement des données
|
||||
@@ -0,0 +1,7 @@
|
||||
v4.14.0 : OpenTracks
|
||||
|
||||
Changements :
|
||||
− Utilisation des données EGM2008 d'Androidx (au lieu d'empaqueter notre propre solution).
|
||||
|
||||
Développeurs :
|
||||
− Cible Android15/ SDK35
|
||||
@@ -0,0 +1,10 @@
|
||||
(versionName) : OpenTracks
|
||||
|
||||
Changements :
|
||||
−
|
||||
|
||||
Correction de bogue(s) :
|
||||
−
|
||||
|
||||
Développeurs :
|
||||
−
|
||||
@@ -0,0 +1,15 @@
|
||||
v4.13.0: OpenTracks
|
||||
|
||||
Athruithe:
|
||||
- Is féidir marcóirí a chruthú trí API Poiblí
|
||||
Ligeann sé seo a chruthú Marcóirí ag aon suíomh agus tar éis taifeadadh.
|
||||
Míbhuntáiste: Ní thaispeántar marcóirí sna léaráidí a thuilleadh.
|
||||
TABHAIR FAOI DEARA: Tacaíonn OSMDashboard leis an API seo tar éis leagan: v4.1.0
|
||||
|
||||
Ceartúchán Bug:
|
||||
- Ba cheart go mbeadh socrú gníomhaíochta réamhshocraithe ina anuas
|
||||
- Ar ais saighead nach bhfuil ag obair i socruithe
|
||||
- Léiríonn an lipéad le haghaidh siúil as cosán anois "siúlóid as cosán"
|
||||
|
||||
Forbróir:
|
||||
- Úsáid Post in ionad Suíomh Android
|
||||
@@ -0,0 +1,9 @@
|
||||
v4.13.1: OpenTracks
|
||||
|
||||
Athruithe:
|
||||
- Úsáideann féilire staitisticí comhiomlánaithe roghanna réigiúnacha (Android 14+)
|
||||
|
||||
Ceartúchán Bug:
|
||||
- KML 2.3: bain úsáid as ainm réimse caighdeánaithe le haghaidh ráta croí
|
||||
- Liosta rianta: níor nuashonraíodh stádas taifeadta i gceart
|
||||
- Ceartúcháin Chomhéadain a bhaineann le hábhar3
|
||||
@@ -0,0 +1,7 @@
|
||||
v4.14.0: OpenTracks
|
||||
|
||||
Athruithe:
|
||||
- Úsáid sonraí Androidx EGM2008 (in ionad ár réiteach saincheaptha a chuachadh).
|
||||
|
||||
Forbróir:
|
||||
- Dírigh ar Android15/ SDK35
|
||||
@@ -0,0 +1,7 @@
|
||||
v4.14.1: OpenTracks
|
||||
|
||||
Athruithe:
|
||||
- Is féidir brath díomhaoin a dhíchumasú
|
||||
|
||||
Ceartúchán Bug:
|
||||
- Bhí Chomhéadain chun pictiúir a chur le marcóirí i bhfolach
|
||||
@@ -0,0 +1,8 @@
|
||||
v4.12.4: OpenTracks
|
||||
|
||||
Cambios:
|
||||
- Anuncios: pódense omitir as unidades de medida
|
||||
- Anuncios: engadida a potencia durante a volta no ciclismo
|
||||
|
||||
Arranxo:
|
||||
- fallo ao eliminar marcadores na lista
|
||||
@@ -0,0 +1,8 @@
|
||||
v4.12.5: OpenTracks
|
||||
|
||||
Arranxos:
|
||||
- detección correcta do movemento.
|
||||
Estragouse na v4.9.0 ao engdir detección da pausa. Mira #1756.
|
||||
|
||||
Cambios:
|
||||
- Soporte para Retroceso Predictivo
|
||||
@@ -0,0 +1,9 @@
|
||||
v4.13.1: OpenTracks
|
||||
|
||||
Cambios:
|
||||
- O calendario con estatísticas acumuladas segue os axustes rexionais (Android 14+)
|
||||
|
||||
Arranxos:
|
||||
- KML 2.3: usa o nome de campo estándar para frecuencia cardíaca
|
||||
- Lista de rutas: non se actualizaba correctamente o estado da gravación
|
||||
- Arranxos na IU relacionados con Material3
|
||||
@@ -1,11 +1,14 @@
|
||||
OpenTracks er en app for opptak av sportsaktivitet som respekterer ditt personvern.
|
||||
OpenTracks er en app for opptak av sportsaktivitet som respekterer personvernet ditt.
|
||||
|
||||
Funksjoner:
|
||||
* Sportsporing: Registrer dine sports- og utendørsaktiviteter
|
||||
* Bilder og markører: Marker interessante steder under sporing
|
||||
* Registrer dine sports- og utendørsaktiviteter
|
||||
* Bilder og markører: Marker interessante steder underveis
|
||||
* Total stigning og nedstigning: via barometersensor
|
||||
* Høyde vist i EGM2008 (over havnivå); eksportert som WGS84
|
||||
* Talemeldinger
|
||||
* Støtter Blåtann LE-sensorer: puls, hastighet og distanse (sykling), kadens (sykling) og wattmåler (sykling)
|
||||
* Eksport av data: Enten som KMZ (inkl. bilder), KML eller GPX
|
||||
* Ingen internettilgang: Internett brukes ikke
|
||||
* Mørkt og lyst tema, respekterer systeminnstillingene
|
||||
|
||||
En åpen kildekode-app uten reklame.
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
v4.13.1: OpenTracks
|
||||
|
||||
Veranderingen:
|
||||
- Geaggregeerde statistieken calender 'gebruikt regionale voorkeuren (Android 14 +)
|
||||
|
||||
Bugfix:
|
||||
- KML 2.3: gebruik gestandaardiseerde veldnaam voor hartslag
|
||||
- Tracklijst: opnamestatus is niet correct bijgewerkt
|
||||
- Material3 gerelateerde UI-fixes
|
||||
@@ -0,0 +1,7 @@
|
||||
v4.14.0: OpenTracks
|
||||
|
||||
Veranderingen:
|
||||
- Gebruik de EGM2008-gegevens van Androidx (in plaats van onze aangepaste oplossing te bundelen).
|
||||
|
||||
Ontwikkelaar:
|
||||
- Target Android15 / SDK35
|
||||
@@ -0,0 +1,7 @@
|
||||
v4.14.1: OpenTracks
|
||||
|
||||
Veranderingen:
|
||||
- Detectie van inactiviteit kan worden uitgeschakeld
|
||||
|
||||
Opgeloste probleemoplossing:
|
||||
- Gebruikersinterface voor het toevoegen van afbeeldingen aan markeringen is verborgen
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
|
||||
+148
@@ -0,0 +1,148 @@
|
||||
package de.dennisguse.opentracks.services.handlers;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.JUnit4;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.time.Instant;
|
||||
|
||||
import de.dennisguse.opentracks.data.models.TrackPoint;
|
||||
|
||||
/**
|
||||
* Expectation is EGM2008 from <a href="https://geographiclib.sourceforge.io/">GeographicLib</a>] EGM2008 5minute undulation data.
|
||||
*/
|
||||
@RunWith(JUnit4.class)
|
||||
public class AltitudeCorrectionManagerTest {
|
||||
|
||||
private static final double MAX_ERROR = 0.4;
|
||||
|
||||
private final Context context = ApplicationProvider.getApplicationContext();
|
||||
|
||||
@Test
|
||||
public void data_Northpole() {
|
||||
// given
|
||||
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
|
||||
trackPoint.setLatitude(90);
|
||||
trackPoint.setLongitude(0.1);
|
||||
trackPoint.setAltitude(0);
|
||||
|
||||
// when
|
||||
new AltitudeCorrectionManager().correctAltitude(context, trackPoint);
|
||||
|
||||
// then
|
||||
assertEquals(-14.8980, trackPoint.getAltitude().toM(), 2 * MAX_ERROR); //TODO For some reason, the Northpole is more off.
|
||||
}
|
||||
|
||||
@Test
|
||||
public void data_Southpole() {
|
||||
// given
|
||||
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
|
||||
trackPoint.setLatitude(-90);
|
||||
trackPoint.setLongitude(0);
|
||||
trackPoint.setAltitude(0);
|
||||
|
||||
// when
|
||||
new AltitudeCorrectionManager().correctAltitude(context, trackPoint);
|
||||
|
||||
// then
|
||||
assertEquals(30.15, trackPoint.getAltitude().toM(), MAX_ERROR);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void data_Southpole2() {
|
||||
// given
|
||||
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
|
||||
trackPoint.setLatitude(-90);
|
||||
trackPoint.setLongitude(180);
|
||||
trackPoint.setAltitude(0);
|
||||
|
||||
// when
|
||||
new AltitudeCorrectionManager().correctAltitude(context, trackPoint);
|
||||
|
||||
// then
|
||||
assertEquals(30.15, trackPoint.getAltitude().toM(), MAX_ERROR);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void data_Southpole3() {
|
||||
// given
|
||||
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
|
||||
trackPoint.setLatitude(-90);
|
||||
trackPoint.setLongitude(-180);
|
||||
trackPoint.setAltitude(0);
|
||||
|
||||
// when
|
||||
new AltitudeCorrectionManager().correctAltitude(context, trackPoint);
|
||||
|
||||
// then
|
||||
assertEquals(30.15, trackPoint.getAltitude().toM(), MAX_ERROR);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void data_0() throws IOException {
|
||||
// given
|
||||
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
|
||||
trackPoint.setLatitude(0);
|
||||
trackPoint.setLongitude(0);
|
||||
trackPoint.setAltitude(0);
|
||||
|
||||
// when
|
||||
new AltitudeCorrectionManager().correctAltitude(context, trackPoint);
|
||||
|
||||
// then
|
||||
assertEquals(-17.2260, trackPoint.getAltitude().toM(), MAX_ERROR);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void data_Berlin_Germany_() {
|
||||
// given
|
||||
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
|
||||
trackPoint.setLatitude(52.530644);
|
||||
trackPoint.setLongitude(13.383068);
|
||||
trackPoint.setAltitude(0);
|
||||
|
||||
// when
|
||||
new AltitudeCorrectionManager().correctAltitude(context, trackPoint);
|
||||
|
||||
// then
|
||||
assertEquals(-39.4865, trackPoint.getAltitude().toM(), MAX_ERROR);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void data_Seattle_USA() {
|
||||
// given
|
||||
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
|
||||
|
||||
trackPoint.setLatitude(47.63153);
|
||||
trackPoint.setLongitude(-122.30938);
|
||||
trackPoint.setAltitude(0);
|
||||
|
||||
// when
|
||||
new AltitudeCorrectionManager().correctAltitude(context, trackPoint);
|
||||
|
||||
// then
|
||||
assertEquals(22.99, trackPoint.getAltitude().toM(), MAX_ERROR);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void data_MaxUndulation() throws IOException {
|
||||
// given
|
||||
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
|
||||
trackPoint.setLatitude(-8.417);
|
||||
trackPoint.setLongitude(147.367);
|
||||
trackPoint.setAltitude(0);
|
||||
|
||||
// when
|
||||
new AltitudeCorrectionManager().correctAltitude(context, trackPoint);
|
||||
|
||||
// then
|
||||
assertEquals(-85.824, trackPoint.getAltitude().toM(), MAX_ERROR);
|
||||
}
|
||||
}
|
||||
@@ -1,247 +0,0 @@
|
||||
package de.dennisguse.opentracks.util;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotEquals;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.JUnit4;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.EOFException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.time.Instant;
|
||||
|
||||
import de.dennisguse.opentracks.data.models.TrackPoint;
|
||||
|
||||
@RunWith(JUnit4.class)
|
||||
public class EGM2008UtilsTest {
|
||||
|
||||
private static final double MAX_BILINEAR_ERROR = 0.478;
|
||||
|
||||
private final Context context = ApplicationProvider.getApplicationContext();
|
||||
|
||||
@Test
|
||||
public void fileVerification() throws IOException {
|
||||
// given
|
||||
int expectedLength = 18671444;
|
||||
int expectedHeaderLength = 404;
|
||||
|
||||
String expectedHeader = """
|
||||
P5
|
||||
# Geoid file in PGM format for the GeographicLib::Geoid class
|
||||
# Description WGS84 EGM2008, 5-minute grid
|
||||
# URL http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm2008
|
||||
# DateTime 2009-08-29 18:45:00
|
||||
# MaxBilinearError 0.478
|
||||
# RMSBilinearError 0.012
|
||||
# MaxCubicError 0.294
|
||||
# RMSCubicError 0.005
|
||||
# Offset -108
|
||||
# Scale 0.003
|
||||
# Origin 90N 0E
|
||||
# AREA_OR_POINT Point
|
||||
# Vertical_Datum WGS84
|
||||
4320 2161
|
||||
65535
|
||||
""";
|
||||
|
||||
// when
|
||||
try (InputStream inputStream = context.getResources().openRawResource(EGM2008Utils.EGM2008_5_DATA)) {
|
||||
assertEquals(expectedLength, inputStream.available());
|
||||
|
||||
InputStreamReader reader = new InputStreamReader(inputStream, StandardCharsets.US_ASCII);
|
||||
char[] data = new char[expectedHeaderLength];
|
||||
int length = reader.read(data);
|
||||
|
||||
// then
|
||||
assertEquals(expectedHeaderLength, length);
|
||||
assertEquals(expectedHeader, new String(data));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void data_Northpole() throws IOException {
|
||||
// given
|
||||
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
|
||||
trackPoint.setLatitude(90);
|
||||
trackPoint.setLongitude(0.1);
|
||||
trackPoint.setAltitude(0);
|
||||
|
||||
// when
|
||||
EGM2008Utils.EGM2008Correction altitude_egm2008 = EGM2008Utils.createCorrection(context, trackPoint.getLocation());
|
||||
|
||||
// then
|
||||
assertEquals(-14.8980, altitude_egm2008.correctAltitude(trackPoint.getLocation()).toM(), MAX_BILINEAR_ERROR);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void data_Southpole() throws IOException {
|
||||
// given
|
||||
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
|
||||
trackPoint.setLatitude(-90);
|
||||
trackPoint.setLongitude(0);
|
||||
trackPoint.setAltitude(0);
|
||||
|
||||
// when
|
||||
EGM2008Utils.EGM2008Correction altitude_egm2008 = EGM2008Utils.createCorrection(context, trackPoint.getLocation());
|
||||
|
||||
// then
|
||||
assertEquals(30.15, altitude_egm2008.correctAltitude(trackPoint.getLocation()).toM(), MAX_BILINEAR_ERROR);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void data_Southpole2() throws IOException {
|
||||
// given
|
||||
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
|
||||
trackPoint.setLatitude(-90);
|
||||
trackPoint.setLongitude(180);
|
||||
trackPoint.setAltitude(0);
|
||||
|
||||
// when
|
||||
EGM2008Utils.EGM2008Correction altitude_egm2008 = EGM2008Utils.createCorrection(context, trackPoint.getLocation());
|
||||
|
||||
// then
|
||||
assertEquals(30.15, altitude_egm2008.correctAltitude(trackPoint.getLocation()).toM(), MAX_BILINEAR_ERROR);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void data_Southpole3() throws IOException {
|
||||
// given
|
||||
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
|
||||
trackPoint.setLatitude(-90);
|
||||
trackPoint.setLongitude(-180);
|
||||
trackPoint.setAltitude(0);
|
||||
|
||||
// when
|
||||
EGM2008Utils.EGM2008Correction altitude_egm2008 = EGM2008Utils.createCorrection(context, trackPoint.getLocation());
|
||||
|
||||
// then
|
||||
assertEquals(30.15, altitude_egm2008.correctAltitude(trackPoint.getLocation()).toM(), MAX_BILINEAR_ERROR);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void data_0() throws IOException {
|
||||
// given
|
||||
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
|
||||
trackPoint.setLatitude(0);
|
||||
trackPoint.setLongitude(0);
|
||||
trackPoint.setAltitude(0);
|
||||
|
||||
// when
|
||||
EGM2008Utils.EGM2008Correction altitude_egm2008 = EGM2008Utils.createCorrection(context, trackPoint.getLocation());
|
||||
|
||||
// then
|
||||
assertEquals(-17.2260, altitude_egm2008.correctAltitude(trackPoint.getLocation()).toM(), MAX_BILINEAR_ERROR);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void data_Berlin_Germany_() throws IOException {
|
||||
// given
|
||||
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
|
||||
trackPoint.setLatitude(52.530644);
|
||||
trackPoint.setLongitude(13.383068);
|
||||
trackPoint.setAltitude(0);
|
||||
|
||||
// when
|
||||
EGM2008Utils.EGM2008Correction altitude_egm2008 = EGM2008Utils.createCorrection(context, trackPoint.getLocation());
|
||||
|
||||
// then
|
||||
assertEquals(-39.4865, altitude_egm2008.correctAltitude(trackPoint.getLocation()).toM(), MAX_BILINEAR_ERROR);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void data_Berlin_Germany_Caching() throws IOException {
|
||||
// given
|
||||
TrackPoint trackPoint1 = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
|
||||
trackPoint1.setLatitude(52.530644);
|
||||
trackPoint1.setLongitude(13.383068);
|
||||
trackPoint1.setAltitude(0);
|
||||
|
||||
TrackPoint trackPoint2 = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
|
||||
trackPoint2.setLatitude(52.530000);
|
||||
trackPoint2.setLongitude(13.380000);
|
||||
trackPoint2.setAltitude(0);
|
||||
|
||||
// when
|
||||
EGM2008Utils.EGM2008Correction altitude_egm2008 = EGM2008Utils.createCorrection(context, trackPoint1.getLocation());
|
||||
|
||||
// then
|
||||
assertNotEquals(altitude_egm2008.correctAltitude(trackPoint1.getLocation()).toM(), altitude_egm2008.correctAltitude(trackPoint2.getLocation()).toM(), 0.0001);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void data_Seattle_USA() throws IOException {
|
||||
// given
|
||||
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
|
||||
|
||||
trackPoint.setLatitude(47.63153);
|
||||
trackPoint.setLongitude(-122.30938);
|
||||
trackPoint.setAltitude(0);
|
||||
|
||||
// when
|
||||
EGM2008Utils.EGM2008Correction altitude_egm2008 = EGM2008Utils.createCorrection(context, trackPoint.getLocation());
|
||||
|
||||
// then
|
||||
assertEquals(22.99, altitude_egm2008.correctAltitude(trackPoint.getLocation()).toM(), MAX_BILINEAR_ERROR);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void data_MaxUndulation() throws IOException {
|
||||
// given
|
||||
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
|
||||
trackPoint.setLatitude(-8.417);
|
||||
trackPoint.setLongitude(147.367);
|
||||
trackPoint.setAltitude(0);
|
||||
|
||||
// when
|
||||
EGM2008Utils.EGM2008Correction altitude_egm2008 = EGM2008Utils.createCorrection(context, trackPoint.getLocation());
|
||||
|
||||
// then
|
||||
assertEquals(-85.824, altitude_egm2008.correctAltitude(trackPoint.getLocation()).toM(), MAX_BILINEAR_ERROR);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void getIndices() {
|
||||
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
|
||||
trackPoint.setLatitude(90);
|
||||
trackPoint.setLongitude(0);
|
||||
assertEquals(new EGM2008Utils.Indices(0, 0), EGM2008Utils.getIndices(trackPoint.getLocation()));
|
||||
|
||||
trackPoint.setLatitude(0);
|
||||
trackPoint.setLongitude(0);
|
||||
assertEquals(new EGM2008Utils.Indices(1080, 0), EGM2008Utils.getIndices(trackPoint.getLocation()));
|
||||
|
||||
trackPoint.setLatitude(-90);
|
||||
trackPoint.setLongitude(180);
|
||||
assertEquals(new EGM2008Utils.Indices(2160, 4320 / 2), EGM2008Utils.getIndices(trackPoint.getLocation()));
|
||||
|
||||
trackPoint.setLatitude(-90);
|
||||
trackPoint.setLongitude(-180);
|
||||
assertEquals(new EGM2008Utils.Indices(2160, 2160), EGM2008Utils.getIndices(trackPoint.getLocation()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getUndulationRaw_ok() throws IOException {
|
||||
try (DataInputStream dataInputStream = new DataInputStream(context.getResources().openRawResource(EGM2008Utils.EGM2008_5_DATA))) {
|
||||
assertEquals(40966, EGM2008Utils.getUndulationRaw(dataInputStream, new EGM2008Utils.Indices(0, 0)));
|
||||
assertEquals(41742, EGM2008Utils.getUndulationRaw(dataInputStream, new EGM2008Utils.Indices(1081, 0)));
|
||||
assertEquals(25950, EGM2008Utils.getUndulationRaw(dataInputStream, new EGM2008Utils.Indices(2160, 4319)));
|
||||
}
|
||||
}
|
||||
|
||||
@Test(expected = EOFException.class)
|
||||
public void getUndulationRaw_error() throws IOException {
|
||||
try (DataInputStream dataInputStream = new DataInputStream(context.getResources().openRawResource(EGM2008Utils.EGM2008_5_DATA))) {
|
||||
assertEquals(0, EGM2008Utils.getUndulationRaw(dataInputStream, new EGM2008Utils.Indices(2161, 4320)), 0.01);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -33,6 +33,7 @@ import java.util.Optional;
|
||||
* Time is created using the {@link de.dennisguse.opentracks.services.handlers.MonotonicClock}, because system time jump backwards.
|
||||
* GPS time is ignored as for non-GPS events, we could not create timestamps.
|
||||
*/
|
||||
//TODO Should be a record (with final properties)
|
||||
public class TrackPoint {
|
||||
|
||||
private static final Duration MAX_LOCATION_AGE = Duration.ofMinutes(1);
|
||||
|
||||
@@ -170,8 +170,7 @@ public class TrackRecordingManager implements SharedPreferences.OnSharedPreferen
|
||||
if (trackPoint.hasLocation() && lastStoredTrackPointWithLocation == null) {
|
||||
insertTrackPoint(trackPoint, true);
|
||||
|
||||
handler.removeCallbacks(ON_IDLE);
|
||||
handler.postDelayed(ON_IDLE, idleDuration.toMillis());
|
||||
scheduleNewIdleTimeout();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -199,16 +198,14 @@ public class TrackRecordingManager implements SharedPreferences.OnSharedPreferen
|
||||
trackPoint.setType(TrackPoint.Type.SEGMENT_START_AUTOMATIC);
|
||||
insertTrackPoint(trackPoint, true);
|
||||
|
||||
handler.removeCallbacks(ON_IDLE);
|
||||
handler.postDelayed(ON_IDLE, idleDuration.toMillis());
|
||||
scheduleNewIdleTimeout();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (distanceToLastStoredTrackPoint.greaterOrEqualThan(recordingDistanceInterval)) {
|
||||
insertTrackPoint(trackPoint, false);
|
||||
|
||||
handler.removeCallbacks(ON_IDLE);
|
||||
handler.postDelayed(ON_IDLE, idleDuration.toMillis());
|
||||
scheduleNewIdleTimeout();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -218,6 +215,15 @@ public class TrackRecordingManager implements SharedPreferences.OnSharedPreferen
|
||||
return false;
|
||||
}
|
||||
|
||||
private void scheduleNewIdleTimeout() {
|
||||
if (idleDuration.isZero()) {
|
||||
Log.d(TAG, "idle functionality is disabled");
|
||||
return;
|
||||
}
|
||||
handler.removeCallbacks(ON_IDLE);
|
||||
handler.postDelayed(ON_IDLE, idleDuration.toMillis());
|
||||
}
|
||||
|
||||
TrackStatistics getTrackStatistics() {
|
||||
return trackStatisticsUpdater == null ? null : trackStatisticsUpdater.getTrackStatistics();
|
||||
}
|
||||
|
||||
+16
-40
@@ -2,15 +2,15 @@ package de.dennisguse.opentracks.services.handlers;
|
||||
|
||||
import android.content.Context;
|
||||
import android.location.Location;
|
||||
import android.location.altitude.AltitudeConverter;
|
||||
import android.os.Build;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.core.location.LocationCompat;
|
||||
import androidx.core.location.altitude.AltitudeConverterCompat;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import de.dennisguse.opentracks.data.models.Altitude;
|
||||
import de.dennisguse.opentracks.data.models.TrackPoint;
|
||||
import de.dennisguse.opentracks.util.EGM2008Utils;
|
||||
|
||||
/**
|
||||
* More infos regarding Android 34's <a href="https://issuetracker.google.com/issues/195660815#comment1">AltitudeConverter</a>.
|
||||
@@ -19,52 +19,28 @@ public class AltitudeCorrectionManager {
|
||||
|
||||
private static final String TAG = AltitudeCorrectionManager.class.getSimpleName();
|
||||
|
||||
private AltitudeConverter altitudeConverter;
|
||||
|
||||
private final EGM2008Internal altitudeConverterFallback;
|
||||
|
||||
public AltitudeCorrectionManager() {
|
||||
this.altitudeConverterFallback = new EGM2008Internal();
|
||||
this.altitudeConverter = Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE ? new AltitudeConverter() : null;
|
||||
}
|
||||
|
||||
public void correctAltitude(Context context, TrackPoint trackPoint) {
|
||||
if (!trackPoint.hasLocation() || !trackPoint.hasAltitude()) {
|
||||
return;
|
||||
}
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE && altitudeConverter != null) {
|
||||
|
||||
// TODO The following is doing IO and should not be done in main thread.
|
||||
// AltitudeConverterCompat uses internally a RoomDatabase that cannot be access from main thread and thus fails on version <= 34.
|
||||
Thread t = new Thread(() -> {
|
||||
try {
|
||||
Location loc = trackPoint.getLocation();
|
||||
altitudeConverter.addMslAltitudeToLocation(context, loc);
|
||||
trackPoint.setAltitude(Altitude.EGM2008.of(loc.getMslAltitudeMeters()));
|
||||
return;
|
||||
AltitudeConverterCompat.addMslAltitudeToLocation(context, loc);
|
||||
trackPoint.setAltitude(Altitude.EGM2008.of(LocationCompat.getMslAltitudeMeters(loc)));
|
||||
} catch (IOException e) {
|
||||
Log.w(TAG, "Android's AltitudeConverter crashed; falling back to internal.");
|
||||
altitudeConverter = null;
|
||||
// Should we fallback
|
||||
Log.w(TAG, "Android's AltitudeConverterCompat failed with " + e.getMessage());
|
||||
}
|
||||
}
|
||||
});
|
||||
t.start();
|
||||
|
||||
altitudeConverterFallback.correctAltitude(context, trackPoint);
|
||||
}
|
||||
|
||||
private static class EGM2008Internal {
|
||||
|
||||
private static final String TAG = EGM2008Internal.class.getSimpleName();
|
||||
|
||||
private EGM2008Utils.EGM2008Correction egm2008Correction;
|
||||
|
||||
public void correctAltitude(Context context, TrackPoint trackPoint) {
|
||||
if (egm2008Correction == null || !egm2008Correction.canCorrect(trackPoint.getLocation())) {
|
||||
try {
|
||||
egm2008Correction = EGM2008Utils.createCorrection(context, trackPoint.getLocation());
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, "Could not load altitude correction for " + trackPoint, e);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
trackPoint.setAltitude(egm2008Correction.correctAltitude(trackPoint.getLocation()));
|
||||
try {
|
||||
t.join(); // wait for thread to finish
|
||||
} catch (InterruptedException e) {
|
||||
Log.w(TAG, "Android's AltitudeConverterCompat failed with " + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -344,17 +344,17 @@ public class PreferencesUtils {
|
||||
}
|
||||
|
||||
static String[] getVoiceAnnouncementFrequencyEntries() {
|
||||
String[] values = resources.getStringArray(R.array.voice_announcement_frequency_values);
|
||||
String[] options = new String[values.length];
|
||||
for (int i = 0; i < values.length; i++) {
|
||||
if (resources.getString(R.string.announcement_off).equals(values[i])) {
|
||||
options[i] = resources.getString(R.string.value_off);
|
||||
String[] entryValues = resources.getStringArray(R.array.voice_announcement_frequency_values);
|
||||
String[] entries = new String[entryValues.length];
|
||||
for (int i = 0; i < entryValues.length; i++) {
|
||||
if (resources.getString(R.string.announcement_off).equals(entryValues[i])) {
|
||||
entries[i] = resources.getString(R.string.value_off);
|
||||
} else {
|
||||
int value = Integer.parseInt(values[i]);
|
||||
options[i] = resources.getString(R.string.value_integer_minute, Duration.ofSeconds(value).toMinutes());
|
||||
int value = Integer.parseInt(entryValues[i]);
|
||||
entries[i] = resources.getString(R.string.value_integer_minute, Duration.ofSeconds(value).toMinutes());
|
||||
}
|
||||
}
|
||||
return options;
|
||||
return entries;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -370,23 +370,23 @@ public class PreferencesUtils {
|
||||
* @return Result depends on getUnitSystem
|
||||
*/
|
||||
static String[] getVoiceAnnouncementDistanceEntries() {
|
||||
String[] values = resources.getStringArray(R.array.voice_announcement_distance_values);
|
||||
String[] options = new String[values.length];
|
||||
String[] entryValues = resources.getStringArray(R.array.voice_announcement_distance_values);
|
||||
String[] entries = new String[entryValues.length];
|
||||
UnitSystem unitSystem = getUnitSystem();
|
||||
|
||||
DistanceFormatter formatter = DistanceFormatter.Builder()
|
||||
.setDecimalCount(0)
|
||||
.setUnit(unitSystem)
|
||||
.build(resources);
|
||||
for (int i = 0; i < values.length; i++) {
|
||||
if (resources.getString(R.string.announcement_off).equals(values[i])) {
|
||||
options[i] = resources.getString(R.string.value_off);
|
||||
for (int i = 0; i < entryValues.length; i++) {
|
||||
if (resources.getString(R.string.announcement_off).equals(entryValues[i])) {
|
||||
entries[i] = resources.getString(R.string.value_off);
|
||||
} else {
|
||||
Distance distance = Distance.one(unitSystem).multipliedBy(Double.parseDouble(values[i]));
|
||||
options[i] = formatter.formatDistance(distance);
|
||||
Distance distance = Distance.one(unitSystem).multipliedBy(Double.parseDouble(entryValues[i]));
|
||||
entries[i] = formatter.formatDistance(distance);
|
||||
}
|
||||
}
|
||||
return options;
|
||||
return entries;
|
||||
}
|
||||
|
||||
public static float getVoiceSpeedRate() {
|
||||
@@ -642,7 +642,9 @@ public class PreferencesUtils {
|
||||
for (int i = 0; i < entryValues.length; i++) {
|
||||
int value = Integer.parseInt(entryValues[i]);
|
||||
|
||||
if (value == idleDurationDefault) {
|
||||
if (resources.getString(R.string.announcement_off).equals(entryValues[i])) {
|
||||
entries[i] = resources.getString(R.string.value_off);
|
||||
} else if (value == idleDurationDefault) {
|
||||
entries[i] = resources.getString(R.string.value_int_seconds, value);
|
||||
} else {
|
||||
entries[i] = value < 60 ? resources.getString(R.string.value_integer_second, value) : resources.getString(R.string.value_integer_minute, value / 60);
|
||||
|
||||
@@ -164,6 +164,8 @@ public class MarkerEditActivity extends AbstractActivity {
|
||||
} else {
|
||||
loadMarkerData(markerId);
|
||||
}
|
||||
|
||||
setSupportActionBar(viewBinding.bottomAppBarLayout.bottomAppBar);
|
||||
}
|
||||
|
||||
private LiveData<Marker> createNewMarker() {
|
||||
|
||||
@@ -1,156 +0,0 @@
|
||||
package de.dennisguse.opentracks.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.location.Location;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
import de.dennisguse.opentracks.R;
|
||||
import de.dennisguse.opentracks.data.models.Altitude;
|
||||
|
||||
/**
|
||||
* Converts WGS84 altitude to EGM2008 (should be close to height above sea level).
|
||||
* <p>
|
||||
* Uses <a href="https://geographiclib.sourceforge.io/">GeographicLib</a>] EGM2008 5minute undulation data.
|
||||
* <a href="https://geographiclib.sourceforge.io/html/geoid.html">...</a>
|
||||
* <p>
|
||||
* File starts at 90N, 0E (North pole) and is encoded in parallel bands as unsigned shorts.
|
||||
*/
|
||||
public class EGM2008Utils {
|
||||
|
||||
static final int EGM2008_5_DATA = R.raw.egm2008_5;
|
||||
|
||||
private static final int HEADER_LENGTH = 404;
|
||||
|
||||
private static final int RESOLUTION_IN_MINUTES = 60 / 5;
|
||||
|
||||
private static final int LATITUDE_CORRECTION = 360 * RESOLUTION_IN_MINUTES;
|
||||
|
||||
private EGM2008Utils() {
|
||||
}
|
||||
|
||||
public static EGM2008Correction createCorrection(Context context, Location location) throws IOException {
|
||||
Indices indices = getIndices(location);
|
||||
|
||||
try (DataInputStream dataInputStream = new DataInputStream(context.getResources().openRawResource(EGM2008_5_DATA))) {
|
||||
return new EGM2008Correction(indices, dataInputStream);
|
||||
}
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
static int getUndulationRaw(DataInputStream dataInputStream, Indices indices) throws IOException {
|
||||
dataInputStream.reset();
|
||||
int absoluteIndex = indices.getAbsoluteIndex();
|
||||
return getUndulationRaw(dataInputStream, absoluteIndex);
|
||||
}
|
||||
|
||||
private static int getUndulationRaw(DataInputStream dataInputStream, int undulationIndex) throws IOException {
|
||||
dataInputStream.reset();
|
||||
int index = HEADER_LENGTH + undulationIndex * 2; //byte size is 2
|
||||
long ignored = dataInputStream.skip(index);
|
||||
|
||||
return dataInputStream.readUnsignedShort();
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
static Indices getIndices(Location location) {
|
||||
double latitude = -location.getLatitude() + 90;
|
||||
int latitudeIndex = (int) (latitude * RESOLUTION_IN_MINUTES);
|
||||
|
||||
double longitude;
|
||||
if (location.getLongitude() >= 0) {
|
||||
longitude = location.getLongitude();
|
||||
} else {
|
||||
longitude = 360 + location.getLongitude();
|
||||
}
|
||||
int longitudeIndex = (int) (longitude * RESOLUTION_IN_MINUTES);
|
||||
|
||||
if (longitudeIndex >= 360 * RESOLUTION_IN_MINUTES) {
|
||||
longitudeIndex = 0;
|
||||
}
|
||||
return new Indices(latitudeIndex, longitudeIndex);
|
||||
}
|
||||
|
||||
public static class EGM2008Correction {
|
||||
|
||||
protected final Indices indices;
|
||||
|
||||
protected final int v00;
|
||||
protected final int v10;
|
||||
protected final int v01;
|
||||
protected final int v11;
|
||||
|
||||
private EGM2008Correction(Indices indices, DataInputStream dataInputStream) throws IOException {
|
||||
this.indices = indices;
|
||||
|
||||
v00 = getUndulationRaw(dataInputStream, indices);
|
||||
if (!isSouthPole()) {
|
||||
v10 = getUndulationRaw(dataInputStream, indices.offset(0, 1));
|
||||
v01 = getUndulationRaw(dataInputStream, indices.offset(1, 0));
|
||||
v11 = getUndulationRaw(dataInputStream, indices.offset(1, 1));
|
||||
} else {
|
||||
v10 = 0;
|
||||
v01 = 0;
|
||||
v11 = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean canCorrect(@NonNull Location location) {
|
||||
return indices.getAbsoluteIndex() == getIndices(location).getAbsoluteIndex();
|
||||
}
|
||||
|
||||
public Altitude.EGM2008 correctAltitude(@NonNull Location location) {
|
||||
if (!canCorrect(location))
|
||||
throw new RuntimeException("Undulation data not loaded for this location.");
|
||||
if (!location.hasAltitude())
|
||||
throw new RuntimeException("Location has no altitude");
|
||||
|
||||
double undulationRaw;
|
||||
if (isSouthPole()) {
|
||||
// No bilinear interpolation on South Pole (not worth the time)
|
||||
undulationRaw = v00;
|
||||
} else {
|
||||
double fLongitude = location.getLongitude() * RESOLUTION_IN_MINUTES -
|
||||
(int) (location.getLongitude() * RESOLUTION_IN_MINUTES);
|
||||
|
||||
double fLatitude = (-location.getLatitude() + 90) * RESOLUTION_IN_MINUTES
|
||||
- (int) ((-location.getLatitude() + 90) * RESOLUTION_IN_MINUTES);
|
||||
|
||||
// Bilinear interpolation (optimized; taken from GeopgrahicLib/Geoid.cpp)
|
||||
double
|
||||
a = (1 - fLongitude) * v00 + fLongitude * v01,
|
||||
b = (1 - fLongitude) * v10 + fLongitude * v11;
|
||||
undulationRaw = (1 - fLatitude) * a + fLatitude * b;
|
||||
}
|
||||
// Bilinear interpolation (not optimized)
|
||||
//undulationRaw = v00 * (1 - fLongitude) * (1 - fLatitude)
|
||||
// + v10 * fLongitude * (1 - fLatitude)
|
||||
// + v01 * (1 - fLongitude) * fLatitude
|
||||
// + v11 * fLongitude * fLatitude;
|
||||
|
||||
double h = 0.003 * undulationRaw - 108;
|
||||
|
||||
return Altitude.EGM2008.of(location.getAltitude() - h);
|
||||
}
|
||||
|
||||
private boolean isSouthPole() {
|
||||
return indices.latitudeIndex == 2160;
|
||||
}
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
record Indices(int latitudeIndex, int longitudeIndex) {
|
||||
|
||||
Indices offset(int latitudeOffset, int longitudeOffset) {
|
||||
return new Indices(latitudeIndex + latitudeOffset, longitudeIndex + longitudeOffset);
|
||||
}
|
||||
|
||||
int getAbsoluteIndex() {
|
||||
return latitudeIndex * LATITUDE_CORRECTION + longitudeIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="188dp"
|
||||
android:height="78dp"
|
||||
android:viewportWidth="188"
|
||||
android:viewportHeight="78">
|
||||
<path
|
||||
android:fillAlpha="0.70196078"
|
||||
android:fillColor="#cccccc"
|
||||
android:pathData="m37.804,0.731 l-37,38 37,39L37.804,49.731L90.804,49.731L106.804,28.731l-69,0z"
|
||||
android:strokeWidth="1"
|
||||
android:strokeAlpha="1"
|
||||
android:strokeColor="#00000000"
|
||||
android:strokeLineCap="butt"
|
||||
android:strokeLineJoin="miter" />
|
||||
<path
|
||||
android:fillAlpha="0.70196078"
|
||||
android:fillColor="#cccccc"
|
||||
android:pathData="M136.804,28.731L117.804,28.731L101.804,49.731L120.804,49.731Z"
|
||||
android:strokeWidth="1"
|
||||
android:strokeAlpha="1"
|
||||
android:strokeColor="#00000000"
|
||||
android:strokeLineCap="butt"
|
||||
android:strokeLineJoin="miter" />
|
||||
<path
|
||||
android:fillAlpha="0.70196078"
|
||||
android:fillColor="#cccccc"
|
||||
android:pathData="M164.804,28.731L147.804,28.731L131.804,49.731L148.804,49.731Z"
|
||||
android:strokeWidth="1"
|
||||
android:strokeAlpha="1"
|
||||
android:strokeColor="#00000000"
|
||||
android:strokeLineCap="butt"
|
||||
android:strokeLineJoin="miter" />
|
||||
<path
|
||||
android:fillAlpha="0.70196078"
|
||||
android:fillColor="#cccccc"
|
||||
android:pathData="M187.804,28.731L173.804,28.731L158.804,49.731L171.804,49.731Z"
|
||||
android:strokeWidth="1"
|
||||
android:strokeAlpha="1"
|
||||
android:strokeColor="#00000000"
|
||||
android:strokeLineCap="butt"
|
||||
android:strokeLineJoin="miter" />
|
||||
</vector>
|
||||
@@ -1,42 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="78dp"
|
||||
android:height="188dp"
|
||||
android:viewportWidth="78"
|
||||
android:viewportHeight="188">
|
||||
<path
|
||||
android:fillAlpha="0.7019608"
|
||||
android:fillColor="#cccccc"
|
||||
android:pathData="m1,150 l38,37 39,-37H50V97L29,81v69z"
|
||||
android:strokeWidth="1"
|
||||
android:strokeAlpha="1"
|
||||
android:strokeColor="#00000000"
|
||||
android:strokeLineCap="butt"
|
||||
android:strokeLineJoin="miter" />
|
||||
<path
|
||||
android:fillAlpha="0.7019608"
|
||||
android:fillColor="#cccccc"
|
||||
android:pathData="M29,51V70L50,86V67Z"
|
||||
android:strokeWidth="1"
|
||||
android:strokeAlpha="1"
|
||||
android:strokeColor="#00000000"
|
||||
android:strokeLineCap="butt"
|
||||
android:strokeLineJoin="miter" />
|
||||
<path
|
||||
android:fillAlpha="0.7019608"
|
||||
android:fillColor="#cccccc"
|
||||
android:pathData="M29,23V40L50,56V39Z"
|
||||
android:strokeWidth="1"
|
||||
android:strokeAlpha="1"
|
||||
android:strokeColor="#00000000"
|
||||
android:strokeLineCap="butt"
|
||||
android:strokeLineJoin="miter" />
|
||||
<path
|
||||
android:fillAlpha="0.7019608"
|
||||
android:fillColor="#cccccc"
|
||||
android:pathData="M29,0V14L50,29V16Z"
|
||||
android:strokeWidth="1"
|
||||
android:strokeAlpha="1"
|
||||
android:strokeColor="#00000000"
|
||||
android:strokeLineCap="butt"
|
||||
android:strokeLineJoin="miter" />
|
||||
</vector>
|
||||
@@ -7,7 +7,8 @@
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/track_list_toolbar"
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/export_activity_toolbar"
|
||||
|
||||
@@ -5,7 +5,8 @@
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/show_error_toolbar"
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/export_activity_toolbar"
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/import_activity_toolbar"
|
||||
|
||||
@@ -20,7 +20,8 @@ limitations under the License.
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/marker_detail_toolbar"
|
||||
|
||||
@@ -20,7 +20,8 @@ limitations under the License.
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/marker_edit_toolbar"
|
||||
@@ -34,6 +35,7 @@ limitations under the License.
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:layout_marginBottom="102dp"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||
|
||||
<ScrollView style="@style/ScrollView.WithBottomButtons">
|
||||
@@ -150,4 +152,8 @@ limitations under the License.
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
<include
|
||||
android:id="@+id/bottom_app_bar_layout"
|
||||
layout="@layout/bottomappbar" />
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
@@ -20,7 +20,8 @@ limitations under the License.
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<com.google.android.material.search.SearchBar
|
||||
android:id="@+id/marker_list_toolbar"
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/top_app_bar"
|
||||
|
||||
@@ -20,7 +20,8 @@ limitations under the License.
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
android:orientation="vertical"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<include
|
||||
android:id="@+id/fields"
|
||||
|
||||
@@ -20,7 +20,8 @@ limitations under the License.
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<com.google.android.material.search.SearchBar
|
||||
android:id="@+id/track_list_toolbar"
|
||||
|
||||
@@ -21,7 +21,8 @@ limitations under the License.
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:paddingBottom="70dp">
|
||||
android:paddingBottom="90dp"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<com.google.android.material.tabs.TabLayout
|
||||
android:id="@+id/track_detail_activity_tablayout"
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:paddingBottom="90dp">
|
||||
android:paddingBottom="90dp"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<com.google.android.material.tabs.TabLayout
|
||||
android:id="@+id/track_detail_activity_tablayout"
|
||||
|
||||
@@ -5,7 +5,8 @@
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
android:orientation="vertical"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<include
|
||||
android:id="@+id/loading_layout"
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -277,7 +277,7 @@
|
||||
<string name="settings_import_export_title">Impurtazione è espurtazione</string>
|
||||
<string name="settings_reset_summary">Reinizià i parametri à i valori predefiniti</string>
|
||||
<string name="settings_export_filename_title">Furmatu di u nome di schedariu</string>
|
||||
<string name="settings_chart_by_distance">Secondu à a distenza</string>
|
||||
<string name="settings_chart_by_distance">Secondu à a distanza</string>
|
||||
<string name="settings_chart_by_time">Secondu à a durata</string>
|
||||
<string name="settings_ui_dynamic_colors_summary">Impiegà i culori dinamichi definiti da l’utilizatore (solu Android 12è più ; richiede un rilanciu manuale)</string>
|
||||
<string name="settings_recording_customize_layout_title">Persunalizà u vostru accunciamentu d’arregistramentu</string>
|
||||
|
||||
@@ -609,4 +609,5 @@ limitations under the License.
|
||||
<string name="settings_announcements_lap_power">Výkon kola</string>
|
||||
<string name="power_x_watt">Výkon {x, plural, =1 {1 watt} few {# watty} other {# wattů} }</string>
|
||||
<string name="create_marker_error">Nepodařilo se vytvořit značku. Zkuste to znovu.</string>
|
||||
<string name="empty">" "</string>
|
||||
</resources>
|
||||
@@ -15,11 +15,11 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--><resources>
|
||||
<string name="about_preference_title">Über OpenTracks</string>
|
||||
<string name="about_description"><i>OpenTracks</i> ist eine Sport-Tracking-Anwendung, die Ihre Privatsphäre respektiert.</string>
|
||||
<string name="about_description"><i>OpenTracks</i> ist eine Sport-Tracking-Anwendung, die deine Privatsphäre respektiert.</string>
|
||||
<string name="about_url">Projekt-Website: <a href="%1$s">%1$s</a></string>
|
||||
<string name="about_version_name">Version Name: %1$s</string>
|
||||
<string name="about_version_code">Version Code: %1$d</string>
|
||||
<string name="about_history">OpenTracks ist ein Fork von <a href="https://code.google.com/archive/p/mytracks/"><i>Google\'s MyTracks</i></a> (2016 eingestellt).</string>
|
||||
<string name="about_version_name">Versionsname: %1$s</string>
|
||||
<string name="about_version_code">Versionscode: %1$d</string>
|
||||
<string name="about_history">OpenTracks ist ein Fork von <a href="https://code.google.com/archive/p/mytracks/"><i>Google MyTracks</i></a> (das 2016 eingestellt wurde).</string>
|
||||
<string name="about_libraries">Bibliotheken</string>
|
||||
<!-- Help -->
|
||||
<string name="help_feature_title">OpenTracks hat die folgenden Funktionen:</string>
|
||||
@@ -30,38 +30,37 @@ limitations under the License.
|
||||
\n* arbeitet vollständig offline
|
||||
\n* Tracks auf einer Karte anzeigen (siehe unten)</string>
|
||||
<string name="help_track_map_title">Wie wird ein Track auf einer Karte angezeigt?</string>
|
||||
<string name="help_track_map_content"> Verwende das kleine Kartensymbol.
|
||||
\n a) (Live-Aktualisierungen) Installiere <a href="https://github.com/OpenTracksApp/OSMDashboard">OSMDashboard</a>. OSMDashboard stellt Online- oder Offline-Karten über <a href="https://www.openstreetmap.org">OpenStreetMap</a>.
|
||||
\n zur Verfügung. Eigentlich ist OSMDashboard eine separate App, die nur (vorübergehend) auf die Daten der anzuzeigenden Strecke(n) zugreifen kann.
|
||||
\n b) Über eine normale Kartenanwendung (z.B. <a href="http://osmand.net/">OsmAnd</a> und <a href="https://maps.me/">MAPS.ME</a>). Diese Anwendungen müssen das KMZ-Dateiformat unterstützen (nur Orte und Zeitstempel). In der Tat muss eine App <i>ACTION_VIEW</i> mit MIME <i>application/vnd.google-earth.kmz</i> unterstützen. </string>
|
||||
<string name="help_storage_pictures_title">Wie speichert OpenTracks Bilder, die als Markierungen aufgenommen wurden?</string>
|
||||
<string name="help_track_map_content"> \u0020Verwende das kleine Kartensymbol.
|
||||
\na) (Live-Aktualisierungen) Installiere <a href="https://github.com/OpenTracksApp/OSMDashboard">OSMDashboard</a>. OSMDashboard stellt Online- oder Offline-Karten über <a href="https://www.openstreetmap.org">OpenStreetMap</a> zur Verfügung. Tatsächlich ist OSMDashboard eine separate App, die nur (vorübergehend) auf die Daten der anzuzeigenden Strecke(n) zugreifen kann.
|
||||
\nb) Über eine normale Kartenanwendung (z.B. <a href="http://osmand.net/">OsmAnd</a> und <a href="https://maps.me/">MAPS.ME</a>). Diese Anwendungen müssen das KMZ-Dateiformat unterstützen (nur Orte und Zeitstempel). Genauer ausgedrückt muss eine App <i>ACTION_VIEW</i> mit MIME <i>application/vnd.google-earth.kmz</i> unterstützen. \u0020</string>
|
||||
<string name="help_storage_pictures_title">Wie speichert OpenTracks Fotos, die als Markierungen aufgenommen wurden?</string>
|
||||
<string name="help_storage_pictures_content">Diese werden App-intern gespeichert (d.h. nur innerhalb von OpenTracks zugänglich).</string>
|
||||
<string name="help_track_export_title">Wie kann ich aufgezeichnete Tracks exportieren/teilen?</string>
|
||||
<string name="help_track_export_content"> Tracks können aus den Einstellungen als KMZ, KML oder GPX exportiert werden. KMZ/KML alle Daten; GPX nur Standorte. Tracks, die über das Symbol <i>Teilen Icon</i> freigegeben werden, werden als KMZ freigegeben. </string>
|
||||
<string name="help_track_export_content"> Tracks können aus den Einstellungen als KMZ, KML oder GPX exportiert werden. KMZ/KML alle Daten; GPX nur Standorte. Tracks, die über das Symbol <i>Teilen</i> freigegeben werden, werden als KMZ freigegeben. </string>
|
||||
<string name="help_data_google_play_services_title">Benötigt/benutzt OpenTracks den Google Play Service?</string>
|
||||
<string name="help_recording_title">Wie zeichnet OpenTracks Daten auf?</string>
|
||||
<string name="help_recording_content">
|
||||
OpenTracks verwendet den GPS-Sensor des Geräts, um den Standort kontinuierlich aufzuzeichnen.
|
||||
Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), kann OpenTracks nichts dagegen unternehmen.</string>
|
||||
<string name="help_data_storage_title">Wie speichert OpenTracks Sensordaten?</string>
|
||||
<string name="help_data_storage_content"> Sensordaten werden pro aufgezeichneter Stelle gespeichert. Bezogen auf einen Herzfrequenzsensor bedeutet dies, dass nur <i>eine</i>Herzfrequenzmessung pro Ort gespeichert wird. Wenn Du still stehst oder du dich in geschlossenen Räumen aufhälst, werden keine Sensordaten aufgezeichnet (aber angezeigt) </string>
|
||||
<string name="help_data_storage_content"> Sensordaten werden pro aufgezeichnetem Standort gespeichert. Bezogen auf einen Herzfrequenzsensor bedeutet dies, dass nur <i>eine</i>Herzfrequenzmessung pro Standort gespeichert wird. Wenn Du still stehst oder dich in geschlossenen Räumen aufhältst, werden keine Sensordaten aufgezeichnet (aber angezeigt). </string>
|
||||
<string name="help_gps_troubleshooting_title">OpenTracks zeichnet keine Standorte auf?</string>
|
||||
<string name="help_gps_troubleshooting_content"> Was Du tun kannst:
|
||||
\n a) prüfen, ob GPS aktiviert ist,
|
||||
\n b) den GPS-Empfang verbessern (z.B. ins Freie gehen),
|
||||
\n c) mit der <a href="https://f-droid.org/en/packages/com.android.gpstest.osmdroid/">GPSTest</a>-App das GPS testen, und
|
||||
\n d) Energiesparen deaktivieren.
|
||||
<string name="help_gps_troubleshooting_content"> \u0020Was Du tun kannst:
|
||||
\na) prüfen, ob GPS aktiviert ist,
|
||||
\nb) den GPS-Empfang verbessern (z.B. ins Freie gehen),
|
||||
\nc) mit der <a href="https://f-droid.org/en/packages/com.android.gpstest.osmdroid/">GPSTest</a>-App das GPS testen, und
|
||||
\nd) Energiesparen deaktivieren.
|
||||
\n
|
||||
\n Wenn das alles nicht hilft, melde bitte einen Fehler. </string>
|
||||
\nWenn das alles nicht hilft, melde bitte einen Fehler. \u0020</string>
|
||||
<string name="help_support_title">Wie kann ich OpenTracks unterstützen?</string>
|
||||
<string name="help_support_content"> Du kannst:
|
||||
\n a) über OpenTracks reden,
|
||||
\n b) <a href="https://github.com/OpenTracksApp/OpenTracks/issues">Merkmale vorschlagen</a>,
|
||||
\n c) <a href="https://github.com/OpenTracksApp/OpenTracks/issues">Fehler melden</a>,
|
||||
\n d) Hilfe bei der Software-Entwicklung,
|
||||
\n e) kaufen in <a href="https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore">Google Play Store</a>,
|
||||
\n f) spenden, und
|
||||
\n g) das tun, was Deiner Meinung nach OpenTracks hilft </string>
|
||||
<string name="help_support_content"> \u0020Du kannst:
|
||||
\na) auf OpenTracks aufmerksam machen,
|
||||
\nb) <a href="https://github.com/OpenTracksApp/OpenTracks/issues">Funktionen vorschlagen</a>,
|
||||
\nc) <a href="https://github.com/OpenTracksApp/OpenTracks/issues">Fehler melden</a>,
|
||||
\nd) bei der Software-Entwicklung helfen,
|
||||
\ne) es im <a href="https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore">Google Play Store</a> kaufen,
|
||||
\nf) spenden, und
|
||||
\ng) das tun, was OpenTracks Deiner Meinung nach hilft. \u0020</string>
|
||||
<string name="open_track_as_trackfileformat">Als %1$s öffnen</string>
|
||||
<!-- Activity Type -->
|
||||
<string name="activity_type_airplane">Flugzeug</string>
|
||||
@@ -174,8 +173,8 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
|
||||
<string name="generic_tracks">Strecken</string>
|
||||
<!-- Gps -->
|
||||
<string name="gps_starting">GPS wird gestartet</string>
|
||||
<string name="gps_wait_for_better_signal">Warten auf besseres GPS-Signal</string>
|
||||
<string name="gps_wait_for_signal">Warten auf GPS-Signal</string>
|
||||
<string name="gps_wait_for_better_signal">Warte auf besseres GPS-Signal</string>
|
||||
<string name="gps_wait_for_signal">Warte auf GPS-Signal</string>
|
||||
<!-- Image -->
|
||||
<string name="image_arrow">Pfeil</string>
|
||||
<string name="image_marker_count">Anzahl der Markierungen</string>
|
||||
@@ -428,7 +427,7 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
|
||||
<string name="activity_type_escooter">E-Scooter</string>
|
||||
<string name="import_unsupported_format">Nicht unterstütztes Dateiformat</string>
|
||||
<plurals name="generic_completed_with_errors">
|
||||
<item quantity="one">Abgeschlossen mit einem fehler</item>
|
||||
<item quantity="one">Abgeschlossen mit einem Fehler</item>
|
||||
<item quantity="other">Abgeschlossen mit %1$d Fehlern</item>
|
||||
</plurals>
|
||||
<string name="import_error_info">%1$s: %2$s</string>
|
||||
@@ -462,7 +461,7 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
|
||||
<string name="track_pace_notification">Tempo: %1$s</string>
|
||||
<string name="menu_voice_rate">Sprachgeschwindigkeit</string>
|
||||
<string name="import_prevent_reimport">Du hast re-import von Tracks verhindern aktiviert</string>
|
||||
<string name="about_third_party_data">Daten von Drittherstellern</string>
|
||||
<string name="about_third_party_data">Daten von Drittanbietern</string>
|
||||
<string name="sensor_state_heart_rate_max">Maximaler Herzfrequenz</string>
|
||||
<string name="track_delete_not_recording">Dieser Track kann nicht gelöscht werden, da er gerade aufgezeichnet wird.</string>
|
||||
<string name="interval_list_empty_message">Es gibt noch keine Intervalle</string>
|
||||
@@ -561,17 +560,17 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
|
||||
<string name="no_compatible_file_manager_installed">Kein kompatibler Dateimanager installiert</string>
|
||||
<string name="aggregated_stats_filter_no_results">Es gibt keine Aktivitäten für diesen Filter</string>
|
||||
<string name="settings_announcements_summary">Zeit, Entfernung, Sprachgeschwindigkeit</string>
|
||||
<string name="generic_dismiss">Ablehnen</string>
|
||||
<string name="generic_dismiss">Verwerfen</string>
|
||||
<string name="settings_defaults_summary">Bevorzugte Einheiten, Standard Aktivität, Standard Trackbezeichnung</string>
|
||||
<string name="settings_layout_reset_confirm_title">Deine Layouts zurücksetzen\?</string>
|
||||
<string name="settings_layout_reset">Individuelle Layouts zurücksetzen</string>
|
||||
<string name="settings_layout_reset_done">Alle Layout-Einstellungen wurden auf ihre Standardwerte zurückgesetzt</string>
|
||||
<string name="settings_all_reset">Zurücksetzen</string>
|
||||
<string name="field_remove_from_layout">Entfernen</string>
|
||||
<string name="error_crash_title">%1$s abgestürzt</string>
|
||||
<string name="share_crash_report">Teile Absturzbericht</string>
|
||||
<string name="error_crash_title">%1$s ist abgestürzt</string>
|
||||
<string name="share_crash_report">Absturzbericht teilen</string>
|
||||
<string name="always">Immer</string>
|
||||
<string name="select_show_on_map_behavior">Wähle \"Zeige auf Karte\" Verhalten</string>
|
||||
<string name="select_show_on_map_behavior">Wähle \"Zeige auf Karte\"-Verhalten</string>
|
||||
<string name="settings_open_tracks_summary">Alles über das OpenTracks-Projekt</string>
|
||||
<string name="settings_layout_reset_confirm_message">Alle Layout-Einstellungen werden auf die Standardwerte zurückgesetzt. Aufzeichnungen werden nicht vom Gerät gelöscht.</string>
|
||||
<string name="report_bug">Fehler melden</string>
|
||||
@@ -588,7 +587,7 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
|
||||
<string name="no_compatible_gallery_installed">Keine kompatible Bildergalerie Anwendung installiert</string>
|
||||
<string name="show_on_dashboard_not_installed">Es ist keine Anwendung installiert, die die OpenTracks Dashboard API unterstützt.</string>
|
||||
<string name="location_latitude_longitude">%1$s, %2$s</string>
|
||||
<string name="show_on_map_format_ask">Frag</string>
|
||||
<string name="show_on_map_format_ask">Nachfragen</string>
|
||||
<string name="settings_stats_units_nautical">Nautisches Maß (NM, ft)</string>
|
||||
<string name="unit_minute_per_nautical_mile">min/NM</string>
|
||||
<string name="voice_on_device_speaker_title">Verwende den Lautsprecher des Gerätes</string>
|
||||
@@ -646,4 +645,5 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
|
||||
<string name="voiceIdle">Untätig werden.</string>
|
||||
<string name="voice_announce_lap_power_key">StimmeAnkündigungLapPower</string>
|
||||
<string name="settings_announcements_lap_power">Rundenleistung</string>
|
||||
<string name="create_marker_error">Die Markierung konnte nicht erstellt werden. Versuchen Sie es erneut.</string>
|
||||
</resources>
|
||||
@@ -658,4 +658,8 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
|
||||
<string name="settings_announcements_idle_title">En veille</string>
|
||||
<string name="settings_ui_dynamic_colors_title">Couleurs dynamiques</string>
|
||||
<string name="permission_recording_failed">OpenTracks a besoin de la permission d\'accéder à votre localisation ainsi qu\'aux appareils à proximité.</string>
|
||||
<string name="create_marker_error">Impossible de créer un marqueur. Veuillez réessayer.</string>
|
||||
<string name="power">Puissance</string>
|
||||
<string name="power_x_watt">Puissance {x, plural, =1 {1 watt} autres {# watt} }</string>
|
||||
<string name="settings_announcements_lap_power">Puissance par tour</string>
|
||||
</resources>
|
||||
@@ -15,13 +15,13 @@
|
||||
<string name="help_recording_title">Conas a thaifeadann OpenTracks sonraí\?</string>
|
||||
<string name="help_data_storage_title">Conas a stórálann OpenTracks sonraí braiteora\?</string>
|
||||
<string name="help_recording_content">OpenTracks úsáideann an braiteoir GPS an fheiste chun an suíomh a thaifeadadh go leanúnach. Má thuairiscíonn an gléas GPS sonraí míchruinne (m.sh., suíomh, luas, ingearchló), Ní féidir Le OpenTracks aon rud a dhéanamh faoi.</string>
|
||||
<string name="help_gps_troubleshooting_content"> Cad is féidir leat a dhéanamh:
|
||||
\n a) seiceáil an bhfuil GPS cumasaithe,
|
||||
\n b) feabhas a chur ar fáiltiú GPS (e.g., dul amuigh faoin AER),
|
||||
<string name="help_gps_troubleshooting_content"> \u0020Cad is féidir leat a dhéanamh:
|
||||
\n a) seiceáil an bhfuil GPS cumasaithe,
|
||||
\n b) feabhas a chur ar fáiltiú GPS (e.g., dul amuigh faoin AER),
|
||||
\n c) seiceáil le <a href="https://f-droid.org/en/packages/com.android.gpstest.osmdroid/">gpstest</a> app, agus
|
||||
\n d) díchumasaigh coigilt cumhachta.
|
||||
\n
|
||||
\n Mura gcabhraíonn gach rud le do thoil tuairiscigh fabht. </string>
|
||||
\nMura gcabhraíonn gach rud le do thoil tuairiscigh fabht. \u0020</string>
|
||||
<string name="open_track_as_trackfileformat">Oscail mar %1$s</string>
|
||||
<string name="activity_type_airplane">eitleán</string>
|
||||
<string name="activity_type_biking">rothaíocht</string>
|
||||
@@ -331,10 +331,10 @@
|
||||
<string name="settings_gps_summary">Eatramh ama, Fad-eatramh, Fad Max, Cruinneas</string>
|
||||
<string name="about_description"><i>Open Tracks</i> is iarratas rianaithe spóirt go n-urramaíonn go hiomlán do phríobháideacht.</string>
|
||||
<string name="help_track_export_content"> Is féidir rianta a easpórtáil ó na Socruithe mar KMZ, KML, nó GPX. na sonraí go léir KMZ/KML; Suíomhanna GPX amháin. Roinntear rianta a roinntear tríd an <i>deilbhín comhroinnte</i> mar KMZ. </string>
|
||||
<string name="help_track_map_content">" Bain úsáid as an deilbhín léarscáile beag.
|
||||
\n a) (nuashonraithe beo) Suiteáil <a href=\"https://github.com/OpenTracksApp/OSMDashboard\">OSMDashboard</a>. Soláthraíonn sé léarscáileanna ar líne nó as líne trí <a href=\"https://www.openstreetmap.org\">OpenStreetMap</a>.
|
||||
<string name="help_track_map_content"> \u0020Bain úsáid as an deilbhín léarscáile beag.
|
||||
\n a) (nuashonraithe beo) Suiteáil <a href="https://github.com/OpenTracksApp/OSMDashboard">OSMDashboard</a>. Soláthraíonn sé léarscáileanna ar líne nó as líne trí <a href="https://www.openstreetmap.org">OpenStreetMap</a>.
|
||||
\n I ndáiríre, is aip ar leith é OSMDashboard nach féidir ach rochtain a fháil (go sealadach) ar shonraí na rianta atá le taispeáint.
|
||||
\n b) Trí ghnáthfheidhmchlár léarscáile (m.sh., <a href=\"http://osmand.net/\">OsmAnd</a> agus <a href=\"https://maps.me/\">MAPS.ME< /a>). Ní mór do na haipeanna seo tacú le formáid comhaid KMZ (suíomhanna agus stampaí ama amháin). Go deimhin, caithfidh aip tacaíocht a thabhairt do <i>ACTION_VIEW</i> le MIME <i>application/vnd.google-earth.kmz</i>. "</string>
|
||||
\n b) Trí ghnáthfheidhmchlár léarscáile (m.sh., <a href="http://osmand.net/">OsmAnd</a> agus <a href="https://maps.me/">MAPS.ME</a>). Ní mór do na haipeanna seo tacú le formáid comhaid KMZ (suíomhanna agus stampaí ama amháin). Go deimhin, caithfidh aip tacaíocht a thabhairt do <i>ACTION_VIEW</i> le MIME <i>application/vnd.google-earth.kmz</i>. \u0020</string>
|
||||
<string name="activity_type_ultimate_frisbee">frisbee deiridh</string>
|
||||
<string name="description_total_time">Am iomlán: %1$s</string>
|
||||
<string name="activity_type_inline_skating">scátáil inlíne</string>
|
||||
@@ -364,14 +364,14 @@
|
||||
<string name="always">I gcónaí</string>
|
||||
<string name="show_on_dashboard_not_installed">Níl aon fheidhmchlár a thacaíonn le OpenTracks Dashboard API suiteáilte.</string>
|
||||
<string name="share_image_body">Sílim go mb\'fhéidir go mbeadh suim agat san íomhá seo.</string>
|
||||
<string name="help_support_content"> You can:
|
||||
\n a) spread the word about OpenTracks,
|
||||
<string name="help_support_content"> \u0020You can:
|
||||
\n a) spread the word about OpenTracks,
|
||||
\n b) <a href="https://github.com/OpenTracksApp/OpenTracks/issues">propose features</a>,
|
||||
\n c) <a href="https://github.com/OpenTracksApp/OpenTracks/issues">report bugs</a>,
|
||||
\n d) help in software development,
|
||||
\n e) buy in <a href="https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore">Google Play Store</a>,
|
||||
\n f) donate, and
|
||||
\n g) do whatever you think helps OpenTracks. </string>
|
||||
\nc) <a href="https://github.com/OpenTracksApp/OpenTracks/issues">report bugs</a>,
|
||||
\n d) help in software development,
|
||||
\n e) buy in <a href="https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore">Google Play Store</a>,
|
||||
\n f) donate, and
|
||||
\n g) do whatever you think helps OpenTracks. \u0020</string>
|
||||
<string name="settings_public_api_disabled_toast">Tá OpenTracks Public API díchumasaithe: is féidir é a chumasú sna socruithe.</string>
|
||||
<string name="stats_altitude">Airde</string>
|
||||
<string name="stats_coordinates">Domhanleithead/Domhanfhad</string>
|
||||
|
||||
@@ -393,7 +393,7 @@ limitations under the License.
|
||||
<string name="menu_insert_gallery_img">Galériakép beillesztése</string>
|
||||
<string name="menu_resume_track">Nyomvonal folytatása</string>
|
||||
<string name="import_parser_error">Értelmezőhiba: %1$s</string>
|
||||
<string name="help_data_storage_content"> \u0020Az érzékelőadatok rögzített helyenként vannak tárolva. A pulzusszám-érzékelőre vonatkoztatva ez azt jelenti, hogy csak <i>egy</i> pulzusszámmérés kerül tárolásra helyenként. Ha Ön mozdulatlanul áll vagy beltérben tartózkodik, akkor nem kerülnek rögzítésre az érzékelőadatai (de megjelennek). \u0020</string>
|
||||
<string name="help_data_storage_content"> Az érzékelőadatok rögzített helyenként vannak tárolva. A pulzusszám-érzékelőre vonatkoztatva ez azt jelenti, hogy csak <i>egy</i> pulzusszámmérés kerül tárolásra helyenként. Ha Ön mozdulatlanul áll vagy beltérben tartózkodik, akkor nem kerülnek rögzítésre az érzékelőadatai (de megjelennek). </string>
|
||||
<string name="help_support_content"> \u0020Ezeket teheti meg:
|
||||
\n \u0020a) terjesztheti az OpenTracks hírét,
|
||||
\n \u0020b) <a href="https://github.com/OpenTracksApp/OpenTracks/issues">funkciókat javasolhat</a>,
|
||||
@@ -417,7 +417,7 @@ limitations under the License.
|
||||
<string name="share_image_subject">Szeretnék megosztani veletek egy képet</string>
|
||||
<string name="share_image_body">Azt hiszem, ez a kép érdekelhet.</string>
|
||||
<string name="help_recording_title">Hogyan veszi fel az OpenTracks az adatokat?</string>
|
||||
<string name="help_track_export_content"> \u0020A nyomvonalak KMZ, KML vagy GPX formátumban exportálhatók a Beállításokból. KMZ/KML minden adat; GPX csak a helyszínek. \u0020A <i>megosztás ikonon</i> keresztül megosztott nyomvonalak KMZ formátumban kerülnek megosztásra. \u0020</string>
|
||||
<string name="help_track_export_content"> A nyomvonalak KMZ, KML vagy GPX formátumban exportálhatók a Beállításokból. KMZ/KML minden adat; GPX csak a helyszínek. A <i>megosztás ikonon</i> keresztül megosztott nyomvonalak KMZ formátumban kerülnek megosztásra. </string>
|
||||
<string name="help_track_map_content"> \u0020Használja a kis térkép ikont.
|
||||
\n \u0020a) \u0020(élő frissítések) Telepítse a <a href="https://github.com/OpenTracksApp/OSMDashboard">OSMDashboard</a>. \u0020Ez online vagy offline térképeket biztosít a <a href="https://www.openstreetmap.org">OpenStreetMap</a> segítségével.
|
||||
\n \u0020Valójában az OSMDashboard egy különálló alkalmazás, amely csak a megjelenítendő nyomvonal(ak) adataihoz fér hozzá (ideiglenesen). \u0020
|
||||
@@ -425,11 +425,11 @@ limitations under the License.
|
||||
<string name="about_description">Az <i>OpenTracks</i> egy sportkövető alkalmazás, amely teljes mértékben tiszteletben tartja az Ön adatvédelmét.</string>
|
||||
<string name="about_history">Az OpenTracks a <a href="https://code.google.com/archive/p/mytracks/"><i>Google MyTracks</i></a> (2016-ban megszűnt) elágazása.</string>
|
||||
<string name="help_feature_content">* GPS nyomvonalak létrehozása
|
||||
\n * szívritmus-érzékelő használata (csak Bluetooth LE)
|
||||
\n * hangbejelentések (idő vagy távolság alapján)
|
||||
\n * jelölések létrehozása (képekkel együtt)
|
||||
\n * teljes offline működés
|
||||
\n * nyomvonalak megjelenítése a térképen (lásd lentebb)</string>
|
||||
\n* szívritmus-érzékelő használata (csak Bluetooth LE)
|
||||
\n* hangbejelentések (idő vagy távolság alapján)
|
||||
\n* jelölések létrehozása (képekkel együtt)
|
||||
\n* teljes offline működés
|
||||
\n* nyomvonalak megjelenítése a térképen (lásd lentebb)</string>
|
||||
<string name="about_third_party_data">Harmadik féltől származó adatok</string>
|
||||
<string name="menu_voice_rate">Beszédhang sebessége</string>
|
||||
<string name="track_delete_not_recording">Ez a nyomvonal nem törölhető, mivel jelenleg is felveszi.</string>
|
||||
@@ -601,4 +601,7 @@ limitations under the License.
|
||||
<string name="voiceSpeed">{n,number,#.0}</string>
|
||||
<string name="settings_announcements_lap_power">Kör teljesítmény</string>
|
||||
<string name="create_marker_error">Nem sikerült jelölőt létrehozni. Próbálja újra.</string>
|
||||
<string name="voiceDistance">{n, plural, =1 {1 } other {{n,number,#.0}} }</string>
|
||||
<string name="voice_announce_lap_power_key">voiceAnnounceLapPower</string>
|
||||
<string name="power_x_watt">Teljesítmény {x, plural, =1 {1 watt} other {# watts} }</string>
|
||||
</resources>
|
||||
@@ -127,7 +127,9 @@
|
||||
|
||||
<string name="idle_duration_key" translatable="false">idleSpeedDuration</string>
|
||||
<string name="idle_duration_default" translatable="false">10</string>
|
||||
<string name="idle_duration_off" translatable="false">0</string>
|
||||
<string-array name="idle_duration_values">
|
||||
<item>@string/idle_duration_off</item>
|
||||
<item>5</item>
|
||||
<item>@string/idle_duration_default</item>
|
||||
<item>15</item>
|
||||
|
||||
Reference in New Issue
Block a user