Compare commits

...

64 Commits

Author SHA1 Message Date
Dennis Guse ae2a97576b Release: v4.0.2 2022-06-20 22:06:01 +02:00
Šimon Hořánek 3e830a086e Replace Start with Stop 2022-06-19 21:03:56 +02:00
Surfoo 618a1df3ea Translated using Weblate (French)
Currently translated at 82.9% (73 of 88 strings)

Translation: OpenTracks/App store metadata files
Translate-URL: https://weblate.bubu1.eu/projects/OpenTracks/app-store-metadata-files/fr/
2022-06-19 17:34:42 +02:00
Surfoo 90cfc67c59 Translated using Weblate (French)
Currently translated at 100.0% (487 of 487 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://weblate.bubu1.eu/projects/OpenTracks/opentracks/fr/
2022-06-19 17:34:42 +02:00
Dennis Guse cecc586868 Bugfix: export was not checking properly if file exists.
Fixes #1283.
2022-06-19 17:24:18 +02:00
Dennis Guse f956e7fab3 Duplicate variable name. 2022-06-19 17:21:56 +02:00
William Pettersson 128b95cd83 Fix voice announcement rounding problem
We extracted integral parts before rounding, but String.format does
rounding which caused occasional issues. To alleviate, we need to round
before passing to String.format. All this rounding logic has now been
moved into appendDecimalUnit, and tests have been added to check that
rounding works correctly.

Fixes: #1285
2022-06-19 16:39:46 +02:00
Román Ginés 895a5c2b2a Bugfixed: DistanceFormatter was using the wrong unitSystem. Fixes #1288. 2022-06-18 23:18:04 +02:00
Dennis Guse 91ce5cf8d7 Add nautical miles (with feet for altitude).
Tests were broken.

Fixes #1280.
2022-06-18 10:01:09 +02:00
Dennis Guse a283464331 Add nautical miles (with feet for altitude).
Fixes #1280.
2022-06-17 19:57:40 +02:00
Dennis Guse 1c3a2bd2e4 Removed altitude smoothing completely: now it will just be the plain GPS-reported value.
Was only used for statistics in exports.

Follow-up to #1241.
2022-06-11 14:41:56 +02:00
Dennis Guse 0b326a77c2 Bugfix: Elevation in charts smoothing removed as it was broken.
Fixes #1241.
2022-06-11 14:24:41 +02:00
Dennis Guse d68008941e Release: v4.0.1 2022-06-09 22:55:36 +02:00
Dennis Guse b822d05a78 Fix voice announcement tests. 2022-06-09 22:33:43 +02:00
Dennis Guse 74bfed768c Translations: removed obsolete ones. 2022-06-09 21:01:08 +02:00
arjan-s ebfcce6d8d Translated using Weblate (Dutch)
Currently translated at 100.0% (487 of 487 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://weblate.bubu1.eu/projects/OpenTracks/opentracks/nl/
2022-06-09 16:04:29 +02:00
Hiajen d97d8f85e4 Translated using Weblate (German)
Currently translated at 96.9% (472 of 487 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://weblate.bubu1.eu/projects/OpenTracks/opentracks/de/
2022-06-09 16:04:28 +02:00
FTno 37c2c5029e Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (482 of 482 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://weblate.bubu1.eu/projects/OpenTracks/opentracks/nb_NO/
2022-06-07 09:55:18 +02:00
mondstern 105ff89fd8 Translated using Weblate (Romanian)
Currently translated at 84.4% (407 of 482 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://weblate.bubu1.eu/projects/OpenTracks/opentracks/ro/
2022-06-07 09:55:18 +02:00
mondstern 0ac033106c Translated using Weblate (Hungarian)
Currently translated at 91.7% (442 of 482 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://weblate.bubu1.eu/projects/OpenTracks/opentracks/hu/
2022-06-07 09:55:18 +02:00
mondstern 21ec9fc568 Translated using Weblate (Finnish)
Currently translated at 96.6% (466 of 482 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://weblate.bubu1.eu/projects/OpenTracks/opentracks/fi/
2022-06-07 09:55:18 +02:00
mondstern 2e3a7a31d4 Translated using Weblate (Hungarian)
Currently translated at 82.5% (398 of 482 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://weblate.bubu1.eu/projects/OpenTracks/opentracks/hu/
2022-06-07 09:55:17 +02:00
Román Ginés ecd7405a8c TrackStoppedActivity: added discard button option. Fixes #1267. 2022-06-07 09:55:09 +02:00
Dennis Guse 28abe360cb Merge pull request #1276 from OpenTracksApp/voiceConfig#1275
Added settings for what to announce
2022-06-06 17:04:15 +02:00
Dennis Guse 9cf88c00b0 Voice announcements: time is moving time (settings). 2022-06-06 17:02:31 +02:00
Dennis Guse 8bbde4aacd Voice announcements: fix translations 2022-06-06 17:02:31 +02:00
Jonas Kalderstam 00351136f2 Voice announcements: added settings for what to announce 2022-06-06 17:02:31 +02:00
dependabot[bot] 30b85bd215 Bump mockito-android from 4.6.0 to 4.6.1
Bumps [mockito-android](https://github.com/mockito/mockito) from 4.6.0 to 4.6.1.
- [Release notes](https://github.com/mockito/mockito/releases)
- [Commits](https://github.com/mockito/mockito/compare/v4.6.0...v4.6.1)

---
updated-dependencies:
- dependency-name: org.mockito:mockito-android
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-04 09:40:55 +02:00
Dennis Guse 14b705b43e README: add large translation status; removed Amazon App Store link. 2022-06-04 09:22:51 +02:00
Dennis Guse 31fc0adabc Fullscreen: now more fullscreen. 2022-06-03 17:26:33 +02:00
Dennis Guse 1714da5d3b Translations: fix quantities (fr). 2022-06-02 22:12:00 +02:00
mondstern 6ae47b5e01 Translated using Weblate (Slovenian)
Currently translated at 93.3% (450 of 482 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://weblate.bubu1.eu/projects/OpenTracks/opentracks/sl/
2022-06-02 22:06:14 +02:00
metezd df8e4c2e2e Translated using Weblate (Turkish)
Currently translated at 99.1% (478 of 482 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://weblate.bubu1.eu/projects/OpenTracks/opentracks/tr/
2022-06-02 20:00:22 +02:00
Surfoo 6f9fa3719a Translated using Weblate (French)
Currently translated at 100.0% (482 of 482 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://weblate.bubu1.eu/projects/OpenTracks/opentracks/fr/
2022-06-02 20:00:21 +02:00
vsevjednom-cz b9014c7219 Translated using Weblate (Czech)
Currently translated at 98.7% (483 of 489 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://weblate.bubu1.eu/projects/OpenTracks/opentracks/cs/
2022-06-02 20:00:21 +02:00
FTno d44ab44620 Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (502 of 502 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://weblate.bubu1.eu/projects/OpenTracks/opentracks/nb_NO/
2022-06-02 20:00:21 +02:00
dependabot[bot] bcffe05744 Bump appcompat from 1.4.1 to 1.4.2
Bumps appcompat from 1.4.1 to 1.4.2.

---
updated-dependencies:
- dependency-name: androidx.appcompat:appcompat
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-02 20:00:06 +02:00
Dennis Guse ed60734868 Donations: we do not accept Bitcoin anymore (too much effort). 2022-06-01 20:17:02 +02:00
dependabot[bot] e314ff8f43 Bump material from 1.6.0 to 1.6.1
Bumps [material](https://github.com/material-components/material-components-android) from 1.6.0 to 1.6.1.
- [Release notes](https://github.com/material-components/material-components-android/releases)
- [Commits](https://github.com/material-components/material-components-android/compare/1.6.0...1.6.1)

---
updated-dependencies:
- dependency-name: com.google.android.material:material
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-31 22:48:36 +02:00
Peter Storch 1108684d06 Add "show on map" format selection dialog 2022-05-30 07:51:00 +02:00
dependabot[bot] 6c0033c107 Bump mockito-android from 4.5.1 to 4.6.0
Bumps [mockito-android](https://github.com/mockito/mockito) from 4.5.1 to 4.6.0.
- [Release notes](https://github.com/mockito/mockito/releases)
- [Commits](https://github.com/mockito/mockito/compare/v4.5.1...v4.6.0)

---
updated-dependencies:
- dependency-name: org.mockito:mockito-android
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-30 07:35:00 +02:00
Dennis Guse 8a3e50ef9b BLE sensors: faster connection. 2022-05-29 22:50:55 +02:00
Román Ginés 05b572253e Bugfixes: buttons colors were handcoded. Fixes #1260. 2022-05-29 20:25:18 +02:00
Dennis Guse f755a086cd Cleanup: removed unused translations. 2022-05-29 20:22:50 +02:00
Dennis Guse b0605323da Track list: RTL fix. 2022-05-29 18:15:41 +02:00
Dennis Guse 585c2234eb Bugfix: request permissions in TrackListActivity.
Introduced in 9d64989ef1
2022-05-29 18:06:00 +02:00
Román Ginés c5d7ea4245 Bugfixes: TrackStoppedActivity on smaller devices. Fixes #1257. 2022-05-29 18:02:57 +02:00
Dennis Guse 281cd8a861 Merge pull request #1248 from OpenTracksApp/reset#1247
Allow settings reset and import/export while recording
2022-05-28 13:48:56 +02:00
Dennis Guse 36400c8ad0 Fix EspressoUITest for API24. 2022-05-26 23:39:35 +02:00
Dennis Guse fb00f697c5 Fix EspressoDeleteTrackTest.
Fixes #817.
2022-05-26 23:39:35 +02:00
Dennis Guse f529726218 KML: icons (start, stop, markers) use default icon.
Until now we used external URLs from Google to fetch proper icons.

Fixes #126.
2022-05-26 10:23:27 +02:00
Dennis Guse 059f3d8f43 Cleanup: align test classes name to tested class. 2022-05-26 10:23:27 +02:00
dependabot[bot] cae716925f Bump gradle from 7.2.0 to 7.2.1
Bumps gradle from 7.2.0 to 7.2.1.

---
updated-dependencies:
- dependency-name: com.android.tools.build:gradle
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-26 08:22:07 +02:00
Dennis Guse d29ee6da3d Settings: allow import/export settings while recording.
Fixes #1247.
2022-05-25 22:03:16 +02:00
Dennis Guse 033b5211ea Settings: allow reset settings while recording.
Fixes #1247.
2022-05-25 22:01:51 +02:00
Dennis Guse 5f4f5baba4 Remove unused settings (formerly used in settings). 2022-05-25 07:38:12 +02:00
Dennis Guse 4421046556 Remove unused settings (incl. deprecated ones). 2022-05-25 07:38:12 +02:00
Dennis Guse 30482d5a34 Record/stop buttons: add contentDescription. 2022-05-25 07:38:12 +02:00
Dennis Guse f12094c953 Remove unused translations (were used for voice announcements). 2022-05-25 07:38:12 +02:00
Dennis Guse c5147e7664 UI tests: use longClick() instead of veryLongClick(). 2022-05-25 07:38:12 +02:00
Dennis Guse 03b66bc6a2 Remove unused xml configuration. 2022-05-25 07:38:12 +02:00
Dennis Guse 7b40f2c949 Remove unused buttons.
Replaced in da62d26409
2022-05-25 07:38:12 +02:00
Dennis Guse 785a922d03 Remove empty translations. 2022-05-25 07:38:12 +02:00
Dennis Guse 5d2414977b TrackRecordingService: remove pause functionality.
Fixes #1233.
2022-05-23 07:41:50 +02:00
134 changed files with 1527 additions and 2600 deletions
+1 -1
View File
@@ -2,4 +2,4 @@
liberapay: OpenTracks
github: [rgmf, pstorch, dennisguse]
custom: https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore
custom: [ https://liberapay.com/OpenTracks, https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore ]
+6 -28
View File
@@ -9,7 +9,6 @@ _OpenTracks_ is a sport tracking application that completely respects your priva
<th>Free (F-Droid)</th>
<th>Free (Nightly for F-Droid)</th>
<th>Donations</th>
<th>Translations</th>
</tr>
<tr>
<td align="center">
@@ -27,47 +26,26 @@ _OpenTracks_ is a sport tracking application that completely respects your priva
<img alt="Donate using Liberapay" src="https://liberapay.com/assets/widgets/donate.svg" height="45" align="middle">
</a>
</td>
<td align="center">
<a href="https://weblate.bubu1.eu/engage/OpenTracks/">
<img src="https://weblate.bubu1.eu/widgets/OpenTracks/-/opentracks/svg-badge.svg" alt="Translation status" />
</a>
</td>
</tr>
<tr>
<td align="center">
<img alt="OpenTracks version published on F-Droid" src="https://img.shields.io/f-droid/v/de.dennisguse.opentracks.svg" align="middle" >
</td>
<td></td>
<td align="center">
<a href="bitcoin:bc1qckpls3lpjlcpyxzm66hcy65hnesas9zgacy6yc">
<img alt="bitcoin:bc1qckpls3lpjlcpyxzm66hcy65hnesas9zgacy6yc" src="promotion/donations-bitcoin.png" height="90" align="middle">
</a>
</td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td align="center">
<a href="https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore">
<img alt="Get it on Google Play" src="https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png" height="60" align="middle">
</a>
</td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td align="center">
<a href="https://www.amazon.de/dp/B09K2KNQ7X/">
<img alt="Get it on Amazon App Store" src="https://images-na.ssl-images-amazon.com/images/G/01/mobile-apps/devportal2/res/images/amazon-appstore-badge-english-white.png" height="40" align="middle">
</a>
</td>
<td></td>
</tr>
</table>
<a href="https://weblate.bubu1.eu/engage/OpenTracks/">
<img src="https://weblate.bubu1.eu/widgets/OpenTracks/-/opentracks/horizontal-auto.svg" alt="Translation status" />
</a>
## Screenshots
<div>
<img width="23%" src="fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot1.png">
<img width="23%" src="fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot2.png">
@@ -130,7 +108,7 @@ The API can be invoked by sending an explicit Intent to start an activity.
`Class`:
* **Start a recording:** `de.dennisguse.opentracks.publicapi.StartRecording`
* **Start a recording:** `de.dennisguse.opentracks.publicapi.StopRecording`
* **Stop a recording:** `de.dennisguse.opentracks.publicapi.StopRecording`
For testing via adb: `adb shell am start -n "package/class"`
+6 -6
View File
@@ -6,7 +6,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.2.0'
classpath 'com.android.tools.build:gradle:7.2.1'
}
}
@@ -59,8 +59,8 @@ android {
defaultConfig {
applicationId "de.dennisguse.opentracks"
versionCode 4874
versionName "v4.0.0"
versionCode 4938
versionName "v4.0.2"
buildConfigField "String", "VERSION_NAME_FULL", "\"${getVersionName()}\""
@@ -119,10 +119,10 @@ android {
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'androidx.appcompat:appcompat:1.4.2'
implementation 'androidx.preference:preference:1.2.0'
implementation 'androidx.documentfile:documentfile:1.0.1'
implementation 'com.google.android.material:material:1.6.0'
implementation 'com.google.android.material:material:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
androidTestImplementation 'androidx.test:core:1.4.0'
@@ -130,7 +130,7 @@ dependencies {
androidTestImplementation 'androidx.test:rules:1.4.0'
androidTestImplementation 'androidx.test:runner:1.4.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation 'org.mockito:mockito-android:4.5.1'
androidTestImplementation 'org.mockito:mockito-android:4.6.1'
androidTestUtil 'androidx.test:orchestrator:1.4.1'
}
@@ -0,0 +1,13 @@
v4.0.1: OpenTracks
Changes:
- Voice announcements are now configurable
- Fullscreen mode now also hides Android's navigation bar
- Connection to BLE sensors should now be faster
- Allow to reset settings while recording
- Allow to change import/export settings while recording
- KML/KMZ: do not use icons to be loaded from Google
Bugfix:
- TrackStoppedActivity now works on smaller screens
- Requests permissions on track list
@@ -0,0 +1,10 @@
v4.0.2: OpenTracks
Changes:
- Add nautical miles
- Settings can be reset while recording
Bugfix:
- Voice announcement rounding
- Chart: elevation was weirdly smoothed
- Export was not checking if file exists
@@ -0,0 +1,11 @@
v3.20.2 : OpenTracks
Changements :
- Le gain et la perte d'altitude sont des entiers au lieu de floats
- Demander la permission avant d'utiliser Bluetooth par un message Toast
Correction d'un bug :
- Définir FLAG_IMMUTABLE pour PendingIntents pour éviter un crash sur Android 12
- Le capteur de cadence renvoie 0 au lieu de None lorsque l'utilisateur ne pédale pas.
- Le capteur de vitesse renvoie 0 au lieu de la dernière vitesse connue quand c'est arrêté
- Avec les capteurs, le temps de déplacement s'arrête lorsqu'il n'est pas en mouvement
@@ -7,5 +7,11 @@ Fonctionnalités :
* Dénivelé positif et négatif: via capteur de pression barométrique
* Synthèse vocale
* Prise en charge des capteurs Bluetooth LE : rythme cardiaque, vitesse et distance (vélo), cadence de pédalage (vélo), et capteur de puissance (vélo)
* Export : export des traces au format KMZ (photos incluses), KML ou GPX
* Export : export des traces au format KMZ (photos incluses), KML ou GPX
* Pas d'accès internet requis : Internet n'est pas nécessaire pour le fonctionnement de l'application
* Thème sombre ou claire, avec le respect des paramètres du système
* Pas de publicités
Logiciel Open Source
Vous pouvez utiliser, étudier, changer et partager le code source.
Licence Apache 2.0
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

@@ -5,6 +5,7 @@ import static androidx.test.espresso.Espresso.onData;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.Espresso.pressBack;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.longClick;
import static androidx.test.espresso.action.ViewActions.scrollTo;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
@@ -14,7 +15,6 @@ import static androidx.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.anything;
import static de.dennisguse.opentracks.util.EspressoUtils.childAtPosition;
import static de.dennisguse.opentracks.util.EspressoUtils.veryLongTouch;
import static de.dennisguse.opentracks.util.EspressoUtils.waitFor;
import static de.dennisguse.opentracks.util.EspressoUtils.withListSize;
@@ -55,149 +55,33 @@ public class EspressoDeleteTrackTest {
@Rule
public GrantPermissionRule mGrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.ACCESS_FINE_LOCATION);
private MyIdlingResource idlingResource;
@Before
public void registerIntentServiceIdlingResource() {
Instrumentation instrumentation
= InstrumentationRegistry.getInstrumentation();
idlingResource = new MyIdlingResource(instrumentation.getTargetContext());
IdlingRegistry.getInstance().register(idlingResource);
}
@After
public void unregisterIntentServiceIdlingResource() {
IdlingRegistry.getInstance().unregister(idlingResource);
}
@Ignore("Test fails permanently")
@Deprecated
@Test
public void espressoDeleteTrackTest() {
int countBefore;
// TrackListActivity: start recording
onView(withId(R.id.track_list_fab_action)).perform(click());
{
// TrackListActivity: start recording
ViewInteraction trackControllerRecordButton = onView(withId(R.id.track_list_fab_action));
trackControllerRecordButton.perform(click());
}
// TrackRecordingActivity
onView(withId(R.id.track_recording_fab_action))
// wait; stay recording
.perform(waitFor(5000))
// stop;
.perform(longClick());
{
// TrackRecordingActivity
ViewInteraction trackControllerStopButton = onView(withId(R.id.track_recording_fab_action));
// wait; stay recording
trackControllerStopButton.perform(waitFor(5000));
// stop;
trackControllerStopButton.perform(veryLongTouch(1600));
}
// back
pressBack();
// get number of items before deleting a track
countBefore = numberOfItemsListView();
// TrackStoppedActivity
onView(withId(R.id.finish_button)).perform(click());
// select track
onData(anything()).inAdapterView(withId(R.id.track_list)).atPosition(0).perform(veryLongTouch(5000));
onData(anything()).inAdapterView(withId(R.id.track_list)).atPosition(0).perform(longClick());
// open menu and delete selected track
ViewInteraction overflowMenuButton = onView(
allOf(withContentDescription("More options"),
childAtPosition(
childAtPosition(
withId(R.id.bottom_app_bar),
2),
2),
isDisplayed()));
overflowMenuButton.perform(click());
onView(allOf(withContentDescription("More options"), isDisplayed()))
.perform(click());
ViewInteraction appCompatTextView = onView(
allOf(withId(R.id.title), withText("Delete"),
childAtPosition(
childAtPosition(
withId(R.id.content),
0),
0),
isDisplayed()));
appCompatTextView.perform(click());
onView(withText("Delete")).perform(click());
ViewInteraction appCompatButton = onView(
allOf(withId(android.R.id.button1), withText("Yes"),
childAtPosition(
childAtPosition(
withId(R.id.buttonPanel),
0),
3)));
appCompatButton.perform(scrollTo(), click());
onView(withText("OK")).perform(click());
// check number of items after delete
onView(withId(R.id.track_list)).check(ViewAssertions.matches(withListSize(countBefore - 1)));
}
private int numberOfItemsListView() {
final int[] counts = new int[1];
onView(withId(R.id.track_list)).check(matches(new TypeSafeMatcher<View>() {
@Override
public boolean matchesSafely(View view) {
ListView listView = (ListView) view;
counts[0] = listView.getCount();
return true;
}
@Override
public void describeTo(Description description) {
}
}));
return counts[0];
}
private static class MyIdlingResource implements IdlingResource {
private final Context context;
private ResourceCallback resourceCallback;
public MyIdlingResource(Context context) {
this.context = context;
}
@Override
public String getName() {
return MyIdlingResource.class.getName();
}
@Override
public void registerIdleTransitionCallback(IdlingResource.ResourceCallback resourceCallback) {
this.resourceCallback = resourceCallback;
}
@Override
public boolean isIdleNow() {
boolean idle = !isDeleteServiceRunning();
if (idle && resourceCallback != null) {
resourceCallback.onTransitionToIdle();
}
return idle;
}
private boolean isDeleteServiceRunning() {
ActivityManager manager =
(ActivityManager) context.getSystemService(
Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo info :
manager.getRunningServices(Integer.MAX_VALUE)) {
if (TrackDeleteService.class.getName().equals(
info.service.getClassName())) {
return true;
}
}
return false;
}
// tracklist is empty now
onView(allOf(withText("Start recording your next adventure here"), isDisplayed()));
}
}
@@ -4,26 +4,22 @@ import static androidx.test.espresso.Espresso.onData;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.longClick;
import static androidx.test.espresso.action.ViewActions.scrollTo;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.isClickable;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.anything;
import static de.dennisguse.opentracks.util.EspressoUtils.selectTabAtIndex;
import static de.dennisguse.opentracks.util.EspressoUtils.waitFor;
import android.view.MotionEvent;
import android.view.View;
import androidx.test.espresso.UiController;
import androidx.test.espresso.ViewAction;
import androidx.test.espresso.ViewInteraction;
import androidx.test.espresso.action.MotionEvents;
import androidx.test.ext.junit.rules.ActivityScenarioRule;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
import androidx.test.rule.GrantPermissionRule;
import org.hamcrest.Matcher;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -53,7 +49,7 @@ public class EspressoUITest {
.perform(longClick());
// TrackStoppedActivity: resume
onView(withId(R.id.resume_button))
onView(allOf(withId(R.id.resume_button), isClickable()))
.perform(click());
// TrackRecordingActivity: wait and then stop
@@ -93,7 +89,7 @@ public class EspressoUITest {
tabLayout.perform(waitFor(1000));
// stop
trackControllerStopButton.perform(veryLongTouch(1600));
trackControllerStopButton.perform(longClick());
}
}
@@ -101,36 +97,6 @@ public class EspressoUITest {
@Test
public void selectAndDeleteTrack() {
onView(withId(R.id.track_list)).check(matches(isDisplayed()));
onData(anything()).inAdapterView(withId(R.id.track_list)).atPosition(0).perform(veryLongTouch(2000));
onData(anything()).inAdapterView(withId(R.id.track_list)).atPosition(0).perform(longClick());
}
private static ViewAction veryLongTouch(final int duration_ms) {
return new ViewAction() {
@Override
public String getDescription() {
return "Perform long touch.";
}
@Override
public Matcher<View> getConstraints() {
return isDisplayed();
}
@Override
public void perform(UiController uiController, final View view) {
// Get view absolute position
int[] location = new int[2];
view.getLocationOnScreen(location);
// Offset coordinates by view position
float[] coordinates = new float[]{location[0] + 1, location[1] + 1};
// Send down event, pause, and send up
MotionEvent down = MotionEvents.sendDown(uiController, coordinates, new float[]{1f, 1f}).down;
uiController.loopMainThreadForAtLeast(duration_ms);
MotionEvents.sendUp(uiController, down, coordinates);
}
};
}
}
@@ -27,7 +27,7 @@ public class ChartPointTest {
statistics.setTotalTime(Duration.ofSeconds(1000));
// when
ChartPoint point = new ChartPoint(statistics, TrackStubUtils.createDefaultTrackPoint(), Speed.of(0), Altitude.EGM2008.of(0), false, UnitSystem.IMPERIAL);
ChartPoint point = new ChartPoint(statistics, TrackStubUtils.createDefaultTrackPoint(), Speed.of(0), false, UnitSystem.IMPERIAL);
// then
assertEquals(1000000, (long) point.getTimeOrDistance());
@@ -40,7 +40,7 @@ public class ChartPointTest {
statistics.setTotalDistance(Distance.of(1000));
// when
ChartPoint point = new ChartPoint(statistics, TrackStubUtils.createDefaultTrackPoint(), Speed.of(0), Altitude.EGM2008.of(0), true, UnitSystem.METRIC);
ChartPoint point = new ChartPoint(statistics, TrackStubUtils.createDefaultTrackPoint(), Speed.of(0), true, UnitSystem.METRIC);
// then
assertEquals(1, (long) point.getTimeOrDistance());
@@ -50,9 +50,11 @@ public class ChartPointTest {
public void create_get_altitude_speed_and_pace() {
// given
TrackStatistics statistics = new TrackStatistics();
TrackPoint trackPoint = TrackStubUtils.createDefaultTrackPoint()
.setAltitude(Altitude.EGM2008.of(50));
// when
ChartPoint point = new ChartPoint(statistics, TrackStubUtils.createDefaultTrackPoint(), Speed.of(10), Altitude.EGM2008.of(50), false, UnitSystem.METRIC);
ChartPoint point = new ChartPoint(statistics, trackPoint, Speed.of(10), false, UnitSystem.METRIC);
// then
assertEquals(50, point.getAltitude(), 0.01);
@@ -64,9 +66,10 @@ public class ChartPointTest {
public void create_sensorNotAvailable() {
// given
TrackStatistics statistics = new TrackStatistics();
TrackPoint trackPoint = TrackStubUtils.createDefaultTrackPoint()
.setAltitude(Altitude.EGM2008.of(50));
// when
ChartPoint point = new ChartPoint(statistics, TrackStubUtils.createDefaultTrackPoint(), Speed.of(10), Altitude.EGM2008.of(50), false, UnitSystem.METRIC);
ChartPoint point = new ChartPoint(statistics, trackPoint, Speed.of(10), false, UnitSystem.METRIC);
// then
assertNull(point.getHeartRate());
@@ -77,15 +80,16 @@ public class ChartPointTest {
@Test
public void create_sensorAvailable() {
// given
TrackPoint trackPoint = TrackStubUtils.createDefaultTrackPoint();
trackPoint.setHeartRate(100f);
trackPoint.setCadence(101f);
trackPoint.setPower(102f);
TrackPoint trackPoint = TrackStubUtils.createDefaultTrackPoint()
.setAltitude(Altitude.EGM2008.of(50))
.setHeartRate(100f)
.setCadence(101f)
.setPower(102f);
TrackStatistics statistics = new TrackStatistics();
// when
ChartPoint point = new ChartPoint(statistics, trackPoint, Speed.of(10), Altitude.EGM2008.of(50), false, UnitSystem.METRIC);
ChartPoint point = new ChartPoint(statistics, trackPoint, Speed.of(10), false, UnitSystem.METRIC);
// then
assertEquals(100.0, point.getHeartRate(), 0.01);
@@ -47,6 +47,7 @@ public class ChartValueSeriesTest {
new int[]{1, 100, 1000},
R.string.description_altitude_metric,
R.string.description_altitude_imperial,
R.string.description_altitude_imperial,
R.color.chart_altitude_fill,
R.color.chart_altitude_border,
15,
@@ -12,6 +12,7 @@ import org.junit.runner.RunWith;
import de.dennisguse.opentracks.settings.UnitSystem;
//TODO Parametrized tests
@RunWith(AndroidJUnit4.class)
public class DistanceFormatterTest {
@@ -42,4 +43,17 @@ public class DistanceFormatterTest {
// A small number in imperial
assertEquals("328.08 ft", formatter.formatDistance(Distance.of(100)));
}
@Test
public void testFormatDistance_nautical() {
DistanceFormatter formatter = DistanceFormatter.Builder()
.setDecimalCount(2)
.setUnit(UnitSystem.NAUTICAL_IMPERIAL)
.build(context);
// A large number in nautical
assertEquals("2.70 NM", formatter.formatDistance(Distance.of(5000)));
// A small number in nautical
assertEquals("328.08 ft", formatter.formatDistance(Distance.of(100)));
}
}
@@ -12,6 +12,7 @@ import org.junit.runner.RunWith;
import de.dennisguse.opentracks.settings.UnitSystem;
//TODO Use make parametrized tests?
@RunWith(AndroidJUnit4.class)
public class SpeedFormatterTest {
@@ -39,12 +40,22 @@ public class SpeedFormatterTest {
.setReportSpeedOrPace(false)
.build(context);
// assertEquals("TODO", formatter.getSpeedParts(Speed.of(3.34)).first);
// assertEquals("TODO", formatter.getSpeedParts(Speed.of(3.33)).first);
assertEquals("8:02", formatter.getSpeedParts(Speed.of(3.34)).first);
assertEquals("min/mi", formatter.getSpeedParts(Speed.zero()).second);
}
@Test
public void testGetSpeedParts_pace_nautical() {
SpeedFormatter formatter = SpeedFormatter.Builder()
.setDecimalCount(2)
.setUnit(UnitSystem.NAUTICAL_IMPERIAL)
.setReportSpeedOrPace(false)
.build(context);
assertEquals("9:14", formatter.getSpeedParts(Speed.of(3.34)).first);
assertEquals("min/NM", formatter.getSpeedParts(Speed.zero()).second);
}
@Test
public void testGetSpeedParts_speed_metric() {
SpeedFormatter formatter = SpeedFormatter.Builder()
@@ -69,6 +80,18 @@ public class SpeedFormatterTest {
assertEquals("mph", formatter.getSpeedParts(Speed.zero()).second);
}
@Test
public void testGetSpeedParts_speed_nautical() {
SpeedFormatter formatter = SpeedFormatter.Builder()
.setDecimalCount(2)
.setUnit(UnitSystem.NAUTICAL_IMPERIAL)
.setReportSpeedOrPace(true)
.build(context);
assertEquals("6.5", formatter.getSpeedParts(Speed.of(3.34)).first);
assertEquals("kn", formatter.getSpeedParts(Speed.zero()).second);
}
@Test
public void testFormatSpeed() {
SpeedFormatter formatter = SpeedFormatter.Builder()
@@ -163,10 +163,10 @@ public class ExportImportTest {
trackPointCreator.setClock("2020-02-02T02:02:06Z");
trackPointCreator.setRemoteSensorManager(new BluetoothRemoteSensorManager(context, null, trackPointCreator));
service.pauseCurrentTrack();
service.endCurrentTrack();
trackPointCreator.setClock("2020-02-02T02:02:20Z");
service.resumeCurrentTrack();
service.resumeTrack(trackId);
sendLocation(trackPointCreator, "2020-02-02T02:02:21Z", 3, 14.002, 10, 13, 15, 10, 0);
@@ -33,7 +33,7 @@ import de.dennisguse.opentracks.stats.TrackStatistics;
* Test that legacy KML/GPX formats can still be imported.
*/
@RunWith(JUnit4.class)
public class GPXImportTest {
public class GPXTrackImporterTest {
private final Context context = ApplicationProvider.getApplicationContext();
private final ContentProviderUtils contentProviderUtils = new ContentProviderUtils(context);
@@ -31,7 +31,7 @@ import de.dennisguse.opentracks.data.models.TrackPoint;
* Test that legacy KML/GPX formats can still be imported.
*/
@RunWith(JUnit4.class)
public class KMLImportTest {
public class KMLTrackImporterTest {
private final Context context = ApplicationProvider.getApplicationContext();
private final ContentProviderUtils contentProviderUtils = new ContentProviderUtils(context);
@@ -159,7 +159,7 @@ public class TrackRecordingServiceTestRecording {
// when
String pauseTime = "2020-02-02T02:02:03Z";
trackPointCreator.setClock(pauseTime);
service.pauseCurrentTrack();
service.endCurrentTrack();
// then
assertEquals(new TrackStatistics(startTime, pauseTime, 0, 1, 0, 0, 0f, 0f)
@@ -205,7 +205,7 @@ public class TrackRecordingServiceTestRecording {
String pauseTime = "2020-02-02T02:02:03Z";
trackPointCreator.setClock(pauseTime);
service.pauseCurrentTrack();
service.endCurrentTrack();
// when
trackPointCreator.setClock("2020-02-02T02:02:04Z");
@@ -143,7 +143,7 @@ public class TrackRecordingServiceTestStateMachine {
@MediumTest
@Test
public void recording_startPauseStopResume_no_data() throws InterruptedException {
public void recording_startStopResume_no_data() throws InterruptedException {
// given
assertFalse(service.isRecording());
@@ -153,31 +153,19 @@ public class TrackRecordingServiceTestStateMachine {
// then
assertTrue(service.isRecording());
assertEquals(new RecordingStatus(trackId, false), service.getRecordingStatusObservable().getValue());
assertEquals(new RecordingStatus(trackId), service.getRecordingStatusObservable().getValue());
assertNotEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue());
assertEquals(GpsStatusValue.GPS_ENABLED, service.getGpsStatusObservable().getValue());
service.endCurrentTrack();
// when
service.pauseCurrentTrack();
service.resumeTrack(trackId);
Thread.sleep(1000);
// then
assertTrue(service.isRecording());
assertTrue(service.isPaused());
assertEquals(new RecordingStatus(trackId, true), service.getRecordingStatusObservable().getValue());
assertNotEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue());
assertEquals(GpsStatusValue.GPS_NONE, service.getGpsStatusObservable().getValue()); //TODO The GPS is kept in pause, right? Might be a bug.
// when
service.resumeCurrentTrack();
Thread.sleep(1000);
// then
assertTrue(service.isRecording());
assertFalse(service.isPaused());
assertEquals(new RecordingStatus(trackId, false), service.getRecordingStatusObservable().getValue());
assertEquals(new RecordingStatus(trackId), service.getRecordingStatusObservable().getValue());
assertNotEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue());
assertEquals(GpsStatusValue.GPS_ENABLED, service.getGpsStatusObservable().getValue());
@@ -188,7 +176,6 @@ public class TrackRecordingServiceTestStateMachine {
// then
assertFalse(service.isRecording());
assertFalse(service.isPaused());
assertEquals(TrackRecordingService.STATUS_DEFAULT, service.getRecordingStatusObservable().getValue());
assertEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue());
assertEquals(GpsStatusValue.GPS_NONE, service.getGpsStatusObservable().getValue());
@@ -200,8 +187,7 @@ public class TrackRecordingServiceTestStateMachine {
// then
assertTrue(service.isRecording());
assertFalse(service.isPaused());
assertEquals(new RecordingStatus(trackId, false), service.getRecordingStatusObservable().getValue());
assertEquals(new RecordingStatus(trackId), service.getRecordingStatusObservable().getValue());
Thread.sleep(1000); //TODO Figure out why we need to wait here until the update is happening
assertNotEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue());
assertEquals(GpsStatusValue.GPS_ENABLED, service.getGpsStatusObservable().getValue());
@@ -209,29 +195,31 @@ public class TrackRecordingServiceTestStateMachine {
@MediumTest
@Test
public void invalidStateChanges() throws InterruptedException {
public void cannotResume_non_existing_track() throws InterruptedException {
// given
assertFalse(service.isRecording());
// when
service.pauseCurrentTrack();
Thread.sleep(2000);
// then
assertEquals(TrackRecordingService.STATUS_DEFAULT, service.getRecordingStatusObservable().getValue());
assertEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue());
assertEquals(GpsStatusValue.GPS_NONE, service.getGpsStatusObservable().getValue());
// when
service.resumeCurrentTrack();
Thread.sleep(1000);
service.resumeTrack(new Track.Id(-1));
// then
assertFalse(service.isRecording());
assertEquals(TrackRecordingService.STATUS_DEFAULT, service.getRecordingStatusObservable().getValue());
assertEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue());
assertEquals(GpsStatusValue.GPS_NONE, service.getGpsStatusObservable().getValue());
}
@MediumTest
@Test
public void cannotEnd_without_starting() throws InterruptedException {
// given
assertFalse(service.isRecording());
assertEquals(TrackRecordingService.STATUS_DEFAULT, service.getRecordingStatusObservable().getValue());
assertEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue());
assertEquals(GpsStatusValue.GPS_NONE, service.getGpsStatusObservable().getValue());
// when
service.endCurrentTrack();
@@ -257,8 +245,7 @@ public class TrackRecordingServiceTestStateMachine {
// then
assertTrue(service.isRecording());
assertFalse(service.isPaused());
assertEquals(new RecordingStatus(trackId, false), service.getRecordingStatusObservable().getValue());
assertEquals(new RecordingStatus(trackId), service.getRecordingStatusObservable().getValue());
Thread.sleep(1000); //TODO Figure out why we need to wait here until the update is happening
assertNotEquals(TrackRecordingService.NOT_RECORDING, service.getRecordingDataObservable().getValue());
assertEquals(GpsStatusValue.GPS_ENABLED, service.getGpsStatusObservable().getValue());
@@ -42,7 +42,13 @@ public class VoiceAnnouncementUtilsTest {
@Before
public void setUp() {
contentProviderUtils = new ContentProviderUtils(context);
PreferencesUtils.setVoiceAnnounceHeartRate(false);
PreferencesUtils.setVoiceAnnounceLapHeartRate(false);
PreferencesUtils.setVoiceAnnounceAverageHeartRate(false);
PreferencesUtils.setVoiceAnnounceTotalDistance(true);
PreferencesUtils.setVoiceAnnounceMovingTime(true);
PreferencesUtils.setVoiceAnnounceAverageSpeedPace(true);
PreferencesUtils.setVoiceAnnounceLapSpeedPace(true);
}
@Test
@@ -61,6 +67,54 @@ public class VoiceAnnouncementUtilsTest {
assertEquals("Total distance 20.00 kilometers. 1 hour 5 minutes 10 seconds. Speed 18.4 kilometers per hour.", announcement);
}
@Test
public void getAnnouncement_metric_speed_rounding_check() {
TrackStatistics stats = new TrackStatistics();
stats.setTotalDistance(Distance.of(20000));
stats.setTotalTime(Duration.ofHours(1).plusMinutes(5).plusSeconds(10));
stats.setMovingTime(Duration.ofHours(1).plusSeconds(1));
stats.setMaxSpeed(Speed.of(100));
stats.setTotalAltitudeGain(6000f);
// when
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, null, null).toString();
// then
assertEquals("Total distance 20.00 kilometers. 1 hour 1 second. Speed 20.0 kilometers per hour.", announcement);
}
@Test
public void getAnnouncement_metric_distance_rounding_check() {
TrackStatistics stats = new TrackStatistics();
stats.setTotalDistance(Distance.of(19999));
stats.setTotalTime(Duration.ofHours(1).plusMinutes(5).plusSeconds(10));
stats.setMovingTime(Duration.ofHours(1));
stats.setMaxSpeed(Speed.of(100));
stats.setTotalAltitudeGain(6000f);
// when
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, null, null).toString();
// then
assertEquals("Total distance 20.00 kilometers. 1 hour. Speed 20.0 kilometers per hour.", announcement);
}
@Test
public void getAnnouncement_metric_distance_rounding_check_two() {
TrackStatistics stats = new TrackStatistics();
stats.setTotalDistance(Distance.of(19990));
stats.setTotalTime(Duration.ofHours(1).plusMinutes(5).plusSeconds(10));
stats.setMovingTime(Duration.ofHours(1));
stats.setMaxSpeed(Speed.of(100));
stats.setTotalAltitudeGain(6000f);
// when
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, null, null).toString();
// then
assertEquals("Total distance 19.99 kilometers. 1 hour. Speed 20.0 kilometers per hour.", announcement);
}
@Test
public void getAnnouncement_withInterval_metric_speed() {
// given
@@ -199,7 +253,8 @@ public class VoiceAnnouncementUtilsTest {
@Test
public void getAnnouncement_heart_rate_and_sensor_statistics() {
PreferencesUtils.setVoiceAnnounceHeartRate(true);
PreferencesUtils.setVoiceAnnounceAverageHeartRate(true);
PreferencesUtils.setVoiceAnnounceLapHeartRate(true);
int numberOfPoints = 1000;
Pair<Track.Id, TrackStatistics> trackWithStats = TestDataUtil.buildTrackWithTrackPoints(contentProviderUtils, numberOfPoints);
@@ -221,4 +276,34 @@ public class VoiceAnnouncementUtilsTest {
// then
assertEquals("Total distance 14.21 kilometers. 16 minutes 39 seconds. Speed 51.2 kilometers per hour. Lap speed 51.2 kilometers per hour. Average heart rate 180 bpm. Current heart rate 133 bpm.", announcement);
}
@Test
public void getAnnouncement_only_lap_heart_rate() {
PreferencesUtils.setVoiceAnnounceLapHeartRate(true);
PreferencesUtils.setVoiceAnnounceAverageHeartRate(false);
PreferencesUtils.setVoiceAnnounceTotalDistance(false);
PreferencesUtils.setVoiceAnnounceMovingTime(false);
PreferencesUtils.setVoiceAnnounceAverageSpeedPace(false);
PreferencesUtils.setVoiceAnnounceLapSpeedPace(false);
int numberOfPoints = 1000;
Pair<Track.Id, TrackStatistics> trackWithStats = TestDataUtil.buildTrackWithTrackPoints(contentProviderUtils, numberOfPoints);
Track.Id trackId = trackWithStats.first;
TrackStatistics stats = trackWithStats.second;
IntervalStatistics.Interval lastInterval;
try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, null)) {
assertEquals(trackPointIterator.getCount(), numberOfPoints);
IntervalStatistics intervalStatistics = new IntervalStatistics(Distance.of(1000));
intervalStatistics.addTrackPoints(trackPointIterator);
lastInterval = intervalStatistics.getIntervalList().get(intervalStatistics.getIntervalList().size() - 1);
}
SensorStatistics sensorStatistics = new SensorStatistics(HeartRate.of(180f), HeartRate.of(180f), null, null, null);
// when
String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.METRIC, true, lastInterval, sensorStatistics).toString();
// then
assertEquals(" Current heart rate 133 bpm.", announcement);
}
}
@@ -86,7 +86,7 @@ public class TrackStatisticsUpdaterTest {
assertEquals(Duration.ofSeconds(9), statistics.getMovingTime());
assertEquals(2.5, statistics.getMinAltitude(), 0.01);
assertEquals(28.75, statistics.getMaxAltitude(), 0.01);
assertEquals(32.5, statistics.getMaxAltitude(), 0.01);
assertEquals(36, statistics.getTotalAltitudeGain(), 0.01);
assertEquals(36, statistics.getTotalAltitudeLoss(), 0.01);
@@ -3,10 +3,10 @@ package de.dennisguse.opentracks.ui.customRecordingLayout;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.longClick;
import static androidx.test.espresso.matcher.ViewMatchers.assertThat;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static org.hamcrest.CoreMatchers.is;
import static de.dennisguse.opentracks.util.EspressoUtils.veryLongTouch;
import android.view.View;
@@ -51,7 +51,7 @@ public class EspressoCustomLayoutTest {
// stop recording
ViewInteraction trackControllerStopButton = onView(withId(R.id.track_recording_fab_action));
trackControllerStopButton.perform(veryLongTouch(1600));
trackControllerStopButton.perform(longClick());
}
private static class RecyclerViewItemCountAssertion implements ViewAssertion {
@@ -1,21 +1,14 @@
package de.dennisguse.opentracks.util;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.isRoot;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.util.TreeIterables.breadthFirstViewTraversal;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.ListView;
import androidx.test.espresso.PerformException;
import androidx.test.espresso.UiController;
import androidx.test.espresso.ViewAction;
import androidx.test.espresso.action.MotionEvents;
import androidx.test.espresso.util.HumanReadables;
import com.google.android.material.tabs.TabLayout;
@@ -23,8 +16,6 @@ import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
import java.util.concurrent.TimeoutException;
public class EspressoUtils {
public static Matcher<View> childAtPosition(
@@ -80,76 +71,6 @@ public class EspressoUtils {
};
}
public static ViewAction veryLongTouch(final int duration_ms) {
return new ViewAction() {
@Override
public String getDescription() {
return "Perform long touch.";
}
@Override
public Matcher<View> getConstraints() {
return isDisplayed();
}
@Override
public void perform(UiController uiController, final View view) {
// Get view absolute position
int[] location = new int[2];
view.getLocationOnScreen(location);
// Offset coordinates by view position
float[] coordinates = new float[]{location[0] + 1, location[1] + 1};
// Send down event, pause, and send up
MotionEvent down = MotionEvents.sendDown(uiController, coordinates, new float[]{1f, 1f}).down;
uiController.loopMainThreadForAtLeast(duration_ms);
MotionEvents.sendUp(uiController, down, coordinates);
}
};
}
public static ViewAction waitId(final int viewId, final long millis) {
return new ViewAction() {
@Override
public Matcher<View> getConstraints() {
return isRoot();
}
@Override
public String getDescription() {
return "wait for a specific view with id <" + viewId + "> during " + millis + " millis.";
}
@Override
public void perform(final UiController uiController, final View view) {
uiController.loopMainThreadUntilIdle();
final long startTime = System.currentTimeMillis();
final long endTime = startTime + millis;
final Matcher<View> viewMatcher = withId(viewId);
do {
for (View child : breadthFirstViewTraversal(view)) {
// found view with required ID
if (viewMatcher.matches(child)) {
return;
}
}
uiController.loopMainThreadForAtLeast(50);
}
while (System.currentTimeMillis() < endTime);
// timeout happens
throw new PerformException.Builder()
.withActionDescription(this.getDescription())
.withViewDescription(HumanReadables.describe(view))
.withCause(new TimeoutException())
.build();
}
};
}
public static ViewAction selectTabAtIndex(final int index) {
return new ViewAction() {
@Override
@@ -1,63 +0,0 @@
package de.dennisguse.opentracks.util;
import junit.framework.TestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@RunWith(JUnit4.class)
public class ExportUtilsTest extends TestCase {
@Test
public void testIsExportFileExists_exists() {
// given
UUID uuid = UUID.randomUUID();
String format = "kmz";
List<String> fileNames = new ArrayList<>();
fileNames.add(uuid.toString().substring(0, 8) + "_name.gpx");
fileNames.add(uuid.toString().substring(0, 8) + "_other name name.kmz");
// when
boolean exists = ExportUtils.isExportFileExists(uuid, format, fileNames);
// then
assertTrue(exists);
}
@Test
public void testIsExportFileExists_not_exists1() {
// given
UUID uuid = UUID.randomUUID();
String format = "gpx";
List<String> fileNames = new ArrayList<>();
fileNames.add(UUID.randomUUID().toString().substring(0, 8) + "_name.gpx");
fileNames.add(UUID.randomUUID().toString().substring(0, 8) + "_other name name.gpx");
// when
boolean exists = ExportUtils.isExportFileExists(uuid, format, fileNames);
// then
assertFalse(exists);
}
@Test
public void testIsExportFileExists_not_exists2() {
// given
UUID uuid = UUID.randomUUID();
String format = "kmz";
List<String> fileNames = new ArrayList<>();
fileNames.add(uuid.toString().substring(0, 8) + "_name.gpx");
fileNames.add(UUID.randomUUID().toString().substring(0, 8) + "_other name name.gpx");
// when
boolean exists = ExportUtils.isExportFileExists(uuid, format, fileNames);
// then
assertFalse(exists);
}
}
-17
View File
@@ -347,23 +347,6 @@ limitations under the License.
<activity android:name=".settings.SettingsCustomLayoutListActivity" />
<activity android:name=".settings.SettingsCustomLayoutEditActivity" />
<activity
android:name=".share.ShowOnMapProxyActivity$KML"
android:exported="true">
<intent-filter android:label="@string/open_track_as_KML">
<action android:name="Intent.OpenTracks-Dashboard" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".share.ShowOnMapProxyActivity$GPX"
android:exported="true">
<intent-filter android:label="@string/open_track_as_GPX">
<action android:name="Intent.OpenTracks-Dashboard" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".ShowErrorActivity"
android:excludeFromRecents="true"
@@ -88,11 +88,14 @@ public abstract class AbstractTrackDeleteActivity extends AbstractActivity imple
if (deleteStatus.isFinished() && trackDeleteServiceConnection != null) {
trackDeleteServiceConnection.unbind(this);
trackDeleteServiceConnection = null;
onDeleteFinished();
}
}
protected abstract void onDeleteConfirmed();
protected abstract void onDeleteFinished();
protected abstract Track.Id getRecordingTrackId();
@Override
@@ -70,6 +70,7 @@ import de.dennisguse.opentracks.ui.util.ActivityUtils;
import de.dennisguse.opentracks.ui.util.ListItemUtils;
import de.dennisguse.opentracks.util.IntentDashboardUtils;
import de.dennisguse.opentracks.util.IntentUtils;
import de.dennisguse.opentracks.util.PermissionUtils;
import de.dennisguse.opentracks.util.StringUtils;
import de.dennisguse.opentracks.util.TrackIconUtils;
@@ -163,6 +164,8 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
super.onCreate(savedInstanceState);
setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
requestRequiredPermissions();
trackRecordingServiceConnection = new TrackRecordingServiceConnection(bindChangedCallback);
viewBinding.trackList.setEmptyView(viewBinding.trackListEmptyView);
@@ -259,6 +262,16 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
loadData(getIntent());
}
private void requestRequiredPermissions() {
if (!PermissionUtils.hasGPSPermission(this)) {
PermissionUtils.requestGPSPermission(this, null, () -> Toast.makeText(this, R.string.permission_gps_failed, Toast.LENGTH_SHORT).show());
}
if (!PermissionUtils.hasBluetoothPermissions(this)) {
PermissionUtils.requestBluetoothPermission(this, null, null);
}
}
@Override
protected void onStart() {
super.onStart();
@@ -432,6 +445,11 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
// Do nothing
}
@Override
protected void onDeleteFinished() {
// Do nothing
}
@Nullable
@Override
protected Track.Id getRecordingTrackId() {
@@ -472,7 +490,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
}
if (itemId == R.id.list_context_menu_show_on_map) {
IntentDashboardUtils.startDashboard(this, false, trackIds);
IntentDashboardUtils.showTrackOnMap(this, false, trackIds);
return true;
}
@@ -179,7 +179,7 @@ public class TrackRecordedActivity extends AbstractTrackDeleteActivity implement
}
if (item.getItemId() == R.id.track_detail_menu_show_on_map) {
IntentDashboardUtils.startDashboard(this, false, trackId);
IntentDashboardUtils.showTrackOnMap(this, false, trackId);
return true;
}
@@ -244,6 +244,11 @@ public class TrackRecordedActivity extends AbstractTrackDeleteActivity implement
runOnUiThread(this::finish);
}
@Override
protected void onDeleteFinished() {
// Do nothing
}
/**
* Gets the {@link TrackDataHub}.
*/
@@ -11,11 +11,16 @@ import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowInsets;
import android.view.WindowInsetsController;
import android.view.WindowManager;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.core.view.WindowInsetsControllerCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
@@ -131,8 +136,6 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
viewBinding.trackDetailActivityViewPager.setCurrentItem(savedInstanceState.getInt(CURRENT_TAB_TAG_KEY));
}
requestGPSPermissions();
viewBinding.trackRecordingFabAction.setImageResource(R.drawable.ic_baseline_stop_24);
viewBinding.trackRecordingFabAction.setBackgroundTintList(ContextCompat.getColorStateList(this, R.color.opentracks_secondary_color));
viewBinding.trackRecordingFabAction.setBackgroundColor(getResources().getColor(R.color.opentracks_secondary_color));
@@ -185,9 +188,20 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
}
private void setFullscreenPolicy() {
boolean keepScreenOn = PreferencesUtils.shouldUseFullscreen();
boolean fullscreen = PreferencesUtils.shouldUseFullscreen();
if (keepScreenOn) {
WindowInsetsControllerCompat windowInsetsController = ViewCompat.getWindowInsetsController(getWindow().getDecorView());
if (windowInsetsController != null) {
windowInsetsController.setSystemBarsBehavior(WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
if (fullscreen) {
windowInsetsController.hide(WindowInsetsCompat.Type.systemBars());
} else {
windowInsetsController.show(WindowInsetsCompat.Type.systemBars());
}
return;
}
if (fullscreen) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
@@ -256,7 +270,7 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.track_detail_menu_show_on_map) {
IntentDashboardUtils.startDashboard(this, true, trackId);
IntentDashboardUtils.showTrackOnMap(this, true, trackId);
return true;
}
@@ -371,14 +385,6 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
setScreenOnPolicy();
}
private void requestGPSPermissions() {
if (PermissionUtils.hasGPSPermission(this)) {
return;
}
PermissionUtils.requestGPSPermission(this, null, () -> Toast.makeText(this, R.string.permission_gps_failed, Toast.LENGTH_SHORT).show());
}
private void onGpsStatusChanged(GpsStatusValue gpsStatusValue) {
if (gpsStatusValue.isGpsStarted() && snackbar != null && snackbar.isShown()) {
snackbar.dismiss();
@@ -15,13 +15,14 @@ import de.dennisguse.opentracks.databinding.TrackStoppedBinding;
import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment;
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
import de.dennisguse.opentracks.settings.PreferencesUtils;
import de.dennisguse.opentracks.ui.aggregatedStatistics.ConfirmDeleteDialogFragment;
import de.dennisguse.opentracks.util.ExportUtils;
import de.dennisguse.opentracks.util.IntentUtils;
import de.dennisguse.opentracks.util.StringUtils;
import de.dennisguse.opentracks.util.TrackIconUtils;
import de.dennisguse.opentracks.util.TrackUtils;
public class TrackStoppedActivity extends AbstractActivity implements ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller {
public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller {
private static final String TAG = TrackStoppedActivity.class.getSimpleName();
@@ -31,6 +32,8 @@ public class TrackStoppedActivity extends AbstractActivity implements ChooseActi
private Track.Id trackId;
private boolean isDiscarding = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -44,26 +47,26 @@ public class TrackStoppedActivity extends AbstractActivity implements ChooseActi
ContentProviderUtils contentProviderUtils = new ContentProviderUtils(this);
Track track = contentProviderUtils.getTrack(trackId);
viewBinding.fields.trackEditName.setText(track.getName());
viewBinding.trackEditName.setText(track.getName());
viewBinding.fields.trackEditActivityType.setText(track.getCategory());
viewBinding.trackEditActivityType.setText(track.getCategory());
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.activity_types, android.R.layout.simple_dropdown_item_1line);
viewBinding.fields.trackEditActivityType.setAdapter(adapter);
viewBinding.fields.trackEditActivityType.setOnItemClickListener((parent, view, position, id) -> setActivityTypeIcon(TrackIconUtils.getIconValue(this, (String) viewBinding.fields.trackEditActivityType.getAdapter().getItem(position))));
viewBinding.fields.trackEditActivityType.setOnFocusChangeListener((v, hasFocus) -> {
viewBinding.trackEditActivityType.setAdapter(adapter);
viewBinding.trackEditActivityType.setOnItemClickListener((parent, view, position, id) -> setActivityTypeIcon(TrackIconUtils.getIconValue(this, (String) viewBinding.trackEditActivityType.getAdapter().getItem(position))));
viewBinding.trackEditActivityType.setOnFocusChangeListener((v, hasFocus) -> {
if (!hasFocus) {
setActivityTypeIcon(TrackIconUtils.getIconValue(
TrackStoppedActivity.this, viewBinding.fields.trackEditActivityType.getText().toString()));
TrackStoppedActivity.this, viewBinding.trackEditActivityType.getText().toString()));
}
});
String iconValue = track.getIcon();
setActivityTypeIcon(iconValue);
viewBinding.fields.trackEditActivityTypeIcon.setOnClickListener(v -> ChooseActivityTypeDialogFragment.showDialog(getSupportFragmentManager(), viewBinding.fields.trackEditActivityType.getText().toString()));
viewBinding.trackEditActivityTypeIcon.setOnClickListener(v -> ChooseActivityTypeDialogFragment.showDialog(getSupportFragmentManager(), viewBinding.trackEditActivityType.getText().toString()));
viewBinding.fields.trackEditDescription.setText(track.getDescription());
viewBinding.trackEditDescription.setText(track.getDescription());
viewBinding.time.setText(StringUtils.formatElapsedTime(track.getTrackStatistics().getMovingTime()));
@@ -87,20 +90,23 @@ public class TrackStoppedActivity extends AbstractActivity implements ChooseActi
}
viewBinding.finishButton.setOnClickListener(v -> {
TrackUtils.updateTrack(TrackStoppedActivity.this, track, viewBinding.fields.trackEditName.getText().toString(),
viewBinding.fields.trackEditActivityType.getText().toString(), viewBinding.fields.trackEditDescription.getText().toString(),
TrackUtils.updateTrack(TrackStoppedActivity.this, track, viewBinding.trackEditName.getText().toString(),
viewBinding.trackEditActivityType.getText().toString(), viewBinding.trackEditDescription.getText().toString(),
contentProviderUtils);
ExportUtils.postWorkoutExport(this, trackId);
finish();
});
viewBinding.resumeButton.setOnClickListener(v -> {
resumeTrackAndFinish();
});
viewBinding.resumeButton.setOnClickListener(v -> resumeTrackAndFinish());
viewBinding.discardButton.setOnClickListener(v -> ConfirmDeleteDialogFragment.showDialog(getSupportFragmentManager(), trackId));
}
@Override
public void onBackPressed() {
if (isDiscarding) {
return;
}
super.onBackPressed();
resumeTrackAndFinish();
}
@@ -112,13 +118,13 @@ public class TrackStoppedActivity extends AbstractActivity implements ChooseActi
}
private void setActivityTypeIcon(String iconValue) {
viewBinding.fields.trackEditActivityTypeIcon.setImageResource(TrackIconUtils.getIconDrawable(iconValue));
viewBinding.trackEditActivityTypeIcon.setImageResource(TrackIconUtils.getIconDrawable(iconValue));
}
@Override
public void onChooseActivityTypeDone(String iconValue) {
setActivityTypeIcon(iconValue);
viewBinding.fields.trackEditActivityType.setText(getString(TrackIconUtils.getIconActivityType(iconValue)));
viewBinding.trackEditActivityType.setText(getString(TrackIconUtils.getIconActivityType(iconValue)));
}
private void resumeTrackAndFinish() {
@@ -134,4 +140,22 @@ public class TrackStoppedActivity extends AbstractActivity implements ChooseActi
finish();
}).startAndBind(this);
}
}
@Override
protected void onDeleteConfirmed() {
isDiscarding = true;
viewBinding.loadingLayout.loadingText.setText(getString(R.string.track_discarding));
viewBinding.contentLinearLayout.setVisibility(View.GONE);
viewBinding.loadingLayout.loadingIndeterminate.setVisibility(View.VISIBLE);
}
@Override
protected void onDeleteFinished() {
finish();
}
@Override
protected Track.Id getRecordingTrackId() {
return null;
}
}
@@ -188,9 +188,9 @@ public class ChartFragment extends Fragment implements TrackDataHub.Listener {
}
}
public void onSampledInTrackPoint(@NonNull TrackPoint trackPoint, @NonNull TrackStatistics trackStatistics, Speed smoothedSpeed, Altitude smoothedAltitude) {
public void onSampledInTrackPoint(@NonNull TrackPoint trackPoint, @NonNull TrackStatistics trackStatistics, Speed smoothedSpeed) {
if (isResumed()) {
ChartPoint point = new ChartPoint(trackStatistics, trackPoint, smoothedSpeed, smoothedAltitude, chartByDistance, viewBinding.chartView.getUnitSystem());
ChartPoint point = new ChartPoint(trackStatistics, trackPoint, smoothedSpeed, chartByDistance, viewBinding.chartView.getUnitSystem());
pendingPoints.add(point);
}
}
@@ -29,15 +29,15 @@ public class ChartPoint {
this.altitude = altitude;
}
public ChartPoint(@NonNull TrackStatistics trackStatistics, @NonNull TrackPoint trackPoint, Speed smoothedSpeed, Altitude smoothedAltitude, boolean chartByDistance, UnitSystem unitSystem) {
public ChartPoint(@NonNull TrackStatistics trackStatistics, @NonNull TrackPoint trackPoint, Speed smoothedSpeed, boolean chartByDistance, UnitSystem unitSystem) {
if (chartByDistance) {
timeOrDistance = trackStatistics.getTotalDistance().toKM_Miles(unitSystem);
} else {
timeOrDistance = trackStatistics.getTotalTime().toMillis();
}
if (smoothedAltitude != null) {
altitude = Distance.of(smoothedAltitude.toM()).toM_FT(unitSystem);
if (trackPoint.hasAltitude()) {
altitude = Distance.of(trackPoint.getAltitude().toM()).toM_FT(unitSystem);
}
if (smoothedSpeed != null) {
@@ -44,6 +44,7 @@ abstract class ChartValueSeries {
private final int[] intervalValues;
private final int metricTitleId;
private final int imperialTitleId;
private final int nauticalTitleId;
private final Paint fillPaint;
private final Paint strokePaint;
private final Paint titlePaint;
@@ -57,24 +58,13 @@ abstract class ChartValueSeries {
private int maxMarkerValue = interval * ChartView.Y_AXIS_INTERVALS;
private boolean enabled = true;
/**
* Constructor.
*
* @param context the context
* @param absoluteMin the absolute min value
* @param absoluteMax the absolute max value
* @param intervalValues the list of interval values
* @param metricTitleId the metric title id
* @param imperialTitleId the imperial title id
* @param fillColor the fill color
* @param strokeColor the stroke color
*/
ChartValueSeries(Context context, int absoluteMin, int absoluteMax, int[] intervalValues, int metricTitleId, int imperialTitleId, int fillColor, int strokeColor, int fontSizeSmall, int fontSizeMedium) {
ChartValueSeries(Context context, int absoluteMin, int absoluteMax, int[] intervalValues, int metricTitleId, int imperialTitleId, int nauticalTitleId, int fillColor, int strokeColor, int fontSizeSmall, int fontSizeMedium) {
this.absoluteMin = absoluteMin;
this.absoluteMax = absoluteMax;
this.intervalValues = intervalValues;
this.metricTitleId = metricTitleId;
this.imperialTitleId = imperialTitleId;
this.nauticalTitleId = nauticalTitleId;
fillPaint = new Paint();
fillPaint.setStyle(Style.FILL);
@@ -224,39 +214,27 @@ abstract class ChartValueSeries {
return metricTitleId;
case IMPERIAL:
return imperialTitleId;
case NAUTICAL_IMPERIAL:
return nauticalTitleId;
default:
throw new RuntimeException("Not implemented");
}
}
/**
* Gets the title paint.
*/
Paint getTitlePaint() {
return titlePaint;
}
/**
* Gets the marker paint.
*/
Paint getMarkerPaint() {
return markerPaint;
}
/**
* Gets the largest marker.
*/
String getLargestMarker() {
String minMarker = numberFormat.format(getMinMarkerValue());
String maxMarker = numberFormat.format(getMaxMarkerValue());
return minMarker.length() >= maxMarker.length() ? minMarker : maxMarker;
}
/**
* Formats a marker value.
*
* @param value the value
*/
String formatMarker(int value) {
return numberFormat.format(value);
}
@@ -203,6 +203,7 @@ public class ChartView extends View {
new int[]{5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000},
R.string.description_altitude_metric,
R.string.description_altitude_imperial,
R.string.description_altitude_imperial,
R.color.chart_altitude_fill,
R.color.chart_altitude_border,
fontSizeSmall,
@@ -224,6 +225,7 @@ public class ChartView extends View {
new int[]{1, 5, 10, 20, 50, 100},
R.string.description_speed_metric,
R.string.description_speed_imperial,
R.string.description_speed_nautical,
R.color.chart_speed_fill,
R.color.chart_speed_border,
fontSizeSmall,
@@ -246,6 +248,7 @@ public class ChartView extends View {
new int[]{1, 2, 5, 10, 15, 20, 30, 60, 120},
R.string.description_pace_metric,
R.string.description_pace_imperial,
R.string.description_pace_nautical,
R.color.chart_pace_fill,
R.color.chart_pace_border,
fontSizeSmall,
@@ -268,6 +271,7 @@ public class ChartView extends View {
new int[]{25, 50},
R.string.description_sensor_heart_rate,
R.string.description_sensor_heart_rate,
R.string.description_sensor_heart_rate,
R.color.chart_heart_rate_fill,
R.color.chart_heart_rate_border,
fontSizeSmall,
@@ -289,6 +293,7 @@ public class ChartView extends View {
new int[]{5, 10, 25, 50},
R.string.description_sensor_cadence,
R.string.description_sensor_cadence,
R.string.description_sensor_cadence,
R.color.chart_cadence_fill,
R.color.chart_cadence_border,
fontSizeSmall,
@@ -309,6 +314,7 @@ public class ChartView extends View {
new int[]{5, 50, 100, 200},
R.string.description_sensor_power,
R.string.description_sensor_power,
R.string.description_sensor_power,
R.color.chart_power_fill,
R.color.chart_power_border,
fontSizeSmall,
@@ -732,6 +738,8 @@ public class ChartView extends View {
return context.getString(R.string.unit_kilometer);
case IMPERIAL:
return context.getString(R.string.unit_mile);
case NAUTICAL_IMPERIAL:
return context.getString(R.string.unit_nautical_mile);
default:
throw new RuntimeException("Not implemented");
}
@@ -367,7 +367,7 @@ public class TrackDataHub {
// Also include the last point if the selected track is not recording.
if ((localNumLoadedTrackPoints % samplingFrequency == 0) || (trackPointId == lastTrackPointId && !isSelectedTrackRecording())) {
for (Listener trackDataListener : listeners) {
trackDataListener.onSampledInTrackPoint(trackPoint, currentUpdater.getTrackStatistics(), currentUpdater.getSmoothedSpeed(), currentUpdater.getSmoothedAltitude());
trackDataListener.onSampledInTrackPoint(trackPoint, currentUpdater.getTrackStatistics(), currentUpdater.getSmoothedSpeed());
}
} else {
for (Listener trackDataListener : listeners) {
@@ -432,7 +432,7 @@ public class TrackDataHub {
*
* @param trackPoint the trackPoint
*/
default void onSampledInTrackPoint(@NonNull TrackPoint trackPoint, @NonNull TrackStatistics trackStatistics, Speed smoothedSpeed, @Nullable Altitude smoothedAltitude_m) {
default void onSampledInTrackPoint(@NonNull TrackPoint trackPoint, @NonNull TrackStatistics trackStatistics, Speed smoothedSpeed) {
}
/**
@@ -29,6 +29,10 @@ public class Distance {
return of(distance_mile * UnitConversions.MI_TO_M);
}
public static Distance ofNauticalMile(double distance_mile) {
return of(distance_mile * UnitConversions.NAUTICAL_MILE_TO_M);
}
public static Distance ofKilometer(double distance_km) {
return of(distance_km * UnitConversions.KM_TO_M);
}
@@ -51,6 +55,8 @@ public class Distance {
return Distance.ofKilometer(1);
case IMPERIAL:
return Distance.ofMile(1);
case NAUTICAL_IMPERIAL:
return Distance.ofNauticalMile(1);
default:
throw new RuntimeException("Not implemented");
}
@@ -114,12 +120,18 @@ public class Distance {
return toKM() * UnitConversions.KM_TO_MI;
}
public double toNauticalMiles() {
return toKM() * UnitConversions.KM_TO_NAUTICAL_MILE;
}
public double toKM_Miles(UnitSystem unitSystem) {
switch (unitSystem) {
case METRIC:
return toKM();
case IMPERIAL:
return toMI();
case NAUTICAL_IMPERIAL:
return toNauticalMiles();
default:
throw new RuntimeException("Not implemented");
}
@@ -129,6 +141,7 @@ public class Distance {
switch (unitSystem) {
case METRIC:
return toM();
case NAUTICAL_IMPERIAL:
case IMPERIAL:
return toFT();
default:
@@ -46,6 +46,7 @@ public class DistanceFormatter {
case METRIC:
return new Pair<>(null, resources.getString(R.string.unit_meter));
case IMPERIAL:
case NAUTICAL_IMPERIAL:
return new Pair<>(null, resources.getString(R.string.unit_feet));
default:
throw new RuntimeException("Not implemented");
@@ -65,6 +66,12 @@ public class DistanceFormatter {
} else {
return new Pair<>(StringUtils.formatDecimal(distance.toFT(), decimalCount), resources.getString(R.string.unit_feet));
}
case NAUTICAL_IMPERIAL:
if (distance.greaterThan(Distance.ofNauticalMile(0.5))) {
return new Pair<>(StringUtils.formatDecimal(distance.toNauticalMiles(), decimalCount), resources.getString(R.string.unit_nautical_mile));
} else {
return new Pair<>(StringUtils.formatDecimal(distance.toFT(), decimalCount), resources.getString(R.string.unit_feet));
}
default:
throw new RuntimeException("Not implemented");
}
@@ -93,6 +93,10 @@ public class Speed {
return toKMH() * UnitConversions.KM_TO_MI;
}
public double toKnots() {
return toKMH() * UnitConversions.KM_TO_NAUTICAL_MILE;
}
public Duration toPace(UnitSystem unitSystem) {
if (isZero()) {
return Duration.ofSeconds(0);
@@ -106,6 +110,9 @@ public class Speed {
case IMPERIAL:
distance *= UnitConversions.M_TO_MI;
break;
case NAUTICAL_IMPERIAL:
distance *= UnitConversions.M_TO_NAUTICAL_MILE;
break;
default:
throw new RuntimeException("Not implemented");
}
@@ -119,6 +126,8 @@ public class Speed {
return toKMH();
case IMPERIAL:
return toMPH();
case NAUTICAL_IMPERIAL:
return toKnots();
default:
throw new RuntimeException("Not implemented");
}
@@ -47,6 +47,9 @@ public class SpeedFormatter {
case IMPERIAL:
unitId = reportSpeedOrPace ? R.string.unit_mile_per_hour : R.string.unit_minute_per_mile;
break;
case NAUTICAL_IMPERIAL:
unitId = reportSpeedOrPace ? R.string.unit_knots : R.string.unit_minute_per_nautical_mile;
break;
default:
throw new RuntimeException("Not implemented");
}
@@ -46,7 +46,7 @@ public class TrackPoint {
private Double longitude;
private Distance horizontalAccuracy;
private Distance verticalAccuracy;
private Altitude altitude;
private Altitude altitude; //TODO use Altitude.WGS84
private Speed speed;
private Float bearing;
private Distance sensorDistance;
@@ -53,6 +53,9 @@ public class UnitConversions {
public static final double M_TO_MI = M_TO_KM * KM_TO_MI;
// multiplication factor to convert meters to feet
public static final double M_TO_FT = M_TO_MI * MI_TO_FT;
public static final double NAUTICAL_MILE_TO_M = 1852.0;
public static final double M_TO_NAUTICAL_MILE = 1 / NAUTICAL_MILE_TO_M;
public static final double KM_TO_NAUTICAL_MILE = 1000 * M_TO_NAUTICAL_MILE;
// multiplication factor to convert meters per second to kilometers per hour
public static final double MPS_TO_KMH = M_TO_KM / (S_TO_MIN * MIN_TO_HR);
// multiplication factor to convert miles to km
@@ -1,6 +1,12 @@
package de.dennisguse.opentracks.io.file;
import android.content.Context;
import android.content.res.Resources;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.data.ContentProviderUtils;
@@ -128,6 +134,23 @@ public enum TrackFileFormat {
this.preferenceId = preferenceId;
}
public static Map<String, String> toPreferenceIdLabelMap(final Resources resources, final TrackFileFormat ... trackFileFormats) {
Map<String, String> preferenceIdLabelMap = new LinkedHashMap<>(trackFileFormats.length);
for (TrackFileFormat trackFileFormat : trackFileFormats) {
String trackFileFormatUpperCase = trackFileFormat.getExtension().toUpperCase(Locale.US); //ASCII upper case
int photoMessageId = trackFileFormat.includesPhotos() ? R.string.export_with_photos : R.string.export_without_photos;
preferenceIdLabelMap.put(trackFileFormat.getPreferenceId(), String.format("%s (%s)", trackFileFormatUpperCase, resources.getString(photoMessageId)));
}
return preferenceIdLabelMap;
}
public static TrackFileFormat valueOfPreferenceId(final String preferenceId) {
return Arrays.stream(values())
.filter(trackFileFormat -> trackFileFormat.getPreferenceId().equals(preferenceId))
.findFirst()
.orElse(null);
}
/**
* Returns the mime type for each format.
*/
@@ -39,6 +39,7 @@ import de.dennisguse.opentracks.data.tables.TracksColumns;
import de.dennisguse.opentracks.databinding.ExportActivityBinding;
import de.dennisguse.opentracks.io.file.ErrorListDialog;
import de.dennisguse.opentracks.io.file.TrackFileFormat;
import de.dennisguse.opentracks.settings.PreferencesUtils;
import de.dennisguse.opentracks.util.ExportUtils;
import de.dennisguse.opentracks.util.FileUtils;
@@ -234,7 +235,7 @@ public class ExportActivity extends FragmentActivity implements ExportServiceRes
* @param conflictResolution conflict resolution to be applied if needed.
*/
private void export(Track track, int conflictResolution) {
boolean fileExists = ExportUtils.isExportFileExists(track.getUuid(), trackFileFormat.getExtension(), directoryFiles);
boolean fileExists = exportFileExists(track);
if (fileExists && conflictResolution == CONFLICT_NONE) {
conflict(track);
@@ -250,6 +251,11 @@ public class ExportActivity extends FragmentActivity implements ExportServiceRes
export(track, autoConflict);
}
private boolean exportFileExists(Track track) {
String filename = PreferencesUtils.getTrackFileformatGenerator().format(track, trackFileFormat);
return directoryFiles.stream().anyMatch(filename::equals);
}
private void setConflictVisibility(int visibility) {
viewBinding.exportProgressAlertIcon.setVisibility(visibility);
viewBinding.exportProgressAlertMsg.setVisibility(visibility);
@@ -315,7 +321,7 @@ public class ExportActivity extends FragmentActivity implements ExportServiceRes
public void onExportSuccess(Track.Id trackId) {
Track track = contentProviderUtils.getTrack(trackId);
if (ExportUtils.isExportFileExists(track.getUuid(), trackFileFormat.getExtension(), directoryFiles)) {
if (exportFileExists(track)) {
trackExportOverwrittenCount++;
} else {
trackExportSuccessCount++;
@@ -68,9 +68,6 @@ public class KMLTrackExporter implements TrackExporter {
public static final String EXTENDED_DATA_TYPE_ACCURACY_HORIZONTAL = "accuracy_horizontal";
public static final String EXTENDED_DATA_TYPE_ACCURACY_VERTICAL = "accuracy_vertical";
private static final String MARKER_ICON = "http://maps.google.com/mapfiles/kml/pushpin/blue-pushpin.png";
private static final String TRACK_ICON = "http://earth.google.com/images/kml-icons/track-directional/track-0.png";
private static final NumberFormat SENSOR_DATA_FORMAT = NumberFormat.getInstance(Locale.US);
static {
@@ -536,7 +533,7 @@ public class KMLTrackExporter implements TrackExporter {
printWriter.println("<LineStyle><color>7f0000ff</color><width>4</width></LineStyle>");
printWriter.println("<IconStyle>");
printWriter.println("<scale>1.3</scale>");
printWriter.println("<Icon><href>" + TRACK_ICON + "</href></Icon>");
printWriter.println("<Icon />");
printWriter.println("</IconStyle>");
printWriter.println("</Style>");
}
@@ -546,9 +543,7 @@ public class KMLTrackExporter implements TrackExporter {
*/
private void writePlacemarkerStyle() {
printWriter.println("<Style id=\"" + KMLTrackExporter.MARKER_STYLE + "\"><IconStyle>");
printWriter.println("<scale>1.3</scale>");
printWriter.println("<Icon><href>" + KMLTrackExporter.MARKER_ICON + "</href></Icon>");
printWriter.println("<hotSpot x=\"" + 20 + "\" y=\"" + 2 + "\" xunits=\"pixels\" yunits=\"pixels\"/>");
printWriter.println("<Icon />");
printWriter.println("</IconStyle></Style>");
}
@@ -136,9 +136,9 @@ public abstract class BluetoothConnectionManager<DataType> {
Log.d(TAG, "Connecting to: " + device);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
bluetoothGatt = device.connectGatt(context, true, connectCallback, BluetoothDevice.TRANSPORT_AUTO, 0, this.observer.getHandler());
bluetoothGatt = device.connectGatt(context, false, connectCallback, BluetoothDevice.TRANSPORT_AUTO, 0, this.observer.getHandler());
} else {
bluetoothGatt = device.connectGatt(context, true, connectCallback);
bluetoothGatt = device.connectGatt(context, false, connectCallback);
}
SensorData<?> sensorData = createEmptySensorData(bluetoothGatt.getDevice().getAddress());
observer.onChanged(sensorData);
@@ -9,12 +9,10 @@ import de.dennisguse.opentracks.data.models.Track;
public class RecordingStatus {
private final Track.Id trackId;
private final boolean paused;
@VisibleForTesting
RecordingStatus(Track.Id trackId, boolean paused) {
RecordingStatus(Track.Id trackId) {
this.trackId = trackId;
this.paused = paused;
}
public Track.Id getTrackId() {
@@ -25,24 +23,12 @@ public class RecordingStatus {
return trackId != null;
}
public boolean isPaused() {
return paused;
}
public boolean isRecordingAndNotPaused() {
return isRecording() && !isPaused();
}
static RecordingStatus notRecording() {
return new RecordingStatus(null, false);
return new RecordingStatus(null);
}
static RecordingStatus record(@NonNull Track.Id trackId) {
return new RecordingStatus(trackId, false);
}
RecordingStatus pause() {
return new RecordingStatus(getTrackId(), true);
return new RecordingStatus(trackId);
}
public RecordingStatus stop() {
@@ -54,7 +40,6 @@ public class RecordingStatus {
public String toString() {
return "RecordingStatus{" +
"trackId=" + trackId +
", paused=" + paused +
'}';
}
@@ -63,11 +48,11 @@ public class RecordingStatus {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
RecordingStatus that = (RecordingStatus) o;
return paused == that.paused && Objects.equals(trackId, that.trackId);
return Objects.equals(trackId, that.trackId);
}
@Override
public int hashCode() {
return Objects.hash(trackId, paused);
return Objects.hash(trackId);
}
}
@@ -82,25 +82,23 @@ class TrackRecordingManager implements SharedPreferences.OnSharedPreferenceChang
return trackId;
}
//TODO Handle non-existing trackId? Start a new track or exception?
void resumeExistingTrack(@NonNull Track.Id resumeTrackId, @NonNull TrackPointCreator trackPointCreator) {
/**
* @return if the recording could be started.
*/
boolean resumeExistingTrack(@NonNull Track.Id resumeTrackId, @NonNull TrackPointCreator trackPointCreator) {
trackId = resumeTrackId;
Track track = contentProviderUtils.getTrack(trackId);
if (track == null) {
Log.e(TAG, "Ignore resumeTrack. Track " + trackId.getId() + " does not exists.");
return;
return false;
}
trackStatisticsUpdater = new TrackStatisticsUpdater(track.getTrackStatistics());
onNewTrackPoint(trackPointCreator.createSegmentStartManual());
reset();
}
void pause(TrackPointCreator trackPointCreator) {
insertTrackPoint(trackPointCreator.createSegmentEnd(), true);
reset();
return true;
}
void end(TrackPointCreator trackPointCreator) {
@@ -30,7 +30,6 @@ import androidx.lifecycle.MutableLiveData;
import java.time.Duration;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.data.models.Distance;
import de.dennisguse.opentracks.data.models.Marker;
import de.dennisguse.opentracks.data.models.Track;
@@ -178,23 +177,16 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
public void resumeTrack(Track.Id trackId) {
trackPointCreator.reset();
trackRecordingManager.resumeExistingTrack(trackId, trackPointCreator);
if (!trackRecordingManager.resumeExistingTrack(trackId, trackPointCreator)) {
Log.w(TAG, "Cannot resume a non-existing track.");
return;
}
updateRecordingStatus(RecordingStatus.record(trackId));
startRecording();
}
@VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
public void resumeCurrentTrack() {
if (!isRecording() || !isPaused()) {
Log.w(TAG, "Ignore resumeCurrentTrack. Not recording or not paused.");
return;
}
resumeTrack(recordingStatus.getTrackId());
}
private void startRecording() {
// Update instance variables
handler.postDelayed(updateRecordingData, RECORDING_DATA_UPDATE_INTERVAL.toMillis());
@@ -222,46 +214,18 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
return;
}
// Need to remember the recordingTrackId before setting it to null
boolean wasPause = isPaused();
Track.Id trackId = recordingStatus.getTrackId();
// Set recording status
updateRecordingStatus(STATUS_DEFAULT);
if (!wasPause) {
trackRecordingManager.end(trackPointCreator);
}
endRecording(true);
trackRecordingManager.end(trackPointCreator);
endRecording();
stopSelf();
}
@VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
public void pauseCurrentTrack() {
if (!isRecording() || isPaused()) {
Log.w(TAG, "Ignore pauseCurrentTrack. Not recording or paused.");
return;
}
// Set recording status
updateRecordingStatus(recordingStatus.pause());
trackRecordingManager.pause(trackPointCreator);
endRecording(false);
notificationManager.updateContent(getString(R.string.generic_paused));
}
private void endRecording(boolean trackStopped) {
private void endRecording() {
stopUpdateRecordingData();
if (!trackStopped) {
updateRecordingDataWhileRecording();
} else {
recordingDataObservable.postValue(NOT_RECORDING);
}
recordingDataObservable.postValue(NOT_RECORDING);
voiceAnnouncementManager.stop();
@@ -289,8 +253,8 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
@Override
public boolean newTrackPoint(TrackPoint trackPoint, Distance thresholdHorizontalAccuracy) {
if (!isRecording() || isPaused()) {
Log.w(TAG, "Ignore newTrackPoint. Not recording or paused.");
if (!isRecording()) {
Log.w(TAG, "Ignore newTrackPoint. Not recording.");
return false;
}
@@ -323,7 +287,7 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
}
public Marker.Id insertMarker(String name, String category, String description, String photoUrl) {
if (!isRecording() || isPaused()) {
if (!isRecording()) {
return null;
}
@@ -398,9 +362,4 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
public boolean isRecording() {
return recordingStatus.isRecording();
}
@VisibleForTesting
public boolean isPaused() {
return recordingStatus.isPaused();
}
}
@@ -167,17 +167,6 @@ public class TrackRecordingServiceConnection implements ServiceConnection, Death
setTrackRecordingService(null);
}
public void resumeTrack() {
if (trackRecordingService != null) {
trackRecordingService.resumeCurrentTrack();
}
}
public void pauseTrack() {
if (trackRecordingService != null) {
trackRecordingService.pauseCurrentTrack();
}
}
@Nullable
public Marker.Id addMarker(Context context, String name, String category, String description, String photoUrl) {
TrackRecordingService trackRecordingService = getServiceIfBound();
@@ -181,8 +181,10 @@ public class VoiceAnnouncement {
Spannable announcement = VoiceAnnouncementUtils.getAnnouncement(context, track.getTrackStatistics(), unitSystem, isReportSpeed, lastInterval, sensorStatistics);
// We don't care about the utterance id. It is supplied here to force onUtteranceCompleted to be called.
tts.speak(announcement, TextToSpeech.QUEUE_FLUSH, null, "not used");
if (announcement.length() > 0) {
// We don't care about the utterance id. It is supplied here to force onUtteranceCompleted to be called.
tts.speak(announcement, TextToSpeech.QUEUE_FLUSH, null, "not used");
}
}
public void stop() {
@@ -1,7 +1,12 @@
package de.dennisguse.opentracks.services.announcement;
import static android.text.Spanned.SPAN_INCLUSIVE_EXCLUSIVE;
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceHeartRate;
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceAverageHeartRate;
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceAverageSpeedPace;
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceLapHeartRate;
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceLapSpeedPace;
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceTotalDistance;
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceMovingTime;
import android.content.Context;
import android.text.Spannable;
@@ -52,68 +57,68 @@ class VoiceAnnouncementUtils {
unitDistanceTTS = "mile";
unitSpeedTTS = "mile per hour";
break;
case NAUTICAL_IMPERIAL:
perUnitStringId = R.string.voice_per_nautical_mile;
distanceId = R.plurals.voiceDistanceNauticalMiles;
speedId = R.plurals.voiceSpeedMKnots;
unitDistanceTTS = "nautical mile";
unitSpeedTTS = "knots";
break;
default:
throw new RuntimeException("Not implemented");
}
double distanceInUnit = distance.toKM_Miles(unitSystem);
builder.append(context.getString(R.string.total_distance));
long distanceIntegerPart = (long) distanceInUnit;
// Extract the decimal part
String distanceFractionalPart = String.format("%.2f", (distanceInUnit - distanceIntegerPart)).substring(2);
// Units should always be english singular for TTS.
// See https://developer.android.com/reference/android/text/style/TtsSpan?hl=en#TYPE_MEASURE
appendDecimalUnit(builder, context.getResources().getQuantityString(distanceId, getQuantityCount(distanceInUnit), distanceInUnit), distanceIntegerPart, distanceFractionalPart, unitDistanceTTS);
// Punctuation helps introduce natural pauses in TTS
builder.append(".");
if (shouldVoiceAnnounceTotalDistance()) {
builder.append(context.getString(R.string.total_distance));
// Units should always be english singular for TTS.
// See https://developer.android.com/reference/android/text/style/TtsSpan?hl=en#TYPE_MEASURE
appendDecimalUnit(builder, context.getResources().getQuantityString(distanceId, getQuantityCount(distanceInUnit), distanceInUnit), distanceInUnit, 2, unitDistanceTTS);
// Punctuation helps introduce natural pauses in TTS
builder.append(".");
}
if (distance.isZero()) {
return builder;
}
// Announce time
Duration movingTime = trackStatistics.getMovingTime();
if (!movingTime.isZero()) {
if (shouldVoiceAnnounceMovingTime() && !movingTime.isZero()) {
appendDuration(context, builder, movingTime);
builder.append(".");
}
if (isReportSpeed) {
double speedInUnit = distancePerTime.to(unitSystem);
builder.append(" ")
.append(context.getString(R.string.speed));
long speedIntegerPart = (long) speedInUnit;
// Extract the decimal part
String speedFractionalPart = String.format("%.1f", (speedInUnit - speedIntegerPart)).substring(2);
appendDecimalUnit(builder, context.getResources().getQuantityString(speedId, getQuantityCount(speedInUnit), speedInUnit), speedIntegerPart, speedFractionalPart, unitSpeedTTS);
builder.append(".");
if (currentDistancePerTime != null) {
if (shouldVoiceAnnounceAverageSpeedPace()) {
double speedInUnit = distancePerTime.to(unitSystem);
builder.append(" ")
.append(context.getString(R.string.speed));
appendDecimalUnit(builder, context.getResources().getQuantityString(speedId, getQuantityCount(speedInUnit), speedInUnit), speedInUnit, 1, unitSpeedTTS);
builder.append(".");
}
if (shouldVoiceAnnounceLapSpeedPace() && currentDistancePerTime != null) {
double currentDistancePerTimeInUnit = currentDistancePerTime.to(unitSystem);
if (currentDistancePerTimeInUnit > 0) {
builder.append(" ")
.append(context.getString(R.string.lap_speed));
long currentDistanceIntegerPart = (long) currentDistancePerTimeInUnit;
// Extract the decimal part
String currentDistanceFractionalPart = String.format("%.1f", (currentDistancePerTimeInUnit - currentDistanceIntegerPart)).substring(2);
appendDecimalUnit(builder, context.getResources().getQuantityString(speedId, getQuantityCount(currentDistancePerTimeInUnit), currentDistancePerTimeInUnit), currentDistanceIntegerPart, currentDistanceFractionalPart, unitSpeedTTS);
appendDecimalUnit(builder, context.getResources().getQuantityString(speedId, getQuantityCount(currentDistancePerTimeInUnit), currentDistancePerTimeInUnit), currentDistancePerTimeInUnit, 1, unitSpeedTTS);
builder.append(".");
}
}
} else {
Duration time = distancePerTime.toPace(unitSystem);
builder.append(" ")
.append(context.getString(R.string.pace));
appendDuration(context, builder, time);
builder.append(" ")
.append(context.getString(perUnitStringId))
.append(".");
if (shouldVoiceAnnounceAverageSpeedPace()) {
Duration time = distancePerTime.toPace(unitSystem);
builder.append(" ")
.append(context.getString(R.string.pace));
appendDuration(context, builder, time);
builder.append(" ")
.append(context.getString(perUnitStringId))
.append(".");
}
Duration currentTime = currentDistancePerTime != null ? currentDistancePerTime.toPace(unitSystem) : Duration.ofMillis(0);
if (!currentTime.isZero()) {
if (shouldVoiceAnnounceLapSpeedPace() && currentDistancePerTime != null) {
Duration currentTime = currentDistancePerTime.toPace(unitSystem);
builder.append(" ")
.append(context.getString(R.string.lap_time));
appendDuration(context, builder, currentTime);
@@ -123,24 +128,21 @@ class VoiceAnnouncementUtils {
}
}
if (shouldVoiceAnnounceHeartRate()) {
if (sensorStatistics != null && sensorStatistics.hasHeartRate()) {
int averageHeartRate = Math.round(sensorStatistics.getAvgHeartRate().getBPM());
if (shouldVoiceAnnounceAverageHeartRate() && sensorStatistics != null && sensorStatistics.hasHeartRate()) {
int averageHeartRate = Math.round(sensorStatistics.getAvgHeartRate().getBPM());
builder.append(" ")
.append(context.getString(R.string.average_heart_rate));
appendCardinal(builder, context.getString(R.string.sensor_state_heart_rate_value, averageHeartRate), averageHeartRate);
builder.append(".");
}
builder.append(" ")
.append(context.getString(R.string.average_heart_rate));
appendCardinal(builder, context.getString(R.string.sensor_state_heart_rate_value, averageHeartRate), averageHeartRate);
builder.append(".");
}
if (shouldVoiceAnnounceLapHeartRate() && currentInterval != null && currentInterval.hasAverageHeartRate()) {
int currentHeartRate = Math.round(currentInterval.getAverageHeartRate().getBPM());
if (currentInterval != null && currentInterval.hasAverageHeartRate()) {
int currentHeartRate = Math.round(currentInterval.getAverageHeartRate().getBPM());
builder.append(" ")
.append(context.getString(R.string.current_heart_rate));
appendCardinal(builder, context.getString(R.string.sensor_state_heart_rate_value, currentHeartRate), currentHeartRate);
builder.append(".");
}
builder.append(" ")
.append(context.getString(R.string.current_heart_rate));
appendCardinal(builder, context.getString(R.string.sensor_state_heart_rate_value, currentHeartRate), currentHeartRate);
builder.append(".");
}
return builder;
@@ -156,26 +158,34 @@ class VoiceAnnouncementUtils {
int seconds = (int) (duration.getSeconds() % 60);
if (hours > 0) {
appendDecimalUnit(builder, context.getResources().getQuantityString(R.plurals.voiceHours, hours, hours), hours, null, "hour");
appendDecimalUnit(builder, context.getResources().getQuantityString(R.plurals.voiceHours, hours, hours), hours, 0, "hour");
}
if (minutes > 0) {
appendDecimalUnit(builder, context.getResources().getQuantityString(R.plurals.voiceMinutes, minutes, minutes), minutes, null, "minute");
appendDecimalUnit(builder, context.getResources().getQuantityString(R.plurals.voiceMinutes, minutes, minutes), minutes, 0, "minute");
}
if (seconds > 0 || duration.isZero()) {
appendDecimalUnit(builder, context.getResources().getQuantityString(R.plurals.voiceSeconds, seconds, seconds), seconds, null, "second");
appendDecimalUnit(builder, context.getResources().getQuantityString(R.plurals.voiceSeconds, seconds, seconds), seconds, 0, "second");
}
}
/**
* Speaks as: 98.14 [UNIT] - ninety eight point one four [UNIT with correct plural form]
*
* @param number The number to speak
* @param precision The number of decimal places to announce
*/
private static void appendDecimalUnit(@NonNull SpannableStringBuilder builder, @NonNull String localizedText, long integerPart, @Nullable String fractionalPart, @NonNull String unit) {
private static void appendDecimalUnit(@NonNull SpannableStringBuilder builder, @NonNull String localizedText, double number, int precision, @NonNull String unit) {
TtsSpan.MeasureBuilder measureBuilder = new TtsSpan.MeasureBuilder()
.setUnit(unit);
if (fractionalPart == null) {
measureBuilder.setNumber(integerPart);
if (precision == 0) {
measureBuilder.setNumber((long)number);
} else {
// Round before extracting integral and decimal parts
double roundedNumber = Math.round(Math.pow(10, precision) * number) / Math.pow(10.0, precision);
long integerPart = (long) roundedNumber;
// Extract the decimal part
String fractionalPart = String.format("%." + precision + "f", (roundedNumber - integerPart)).substring(2);
measureBuilder.setIntegerPart(integerPart)
.setFractionalPart(fractionalPart);
}
@@ -74,6 +74,7 @@ public class DefaultsSettingsFragment extends PreferenceFragmentCompat implement
entriesId = R.array.stats_rate_metric_options;
break;
case IMPERIAL:
case NAUTICAL_IMPERIAL:
entriesId = R.array.stats_rate_imperial_options;
break;
default:
@@ -9,7 +9,7 @@ import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import java.util.Locale;
import java.util.Map;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.io.file.TrackFileFormat;
@@ -46,27 +46,15 @@ public class ImportExportSettingsFragment extends PreferenceFragmentCompat {
}
private void setExportTrackFileFormatOptions() {
final TrackFileFormat[] trackFileFormats = {
Map<String, String> options = TrackFileFormat.toPreferenceIdLabelMap(getResources(),
TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA_AND_PICTURES,
TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA,
TrackFileFormat.KML_WITH_TRACKDETAIL_AND_SENSORDATA,
TrackFileFormat.GPX,
TrackFileFormat.CSV
};
String[] entries = new String[trackFileFormats.length];
String[] entryValues = new String[trackFileFormats.length];
for (int i = 0; i < entries.length; i++) {
TrackFileFormat trackFileFormat = trackFileFormats[i];
String trackFileFormatUpperCase = trackFileFormat.getExtension().toUpperCase(Locale.US); //ASCII upper case
int photoMessageId = trackFileFormat.includesPhotos() ? R.string.export_with_photos : R.string.export_without_photos;
entries[i] = String.format("%s (%s)", trackFileFormatUpperCase, getString(photoMessageId));
entryValues[i] = trackFileFormat.getPreferenceId();
}
TrackFileFormat.CSV);
ListPreference listPreference = findPreference(getString(R.string.export_trackfileformat_key));
listPreference.setEntries(entries);
listPreference.setEntryValues(entryValues);
listPreference.setEntries(options.values().toArray(new String[0]));
listPreference.setEntryValues(options.keySet().toArray(new String[0]));
}
private void setExportDirectorySummary() {
@@ -2,6 +2,7 @@ package de.dennisguse.opentracks.settings;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.fragment.app.DialogFragment;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
@@ -13,20 +14,10 @@ import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
public class MainSettingsFragment extends PreferenceFragmentCompat {
private static final String TAG = MainSettingsFragment.class.getSimpleName();
private RecordingStatus recordingStatus = TrackRecordingService.STATUS_DEFAULT;
private TrackRecordingServiceConnection trackRecordingServiceConnection;
private final TrackRecordingServiceConnection.Callback bindServiceCallback =
(service, unused) -> service.getRecordingStatusObservable()
.observe(MainSettingsFragment.this, this::onRecordingStatusChanged);
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
addPreferencesFromResource(R.xml.settings);
trackRecordingServiceConnection = new TrackRecordingServiceConnection(bindServiceCallback);
findPreference(getString(R.string.settings_defaults_key)).setOnPreferenceClickListener(preference -> {
((SettingsActivity) getActivity()).openScreen(getString(R.string.settings_defaults_key));
return true;
@@ -69,20 +60,7 @@ public class MainSettingsFragment extends PreferenceFragmentCompat {
}
@Override
public void onResume() {
super.onResume();
trackRecordingServiceConnection.bind(getContext());
updatePrefsDependOnRecording();
}
@Override
public void onDestroy() {
super.onDestroy();
trackRecordingServiceConnection.unbind(getContext());
}
@Override
public void onDisplayPreferenceDialog(Preference preference) {
public void onDisplayPreferenceDialog(@NonNull Preference preference) {
DialogFragment dialogFragment = null;
if (preference instanceof ResetDialogPreference) {
@@ -97,24 +75,4 @@ public class MainSettingsFragment extends PreferenceFragmentCompat {
super.onDisplayPreferenceDialog(preference);
}
private void onRecordingStatusChanged(RecordingStatus status) {
this.recordingStatus = status;
if (isAdded()) {
updatePrefsDependOnRecording();
}
}
private void updatePrefsDependOnRecording() {
Preference importExportPreference = findPreference(getString(R.string.settings_import_export_key));
Preference resetPreference = findPreference(getString(R.string.settings_reset_key));
boolean isRecording = recordingStatus.isRecording();
importExportPreference.setSummary(isRecording ? getString(R.string.settings_not_while_recording) : getString(R.string.settings_import_export_summary));
importExportPreference.setEnabled(!isRecording);
resetPreference.setSummary(isRecording ? getString(R.string.settings_not_while_recording) : getString(R.string.settings_reset_summary));
resetPreference.setEnabled(!isRecording);
}
}
@@ -47,6 +47,7 @@ import de.dennisguse.opentracks.io.file.TrackFileFormat;
import de.dennisguse.opentracks.io.file.TrackFilenameGenerator;
import de.dennisguse.opentracks.ui.customRecordingLayout.CsvLayoutUtils;
import de.dennisguse.opentracks.ui.customRecordingLayout.Layout;
import de.dennisguse.opentracks.util.IntentDashboardUtils;
import de.dennisguse.opentracks.util.TrackIconUtils;
/**
@@ -213,7 +214,6 @@ public class PreferencesUtils {
//TODO Check if actually needed or can be superseeded by a flexible default in getUnit()
public static void applyDefaultUnit() {
if (getString(R.string.stats_units_key, "").equals("")) {
if (!Locale.US.equals(Locale.getDefault())) {
setUnit(UnitSystem.METRIC);
} else {
@@ -323,7 +323,7 @@ public class PreferencesUtils {
UnitSystem unitSystem = getUnitSystem();
DistanceFormatter formatter = DistanceFormatter.Builder()
.setDecimalCount(0)
.setDecimalCount(1)
.setUnit(unitSystem)
.build(resources);
for (int i = 0; i < values.length; i++) {
@@ -342,13 +342,58 @@ public class PreferencesUtils {
return getFloat(R.string.voice_speed_rate_key, DEFAULT);
}
public static boolean shouldVoiceAnnounceHeartRate() {
return getBoolean(R.string.voice_announce_heart_rate_key, false);
public static boolean shouldVoiceAnnounceTotalDistance() {
return getBoolean(R.string.voice_announce_total_distance_key, true);
}
@VisibleForTesting
public static void setVoiceAnnounceHeartRate(boolean value) {
setBoolean(R.string.voice_announce_heart_rate_key, value);
public static void setVoiceAnnounceTotalDistance(boolean value) {
setBoolean(R.string.voice_announce_total_distance_key, value);
}
public static boolean shouldVoiceAnnounceMovingTime() {
return getBoolean(R.string.voice_announce_moving_time_key, true);
}
@VisibleForTesting
public static void setVoiceAnnounceMovingTime(boolean value) {
setBoolean(R.string.voice_announce_moving_time_key, value);
}
public static boolean shouldVoiceAnnounceAverageSpeedPace() {
return getBoolean(R.string.voice_announce_average_speed_pace_key, true);
}
@VisibleForTesting
public static void setVoiceAnnounceAverageSpeedPace(boolean value) {
setBoolean(R.string.voice_announce_average_speed_pace_key, value);
}
public static boolean shouldVoiceAnnounceLapSpeedPace() {
return getBoolean(R.string.voice_announce_lap_speed_pace_key, true);
}
@VisibleForTesting
public static void setVoiceAnnounceLapSpeedPace(boolean value) {
setBoolean(R.string.voice_announce_lap_speed_pace_key, value);
}
public static boolean shouldVoiceAnnounceLapHeartRate() {
return getBoolean(R.string.voice_announce_lap_heart_rate_key, false);
}
@VisibleForTesting
public static void setVoiceAnnounceLapHeartRate(boolean value) {
setBoolean(R.string.voice_announce_lap_heart_rate_key, value);
}
public static boolean shouldVoiceAnnounceAverageHeartRate() {
return getBoolean(R.string.voice_announce_average_heart_rate_key, false);
}
@VisibleForTesting
public static void setVoiceAnnounceAverageHeartRate(boolean value) {
setBoolean(R.string.voice_announce_average_heart_rate_key, value);
}
public static Distance getRecordingDistanceInterval() {
@@ -372,7 +417,7 @@ public class PreferencesUtils {
DistanceFormatter formatter = DistanceFormatter.Builder()
.setUnit(unitSystem)
.setDecimalCount(0)
.setDecimalCount(1)
.build(resources);
for (int i = 0; i < entryValues.length; i++) {
int value = Integer.parseInt(entryValues[i]);
@@ -388,6 +433,7 @@ public class PreferencesUtils {
}
break;
case IMPERIAL:
case NAUTICAL_IMPERIAL:
if (value == recordingDistanceIntervalDefault) {
entries[i] = resources.getString(R.string.value_integer_feet_recommended, (int) distance.toFT());
} else {
@@ -415,7 +461,7 @@ public class PreferencesUtils {
UnitSystem unitSystem = getUnitSystem();
DistanceFormatter formatter = DistanceFormatter.Builder()
.setDecimalCount(0)
.setDecimalCount(1)
.setUnit(unitSystem)
.build(resources);
for (int i = 0; i < entryValues.length; i++) {
@@ -432,6 +478,7 @@ public class PreferencesUtils {
}
break;
case IMPERIAL:
case NAUTICAL_IMPERIAL:
if (value == maxRecordingDistanceDefault) {
entries[i] = resources.getString(R.string.value_integer_feet_recommended, (int) distance.toFT());
} else {
@@ -487,7 +534,7 @@ public class PreferencesUtils {
UnitSystem unitSystem = getUnitSystem();
DistanceFormatter formatter = DistanceFormatter.Builder()
.setDecimalCount(0)
.setDecimalCount(1)
.setUnit(unitSystem)
.build(resources);
@@ -509,6 +556,7 @@ public class PreferencesUtils {
}
break;
case IMPERIAL:
case NAUTICAL_IMPERIAL:
if (value == recordingGPSAccuracyDefault) {
entries[i] = resources.getString(R.string.value_integer_feet_recommended, (int) distance.toFT());
} else if (value == recordingGPSAccuracyExcellent) {
@@ -560,6 +608,14 @@ public class PreferencesUtils {
entries[i] = resources.getString(R.string.value_float_mile_hour, valueMPH);
}
break;
case NAUTICAL_IMPERIAL:
double valueKnots = Speed.ofKMH(value).toKnots();
if (value == idleSpeedDefault) {
entries[i] = resources.getString(R.string.value_float_knots_recommended, valueKnots);
} else {
entries[i] = resources.getString(R.string.value_float_knots, valueKnots);
}
break;
default:
throw new RuntimeException("Not implemented");
}
@@ -761,4 +817,13 @@ public class PreferencesUtils {
public static void clear() {
sharedPreferences.edit().clear().commit();
}
public static void setShowOnMapFormat(final String showOnMapFormat) {
setString(R.string.show_on_map_format_key, showOnMapFormat);
}
public static String getShowOnMapFormat() {
return getString(R.string.show_on_map_format_key, IntentDashboardUtils.PREFERENCE_ID_ASK);
}
}
@@ -4,7 +4,8 @@ import de.dennisguse.opentracks.R;
public enum UnitSystem {
METRIC(R.string.stats_units_metric),
IMPERIAL(R.string.stats_units_imperial);
IMPERIAL(R.string.stats_units_imperial),
NAUTICAL_IMPERIAL(R.string.stats_units_nautical); // Nautical miles with feet
private final int preferenceIdentifier;
@@ -5,10 +5,15 @@ import android.content.SharedPreferences;
import android.os.Bundle;
import androidx.fragment.app.DialogFragment;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import java.util.Map;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.io.file.TrackFileFormat;
import de.dennisguse.opentracks.util.IntentDashboardUtils;
public class UserInterfaceSettingsFragment extends PreferenceFragmentCompat {
@@ -28,6 +33,8 @@ public class UserInterfaceSettingsFragment extends PreferenceFragmentCompat {
startActivity(intent);
return true;
});
setShowOnMapFormatOptions();
}
@Override
@@ -64,4 +71,14 @@ public class UserInterfaceSettingsFragment extends PreferenceFragmentCompat {
super.onDisplayPreferenceDialog(preference);
}
private void setShowOnMapFormatOptions() {
Map<String, String> options = TrackFileFormat.toPreferenceIdLabelMap(getResources(), IntentDashboardUtils.SHOW_ON_MAP_TRACK_FILE_FORMATS);
options.put(IntentDashboardUtils.PREFERENCE_ID_DASHBOARD, getString(R.string.show_on_dashboard));
options.put(IntentDashboardUtils.PREFERENCE_ID_ASK, getString(R.string.show_on_map_format_ask));
ListPreference listPreference = findPreference(getString(R.string.show_on_map_format_key));
listPreference.setEntries(options.values().toArray(new String[0]));
listPreference.setEntryValues(options.keySet().toArray(new String[0]));
}
}
@@ -1,72 +0,0 @@
package de.dennisguse.opentracks.share;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Pair;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Set;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.data.ShareContentProvider;
import de.dennisguse.opentracks.data.models.Track;
import de.dennisguse.opentracks.io.file.TrackFileFormat;
import de.dennisguse.opentracks.util.IntentDashboardUtils;
/**
* Used to convert IntentDashboardUtils.startDashboard-requests into {@link TrackFileFormat}.
*/
public abstract class ShowOnMapProxyActivity extends AppCompatActivity {
private final TrackFileFormat trackFileFormat;
protected ShowOnMapProxyActivity(TrackFileFormat trackFileFormat) {
this.trackFileFormat = trackFileFormat;
}
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Set<Track.Id> trackIds = IntentDashboardUtils.extractTrackIdsFromIntent(getIntent());
showTrackfileFormat(this, trackFileFormat, trackIds);
finish();
}
/**
* Send intent to show tracks on a map (needs an another app) as KMZ.
*
* @param context the context
* @param trackIds the track ids
*/
private static void showTrackfileFormat(Context context, TrackFileFormat trackFileFormat, Set<Track.Id> trackIds) {
if (trackIds.isEmpty()) {
return;
}
Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Pair<Uri, String> uriAndMime = ShareContentProvider.createURI(trackIds, "SharingTrack", trackFileFormat);
intent.setDataAndType(uriAndMime.first, uriAndMime.second);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startActivity(Intent.createChooser(intent, context.getString(R.string.open_track_as_trackfileformat, trackFileFormat.getExtension())));
}
public static class KML extends ShowOnMapProxyActivity {
public KML() {
super(TrackFileFormat.KML_WITH_TRACKDETAIL_AND_SENSORDATA);
}
}
public static class GPX extends ShowOnMapProxyActivity {
public GPX() {
super(TrackFileFormat.GPX);
}
}
}
@@ -1,32 +0,0 @@
package de.dennisguse.opentracks.stats;
import androidx.annotation.Nullable;
import de.dennisguse.opentracks.data.models.Altitude;
public class AltitudeRingBuffer extends RingBuffer<Altitude> {
private Altitude firstAltitude;
AltitudeRingBuffer(int size) {
super(size);
}
AltitudeRingBuffer(RingBuffer<Altitude> toCopy) {
super(toCopy);
}
@Nullable
@Override
protected Number from(Altitude object) {
if (firstAltitude == null) {
firstAltitude = object;
}
return object.toM();
}
@Override
protected Altitude to(double object) {
return firstAltitude.replace(object);
}
}
@@ -41,12 +41,6 @@ import de.dennisguse.opentracks.data.models.TrackPoint;
*/
public class TrackStatisticsUpdater {
/**
* The number of altitude readings to smooth to get a somewhat accurate signal.
*/
@VisibleForTesting
private static final int ALTITUDE_SMOOTHING_FACTOR = 25;
/**
* The number of speed reading to smooth to get a somewhat accurate signal.
*/
@@ -63,7 +57,6 @@ public class TrackStatisticsUpdater {
private final TrackStatistics trackStatistics;
private final AltitudeRingBuffer altitudeBuffer;
private final SpeedRingBuffer speedBuffer;
private float averageHeartRateBPM;
private Duration totalHeartRateDuration = Duration.ZERO;
@@ -86,7 +79,6 @@ public class TrackStatisticsUpdater {
this.trackStatistics = trackStatistics;
this.currentSegment = new TrackStatistics();
altitudeBuffer = new AltitudeRingBuffer(ALTITUDE_SMOOTHING_FACTOR);
speedBuffer = new SpeedRingBuffer(SPEED_SMOOTHING_FACTOR);
resetAverageHeartRate();
}
@@ -95,7 +87,6 @@ public class TrackStatisticsUpdater {
this.currentSegment = new TrackStatistics(toCopy.currentSegment);
this.trackStatistics = new TrackStatistics(toCopy.trackStatistics);
this.altitudeBuffer = new AltitudeRingBuffer(toCopy.altitudeBuffer);
this.speedBuffer = new SpeedRingBuffer(toCopy.speedBuffer);
this.lastTrackPoint = toCopy.lastTrackPoint;
@@ -140,11 +131,7 @@ public class TrackStatisticsUpdater {
//Update absolute (GPS-based) altitude
if (trackPoint.hasAltitude()) {
// Update altitude using the smoothed average
altitudeBuffer.setNext(trackPoint.getAltitude());
Altitude newAverage = altitudeBuffer.getAverage();
currentSegment.updateAltitudeExtremities(newAverage);
currentSegment.updateAltitudeExtremities(trackPoint.getAltitude());
}
// Update heart rate
@@ -198,7 +185,6 @@ public class TrackStatisticsUpdater {
currentSegment.reset(trackPoint.getTime());
lastTrackPoint = null;
altitudeBuffer.reset();
speedBuffer.reset();
resetAverageHeartRate();
}
@@ -208,14 +194,6 @@ public class TrackStatisticsUpdater {
totalHeartRateDuration = Duration.ZERO;
}
/**
* Gets the smoothed altitude over several readings.
* The altitude readings is noisy so the smoothed altitude is better than the raw altitude for many tasks.
*/
public Altitude getSmoothedAltitude() {
return altitudeBuffer.getAverage();
}
public Speed getSmoothedSpeed() {
return speedBuffer.getAverage();
}
@@ -107,17 +107,17 @@ public class IntervalsFragment extends Fragment {
// TODO handle empty view: before we did viewBinding.intervalList.setEmptyView(viewBinding.intervalListEmptyView);
viewBinding.intervalList.setAdapter(adapter);
final DistanceFormatter formatter = DistanceFormatter.Builder()
.setDecimalCount(0)
.setUnit(unitSystem)
.build(getContext());
intervalsAdapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_dropdown_item, IntervalStatisticsModel.IntervalOption.values()) {
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
TextView v = (TextView) super.getView(position, convertView, parent);
DistanceFormatter formatter = DistanceFormatter.Builder()
.setDecimalCount(0)
.setUnit(unitSystem)
.build(getContext());
IntervalStatisticsModel.IntervalOption option = getItem(position);
String stringValue = formatter.formatDistance(option.getDistance(unitSystem));
v.setText(stringValue);
@@ -181,7 +181,7 @@ public class MarkerListActivity extends AbstractActivity implements DeleteMarker
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
insertMarkerMenuItem.setVisible(track != null && track.getId().equals(recordingStatus.getTrackId()) && !recordingStatus.isPaused());
insertMarkerMenuItem.setVisible(track != null && track.getId().equals(recordingStatus.getTrackId()));
return super.onPrepareOptionsMenu(menu);
}
@@ -85,12 +85,6 @@ public class ExportUtils {
}
}
public static boolean isExportFileExists(UUID uuuid, String trackFileFormatExtension, List<String> filesName) {
String word = uuuid.toString().substring(0, 8) + ".*\\." + trackFileFormatExtension;
Pattern pattern = Pattern.compile(word);
return filesName.stream().anyMatch(w -> pattern.matcher(w).matches());
}
public static List<String> getAllFiles(Context context, Uri directoryUri) {
List<String> fileNames = new ArrayList<>();
final ContentResolver resolver = context.getContentResolver();
@@ -5,31 +5,45 @@ import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;
import android.util.Pair;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.data.ContentProviderUtils;
import de.dennisguse.opentracks.data.ShareContentProvider;
import de.dennisguse.opentracks.data.models.Track;
import de.dennisguse.opentracks.data.tables.MarkerColumns;
import de.dennisguse.opentracks.data.tables.TrackPointsColumns;
import de.dennisguse.opentracks.data.tables.TracksColumns;
import de.dennisguse.opentracks.io.file.TrackFileFormat;
import de.dennisguse.opentracks.settings.PreferencesUtils;
/**
* Create an {@link Intent} to request showing a Dashboard.
* Create an {@link Intent} to request showing tracks on a Map or a Dashboard.
* The receiving {@link android.app.Activity} gets temporary access to the {@link TracksColumns} and the {@link TrackPointsColumns} (incl. update).
*/
public class IntentDashboardUtils {
private static final String TAG = IntentDashboardUtils.class.getSimpleName();
private static final String ACTION_DASHBOARD = "Intent.OpenTracks-Dashboard";
private static final String ACTION_DASHBOARD_PAYLOAD = ACTION_DASHBOARD + ".Payload";
public static final TrackFileFormat[] SHOW_ON_MAP_TRACK_FILE_FORMATS = new TrackFileFormat[] {
TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA_AND_PICTURES,
TrackFileFormat.KML_WITH_TRACKDETAIL_AND_SENSORDATA,
TrackFileFormat.GPX};
public static final String PREFERENCE_ID_DASHBOARD = ACTION_DASHBOARD;
public static final String PREFERENCE_ID_ASK = "ASK";
/**
* Assume "v1" if not present.
*/
@@ -49,24 +63,78 @@ public class IntentDashboardUtils {
private static final int TRACK_URI_INDEX = 0;
private static final int TRACKPOINTS_URI_INDEX = 1;
private static final int MARKERS_URI_INDEX = 2;
private static final int NONE_SELECTED = -1;
private IntentDashboardUtils() {
}
/**
* Send intent to show tracks on a map (needs an another app) as resource URIs.
* Shows an AlertDialog with different format option if none is defined as preference.
*
* @param context the context
* @param isRecording are we currently recording?
* @param trackIds the track ids
*/
public static void startDashboard(Context context, boolean isRecording, Track.Id... trackIds) {
startDashboard(context, isRecording, null, null, trackIds);
public static void showTrackOnMap(Context context, boolean isRecording, Track.Id... trackIds) {
Map<String, String> options = TrackFileFormat.toPreferenceIdLabelMap(context.getResources(), IntentDashboardUtils.SHOW_ON_MAP_TRACK_FILE_FORMATS);
options.put(IntentDashboardUtils.PREFERENCE_ID_DASHBOARD, context.getString(R.string.show_on_dashboard));
final String[] optionLabels = options.values().toArray(new String[0]);
final String[] optionValues = options.keySet().toArray(new String[0]);
final AtomicInteger checkedItem = new AtomicInteger(NONE_SELECTED);
String preferenceValue = PreferencesUtils.getShowOnMapFormat();
for (int i = 0; i < optionValues.length; i++) {
if (optionValues[i].equals(preferenceValue)) {
checkedItem.set(i);
}
}
if (checkedItem.get() == NONE_SELECTED) {
checkedItem.set(0); // set first option as default
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(R.string.select_show_on_map_behavior);
builder.setSingleChoiceItems(optionLabels, checkedItem.get(), (dialog, which) -> checkedItem.set(which));
builder.setPositiveButton(android.R.string.ok, (dialog, which) -> onFormatSelected(context, isRecording, optionValues[checkedItem.get()], trackIds, false));
builder.setNeutralButton(R.string.always, ((dialog, which) -> onFormatSelected(context, isRecording, optionValues[checkedItem.get()], trackIds, true)));
builder.setNegativeButton(android.R.string.cancel, null);
AlertDialog dialog = builder.create();
dialog.show();
} else {
onFormatSelected(context, isRecording, preferenceValue, trackIds, true);
}
}
/**
* A format was selected, remember if <code>always</code> is true and start the necessary action
*
* @param context the context
* @param isRecording are we currently recording?
* @param selectedValue the chosen format
* @param trackIds the track ids
* @param always set the selectedValue as default preference
*/
private static void onFormatSelected(final Context context, final boolean isRecording, final String selectedValue, final Track.Id[] trackIds, final boolean always) {
if (always) {
PreferencesUtils.setShowOnMapFormat(selectedValue);
}
TrackFileFormat trackFileFormat = TrackFileFormat.valueOfPreferenceId(selectedValue);
if (trackFileFormat != null) {
showTrackOnMapWithFileFormat(context, trackFileFormat, Set.of(trackIds));
} else {
startDashboard(context, isRecording, null, null, trackIds);
}
}
/**
* Send intent to show tracks on a map (needs an another app) as resource URIs.
* By providing a targetPackage and targetClass an explicit intent can be sent,
* thus bypassing the need for the user to select an app.
*
* @param context the context
* @param isRecording are we currently recording?
* @param targetPackage the target package
* @param targetClass the target class
* @param trackIds the track ids
*/
public static void startDashboard(Context context, boolean isRecording, String targetPackage, String targetClass, Track.Id... trackIds) {
if (trackIds.length == 0) {
@@ -108,16 +176,27 @@ public class IntentDashboardUtils {
context.startActivity(intent);
}
public static Set<Track.Id> extractTrackIdsFromIntent(@NonNull Intent intent) {
final ArrayList<Uri> uris = intent.getParcelableArrayListExtra(ACTION_DASHBOARD_PAYLOAD);
final Uri tracksUri = uris.get(TRACK_URI_INDEX);
String[] trackIdsString = ContentProviderUtils.parseTrackIdsFromUri(tracksUri);
Set<Track.Id> trackIds = new HashSet<>(trackIdsString.length);
for (String s : trackIdsString) {
trackIds.add(new Track.Id(Long.parseLong(s)));
/**
* Send intent to show tracks on a map (needs an another app) to support specific trackFileFormat.
*
* @param context the context
* @param trackFileFormat the track file format
* @param trackIds the track ids
*/
private static void showTrackOnMapWithFileFormat(Context context, TrackFileFormat trackFileFormat, Set<Track.Id> trackIds) {
if (trackIds.isEmpty()) {
return;
}
return trackIds;
Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Pair<Uri, String> uriAndMime = ShareContentProvider.createURI(trackIds, "SharingTrack", trackFileFormat);
intent.setDataAndType(uriAndMime.first, uriAndMime.second);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startActivity(Intent.createChooser(intent, context.getString(R.string.open_track_as_trackfileformat, trackFileFormat.getExtension())));
}
}
@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z"/>
</vector>
+7 -7
View File
@@ -6,18 +6,18 @@
<path
android:pathData="M62.5,62.5m-59.984,0a59.984,59.984 0,1 1,119.968 0a59.984,59.984 0,1 1,-119.968 0"
android:strokeWidth="5.03185"
android:fillColor="#00000000"
android:strokeColor="#ff6d00"/>
android:fillColor="@android:color/transparent"
android:strokeColor="@color/opentracks_secondary_color"/>
<path
android:pathData="M62.5,62.5m-50,0a50,50 0,1 1,100 0a50,50 0,1 1,-100 0"
android:strokeWidth="6.91728"
android:fillColor="#ff6d00"
android:strokeColor="#00000000"/>
android:strokeWidth="1.0"
android:fillColor="@color/opentracks_secondary_color"
android:strokeColor="@color/opentracks_secondary_color"/>
<path
android:pathData="M38.62,63.866 L52.899,78.144 86.38,44.664"
android:strokeLineJoin="miter"
android:strokeWidth="6.2"
android:fillColor="#00000000"
android:strokeColor="#ffffff"
android:fillColor="@color/opentracks_secondary_color"
android:strokeColor="@android:color/white"
android:strokeLineCap="butt"/>
</vector>
-27
View File
@@ -1,27 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="82dp"
android:height="82dp"
android:viewportWidth="125"
android:viewportHeight="125">
<path
android:fillAlpha="1"
android:fillColor="#00000000"
android:pathData="M62.5,62.5m-59.984,0a59.984,59.984 0,1 1,119.968 0a59.984,59.984 0,1 1,-119.968 0"
android:strokeWidth="5.03185225"
android:strokeAlpha="1"
android:strokeColor="#a31a1f" />
<path
android:fillAlpha="0.87843137"
android:fillColor="#efefef"
android:pathData="M54,54.059h5v17.941h-5z"
android:strokeWidth="4.82273912"
android:strokeAlpha="1"
android:strokeColor="#00000000" />
<path
android:fillAlpha="0.87843137"
android:fillColor="#efefef"
android:pathData="M66,54h5v17.941h-5z"
android:strokeWidth="4.82273865"
android:strokeAlpha="1"
android:strokeColor="#00000000" />
</vector>
@@ -1,27 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="82dp"
android:height="82dp"
android:viewportWidth="125"
android:viewportHeight="125">
<path
android:fillAlpha="1"
android:fillColor="#00000000"
android:pathData="M62.5,62.5m-59.984,0a59.984,59.984 0,1 1,119.968 0a59.984,59.984 0,1 1,-119.968 0"
android:strokeWidth="5.03185225"
android:strokeAlpha="1"
android:strokeColor="#a31a1f" />
<path
android:fillAlpha="1"
android:fillColor="#9a191d"
android:pathData="M62.5,62.5m-50,0a50,50 0,1 1,100 0a50,50 0,1 1,-100 0"
android:strokeWidth="6.9172821"
android:strokeAlpha="1"
android:strokeColor="#00000000" />
<path
android:fillAlpha="1"
android:fillColor="#ffffff"
android:pathData="M62.5,61.5m-9.189,0a9.189,9.189 0,1 1,18.378 0a9.189,9.189 0,1 1,-18.378 0"
android:strokeWidth="1.62162137"
android:strokeAlpha="1"
android:strokeColor="#7e3b3d" />
</vector>
@@ -1,34 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="82dp"
android:height="82dp"
android:viewportWidth="125"
android:viewportHeight="125">
<path
android:fillColor="#00000000"
android:pathData="M62.5,62.5m-59.984,0a59.984,59.984 0,1 1,119.968 0a59.984,59.984 0,1 1,-119.968 0"
android:strokeWidth="5.0319"
android:strokeColor="#a31a1f" />
<path android:pathData="M62.5,62.5m-0,-50a50,50 0,1 1,-0 100a50,50 0,1 1,-0 -100">
<aapt:attr name="android:fillColor">
<gradient
android:endX="62.5"
android:endY="112.5"
android:startX="62.5"
android:startY="12.5"
android:type="linear">
<item
android:color="#FF721212"
android:offset="0" />
<item
android:color="#FFA21A1F"
android:offset="1" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#fff"
android:pathData="M62.5,61.5m-9.189,0a9.189,9.189 0,1 1,18.378 0a9.189,9.189 0,1 1,-18.378 0"
android:strokeWidth="1.6216"
android:strokeColor="#7e3b3d" />
</vector>
+6 -6
View File
@@ -6,17 +6,17 @@
<path
android:pathData="M62.5,62.5m-59.984,0a59.984,59.984 0,1 1,119.968 0a59.984,59.984 0,1 1,-119.968 0"
android:strokeWidth="5.03185"
android:fillColor="#00000000"
android:strokeColor="#ff6d00"/>
android:fillColor="@android:color/transparent"
android:strokeColor="@color/opentracks_secondary_color"/>
<path
android:pathData="M62.5,62.5m-50,0a50,50 0,1 1,100 0a50,50 0,1 1,-100 0"
android:strokeWidth="6.91728"
android:fillColor="#ff6d00"
android:strokeColor="#00000000"/>
android:fillColor="@color/opentracks_secondary_color"
android:strokeColor="@android:color/transparent"/>
<path
android:pathData="M87.6,62.5 L67.991,73.822 48.381,85.143l-0,-22.643 0,-22.643 19.61,11.322z"
android:strokeWidth="6.67087"
android:fillColor="#ffffff"
android:strokeColor="#00000000"
android:fillColor="@android:color/white"
android:strokeColor="@android:color/transparent"
android:strokeLineCap="round"/>
</vector>
-33
View File
@@ -1,33 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="82dp"
android:height="82dp"
android:viewportWidth="125"
android:viewportHeight="125">
<path
android:fillAlpha="1"
android:fillColor="#00000000"
android:pathData="M2.516,63.008a60.239,59.73 134.879,1 0,119.968 -1.017a60.239,59.73 134.879,1 0,-119.968 1.017z"
android:strokeWidth="5.03194237"
android:strokeAlpha="1"
android:strokeColor="#555555" />
<path
android:fillAlpha="1"
android:fillColor="#484848"
android:pathData="M62.5,62.5m-50,0a50,50 0,1 1,100 0a50,50 0,1 1,-100 0"
android:strokeWidth="6.9172821"
android:strokeAlpha="1"
android:strokeColor="#00000000" />
<path
android:fillAlpha="1"
android:fillColor="#ffffff"
android:fillType="nonZero"
android:pathData="M53.02,54.02h17.46v17.46h-17.46z"
android:strokeWidth="1.04023623"
android:strokeAlpha="1"
android:strokeColor="#414141" />
<path
android:name="fade_out_circle"
android:fillAlpha="0.0"
android:fillColor="#a31a1f"
android:pathData="M62.5,62.5m-0,-62a50,50 0,1 1,-0 123a50,50 0,1 1,-0 -123" />
</vector>
@@ -1,28 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="82dp"
android:height="82dp"
android:viewportWidth="125"
android:viewportHeight="125">
<path
android:fillAlpha="1"
android:fillColor="#00000000"
android:pathData="M2.516,63.008a60.239,59.73 134.879,1 0,119.968 -1.017a60.239,59.73 134.879,1 0,-119.968 1.017z"
android:strokeWidth="5.03194237"
android:strokeAlpha="1"
android:strokeColor="#2a2a2a" />
<path
android:fillAlpha="1"
android:fillColor="#2a2a2a"
android:pathData="M62.5,62.5m-50,0a50,50 0,1 1,100 0a50,50 0,1 1,-100 0"
android:strokeWidth="6.9172821"
android:strokeAlpha="1"
android:strokeColor="#00000000" />
<path
android:fillAlpha="1"
android:fillColor="#555555"
android:fillType="nonZero"
android:pathData="M54,56h15v15h-15z"
android:strokeWidth="1.56054175"
android:strokeAlpha="0.4"
android:strokeColor="#00000000" />
</vector>
@@ -1,34 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="82dp"
android:height="82dp"
android:viewportWidth="125"
android:viewportHeight="125">
<path
android:fillColor="#00000000"
android:pathData="M2.516,63.009a60.239,59.73 134.856,1 0,119.967 -1.017a60.239,59.73 134.856,1 0,-119.967 1.017z"
android:strokeWidth="5.0319"
android:strokeColor="#555" />
<path android:pathData="M62.5,62.5m-0,-50a50,50 0,1 1,-0 100a50,50 0,1 1,-0 -100">
<aapt:attr name="android:fillColor">
<gradient
android:endX="62.5"
android:endY="112.5"
android:startX="62.5"
android:startY="12.5"
android:type="linear">
<item
android:color="#FF404040"
android:offset="0" />
<item
android:color="#FF555555"
android:offset="1" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#dbdbdb"
android:pathData="M53.02,54.02h17.46v17.46h-17.46z"
android:strokeWidth="1.0402"
android:strokeColor="#414141" />
</vector>
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/loading_indeterminate"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/loading_text"
style="@style/TextAppearance.MaterialComponents.Headline5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAlignment="center"
app:layout_constraintVertical_chainStyle="packed"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/loading_indicator"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:text="Text" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/loading_indicator"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
app:layout_constraintTop_toBottomOf="@id/loading_text"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:indeterminate="true" />
</androidx.constraintlayout.widget.ConstraintLayout>
+3 -2
View File
@@ -74,8 +74,8 @@ limitations under the License.
style="?attr/textAppearanceHeadline6"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="5"
android:gravity="right"
android:layout_weight="10"
android:gravity="end"
android:text="@string/track_list_empty_message" />
<View
@@ -101,6 +101,7 @@ limitations under the License.
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_baseline_record_24"
android:contentDescription="@string/image_record"
app:layout_anchor="@id/bottom_app_bar" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
+1
View File
@@ -45,6 +45,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_baseline_record_24"
android:contentDescription="@string/image_stop"
app:layout_anchor="@id/bottom_app_bar" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
+200 -90
View File
@@ -2,114 +2,224 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical">
<include
android:id="@+id/fields"
layout="@layout/track_edit_fields" />
android:id="@+id/loading_layout"
layout="@layout/loading_indeterminate"
android:visibility="gone" />
<LinearLayout style="@style/BottomButtonBar">
<LinearLayout
android:id="@+id/content_linear_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:visibility="visible">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<ScrollView style="@style/ScrollView.WithBottomButtons">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="0dp"
android:layout_height="0dp"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5" />
android:padding="8dp">
<!-- Time -->
<TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="?attr/textAppearanceHeadline2"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:text="04:54:36" />
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="?attr/textInputOutlinedStyle"
android:hint="@string/generic_name"
android:imeOptions="actionNext"
android:importantForAutofill="no"
android:layout_marginBottom="16dp">
<!-- Distance -->
<TextView
android:id="@+id/distance"
style="?attr/textAppearanceHeadline3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toStartOf="@id/distance_unit"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/time"
tools:layout_editor_absoluteX="52dp"
tools:text="130" />
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/track_edit_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textCapSentences"
android:selectAllOnFocus="true" />
<TextView
android:id="@+id/distance_unit"
style="@style/TextAppearance.OpenTracks.PrimaryUnit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="@+id/distance"
app:layout_constraintEnd_toStartOf="@id/guideline"
app:layout_constraintStart_toEndOf="@+id/distance"
tools:text="km" />
</com.google.android.material.textfield.TextInputLayout>
<!-- Average moving speed -->
<TextView
android:id="@+id/speed"
style="?attr/textAppearanceHeadline3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toStartOf="@id/speed_unit"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toEndOf="@id/guideline"
app:layout_constraintTop_toBottomOf="@id/time"
tools:text="26,5" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/speed_unit"
style="@style/TextAppearance.OpenTracks.PrimaryUnit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="@id/speed"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/speed"
tools:text="km/h" />
<com.google.android.material.textfield.TextInputLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
style="?attr/textInputOutlinedExposedDropdownMenuStyle"
android:imeOptions="actionNext"
android:importantForAutofill="no"
android:layout_marginBottom="16dp">
<androidx.constraintlayout.widget.Barrier
android:id="@+id/stats_summary_barrier"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="bottom"
app:constraint_referenced_ids="time,distance,speed" />
<com.google.android.material.textfield.MaterialAutoCompleteTextView
android:id="@+id/track_edit_activity_type"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:hint="@string/track_edit_activity_type_hint"
android:imeOptions="actionNext"
android:selectAllOnFocus="true" />
<ImageView
android:id="@+id/resume_button"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_marginTop="48dp"
app:srcCompat="@drawable/ic_button_resume"
app:layout_constraintTop_toBottomOf="@id/stats_summary_barrier"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/finish_button"
app:layout_constraintBottom_toBottomOf="parent" />
</com.google.android.material.textfield.TextInputLayout>
<ImageView
android:id="@+id/finish_button"
android:layout_width="64dp"
android:layout_height="64dp"
app:srcCompat="@drawable/ic_button_done"
app:layout_constraintTop_toTopOf="@id/resume_button"
app:layout_constraintStart_toEndOf="@id/resume_button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="@id/resume_button" />
<ImageView
android:id="@+id/track_edit_activity_type_icon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="bottom"
tools:src="@drawable/ic_activity_bike_24dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="?attr/textInputOutlinedStyle"
android:hint="@string/generic_description"
android:imeOptions="actionNext"
android:importantForAutofill="no"
android:layout_marginBottom="16dp">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/track_edit_description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textCapSentences"
android:selectAllOnFocus="true" />
</com.google.android.material.textfield.TextInputLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="0dp"
android:layout_height="0dp"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5" />
<!-- Time -->
<TextView
android:id="@+id/time"
style="?attr/textAppearanceHeadline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="04:54:36" />
<!-- Distance -->
<TextView
android:id="@+id/distance"
style="?attr/textAppearanceHeadline3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toStartOf="@id/distance_unit"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/time"
tools:layout_editor_absoluteX="52dp"
tools:text="130" />
<TextView
android:id="@+id/distance_unit"
style="@style/TextAppearance.OpenTracks.PrimaryUnit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="@+id/distance"
app:layout_constraintEnd_toStartOf="@id/guideline"
app:layout_constraintStart_toEndOf="@+id/distance"
tools:text="km" />
<!-- Average moving speed -->
<TextView
android:id="@+id/speed"
style="?attr/textAppearanceHeadline3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toStartOf="@id/speed_unit"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toEndOf="@id/guideline"
app:layout_constraintTop_toBottomOf="@id/time"
tools:text="26,5" />
<TextView
android:id="@+id/speed_unit"
style="@style/TextAppearance.OpenTracks.PrimaryUnit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="@id/speed"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/speed"
tools:text="km/h" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</ScrollView>
<LinearLayout style="@style/BottomButtonBar">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/buttons_guideline"
android:layout_width="0dp"
android:layout_height="0dp"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5" />
<ImageView
android:id="@+id/discard_button"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginEnd="52dp"
android:contentDescription="@string/image_discard"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/resume_button"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_delete_forever_24dp" />
<ImageView
android:id="@+id/resume_button"
android:layout_width="64dp"
android:layout_height="64dp"
android:contentDescription="@string/image_record"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/buttons_guideline"
app:layout_constraintStart_toEndOf="@id/buttons_guideline"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_button_resume" />
<ImageView
android:id="@+id/finish_button"
android:layout_width="64dp"
android:layout_height="64dp"
android:contentDescription="@string/image_stop"
android:layout_marginStart="36dp"
app:layout_constraintBottom_toBottomOf="@id/resume_button"
app:layout_constraintStart_toEndOf="@id/resume_button"
app:layout_constraintTop_toTopOf="@id/resume_button"
app:srcCompat="@drawable/ic_button_done" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</LinearLayout>
-30
View File
@@ -117,7 +117,6 @@ limitations under the License.
<string name="generic_description_line">الوصف: %1$s</string>
<string name="generic_name">الاسم</string>
<string name="generic_name_line">الاسم: %1$s</string>
<string name="generic_paused">متوقف مؤقتًا</string>
<string name="generic_recording">جارٍ التسجيل…</string>
<string name="generic_save">حفظ</string>
<string name="generic_tracks">المسارات</string>
@@ -129,7 +128,6 @@ limitations under the License.
<string name="image_arrow">سهم</string>
<string name="image_marker">علامة</string>
<string name="image_marker_count">عدد العلامات</string>
<string name="image_pause">إيقاف مؤقت</string>
<string name="image_photo_marker">علامة الصورة</string>
<string name="image_record">تسجيل</string>
<string name="image_stop">إيقاف</string>
@@ -148,7 +146,6 @@ limitations under the License.
<!-- Marker Detail -->
<!-- Marker Edit -->
<string name="marker_edit_marker_type">نوع المُحدد (على سبيل المثال شلال)</string>
<string name="marker_edit_marker_type_hint">نوع المُحدد</string>
<!-- Marker List -->
<string name="marker_list_empty_message">ليس لديك أية علامات</string>
<!-- Menu -->
@@ -172,21 +169,14 @@ limitations under the License.
<string name="recording_service">خدمة التسجيل</string>
<!-- Search -->
<!-- Sensor State -->
<string name="sensor_state_battery">مستوى شحن البطارية</string>
<string name="sensor_state_cadence">الإيقاع</string>
<string name="sensor_state_cadence_value">%1$d دورة في الدقيقة</string>
<string name="sensor_state_heart_rate">معدل ضربات القلب</string>
<string name="sensor_state_heart_rate_value">%1$d نبضة في الدقيقة</string>
<string name="sensor_state_power">الطاقة</string>
<string name="sensor_state_power_value">%1$d واط</string>
<string name="settings_not_while_recording">غير متاح أثناء تسجيل مسار</string>
<string name="settings_show">إظهار</string>
<!-- Settings Advanced -->
<string name="settings_advanced">خيارات متقدمة</string>
<!-- Settings Chart -->
<string name="settings_chart_by_distance">بحسب المسافة</string>
<string name="settings_chart_by_time">بحسب الوقت</string>
<string name="settings_recording">التسجيل</string>
<string name="settings_recording_default_activity_title">نوع النشاط الافتراضي</string>
<string name="settings_recording_location_frequency_summary">%1$s‏ بين المواقع المسجلة</string>
<string name="settings_recording_max_recording_distance_summary">يتم إنشاء جزء جديد إذا كانت المسافة بين موقعين أكبر من %1$s</string>
@@ -200,7 +190,6 @@ limitations under the License.
<string name="settings_recording_track_name_number_option">عدد</string>
<string name="settings_recording_track_name_title">اسم المسار الافتراضي</string>
<!-- Settings Reset -->
<string name="settings_reset">إعادة تعيين</string>
<string name="settings_reset_confirm_message">ستتم إعادة جميع الإعدادات إلى القيم الافتراضية.</string>
<string name="settings_reset_confirm_title">إعادة التعيين الآن؟</string>
<string name="settings_reset_done">لقد تمت إعادة جميع الإعدادات إلى القيم الافتراضية</string>
@@ -311,25 +300,6 @@ limitations under the License.
<item quantity="many">%1$.1f ميلاً في الساعة</item>
<item quantity="other">%1$.1f من الأميال في الساعة</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s لكل كيلومتر</string>
<string name="voice_pace_per_mile">%1$s لكل ميل</string>
<string name="voice_template">%1$s‏ في‏ %2$s‏ بسرعة‏ %3$s</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="zero">المسافة الإجمالية 0 كيلومتر</item>
<item quantity="one">المسافة الإجمالية كيلومتر واحد</item>
<item quantity="two">المسافة الإجمالية 2 كيلومتر</item>
<item quantity="few">المسافة الإجمالية %1$.2f كيلومتر</item>
<item quantity="many">المسافة الإجمالية %1$.2f كيلومتر</item>
<item quantity="other">المسافة الإجمالية %1$.2f كيلومتر</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="zero">المسافة الإجمالية 2 ميل</item>
<item quantity="one">إجمالي المسافة ميل واحد</item>
<item quantity="two">المسافة الإجمالية 0 ميل</item>
<item quantity="few">المسافة الإجمالية %1$.2f أميال</item>
<item quantity="many">مجموع المسافة %1$.2f ميلاً</item>
<item quantity="other">المسافة الإجمالية %1$.2f من الأميال</item>
</plurals>
<!-- Waypoint Type -->
<string name="waypoint_type_atm">أجهزة الصراف الآلي</string>
<string name="waypoint_type_bank">مصرف</string>
-14
View File
@@ -97,7 +97,6 @@
<string name="generic_description_line">Description: %1$s</string>
<string name="generic_name">Name</string>
<string name="generic_name_line">Name: %1$s</string>
<string name="generic_paused">Paused</string>
<string name="generic_recording">Recording…</string>
<string name="generic_save">Save</string>
<string name="generic_tracks">Tracks</string>
@@ -107,7 +106,6 @@
<string name="image_arrow">Arrow</string>
<string name="image_marker">Marker</string>
<string name="image_marker_count">Marker count</string>
<string name="image_pause">Pause</string>
<string name="image_photo_marker">Photo marker</string>
<string name="image_record">Record</string>
<string name="image_stop">Stop</string>
@@ -122,7 +120,6 @@
<string name="marker_name_format">Marker %1$d</string>
<string name="marker_title">%1$d of %2$d</string>
<string name="marker_edit_marker_type">Marker type (e.g. waterfall)</string>
<string name="marker_edit_marker_type_hint">Marker type</string>
<string name="marker_list_empty_message">You don\'t have any markers</string>
<string name="menu_aggregated_statistics">Aggregated stats</string>
<string name="menu_delete">Delete</string>
@@ -141,19 +138,12 @@
<string name="menu_start_gps">Start GPS</string>
<string name="menu_stop_gps">Stop GPS</string>
<string name="recording_service">Recording service</string>
<string name="sensor_state_battery">Battery level</string>
<string name="sensor_state_cadence">Cadence</string>
<string name="sensor_state_cadence_value">%1$d rpm</string>
<string name="sensor_state_heart_rate">Heart rate</string>
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
<string name="sensor_state_power">Power</string>
<string name="sensor_state_power_value">%1$d W</string>
<string name="settings_not_while_recording">Not available while recording a track</string>
<string name="settings_show">Show</string>
<string name="settings_advanced">Advanced</string>
<string name="settings_chart_by_distance">By distance</string>
<string name="settings_chart_by_time">By time</string>
<string name="settings_recording">Recording</string>
<string name="settings_recording_default_activity_title">Default activity type</string>
<string name="settings_recording_location_frequency_summary">%1$s between recorded locations</string>
<string name="settings_recording_max_recording_distance_summary">A new segment is created if the distance between two locations is greater than %1$s</string>
@@ -166,7 +156,6 @@
<string name="settings_recording_track_name_date_local_option">Date (local)</string>
<string name="settings_recording_track_name_number_option">Number</string>
<string name="settings_recording_track_name_title">Default track name</string>
<string name="settings_reset">Reset</string>
<string name="settings_reset_confirm_message">All settings will be reverted to default values.</string>
<string name="settings_reset_confirm_title">Reset now?</string>
<string name="settings_reset_done">All settings have been reverted to default values</string>
@@ -243,9 +232,6 @@
<item quantity="one">1 mile per hour</item>
<item quantity="other">%1$.1f miles per hour</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s per kilometer</string>
<string name="voice_pace_per_mile">%1$s per mile</string>
<string name="voice_template">%1$s in %2$s at %3$s</string>
<string name="waypoint_type_atm">Cashpoint</string>
<string name="waypoint_type_bank">bank</string>
<string name="waypoint_type_bar">bar/pub</string>
-31
View File
@@ -97,7 +97,6 @@
<string name="generic_description_line">Descripción: %1$s</string>
<string name="generic_name">Nombre</string>
<string name="generic_name_line">Nombre: %1$s</string>
<string name="generic_paused">En pausa</string>
<string name="generic_recording">Grabando…</string>
<string name="generic_save">Guardar</string>
<string name="generic_tracks">Recorridos</string>
@@ -107,7 +106,6 @@
<string name="image_arrow">Flecha</string>
<string name="image_marker">Marcador</string>
<string name="image_marker_count">Recuento de marcadores</string>
<string name="image_pause">Pausa</string>
<string name="image_photo_marker">Marcador de foto</string>
<string name="image_record">Grabar</string>
<string name="image_stop">Parar</string>
@@ -122,7 +120,6 @@
<string name="marker_name_format">Marcador %1$d</string>
<string name="marker_title">%1$d de %2$d</string>
<string name="marker_edit_marker_type">Tipo de marcador (p. ej., cascada)</string>
<string name="marker_edit_marker_type_hint">Tipo de marcador</string>
<string name="marker_list_empty_message">No tienes ningún marcador</string>
<string name="menu_aggregated_statistics">Estadíst. globales</string>
<string name="menu_delete">Eliminar</string>
@@ -143,19 +140,12 @@
<string name="menu_stop_gps">Detener GPS</string>
<string name="menu_resume_track">Reanudar recorrido</string>
<string name="recording_service">Servicio de grabación</string>
<string name="sensor_state_battery">Nivel de la batería</string>
<string name="sensor_state_cadence">Cadencia</string>
<string name="sensor_state_cadence_value">%1$d rpm</string>
<string name="sensor_state_heart_rate">Frecuencia cardíaca</string>
<string name="sensor_state_heart_rate_value">%1$d lpm</string>
<string name="sensor_state_power">Potencia</string>
<string name="sensor_state_power_value">%1$d W</string>
<string name="settings_not_while_recording">No está disponible durante la grabación de un recorrido</string>
<string name="settings_show">Mostrar</string>
<string name="settings_advanced">Opciones avanzadas</string>
<string name="settings_chart_by_distance">Por distancia</string>
<string name="settings_chart_by_time">Por tiempo</string>
<string name="settings_recording">Grabación</string>
<string name="settings_recording_default_activity_title">Tipo de actividad predeterminada</string>
<string name="settings_recording_location_frequency_summary">%1$s entre las ubicaciones grabadas</string>
<string name="settings_recording_max_recording_distance_summary">Se crea un nuevo tramo si la distancia entre dos ubicaciones es superior a %1$s</string>
@@ -168,7 +158,6 @@
<string name="settings_recording_track_name_date_local_option">Fecha (local)</string>
<string name="settings_recording_track_name_number_option">Número</string>
<string name="settings_recording_track_name_title">Nombre de recorrido predeterminado</string>
<string name="settings_reset">Restablecer</string>
<string name="settings_reset_confirm_message">Todos las configuraciones se restablecerán a los valores predeterminados. Esto no eliminará ningún recorrido en el dispositivo.</string>
<string name="settings_reset_confirm_title">¿Restablecer ahora?</string>
<string name="settings_reset_done">Se restablecieron los valores predeterminados de todas las configuraciones</string>
@@ -246,17 +235,6 @@
<item quantity="one">1 milla por hora</item>
<item quantity="other">%1$.1f millas por hora</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s por kilómetro</string>
<string name="voice_pace_per_mile">%1$s por milla</string>
<string name="voice_template">%1$s en %2$s a %3$s</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="one">distancia total de 1 kilómetro</item>
<item quantity="other">distancia total de %1$.2f kilómetros</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="one">distancia total de 1 milla</item>
<item quantity="other">distancia total de %1$.2f millas</item>
</plurals>
<string name="waypoint_type_atm">cajero automático</string>
<string name="waypoint_type_bank">banco</string>
<string name="waypoint_type_bar">barra</string>
@@ -320,10 +298,8 @@
<string name="settings_recording_show_on_lockscreen_while_recording_title">Mostrar estadísticas en pantalla de bloqueo</string>
<string name="permission_gps_failed">OpenTracks necesita permiso para usar el GPS.</string>
<string name="settings_recording_keep_screen_on_while_recording_title">Mantener la pantalla encendida</string>
<string name="settings_sensor_disconnected">Desconectado de %1$s</string>
<string name="instant_export_enabled_title">Exportación instantánea post-entrenamiento</string>
<string name="hold_to_stop">Mantener para parar</string>
<string name="hold_to_pause">Mantener para pausar</string>
<string name="settings_sensor_wheel_circumference">Circunferencia de la rueda (mm)</string>
<string name="sensor_state_cadence_avg">Ritmo promedio</string>
<string name="sensor_state_heart_rate_avg">Tasa cardíaca promedio</string>
@@ -337,8 +313,6 @@
<string name="settings_night_mode_option_system">Sistema</string>
<string name="settings_night_mode_option_day">Día</string>
<string name="settings_night_mode_option_night">Noche</string>
<string name="settings_error_initial_values_restored">Lo sentimos, pero ha ocurrido un error. Todas las configuraciones se han revertido a los valores predeterminados.</string>
<string name="settings_sensor_connecting">Conectado a %1$s</string>
<string name="track_speed_notification">Velocidad: %1$s</string>
<string name="instant_export_enabled_summary">Exportar el recorrido al almacenamiento una vez finalizada la grabación</string>
<string name="description_altitude_loss">Pérdida de elevación: %1$d m (%2$d pies)</string>
@@ -378,8 +352,6 @@
\na) (actualizaciones en vivo) Instale <a href="https://github.com/OpenTracksApp/OSMDashboard"> OSMDashboard </a>. Proporciona mapas en línea o fuera de línea a través de <a href="https://www.openstreetmap.org"> OpenStreetMap </a>.
\nEn realidad, OSMDashboard es una aplicación separada que solo puede acceder (temporalmente) a los datos de los recorridos que se mostrarán.
\nb) A través de una aplicación de mapas normal (p. ej., <a href="http://osmand.net/"> OsmAnd </a> y <a href="https://maps.me/"> MAPS.ME </a>). Estas aplicaciones deben admitir el formato de archivo KMZ (solo ubicaciones y marcas de tiempo). De hecho, una aplicación debe admitir <i> ACTION_VIEW </i> con MIME <i> application / vnd.google-earth.kmz</i>. </string>
<string name="voice_speed_lap">Velocidad de vuelta de %1$s</string>
<string name="voice_pace_lap">Tiempo de vuelta de %1$s</string>
<string name="delete_service">Borrar servicio</string>
<string name="about_third_party_data">Datos de terceros</string>
<string name="about_libraries">Bibliotecas</string>
@@ -447,7 +419,6 @@
<string name="settings_announcements_totaltime_frequency">Intervalo de tiempo</string>
<string name="settings_announcements_distance_frequency">Intervalo de distancia</string>
<string name="settings_layout_reset">Restablecer pantalla personalizada</string>
<string name="settings_announcements">Anuncios</string>
<string name="settings_layout_reset_confirm_title">¿Restablecer todos los diseños\?</string>
<string name="settings_layout_reset_done">Todos los diseños se han revertido a los valores predeterminados</string>
<string name="settings_all_reset">Restablecer</string>
@@ -464,7 +435,6 @@
<string name="settings_sensor_running_speed_and_cadence">Distancia, velocidad y cadencia</string>
<string name="stats_coordinates">Latitud/Longitud</string>
<string name="location_coordinate">%1$s°</string>
<string name="title_activity_settings_custom_layout">Personalizar pantalla de grabación</string>
<string name="generic_choose_an_option">Selecciona una opción</string>
<string name="settings_sensor_cycling_distance_speed">Distancia y velocidad</string>
<string name="settings_sensor_cycling_cadence">Cadencia</string>
@@ -550,6 +520,5 @@
</plurals>
<string name="average_heart_rate">Ritmo cardíaco promedio</string>
<string name="current_heart_rate">Ritmo cardíaco actual</string>
<string name="settings_announcements_report_heart_rate">Anunciar ritmo cardíaco</string>
<string name="settings_export_filename_title">Formato del nombre del archivo</string>
</resources>
+1 -28
View File
@@ -117,7 +117,6 @@ limitations under the License.
<string name="generic_description_line">Описание: %1$s</string>
<string name="generic_name">Име</string>
<string name="generic_name_line">Име: %1$s</string>
<string name="generic_paused">На пауза</string>
<string name="generic_recording">Записва се…</string>
<string name="generic_save">Запазване</string>
<string name="generic_tracks">Маршрути</string>
@@ -129,7 +128,6 @@ limitations under the License.
<string name="image_arrow">Стрелка</string>
<string name="image_marker">Маркер</string>
<string name="image_marker_count">Брой маркери</string>
<string name="image_pause">Пауза</string>
<string name="image_photo_marker">Маркер за снимки</string>
<string name="image_record">Запис</string>
<string name="image_stop">Спиране</string>
@@ -148,7 +146,6 @@ limitations under the License.
<!-- Marker Detail -->
<!-- Marker Edit -->
<string name="marker_edit_marker_type">Тип маркер (напр. водопад)</string>
<string name="marker_edit_marker_type_hint">Тип маркер</string>
<!-- Marker List -->
<string name="marker_list_empty_message">Нямате маркери</string>
<!-- Menu -->
@@ -172,21 +169,14 @@ limitations under the License.
<string name="recording_service">Услуга за запис</string>
<!-- Search -->
<!-- Sensor State -->
<string name="sensor_state_battery">Ниво на батерията</string>
<string name="sensor_state_cadence">Такт</string>
<string name="sensor_state_cadence_value">%1$d об/мин</string>
<string name="sensor_state_heart_rate">Сърдечен ритъм</string>
<string name="sensor_state_heart_rate_value">%1$d уд/мин</string>
<string name="sensor_state_power">Захранване</string>
<string name="sensor_state_power_value">%1$d W</string>
<string name="settings_not_while_recording">Не е налице при записване на маршрут</string>
<string name="settings_show">Показване</string>
<!-- Settings Advanced -->
<string name="settings_advanced">Разширени</string>
<!-- Settings Chart -->
<string name="settings_chart_by_distance">По разстояние</string>
<string name="settings_chart_by_time">По време</string>
<string name="settings_recording">Записване</string>
<string name="settings_recording_default_activity_title">Тип стандартна дейност</string>
<string name="settings_recording_location_frequency_summary">%1$s между записаните местоположения</string>
<string name="settings_recording_max_recording_distance_summary">Създава се нова отсечка, ако разстоянието между две местоположения е по-голямо от %1$s</string>
@@ -200,7 +190,6 @@ limitations under the License.
<string name="settings_recording_track_name_number_option">Число</string>
<string name="settings_recording_track_name_title">Стандартен маршрут: Име</string>
<!-- Settings Reset -->
<string name="settings_reset">Нулиране</string>
<string name="settings_reset_confirm_message">Всички настройки ще бъдат върнати към стандартните им стойности.</string>
<string name="settings_reset_confirm_title">Да се зададе ли повторно сега?</string>
<string name="settings_reset_done">Всички настройки са възстановени до стойностите по подразбиране</string>
@@ -292,17 +281,6 @@ limitations under the License.
<item quantity="one">1 миля в час</item>
<item quantity="other">%1$.1f мили в час</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s на километър</string>
<string name="voice_pace_per_mile">%1$s на миля</string>
<string name="voice_template">%1$s за %2$s при %3$s</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="one">общо разстояние 1 километър</item>
<item quantity="other">общо разстояние %1$.2f километра</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="one">общо разстояние 1 миля</item>
<item quantity="other">общо разстояние %1$.2f мили</item>
</plurals>
<!-- Waypoint Type -->
<string name="waypoint_type_atm">Банкомат</string>
<string name="waypoint_type_bank">банка</string>
@@ -404,7 +382,6 @@ limitations under the License.
<string name="help_storage_pictures_title">Как OpenTracks съхранява снимките, които са направени като маркери\?</string>
<string name="bluetooth_disabled">Моля, включете Bluetooth.</string>
<string name="sensor_could_not_scan">Не можа да сканира за Bluetooth устройства (грешка %1$i).</string>
<string name="hold_to_pause">Задръжте за пауза</string>
<string name="interval_list_empty_message">Все още няма интервали</string>
<string name="track_detail_intervals_tab">Интервали</string>
<string name="settings_recording_show_on_lockscreen_while_recording_summary">По време на запис показвайте статистически данни, без да отключвате устройството.</string>
@@ -440,13 +417,12 @@ limitations under the License.
<string name="export_track_errors">Не се експортират писти</string>
<string name="gps_disabled_msg">GPS е изключен</string>
<string name="share_image_body">Мисля, че тази снимка може да ви заинтересува.</string>
<string name="voice_speed_lap">Скорост на обиколка от %1$s</string>
<string name="help_support_title">Как да подкрепя OpenTracks\?</string>
<string name="permission_gps_failed">OpenTracks изисква разрешение за използване на GPS.</string>
<string name="sensor_state_power_avg">Средна мощност</string>
<string name="help_feature_title">OpenTracks има следните функции:</string>
<string name="delete_service">Услуга за изтриване</string>
<string name="settings_sensor_disconnected">Изключен от %1$s</string>
<string name="settings_night_mode_option_system">Система</string>
<string name="settings_prevent_reimport_tracks_title">Забрана за повторно импортиране на песни</string>
<string name="export_progress_summary_skip_msg">Пропуснати писти</string>
@@ -455,7 +431,6 @@ limitations under the License.
<string name="about_libraries">Библиотеки</string>
<string name="sensor_state_cadence_avg">Среден каданс</string>
<string name="settings_sensor_wheel_circumference">Обиколка на колелото (mm)</string>
<string name="settings_sensor_connecting">Свързан към %1$s</string>
<string name="description_default_speed_or_pace">По вид дейност</string>
<string name="import_error_list_dialog_title">Файловете не се импортират</string>
<string name="generic_overwrite">Презапис</string>
@@ -474,7 +449,6 @@ limitations under the License.
\n д) да купувате в <a href="https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore">Google Play Store</a>,
\n е) да направите дарение, и
\n ж) направете всичко, което смятате, че помага на OpenTracks. </string>
<string name="voice_pace_lap">Време на обиколка от %1$s</string>
<string name="generic_click_twice_cancel">Кликнете отново назад, за да отмените</string>
<plurals name="generic_completed_with_errors">
<item quantity="one">Завърши с една грешка</item>
@@ -488,7 +462,6 @@ limitations under the License.
<string name="export_error_post_workout">Експортът след тренировка е неуспешен, моля, проверете директорията за експорт.</string>
<string name="about_third_party_data">Данни от трети страни</string>
<string name="import_unsupported_format">Неподдържан формат на файла</string>
<string name="settings_error_initial_values_restored">Съжаляваме, но възникна грешка. Всички настройки са възстановени до стойностите по подразбиране.</string>
<string name="import_parser_error">Грешка при парсера: %1$s</string>
<string name="instant_export_enabled_summary">Експортиране на запис в хранилището след приключване на записа</string>
<string name="settings_sensor_cycling_cadence">Колоездене: каданс</string>
-22
View File
@@ -117,7 +117,6 @@ limitations under the License.
<string name="generic_description_line">Descripció: %1$s</string>
<string name="generic_name">Nom</string>
<string name="generic_name_line">Nom: %1$s</string>
<string name="generic_paused">En pausa</string>
<string name="generic_recording">S\'està enregistrant…</string>
<string name="generic_save">Desa</string>
<string name="generic_tracks">Rutes</string>
@@ -129,7 +128,6 @@ limitations under the License.
<string name="image_arrow">Fletxa</string>
<string name="image_marker">Marcador</string>
<string name="image_marker_count">Recompte de marcadors</string>
<string name="image_pause">Atura</string>
<string name="image_photo_marker">Marcador de fotos</string>
<string name="image_record">Enregistra</string>
<string name="image_stop">Atura</string>
@@ -148,7 +146,6 @@ limitations under the License.
<!-- Marker Detail -->
<!-- Marker Edit -->
<string name="marker_edit_marker_type">Tipus de marcador (p. ex. cascada)</string>
<string name="marker_edit_marker_type_hint">Tipus de marcador</string>
<!-- Marker List -->
<string name="marker_list_empty_message">No teniu cap marcador.</string>
<!-- Menu -->
@@ -172,21 +169,14 @@ limitations under the License.
<string name="recording_service">Servei d\'enregistrament</string>
<!-- Search -->
<!-- Sensor State -->
<string name="sensor_state_battery">Nivell de la bateria</string>
<string name="sensor_state_cadence">Cadència</string>
<string name="sensor_state_cadence_value">%1$d rpm</string>
<string name="sensor_state_heart_rate">Freqüència cardíaca</string>
<string name="sensor_state_heart_rate_value">%1$d ppm</string>
<string name="sensor_state_power">Potència</string>
<string name="sensor_state_power_value">%1$d W</string>
<string name="settings_not_while_recording">No està disponible durant l\'enregistrament d\'una ruta.</string>
<string name="settings_show">Mostra\'n més</string>
<!-- Settings Advanced -->
<string name="settings_advanced">Avançades</string>
<!-- Settings Chart -->
<string name="settings_chart_by_distance">Per distància</string>
<string name="settings_chart_by_time">Per temps</string>
<string name="settings_recording">Enregistrament</string>
<string name="settings_recording_default_activity_title">Activitat predeterminada</string>
<string name="settings_recording_location_frequency_summary">%1$s entre ubicacions registrades</string>
<string name="settings_recording_max_recording_distance_summary">Es crea un tram si la distància entre dues ubicacions és superior a %1$s.</string>
@@ -200,7 +190,6 @@ limitations under the License.
<string name="settings_recording_track_name_number_option">Número</string>
<string name="settings_recording_track_name_title">Nom de la ruta</string>
<!-- Settings Reset -->
<string name="settings_reset">Restableix</string>
<string name="settings_reset_confirm_message">Es tornaran a definir els valors predeterminats de la configuració.</string>
<string name="settings_reset_confirm_title">Voleu restablir-ho ara?</string>
<string name="settings_reset_done">S\'ha recuperat la configuració predeterminada.</string>
@@ -290,17 +279,6 @@ limitations under the License.
<item quantity="one">1 milla per hora</item>
<item quantity="other">%1$.1f milles per hora</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s per quilòmetre</string>
<string name="voice_pace_per_mile">%1$s per milla</string>
<string name="voice_template">%1$s en %2$s a %3$s</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="one">1 quilòmetre de distància total</item>
<item quantity="other">%1$.2f quilòmetres de distància total</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="one">1 milla de distància total</item>
<item quantity="other">%1$.2f milles de distància total</item>
</plurals>
<!-- Waypoint Type -->
<string name="waypoint_type_atm">caixer</string>
<string name="waypoint_type_bank">banc</string>
+1 -39
View File
@@ -166,7 +166,6 @@ limitations under the License.
<string name="generic_description_line">Popis: %1$s</string>
<string name="generic_name">Název</string>
<string name="generic_name_line">Název: %1$s</string>
<string name="generic_paused">Pozastaveno</string>
<string name="generic_recording">Nahrávání…</string>
<string name="generic_save">Uložit</string>
<string name="generic_tracks">Trasy</string>
@@ -178,7 +177,6 @@ limitations under the License.
<string name="image_arrow">Šipka</string>
<string name="image_marker">Značka</string>
<string name="image_marker_count">Počet značek</string>
<string name="image_pause">Pozastavit</string>
<string name="image_photo_marker">Fotografická značka</string>
<string name="image_record">Zaznamenat</string>
<string name="image_stop">Ukončit</string>
@@ -198,7 +196,6 @@ limitations under the License.
<!-- Marker Detail -->
<!-- Marker Edit -->
<string name="marker_edit_marker_type">Typ značky (např. vodopád)</string>
<string name="marker_edit_marker_type_hint">Typ značky</string>
<!-- Marker List -->
<string name="marker_list_empty_message">Nemáte žádné značky</string>
<!-- Menu -->
@@ -226,17 +223,11 @@ limitations under the License.
<string name="permission_gps_failed">OpenTracks vyžaduje povolení k používání GPS.</string>
<!-- Search -->
<!-- Sensor State -->
<string name="sensor_state_battery">Stav baterie</string>
<string name="sensor_state_cadence">Frekvence chůze</string>
<string name="sensor_state_cadence_value">%1$d ot./min</string>
<string name="sensor_state_heart_rate">Srdeční frekvence</string>
<string name="sensor_state_heart_rate_value">%1$d úderů/min</string>
<string name="sensor_state_power">Napájení</string>
<string name="sensor_state_power_value">%1$d W</string>
<string name="sensor_could_not_scan">Nelze vyhledat zařízení Bluetooth (chyba %1$i).</string>
<string name="bluetooth_disabled">Aktivujte prosím Bluetooth.</string>
<string name="settings_not_while_recording">Při záznamu trasy není tato funkce dostupná</string>
<string name="settings_show">Zobrazit</string>
<!-- Settings Advanced -->
<string name="settings_advanced">Pokročilé</string>
<!-- Settings Chart -->
@@ -247,7 +238,6 @@ limitations under the License.
<string name="settings_recording_show_on_lockscreen_while_recording_summary">Během nahrávání zobrazte statistiky bez odemknutí zařízení.</string>
<string name="settings_recording_keep_screen_on_while_recording_title">Nechte obrazovku zapnutou</string>
<string name="settings_recording_keep_screen_on_while_recording_summary">Během nahrávání udržovat obrazovku zapnutou.</string>
<string name="settings_recording">Záznam</string>
<string name="settings_recording_default_activity_title">Výchozí typ aktivity</string>
<string name="settings_recording_location_frequency_summary">%1$s mezi zaznamenanými polohami</string>
<string name="settings_recording_max_recording_distance_summary">Vytvořit nový segment pokud je vzdálenost mezi dvěma polohami větší než %1$s</string>
@@ -261,15 +251,11 @@ limitations under the License.
<string name="settings_recording_track_name_number_option">Číslo</string>
<string name="settings_recording_track_name_title">Výchozí název trasy</string>
<!-- Settings Reset -->
<string name="settings_reset">Resetovat</string>
<string name="settings_reset_confirm_message">Všechna nastavení budou obnovena na výchozí hodnoty. Toto nevymaže žádné trasy na přístroji.</string>
<string name="settings_reset_confirm_title">Resetovat nyní?</string>
<string name="settings_reset_done">Všechna nastavení byla obnovena na výchozí hodnoty</string>
<string name="settings_error_initial_values_restored">Litujeme, ale došlo k chybě. Všechna nastavení byla vrácena na výchozí hodnoty.</string>
<!-- Settings Sensor -->
<string name="settings_sensor_bluetooth">Bluetooth</string>
<string name="settings_sensor_connecting">Připojeno k senzoru %1$s</string>
<string name="settings_sensor_disconnected">Odpojeno od %1$s</string>
<!-- Settings Stats -->
<string name="settings_stats_rate_title">Preferovaná rychlost</string>
<string name="settings_stats_units_imperial">Imperiální jednotky (míle, stopy)</string>
@@ -362,19 +348,6 @@ limitations under the License.
<item quantity="few">%1$.1f míle za hodinu</item>
<item quantity="other">%1$.1f mil za hodinu</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s na kilometr</string>
<string name="voice_pace_per_mile">%1$s na míli</string>
<string name="voice_template">%1$s za %2$s rychlostí %3$s</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="one">celková vzdálenost 1 kilometr</item>
<item quantity="few">celková vzdálenost %1$.2f kilometry</item>
<item quantity="other">celková vzdálenost %1$.2f kilometrů</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="one">celková vzdálenost 1 míle</item>
<item quantity="few">celková vzdálenost %1$.2f míle</item>
<item quantity="other">celková vzdálenost %1$.2f mil</item>
</plurals>
<!-- Waypoint Type -->
<string name="waypoint_type_atm">Bankomat</string>
<string name="waypoint_type_bank">banka</string>
@@ -449,8 +422,6 @@ limitations under the License.
<string name="settings_sensor_wheel_circumference">Obvod kola (mm)</string>
<string name="stats_split_interval">Rozdělit interval</string>
<string name="track_detail_intervals_tab">Intervaly</string>
<string name="voice_pace_lap">Čas na kolo %1$s</string>
<string name="hold_to_pause">Podržet pro pozastavení</string>
<string name="instant_export_enabled_title">Instantní export po tréninku</string>
<string name="settings_default_export_uri_title">Adresář pro export tras</string>
<string name="import_thread_interrupted">Vlákno přerušeno</string>
@@ -473,7 +444,6 @@ limitations under the License.
<string name="settings_night_mode_option_system">Systémový</string>
<string name="aggregated_stats_empty_message">Zaznamenejte svou první trasu pro zobrazení agregované statistiky</string>
<string name="interval_list_empty_message">Ještě zde nejsou žádné intervaly</string>
<string name="voice_speed_lap">Rychlost na kolo %1$s</string>
<string name="hold_to_stop">Podržet pro ukončení</string>
<string name="instant_export_enabled_summary">Exportovat trasu na úložiště po ukončení záznamu</string>
<plurals name="generic_completed_with_errors">
@@ -508,14 +478,12 @@ limitations under the License.
<string name="settings_sensor_running_speed_and_cadence">Vzdálenost, rychlost a kadence</string>
<string name="settings_recording_customize_layout_title">Přizpůsobit vzhled měření</string>
<string name="settings_recording_customize_layout_select_columns">Počet polí na řádek</string>
<string name="title_activity_settings_custom_layout">Přizpůsobit vzhled měření</string>
<string name="field_set_primary">První</string>
<string name="field_set_secondary">Druhý</string>
<string name="field_remove_from_layout">Odstranit</string>
<string name="settings_announcements_totaltime_frequency">Časový interval</string>
<string name="settings_announcements_distance_frequency">Interval vzdálenosti</string>
<string name="settings_all_reset">Obnovení</string>
<string name="settings_announcements">Oznámení</string>
<string name="settings_layout_reset">Nastavit výchozí vzhled</string>
<string name="settings_layout_reset_confirm_message">Všechna nastavení vzhledu se vrátí na výchozí hodnoty. Nebudou tím odstraněny žádné zaznamenané aktivity v zařízení.</string>
<string name="settings_layout_reset_confirm_title">Výchozí vzhled\?</string>
@@ -547,7 +515,7 @@ limitations under the License.
<string name="settings_activity_defaults_category">Výchozí nastavení aktivity</string>
<string name="settings_units_category">Jednotky</string>
<string name="settings_import_export_summary">Import, export, automatický export</string>
<string name="settings_import_export_title">Dovoz/vývoz</string>
<string name="settings_import_export_title">Import/Export</string>
<string name="settings_announcements_summary">Čas, vzdálenost, rychlost hlasu</string>
<string name="settings_announcements_title">Hlasová oznámení</string>
<string name="settings_sensors_title">Bluetooth senzory</string>
@@ -578,7 +546,6 @@ limitations under the License.
<string name="export_dir_not_writable">" (nelze zapisovat!)"</string>
<string name="generic_today">Dnes</string>
<string name="no_compatible_file_manager_installed">Není nainstalován kompatibilní správce souborů</string>
<string name="settings_announcements_report_heart_rate">Hlásit tepovou frekvenci</string>
<string name="voice_per_kilometer">za kilometr</string>
<string name="lap_time">Čas kola</string>
<string name="lap_speed">Rychlost kola</string>
@@ -607,9 +574,4 @@ limitations under the License.
<string name="settings_public_api_dashboard_enabled_summary_on">Aplikace, která zahájila nahrávání, může také přistupovat k nahraným datům.</string>
<string name="settings_public_api_dashboard_enabled_summary_off">Zaznamenaná data nebudou automaticky sdílena s jinými aplikacemi.</string>
<string name="pace">Tempo</string>
<plurals name="voiceDistanceMiles">
<item quantity="one"></item>
<item quantity="few"></item>
<item quantity="other"></item>
</plurals>
</resources>
-30
View File
@@ -171,7 +171,6 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
<string name="generic_description_line">Beskrivelse: %1$s</string>
<string name="generic_name">Navn</string>
<string name="generic_name_line">Navn: %1$s</string>
<string name="generic_paused">Midlertidigt afbrudt</string>
<string name="generic_recording">Registrerer…</string>
<string name="generic_save">Gem</string>
<string name="generic_tracks">Ruter</string>
@@ -183,7 +182,6 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
<string name="image_arrow">Pil</string>
<string name="image_marker">Markør</string>
<string name="image_marker_count">Antal markører</string>
<string name="image_pause">Pause</string>
<string name="image_photo_marker">Billedmarkør</string>
<string name="image_record">Registrer</string>
<string name="image_stop">Stop</string>
@@ -203,7 +201,6 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
<!-- Marker Detail -->
<!-- Marker Edit -->
<string name="marker_edit_marker_type">Markørtype (f.eks. vandfald)</string>
<string name="marker_edit_marker_type_hint">Markørtype</string>
<!-- Marker List -->
<string name="marker_list_empty_message">Du har ingen markører</string>
<!-- Menu -->
@@ -231,17 +228,11 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
<string name="permission_gps_failed">OpenTracks kræver tilladelse til at bruge GPS.</string>
<!-- Search -->
<!-- Sensor State -->
<string name="sensor_state_battery">Batteriniveau</string>
<string name="sensor_state_cadence">Kadence</string>
<string name="sensor_state_cadence_value">%1$d omdr/min</string>
<string name="sensor_state_heart_rate">Puls</string>
<string name="sensor_state_heart_rate_value">%1$d slag per minut</string>
<string name="sensor_state_power">Strøm</string>
<string name="sensor_state_power_value">%1$d W</string>
<string name="sensor_could_not_scan">Kunne ikke scanne efter Bluetooth-enheder (fejl %1$i).</string>
<string name="bluetooth_disabled">Aktivér Bluetooth.</string>
<string name="settings_not_while_recording">Ikke tilgængelig ved registrering af rute</string>
<string name="settings_show">Vis</string>
<!-- Settings Advanced -->
<string name="settings_advanced">Avanceret</string>
<!-- Settings Chart -->
@@ -252,7 +243,6 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
<string name="settings_recording_show_on_lockscreen_while_recording_summary">Vis statistik, mens du optager, uden at låse enheden op.</string>
<string name="settings_recording_keep_screen_on_while_recording_title">Hold skærmen tændt</string>
<string name="settings_recording_keep_screen_on_while_recording_summary">Hold skærmen tændt, mens du optager.</string>
<string name="settings_recording">Registrering</string>
<string name="settings_recording_default_activity_title">Standardaktivitetstype</string>
<string name="settings_recording_location_frequency_summary">%1$s mellem registrerede placeringer</string>
<string name="settings_recording_max_recording_distance_summary">Et nyt segment oprettes, hvis afstanden mellem to placeringer er større end %1$s</string>
@@ -266,15 +256,11 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
<string name="settings_recording_track_name_number_option">Nummer</string>
<string name="settings_recording_track_name_title">Standardnavn på spor</string>
<!-- Settings Reset -->
<string name="settings_reset">Nulstil</string>
<string name="settings_reset_confirm_message">Alle indstillinger vil blive ændret til standardværdierne..</string>
<string name="settings_reset_confirm_title">Vil du nulstille nu?</string>
<string name="settings_reset_done">Alle indstillinger er blevet gendannet til standardværdierne</string>
<string name="settings_error_initial_values_restored">Beklager, men der opstod en fejl. Alle indstillinger er vendt tilbage til standardværdierne.</string>
<!-- Settings Sensor -->
<string name="settings_sensor_bluetooth">Bluetooth</string>
<string name="settings_sensor_connecting">Tilsluttet %1$s</string>
<string name="settings_sensor_disconnected">Frakoblet %1$s</string>
<!-- Settings Stats -->
<string name="settings_stats_rate_title">Foretrukkenfartenhed</string>
<string name="settings_stats_units_imperial">Britisk (mil, ft)</string>
@@ -362,17 +348,6 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
<item quantity="one">1 mil i timen</item>
<item quantity="other">%1$.1f mil i timen</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s pr. kilometer</string>
<string name="voice_pace_per_mile">%1$s pr. mil</string>
<string name="voice_template">%1$s på %2$s ved %3$s</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="one">afstand i alt 1 kilometer</item>
<item quantity="other">afstand i alt %1$.2f kilometer</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="one">afstand i alt 1 mil</item>
<item quantity="other">afstand i alt %1$.2f mil</item>
</plurals>
<!-- Waypoint Type -->
<string name="waypoint_type_atm">Pengeautomat</string>
<string name="waypoint_type_bank">bank</string>
@@ -464,9 +439,6 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
<string name="interval_list_empty_message">Der er ikke noget interval endnu</string>
<string name="aggregated_stats_empty_message">Optag dit første spor for at se aggregerede statistikker</string>
<string name="track_detail_intervals_tab">Intervaller</string>
<string name="voice_pace_lap">Omgangstid på %1$s</string>
<string name="voice_speed_lap">Omgangshastighed på %1$s</string>
<string name="hold_to_pause">Hold nede for at holde pause</string>
<string name="hold_to_stop">Hold for at stoppe</string>
<string name="settings_prevent_reimport_tracks_title">Forhindre genimport af spor</string>
<plurals name="generic_completed_with_errors">
@@ -516,7 +488,6 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
<string name="settings_reset_summary">Nulstil indstillingerne til standardværdierne</string>
<string name="settings_recording_customize_layout_title">Tilpas dit optagelseslayout</string>
<string name="settings_recording_customize_layout_select_columns">Datafelter pr. række</string>
<string name="settings_announcements">Meddelelser</string>
<string name="settings_announcements_totaltime_frequency">Tidsinterval</string>
<string name="settings_announcements_distance_frequency">Afstandsinterval</string>
<string name="custom_layout_list_title">Opsætning</string>
@@ -562,7 +533,6 @@ Hvis GPS-enheden rapporterer unøjagtige data (f.eks. Placering, hastighed, høj
<string name="value_float_kilometer_hour">%1$.1f km/h</string>
<string name="location_coordinate">%1$s°</string>
<string name="location_latitude_longitude">%1$s, %2$s</string>
<string name="title_activity_settings_custom_layout">Tilpas optagelseslayout</string>
<string name="generic_undo">Fortryd</string>
<string name="menu_select_layout">Vælg layout</string>
<string name="settings_ui_summary">Udseende, Optagelse af layout, Tema</string>
+53 -31
View File
@@ -172,7 +172,6 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
<string name="generic_description_line">Beschreibung: %1$s</string>
<string name="generic_name">Name</string>
<string name="generic_name_line">Name: %1$s</string>
<string name="generic_paused">Pausiert</string>
<string name="generic_recording">Aufzeichnung…</string>
<string name="generic_save">Speichern</string>
<string name="generic_tracks">Strecken</string>
@@ -184,7 +183,6 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
<string name="image_arrow">Pfeil</string>
<string name="image_marker">Markierung</string>
<string name="image_marker_count">Anzahl der Markierungen</string>
<string name="image_pause">Pausieren</string>
<string name="image_photo_marker">Fotomarkierung</string>
<string name="image_record">Aufzeichnen</string>
<string name="image_stop">Beenden</string>
@@ -204,7 +202,6 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
<!-- Marker Detail -->
<!-- Marker Edit -->
<string name="marker_edit_marker_type">Art der Markierung, z. B. Wasserfall</string>
<string name="marker_edit_marker_type_hint">Art der Markierung</string>
<!-- Marker List -->
<string name="marker_list_empty_message">Sie haben noch keine Markierungen</string>
<!-- Menu -->
@@ -234,17 +231,11 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
<string name="permission_bluetooth_failed_rejected">Du musst OpenTracks die Berechtigung zum Zugriff auf Geräte in der Nähe manuell in den Systemeinstellungen geben.</string>
<!-- Search -->
<!-- Sensor State -->
<string name="sensor_state_battery">Akkustatus</string>
<string name="sensor_state_cadence">Trittfrequenz</string>
<string name="sensor_state_cadence_value">%1$d Umdrehungen pro Minute</string>
<string name="sensor_state_heart_rate">Herzfrequenz</string>
<string name="sensor_state_heart_rate_value">%1$d Schläge pro Minute</string>
<string name="sensor_state_power">Leistung</string>
<string name="sensor_state_power_value">%1$d W</string>
<string name="sensor_could_not_scan">Konnte nicht nach Bluetooth-Geräten scannen (Fehler %1$i).</string>
<string name="bluetooth_disabled">Bitte Bluetooth aktivieren.</string>
<string name="settings_not_while_recording">Während der Aufzeichnung eines Tracks nicht verfügbar</string>
<string name="settings_show">Anzeigen</string>
<!-- Settings Advanced -->
<string name="settings_advanced">Erweitert</string>
<string name="settings_default_trackfileformat">Dateiformat für export/teilen</string>
@@ -256,7 +247,6 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
<string name="settings_recording_show_on_lockscreen_while_recording_summary">Zeige während der Aufzeichnung Statistiken an, ohne das Gerät zu entsperren.</string>
<string name="settings_recording_keep_screen_on_while_recording_title">Bildschirm eingeschaltet lassen</string>
<string name="settings_recording_keep_screen_on_while_recording_summary">Lasse während der Aufnahme den Bildschirm eingeschaltet.</string>
<string name="settings_recording">Aufzeichnung</string>
<string name="settings_recording_default_activity_title">Standardaktivität</string>
<string name="settings_recording_location_frequency_summary">Entfernungs-/Zeitintervall %1$s zwischen zwei Standortaufzeichnungen</string>
<string name="settings_recording_max_recording_distance_summary">Ein neues Segment wird erstellt, wenn die Entfernung zwischen zwei Standorten mehr als %1$s beträgt</string>
@@ -270,15 +260,11 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
<string name="settings_recording_track_name_number_option">Nummer</string>
<string name="settings_recording_track_name_title">Standard-Trackname</string>
<!-- Settings Reset -->
<string name="settings_reset">Zurücksetzen</string>
<string name="settings_reset_confirm_message">Alle Einstellungen werden auf die Standardwerte zurückgesetzt.</string>
<string name="settings_reset_confirm_title">Jetzt zurücksetzen?</string>
<string name="settings_reset_done">Alle Einstellungen wurden auf ihre Standardwerte zurückgesetzt</string>
<string name="settings_error_initial_values_restored">Entschuldigung, es ist ein Fehler aufgetreten. Alle Einstellungen wurden auf die Standardwerte zurückgesetzt.</string>
<!-- Settings Sensor -->
<string name="settings_sensor_bluetooth">Bluetooth</string>
<string name="settings_sensor_connecting">Verbunden mit %1$s</string>
<string name="settings_sensor_disconnected">Verbindung getrennt von %1$s</string>
<!-- Settings Stats -->
<string name="settings_stats_rate_title">Bevorzugtes Maß</string>
<string name="settings_stats_units_imperial">Imperiales Maß (mi, ft)</string>
@@ -369,17 +355,6 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
<item quantity="one">1 Meile pro Stunde</item>
<item quantity="other">%1$.1f Meilen pro Stunde</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s pro Kilometer</string>
<string name="voice_pace_per_mile">%1$s pro Meile</string>
<string name="voice_template">%1$s in %2$s bei %3$s</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="one">Gesamtstrecke: 1 Kilometer</item>
<item quantity="other">Gesamtstrecke: %1$.2f Kilometer</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="one">Gesamtstrecke: 1 Meile</item>
<item quantity="other">Gesamtstrecke: %1$.2f Meilen</item>
</plurals>
<!-- Waypoint Type -->
<string name="waypoint_type_atm">Geldautomat</string>
<string name="waypoint_type_bank">Bank</string>
@@ -457,7 +432,6 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
</plurals>
<string name="import_error_info">%1$s: %2$s</string>
<string name="import_file_imported">Datei %1$s wurde importiert</string>
<string name="hold_to_pause">Halten für Pause</string>
<string name="description_altitude_loss">Höhenverlust: %1$d m (%2$d ft)</string>
<string name="export_error_post_workout">Der Datenexport im Anschluss an die Übung ist fehlgeschlagen. Bitte prüfe den Exportordner.</string>
<string name="settings_recording_fullscreen_on_while_recording_title">Vollbild</string>
@@ -473,8 +447,6 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
<string name="export_progress_summary_errors_msg">Fehler</string>
<string name="generic_click_twice_cancel">Klicke nochmal auf zurück, um abzubrechen</string>
<string name="import_error_list_dialog_title">Dateien wurden nicht importiert</string>
<string name="voice_speed_lap">Rundengeschwindigkeit von %1$s</string>
<string name="voice_pace_lap">Rundenzeit von %1$s</string>
<string name="export_track_already_exists_msg">Die Streckenaufzeichung %1$s existiert bereits im Zielverzeichnis.</string>
<string name="gps_fixed_and_ready">GPS-Position bestimmt und bereit</string>
<string name="instant_export_enabled_title">Sofortiger Export im Anschluss an die Übung</string>
@@ -502,8 +474,8 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
<string name="import_thread_interrupted">Thread unterbrochen</string>
<string name="import_unable_to_import_file">Importieren der Datei gescheitert: %1$s</string>
<string name="delete_service">Löschdienst</string>
<string name="settings_sensor_cycling_cadence">Radfahren: Trittfrequenz</string>
<string name="settings_sensor_cycling_distance_speed">Radfahren: Entfernung und Geschwindigkeit</string>
<string name="settings_sensor_cycling_cadence">Trittfrequenz</string>
<string name="settings_sensor_cycling_distance_speed">Entfernung und Geschwindigkeit</string>
<string name="generic_filter">Filter</string>
<string name="generic_from">Von</string>
<string name="generic_to">Bis</string>
@@ -513,7 +485,6 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
<string name="settings_reset_summary">Einstellungen zurücksetzen</string>
<string name="settings_recording_customize_layout_title">Layout anpassen</string>
<string name="settings_recording_customize_layout_select_columns">Felder pro Zeile</string>
<string name="settings_announcements">Sprachansagen</string>
<string name="custom_layout_list_title">Layouts</string>
<string name="description_speed_source_gps">GPS</string>
<string name="menu_select_layout">Wähle Layout</string>
@@ -553,4 +524,55 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
<string name="settings_public_api_dashboard_enabled_title">Automatischer Datentransfer</string>
<string name="settings_public_api_dashboard_enabled_summary_on">Eine Anwendung, welche eine Aufzeichnung gestartet hat, darf auch auf die aufgezeichneten Daten zugreifen.</string>
<string name="settings_public_api_dashboard_enabled_summary_off">Aufgezeichnete Daten werden nicht automatisch mit anderen Anwendungen geteilt.</string>
<string name="settings_export_filename_title">Format des Dateinamens</string>
<string name="settings_announcements_average_heart_rate">Durchschnittlicher Puls</string>
<string name="settings_announcements_lap_heart_rate">Runden-Herzfrequenz</string>
<string name="settings_announcements_average_speed_pace">Durchschnittliche Geschwindigkeit/Tempo</string>
<string name="settings_announcements_lap_speed_pace">Runden-Geschwindigkeit/Tempo</string>
<string name="field_set_secondary">Sekundär</string>
<string name="export_dir_not_writable">" (nicht schreibbar)"</string>
<string name="stats_clock">Uhr</string>
<string name="image_discard">Verwerfen</string>
<string name="settings_announcements_distance_frequency">Entfernungsintervall</string>
<string name="settings_public_api_enabled_title">Öffentliche API</string>
<string name="track_discarding">Verwerfe Track</string>
<string name="average_heart_rate">Durchschnittlicher Puls</string>
<string name="current_heart_rate">Aktueller Puls</string>
<string name="export_cannot_write_to_dir">Kann nicht in Export-Verzeichnis schreiben.</string>
<string name="stats_sensors_cadence">Trittfrequenz</string>
<plurals name="voiceDistanceMiles">
<item quantity="one">1 Meile</item>
<item quantity="other">%1$.2f Meilen</item>
</plurals>
<string name="field_set_primary">Primär</string>
<string name="voice_per_mile">pro Meile</string>
<string name="lap_time">Rundenzeit</string>
<string name="voice_per_kilometer">pro Kilometer</string>
<string name="pace">Tempo</string>
<string name="lap_speed">Rundengeschwindigkeit</string>
<string name="speed">Geschwindigkeit</string>
<string name="total_distance">Gesamtstrecke</string>
<plurals name="voiceDistanceKilometers">
<item quantity="one">1 Kilometer</item>
<item quantity="other">%1$.2f Kilometer</item>
</plurals>
<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="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="always">Immer</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>
<string name="settings_ui_summary">Erscheinungsbild, Aufzeichnungslayout, Theme</string>
<string name="settings_gps_summary">Zeitintervall, Entfernungsintervall, Max Entfernung, Genauigkeit</string>
</resources>
-22
View File
@@ -117,7 +117,6 @@ limitations under the License.
<string name="generic_description_line">Περιγραφή: %1$s</string>
<string name="generic_name">Όνομα</string>
<string name="generic_name_line">Όνομα: %1$s</string>
<string name="generic_paused">Σε παύση</string>
<string name="generic_recording">Καταγραφή…</string>
<string name="generic_save">αποθήκευση</string>
<string name="generic_tracks">Διαδρομές</string>
@@ -129,7 +128,6 @@ limitations under the License.
<string name="image_arrow">Βέλος</string>
<string name="image_marker">Δείκτης</string>
<string name="image_marker_count">Αριθμός δείκτη</string>
<string name="image_pause">Παύση</string>
<string name="image_photo_marker">Δείκτης φωτογραφίας</string>
<string name="image_record">Εγγραφή</string>
<string name="image_stop">Στοπ</string>
@@ -148,7 +146,6 @@ limitations under the License.
<!-- Marker Detail -->
<!-- Marker Edit -->
<string name="marker_edit_marker_type">Τύπος σήμανσης (π.χ. καταρράκτης)</string>
<string name="marker_edit_marker_type_hint">Τύπος σήμανσης</string>
<!-- Marker List -->
<string name="marker_list_empty_message">Δεν έχετε κανένα δείκτη</string>
<!-- Menu -->
@@ -172,21 +169,14 @@ limitations under the License.
<string name="recording_service">Υπηρεσία καταγραφής</string>
<!-- Search -->
<!-- Sensor State -->
<string name="sensor_state_battery">Στάθμη μπαταρίας</string>
<string name="sensor_state_cadence">Ρυθμός</string>
<string name="sensor_state_cadence_value">%1$d rpm</string>
<string name="sensor_state_heart_rate">Καρδιακοί παλμοί</string>
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
<string name="sensor_state_power">Ισχύς</string>
<string name="sensor_state_power_value">%1$d W</string>
<string name="settings_not_while_recording">Η επιλογή δεν είναι διαθέσιμη κατά την εγγραφή ίχνους</string>
<string name="settings_show">Εμφάνιση</string>
<!-- Settings Advanced -->
<string name="settings_advanced">Προηγμένες</string>
<!-- Settings Chart -->
<string name="settings_chart_by_distance">Κατά απόσταση</string>
<string name="settings_chart_by_time">Κατά χρόνο</string>
<string name="settings_recording">Εγγραφή</string>
<string name="settings_recording_default_activity_title">Προεπιλεγμένος τύπος δραστηριότητας</string>
<string name="settings_recording_location_frequency_summary">%1$s μεταξύ καταγεγραμμένων θέσεων</string>
<string name="settings_recording_max_recording_distance_summary">Δημιουργείται ένα νέο τμήμα εάν η απόσταση ανάμεσα σε δύο θέσεις είναι μεγαλύτερη από %1$s</string>
@@ -200,7 +190,6 @@ limitations under the License.
<string name="settings_recording_track_name_number_option">Αριθμός</string>
<string name="settings_recording_track_name_title">Προεπιλεγμένο όνομα ίχνους</string>
<!-- Settings Reset -->
<string name="settings_reset">Επαναφορά</string>
<string name="settings_reset_confirm_message">Όλες οι ρυθμίσεις θα επανέλθουν στις προεπιλεγμένες τιμές.</string>
<string name="settings_reset_confirm_title">Επαναφορά τώρα;</string>
<string name="settings_reset_done">Όλες οι ρυθμίσεις έχουν επανέλθει στις προεπιλεγμένες τιμές</string>
@@ -291,17 +280,6 @@ limitations under the License.
<item quantity="one">1 μίλι ανά ώρα</item>
<item quantity="other">%1$.1f μίλια ανά ώρα</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s ανά χιλιόμετρο</string>
<string name="voice_pace_per_mile">%1$s ανά μίλι</string>
<string name="voice_template">%1$s σε %2$s με ταχύτητα %3$s</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="one">συνολική απόσταση 1 χιλιόμετρο</item>
<item quantity="other">συνολική απόσταση %1$.2f χιλιόμετρα</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="one">συνολική απόσταση 1 μίλι</item>
<item quantity="other">συνολική απόσταση %1$.2f μίλια</item>
</plurals>
<!-- Waypoint Type -->
<string name="waypoint_type_atm">ATM</string>
<string name="waypoint_type_bank">τράπεζα</string>
-31
View File
@@ -166,7 +166,6 @@ limitations under the License.
<string name="generic_description_line">Descripción: %1$s</string>
<string name="generic_name">Nombre</string>
<string name="generic_name_line">Nombre: %1$s</string>
<string name="generic_paused">En pausa</string>
<string name="generic_recording">Grabando…</string>
<string name="generic_save">Guardar</string>
<string name="generic_tracks">Recorridos</string>
@@ -178,7 +177,6 @@ limitations under the License.
<string name="image_arrow">Flecha</string>
<string name="image_marker">Marcador</string>
<string name="image_marker_count">Recuento de marcadores</string>
<string name="image_pause">Pausa</string>
<string name="image_photo_marker">Marcador de foto</string>
<string name="image_record">Grabar</string>
<string name="image_stop">Parar</string>
@@ -198,7 +196,6 @@ limitations under the License.
<!-- Marker Detail -->
<!-- Marker Edit -->
<string name="marker_edit_marker_type">Tipo de marcador (p. ej., cascada)</string>
<string name="marker_edit_marker_type_hint">Tipo de marcador</string>
<!-- Marker List -->
<string name="marker_list_empty_message">No tienes ningún marcador</string>
<!-- Menu -->
@@ -226,17 +223,11 @@ limitations under the License.
<string name="permission_gps_failed">OpenTracks necesita permiso para usar el GPS.</string>
<!-- Search -->
<!-- Sensor State -->
<string name="sensor_state_battery">Nivel de la batería</string>
<string name="sensor_state_cadence">Cadencia</string>
<string name="sensor_state_cadence_value">%1$d rpm</string>
<string name="sensor_state_heart_rate">Frecuencia cardíaca</string>
<string name="sensor_state_heart_rate_value">%1$d lpm</string>
<string name="sensor_state_power">Potencia</string>
<string name="sensor_state_power_value">%1$d W</string>
<string name="sensor_could_not_scan">No se pudieron buscar dispositivos Bluetooth (error %1$i).</string>
<string name="bluetooth_disabled">Por favor habilite Bluetooth.</string>
<string name="settings_not_while_recording">No está disponible durante la grabación de un recorrido</string>
<string name="settings_show">Mostrar</string>
<!-- Settings Advanced -->
<string name="settings_advanced">Opciones avanzadas</string>
<!-- Settings Chart -->
@@ -247,7 +238,6 @@ limitations under the License.
<string name="settings_recording_show_on_lockscreen_while_recording_summary">Mientras graba, mostrar estadísticas sin desbloquear el dispositivo.</string>
<string name="settings_recording_keep_screen_on_while_recording_title">Mantener la pantalla encendida</string>
<string name="settings_recording_keep_screen_on_while_recording_summary">Mientras graba, mantener la pantalla encendida.</string>
<string name="settings_recording">Grabación</string>
<string name="settings_recording_default_activity_title">Tipo de actividad predeterminada</string>
<string name="settings_recording_location_frequency_summary">%1$s entre las ubicaciones grabadas</string>
<string name="settings_recording_max_recording_distance_summary">Se crea un nuevo tramo si la distancia entre dos ubicaciones es superior a %1$s</string>
@@ -261,15 +251,11 @@ limitations under the License.
<string name="settings_recording_track_name_number_option">Número</string>
<string name="settings_recording_track_name_title">Nombre de recorrido predeterminado</string>
<!-- Settings Reset -->
<string name="settings_reset">Restablecer</string>
<string name="settings_reset_confirm_message">Todos las configuraciones se restablecerán a los valores predeterminados. Esto no eliminará ningún recorrido en el dispositivo.</string>
<string name="settings_reset_confirm_title">¿Restablecer ahora?</string>
<string name="settings_reset_done">Se restablecieron los valores predeterminados de todas las configuraciones</string>
<string name="settings_error_initial_values_restored">Lo sentimos, pero ha ocurrido un error. Todas las configuraciones se han revertido a los valores predeterminados.</string>
<!-- Settings Sensor -->
<string name="settings_sensor_bluetooth">Bluetooth</string>
<string name="settings_sensor_connecting">Conectado a %1$s</string>
<string name="settings_sensor_disconnected">Desconectado de %1$s</string>
<!-- Settings Stats -->
<string name="settings_stats_rate_title">Tasa preferida</string>
<string name="settings_stats_units_imperial">Imperiales (millas, pies)</string>
@@ -357,17 +343,6 @@ limitations under the License.
<item quantity="one">1 milla por hora</item>
<item quantity="other">%1$.1f millas por hora</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s por kilómetro</string>
<string name="voice_pace_per_mile">%1$s por milla</string>
<string name="voice_template">%1$s en %2$s a %3$s</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="one">distancia total de 1 kilómetro</item>
<item quantity="other">distancia total de %1$.2f kilómetros</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="one">distancia total de 1 milla</item>
<item quantity="other">distancia total de %1$.2f millas</item>
</plurals>
<!-- Waypoint Type -->
<string name="waypoint_type_atm">cajero automático</string>
<string name="waypoint_type_bank">banco</string>
@@ -449,8 +424,6 @@ limitations under the License.
<string name="stats_split_interval">Intervalo partido</string>
<string name="track_detail_intervals_tab">Intervalos</string>
<string name="aggregated_stats_empty_message">Grabe su primer recorrido para ver estadísticas agregadas</string>
<string name="voice_pace_lap">Tiempo de vuelta de %1$s</string>
<string name="hold_to_pause">Mantener para pausar</string>
<string name="instant_export_enabled_title">Exportación instantánea post-entrenamiento</string>
<string name="settings_default_export_uri_title">Directorio de exportación de recorrido</string>
<string name="export_track_already_exists_msg">El recorrido %1$s ya existe en el directorio de destino.</string>
@@ -464,7 +437,6 @@ limitations under the License.
<string name="settings_default_trackfileformat">Formato para exportar/compartir</string>
<string name="settings_recording_fullscreen_on_while_recording_title">Pantalla completa</string>
<string name="interval_list_empty_message">Aún no hay ningún intervalo</string>
<string name="voice_speed_lap">Velocidad de vuelta de %1$s</string>
<string name="hold_to_stop">Mantener para parar</string>
<string name="instant_export_enabled_summary">Exportar el recorrido al almacenamiento una vez finalizada la grabación</string>
<string name="stats_loss">Pérdida</string>
@@ -498,7 +470,6 @@ limitations under the License.
<string name="settings_sensor_running_speed_and_cadence">Distancia, velocidad y cadencia</string>
<string name="settings_sensor_cycling_distance_speed">Distancia y velocidad</string>
<string name="settings_sensor_cycling_cadence">Cadencia</string>
<string name="settings_announcements">Anuncios</string>
<string name="settings_announcements_totaltime_frequency">Intervalo de tiempo</string>
<string name="settings_announcements_distance_frequency">Intervalo de distancia</string>
<string name="stats_sensors_heart_rate">Ritmo cardíaco</string>
@@ -518,7 +489,6 @@ limitations under the License.
<string name="generic_choose_an_option">Selecciona una opción</string>
<string name="settings_layout_reset">Restablecer pantalla personalizada</string>
<string name="stats_coordinates">Latitud/Longitud</string>
<string name="title_activity_settings_custom_layout">Personalizar pantalla de grabación</string>
<string name="field_set_secondary">Secundario</string>
<string name="value_float_kilometer_hour">%1$.1f km/h</string>
<string name="value_float_mile_hour">%1$.1f mi/h</string>
@@ -584,7 +554,6 @@ limitations under the License.
<string name="settings_public_api_dashboard_enabled_title">Transferencia automática de datos</string>
<string name="settings_public_api_dashboard_enabled_summary_on">Una aplicación que ha iniciado una grabación puede también acceder a los datos grabados.</string>
<string name="settings_public_api_dashboard_enabled_summary_off">Los datos grabados no se compartirán automáticamente con otras aplicaciones.</string>
<string name="settings_announcements_report_heart_rate">Anunciar ritmo cardíaco</string>
<string name="voice_per_kilometer">por kilometro</string>
<string name="voice_per_mile">por milla</string>
<string name="lap_time">Tiempo de vuelta</string>
-30
View File
@@ -166,7 +166,6 @@ limitations under the License.
<string name="generic_description_line">Kirjeldus: %1$s</string>
<string name="generic_name">Nimi</string>
<string name="generic_name_line">Nimi: %1$s</string>
<string name="generic_paused">Peatatud</string>
<string name="generic_recording">Salvestamine…</string>
<string name="generic_save">Salvesta</string>
<string name="generic_tracks">Rajad</string>
@@ -178,7 +177,6 @@ limitations under the License.
<string name="image_arrow">Nool</string>
<string name="image_marker">Märgis</string>
<string name="image_marker_count">Märgistuste arv</string>
<string name="image_pause">Peata</string>
<string name="image_photo_marker">Fotomärgis</string>
<string name="image_record">Salvesta</string>
<string name="image_stop">Peata</string>
@@ -198,7 +196,6 @@ limitations under the License.
<!-- Marker Detail -->
<!-- Marker Edit -->
<string name="marker_edit_marker_type">Märgise tüüp (nt juga)</string>
<string name="marker_edit_marker_type_hint">Märgise tüüp</string>
<!-- Marker List -->
<string name="marker_list_empty_message">Teil ei ole märgiseid</string>
<!-- Menu -->
@@ -226,17 +223,11 @@ limitations under the License.
<string name="permission_gps_failed">OpenTracks vajab GPS-i kasutamiseks luba.</string>
<!-- Search -->
<!-- Sensor State -->
<string name="sensor_state_battery">Aku tase</string>
<string name="sensor_state_cadence">Rütm</string>
<string name="sensor_state_cadence_value">%1$d p/min (pööret minutis)</string>
<string name="sensor_state_heart_rate">Pulsisagedus</string>
<string name="sensor_state_heart_rate_value">%1$d lööki minutis</string>
<string name="sensor_state_power">Võimsus</string>
<string name="sensor_state_power_value">%1$d W</string>
<string name="sensor_could_not_scan">Bluetooth seadmeid ei õnnestunud skannida (tõrge %1$i).</string>
<string name="bluetooth_disabled">Lubage Bluetooth.</string>
<string name="settings_not_while_recording">Raja salvestamise ajal ei ole kättesaadav</string>
<string name="settings_show">Kuva</string>
<!-- Settings Advanced -->
<string name="settings_advanced">Täpsemad seaded</string>
<!-- Settings Chart -->
@@ -247,7 +238,6 @@ limitations under the License.
<string name="settings_recording_show_on_lockscreen_while_recording_summary">Salvestamise ajal näidake statistikat ilma seadet avamata.</string>
<string name="settings_recording_keep_screen_on_while_recording_title">Hoia ekraan sisse lülitatud</string>
<string name="settings_recording_keep_screen_on_while_recording_summary">Salvestamise ajal hoidke ekraani sisse lülitatud.</string>
<string name="settings_recording">Salvestamine</string>
<string name="settings_recording_default_activity_title">Tegevuse vaiketüüp</string>
<string name="settings_recording_location_frequency_summary">%1$s salvestatud asukohtade vahel</string>
<string name="settings_recording_max_recording_distance_summary">Kui vahemaa kahe asukoha vahel on üle %1$s, luuakse uus lõik</string>
@@ -261,15 +251,11 @@ limitations under the License.
<string name="settings_recording_track_name_number_option">Number</string>
<string name="settings_recording_track_name_title">Raja vaikenimi</string>
<!-- Settings Reset -->
<string name="settings_reset">Lähtesta</string>
<string name="settings_reset_confirm_message">Taastatakse kõikide seadete vaikeväärtus.</string>
<string name="settings_reset_confirm_title">Kas lähtestada kohe?</string>
<string name="settings_reset_done">Kõik seaded on taastatud vaikeväärtustena</string>
<string name="settings_error_initial_values_restored">Vabandust, kuid ilmnes viga. Kõik sätted on taastatud vaikeväärtustele.</string>
<!-- Settings Sensor -->
<string name="settings_sensor_bluetooth">Bluetooth</string>
<string name="settings_sensor_connecting">Ühendatud anduriga %1$s</string>
<string name="settings_sensor_disconnected">Lahti ühendatud %1$s</string>
<!-- Settings Stats -->
<string name="settings_stats_rate_title">Eelistatud määr</string>
<string name="settings_stats_units_imperial">Inglise mõõtühikud (miili, jalga)</string>
@@ -357,17 +343,6 @@ limitations under the License.
<item quantity="one">1 miil tunnis</item>
<item quantity="other">%1$.1f miili tunnis</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s kilomeetri kohta</string>
<string name="voice_pace_per_mile">%1$s miilis</string>
<string name="voice_template">%1$s ajaga %2$s ja kiirusega %3$s</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="one">kogupikkus 1 kilomeeter</item>
<item quantity="other">kogupikkus %1$.2f kilomeetrit</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="one">kogupikkus 1 miil</item>
<item quantity="other">kogupikkus %1$.2f miili</item>
</plurals>
<!-- Waypoint Type -->
<string name="waypoint_type_atm">Sularahaautomaat</string>
<string name="waypoint_type_bank">pank</string>
@@ -444,7 +419,6 @@ limitations under the License.
<string name="export_track_errors">Eksportimata rajad</string>
<string name="export_track_already_exists_msg">Rada %1$s on sihtkataloogis juba olemas.</string>
<string name="aggregated_stats_empty_message">Salvestage oma esimene pala, et näha koondatud statistikat</string>
<string name="voice_pace_lap">Ringiaeg %1$s</string>
<string name="settings_prevent_reimport_tracks_title">Palade reimportimise vältimine</string>
<string name="settings_night_mode_option_night">Öö</string>
<string name="settings_night_mode_option_day">Päev</string>
@@ -463,9 +437,7 @@ limitations under the License.
<string name="track_detail_intervals_tab">Intervallid</string>
<string name="stats_split_interval">Jagatud intervall</string>
<string name="interval_list_empty_message">Ei ole ühtegi intervalli veel</string>
<string name="voice_speed_lap">Ringi kiirus %1$s</string>
<string name="hold_to_stop">Hoidke lõpetada</string>
<string name="hold_to_pause">Hoidke pausi</string>
<string name="instant_export_enabled_summary">Ekspordi pala salvestusruumi pärast salvestamise lõpetamist</string>
<string name="settings_default_export_uri_title">Track ekspordi kataloog</string>
<string name="instant_export_enabled_title">Vahetu treeningujärgne eksport</string>
@@ -541,12 +513,10 @@ limitations under the License.
<string name="stats_sensors_cadence">Rütm</string>
<string name="stats_sensors_heart_rate">Südamerütm</string>
<string name="field_set_secondary">Teisene</string>
<string name="title_activity_settings_custom_layout">Salvestamise Paigutuse Kohandamine</string>
<string name="settings_sensors_summary">Rattaandurid, Ratta Ümbermõõt, Jooksuandurid</string>
<string name="settings_activity_defaults_category">Tegevuse Vaikeväärtused</string>
<string name="field_remove_from_layout">Eemaldama</string>
<string name="stats_coordinates">Laiuskraad/Pikkuskraad</string>
<string name="settings_announcements">Teade</string>
<string name="settings_layout_reset_confirm_message">Kõik paigutuse seaded tagastatakse vaikeväärtustele. See ei kustuta seadmes olevaid lugusid.</string>
<string name="settings_running_sensor">Töötama</string>
<string name="settings_generic_sensor">Geneeriline</string>
-30
View File
@@ -169,7 +169,6 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
<string name="generic_description_line">Azalpena: %1$s</string>
<string name="generic_name">Izena</string>
<string name="generic_name_line">Izena: %1$s</string>
<string name="generic_paused">Etenda</string>
<string name="generic_recording">Grabatzen…</string>
<string name="generic_save">Gorde</string>
<string name="generic_tracks">Ibilbideak</string>
@@ -181,7 +180,6 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
<string name="image_arrow">Gezia</string>
<string name="image_marker">Markatzailea</string>
<string name="image_marker_count">Markatzaile kopurua</string>
<string name="image_pause">Pausatu</string>
<string name="image_photo_marker">Argazki-markatzailea</string>
<string name="image_record">Grabatu</string>
<string name="image_stop">Gelditu</string>
@@ -201,7 +199,6 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
<!-- Marker Detail -->
<!-- Marker Edit -->
<string name="marker_edit_marker_type">Markatzaile mota (adibidez, ur-jauzia)</string>
<string name="marker_edit_marker_type_hint">Markatzaile mota</string>
<!-- Marker List -->
<string name="marker_list_empty_message">Ez duzu markatzailerik</string>
<!-- Menu -->
@@ -229,17 +226,11 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
<string name="permission_gps_failed">OpenTracks GPSa erabiltzeko baimena behar du.</string>
<!-- Search -->
<!-- Sensor State -->
<string name="sensor_state_battery">Bateria maila</string>
<string name="sensor_state_cadence">Erritmoa</string>
<string name="sensor_state_cadence_value">%1$d mbi</string>
<string name="sensor_state_heart_rate">Maiztasun kardiakoa</string>
<string name="sensor_state_heart_rate_value">%1$d mbb</string>
<string name="sensor_state_power">Potentzia</string>
<string name="sensor_state_power_value">%1$d W</string>
<string name="sensor_could_not_scan">Ezin izan da Bluetooth gailuak bilatu (%1$i errorea).</string>
<string name="bluetooth_disabled">Mesedez, aktibatu Bluetooth.</string>
<string name="settings_not_while_recording">Ez dago erabilgarri ibilbidea grabatzen ari den bitartean</string>
<string name="settings_show">Erakutsi</string>
<!-- Settings Advanced -->
<string name="settings_advanced">Aurreratua</string>
<!-- Settings Chart -->
@@ -250,7 +241,6 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
<string name="settings_recording_show_on_lockscreen_while_recording_summary">Grabatzen ari zaren bitartean, erakutsi estatistikak gailua desblokeatu gabe.</string>
<string name="settings_recording_keep_screen_on_while_recording_title">Mantendu pantaila</string>
<string name="settings_recording_keep_screen_on_while_recording_summary">Grabatzen ari zaren bitartean, mantendu pantaila.</string>
<string name="settings_recording">Grabaketa</string>
<string name="settings_recording_default_activity_title">Jarduera mota lehenetsia</string>
<string name="settings_recording_location_frequency_summary">%1$s erregistratutako kokapenen artean</string>
<string name="settings_recording_max_recording_distance_summary">Segmentu berri bat sortzen da bi kokapenen arteko distantzia %1$s baino gehiagokoa bada</string>
@@ -264,15 +254,11 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
<string name="settings_recording_track_name_number_option">Zenbakia</string>
<string name="settings_recording_track_name_title">Ibilbidearen izen lehenetsia</string>
<!-- Settings Reset -->
<string name="settings_reset">Berrezarri</string>
<string name="settings_reset_confirm_message">Ezarpen guztiak balio lehenetsietara leheneratuko dira.</string>
<string name="settings_reset_confirm_title">Berrezarri egin nahi duzu?</string>
<string name="settings_reset_done">Ezarpen guztiak balio lehenetsietara leheneratu dira</string>
<string name="settings_error_initial_values_restored">Sentitzen dugu, baina akats bat gertatu da. Ezarpen guztiak lehenetsitako balioetara itzuli dira.</string>
<!-- Settings Sensor -->
<string name="settings_sensor_bluetooth">Bluetootha</string>
<string name="settings_sensor_connecting">Honekin konektatuta: %1$s</string>
<string name="settings_sensor_disconnected">Deskonektatuta %1$s</string>
<!-- Settings Stats -->
<string name="settings_stats_rate_title">Erritmo hobetsia</string>
<string name="settings_stats_units_imperial">Inperiala (mi, ft)</string>
@@ -360,17 +346,6 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
<item quantity="one">1 milia orduko</item>
<item quantity="other">%1$.1f milia orduko</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s kilometro bakoitzeko</string>
<string name="voice_pace_per_mile">%1$s miliako</string>
<string name="voice_template">Distantzia: %1$s. Denbora: %2$s. Abiadura: %3$s</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="one">distantzia, guztira: 1 kilometro</item>
<item quantity="other">distantzia, guztira: %1$.2f kilometro</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="one">distantzia, guztira: 1 milia</item>
<item quantity="other">distantzia, guztira: %1$.2f milia</item>
</plurals>
<!-- Waypoint Type -->
<string name="waypoint_type_atm">kutxazaina</string>
<string name="waypoint_type_bank">bankua</string>
@@ -468,9 +443,6 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
<string name="track_detail_intervals_tab">Tarteak</string>
<string name="stats_split_interval">Zatitu tarte</string>
<string name="stats_loss">Galera</string>
<string name="voice_pace_lap">Itzulian-denbora %1$s</string>
<string name="voice_speed_lap">Itzulian abiadura %1$s</string>
<string name="hold_to_pause">Eutsi eteteko</string>
<string name="hold_to_stop">Eutsi gelditzeko</string>
<string name="export_progress_summary_skip_msg">Ibilbideak saltatu</string>
<string name="export_progress_summary_errors_msg">Akatsak</string>
@@ -537,7 +509,6 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
<string name="settings_recording_customize_layout_select_columns">Datu-eremuak errenkadako</string>
<string name="settings_recording_customize_layout_title">Pertsonalizatu zure grabazioaren diseinua</string>
<string name="settings_recording_idle_speed_title">Inaktibitatearen abiaduraren muga</string>
<string name="settings_announcements">Iragarkiak</string>
<string name="settings_announcements_totaltime_frequency">Denbora-tartea</string>
<string name="settings_announcements_distance_frequency">Distantzia tartea</string>
<string name="settings_running_sensor">Exekutatzen</string>
@@ -569,7 +540,6 @@ GPS gailuak datu okerrak salatzen baditu (adibidez, kokapena, abiadura, kota), O
<string name="aggregated_stats_filter_no_results">Ez dago jarduerarik zehaztutako iragazkiarentzat</string>
<string name="field_set_secondary">Bigarren mailakoa</string>
<string name="field_set_primary">Nagusia</string>
<string name="title_activity_settings_custom_layout">Pertsonalizatu Grabazioaren Diseinua</string>
<string name="location_latitude_longitude">%1$s, %2$s</string>
<string name="generic_undo">Desegin</string>
<string name="no_compatible_file_manager_installed">Fitxategi-kudeatzaile bateragarririk ez da instalatu</string>
-22
View File
@@ -117,7 +117,6 @@ limitations under the License.
<string name="generic_description_line">شرح: %1$s</string>
<string name="generic_name">نام</string>
<string name="generic_name_line">نام: %1$s</string>
<string name="generic_paused">در حال مکث</string>
<string name="generic_recording">در حال ضبط…</string>
<string name="generic_save">ذخیره</string>
<string name="generic_tracks">مسیرها</string>
@@ -129,7 +128,6 @@ limitations under the License.
<string name="image_arrow">پیکان</string>
<string name="image_marker">نشانگر</string>
<string name="image_marker_count">تعداد نشانگر</string>
<string name="image_pause">مکث</string>
<string name="image_photo_marker">نشانگر عکس</string>
<string name="image_record">ضبط</string>
<string name="image_stop">توقف</string>
@@ -148,7 +146,6 @@ limitations under the License.
<!-- Marker Detail -->
<!-- Marker Edit -->
<string name="marker_edit_marker_type">نوع نشانگر (برای مثال آبشار)</string>
<string name="marker_edit_marker_type_hint">نوع نشانگر</string>
<!-- Marker List -->
<string name="marker_list_empty_message">شما هیچ نشانگری ندارید</string>
<!-- Menu -->
@@ -172,21 +169,14 @@ limitations under the License.
<string name="recording_service">خدمات ضبط</string>
<!-- Search -->
<!-- Sensor State -->
<string name="sensor_state_battery">مقدار شارژ باتری</string>
<string name="sensor_state_cadence">سرعت دورانی</string>
<string name="sensor_state_cadence_value">%1$d دور در دقیقه</string>
<string name="sensor_state_heart_rate">ضربان قلب</string>
<string name="sensor_state_heart_rate_value">%1$d ضربان در دقیقه</string>
<string name="sensor_state_power">توان</string>
<string name="sensor_state_power_value">%1$d وات</string>
<string name="settings_not_while_recording">در حال ضبط گذر، در دسترس نیست</string>
<string name="settings_show">نمایش</string>
<!-- Settings Advanced -->
<string name="settings_advanced">پیشرفته</string>
<!-- Settings Chart -->
<string name="settings_chart_by_distance">بر حسب مسافت</string>
<string name="settings_chart_by_time">بر حسب زمان</string>
<string name="settings_recording">در حال ضبط</string>
<string name="settings_recording_default_activity_title">نوع فعالیت پیش‌فرض</string>
<string name="settings_recording_location_frequency_summary">%1$s بین موقعیت‌های مکانی ضبط شده</string>
<string name="settings_recording_max_recording_distance_summary">چنانچه فاصله بین دو موقعیت مکانی بیشتر از %1$s باشد، یک قطعه جدید ایجاد شود</string>
@@ -200,7 +190,6 @@ limitations under the License.
<string name="settings_recording_track_name_number_option">شماره</string>
<string name="settings_recording_track_name_title">نام پیش‌فرض گذر</string>
<!-- Settings Reset -->
<string name="settings_reset">بازنشانی</string>
<string name="settings_reset_confirm_message">همه تنظیمات به مقادیر پیش‌فرض برگردانده خواهند شد.</string>
<string name="settings_reset_confirm_title">اکنون بازنشانی شود؟</string>
<string name="settings_reset_done">تمام تنظیمات به مقادیر پیش‌فرض برگردانده شدند</string>
@@ -291,17 +280,6 @@ limitations under the License.
<item quantity="one">%1$.1f مایل در ساعت</item>
<item quantity="other">%1$.1f مایل در ساعت</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s در کیلومتر</string>
<string name="voice_pace_per_mile">%1$s در مایل</string>
<string name="voice_template">‏‏ %1$s در %2$s با %3$s</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="one">کل مسافت %1$.2f کیلومتر</item>
<item quantity="other">کل مسافت %1$.2f کیلومتر</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="one">کل مسافت %1$.2f مایل</item>
<item quantity="other">کل مسافت %1$.2f مایل</item>
</plurals>
<!-- Waypoint Type -->
<string name="waypoint_type_atm">خودپرداز</string>
<string name="waypoint_type_bank">بانک</string>
+40 -28
View File
@@ -172,7 +172,6 @@ limitations under the License.
<string name="generic_description_line">Kuvaus: %1$s</string>
<string name="generic_name">Nimi</string>
<string name="generic_name_line">Nimi: %1$s</string>
<string name="generic_paused">Keskeytetty</string>
<string name="generic_recording">Tallennetaan…</string>
<string name="generic_save">Tallenna</string>
<string name="generic_tracks">Reitit</string>
@@ -184,7 +183,6 @@ limitations under the License.
<string name="image_arrow">Nuoli</string>
<string name="image_marker">Merkki</string>
<string name="image_marker_count">Merkkien määrä</string>
<string name="image_pause">Tauko</string>
<string name="image_photo_marker">Kuvamerkki</string>
<string name="image_record">Tallenna</string>
<string name="image_stop">Lopeta</string>
@@ -204,7 +202,6 @@ limitations under the License.
<!-- Marker Detail -->
<!-- Marker Edit -->
<string name="marker_edit_marker_type">Merkin tyyppi (esim. vesiputous)</string>
<string name="marker_edit_marker_type_hint">Merkkityyppi</string>
<!-- Marker List -->
<string name="marker_list_empty_message">Sinulla ei ole merkkejä</string>
<!-- Menu -->
@@ -232,17 +229,11 @@ limitations under the License.
<string name="permission_gps_failed">OpenTracks tarvitsee luvan käyttää satelliittipaikannusta.</string>
<!-- Search -->
<!-- Sensor State -->
<string name="sensor_state_battery">Akun taso</string>
<string name="sensor_state_cadence">Kierrosluku</string>
<string name="sensor_state_cadence_value">%1$d kierr./min</string>
<string name="sensor_state_heart_rate">Syke</string>
<string name="sensor_state_heart_rate_value">%1$d ppm</string>
<string name="sensor_state_power">Virransyöttö</string>
<string name="sensor_state_power_value">%1$d W</string>
<string name="sensor_could_not_scan">Bluetooth-laitteita ei saatu etsittyä (virhe %1$i).</string>
<string name="bluetooth_disabled">Ota Bluetooth käyttöön.</string>
<string name="settings_not_while_recording">Ei saatavilla reitin tallennuksen aikana</string>
<string name="settings_show">Näytä</string>
<!-- Settings Advanced -->
<string name="settings_advanced">Lisäasetukset</string>
<string name="settings_default_trackfileformat">Tiedostomuoto vientiä ja jakamista varten</string>
@@ -254,7 +245,6 @@ limitations under the License.
<string name="settings_recording_show_on_lockscreen_while_recording_summary">Näytä tilastot myös ilman laitteen lukituksen avaamista tallentaessa.</string>
<string name="settings_recording_keep_screen_on_while_recording_title">Pidä näyttö päällä</string>
<string name="settings_recording_keep_screen_on_while_recording_summary">Pidä näyttö päällä tallentaessa.</string>
<string name="settings_recording">Tallennus</string>
<string name="settings_recording_default_activity_title">Toiminnan oletustyyppi</string>
<string name="settings_recording_location_frequency_summary">%1$s tallennettujen sijaintien välillä</string>
<string name="settings_recording_max_recording_distance_summary">Uusi segmentti luodaan, jos kahden sijainnin etäisyys on suurempi kuin %1$s</string>
@@ -268,15 +258,11 @@ limitations under the License.
<string name="settings_recording_track_name_number_option">Numero</string>
<string name="settings_recording_track_name_title">Reitin oletusnimi</string>
<!-- Settings Reset -->
<string name="settings_reset">Palauta</string>
<string name="settings_reset_confirm_message">Kaikki asetukset palautetaan oletusarvoisiksi.</string>
<string name="settings_reset_confirm_title">Palautetaanko oletukset nyt?</string>
<string name="settings_reset_done">Kaikki asetukset on palautettu oletusarvoisiksi</string>
<string name="settings_error_initial_values_restored">Pahoittelut, mutta virhe tapahtui. Kaikki asetukset on palautettu oletuksiinsa.</string>
<!-- Settings Sensor -->
<string name="settings_sensor_bluetooth">Bluetooth</string>
<string name="settings_sensor_connecting">Yhdistetty: %1$s</string>
<string name="settings_sensor_disconnected">Yhteys katkaistu: %1$s</string>
<!-- Settings Stats -->
<string name="settings_stats_rate_title">Haluttu nopeus</string>
<string name="settings_stats_units_imperial">Brittiläinen järj.
@@ -367,17 +353,6 @@ limitations under the License.
<item quantity="one">1 maili tunnissa</item>
<item quantity="other">%1$.1f mailia tunnissa</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s kilometriä kohti</string>
<string name="voice_pace_per_mile">%1$s mailia kohti</string>
<string name="voice_template">%1$s ajassa %2$s nopeudella %3$s</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="one">kokonaisetäisyys 1 kilometri</item>
<item quantity="other">kokonaisetäisyys %1$.2f kilometriä</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="one">kokonaisetäisyys 1 maili</item>
<item quantity="other">kokonaisetäisyys %1$.2f mailia</item>
</plurals>
<!-- Waypoint Type -->
<string name="waypoint_type_atm">pankkiautomaatti</string>
<string name="waypoint_type_bank">pankki</string>
@@ -436,15 +411,12 @@ limitations under the License.
<string name="stats_split_interval">Jakoväli</string>
<string name="stats_loss">Tappio</string>
<string name="track_detail_intervals_tab">Välein</string>
<string name="voice_pace_lap">Kierrosaika %1$s</string>
<string name="instant_export_enabled_title">Instant post-workout vienti</string>
<string name="hold_to_pause">Pidä tauko</string>
<string name="hold_to_stop">Pidä lopettaa</string>
<string name="gps_fixed_and_ready">GPS kiinteä ja valmis</string>
<string name="import_no_kml_file_found">Ei doc.KML tiedosto löytyy KMZ</string>
<string name="settings_default_export_uri_title">Seuraa vientihakemistoa</string>
<string name="instant_export_enabled_summary">Vie reitti tiedostoon tallennuksen loputtua</string>
<string name="voice_speed_lap">Kierrosnopeus %1$s</string>
<string name="settings_sensor_wheel_circumference">Pyörän ympärysmitta (mm)</string>
<string name="import_thread_interrupted">Lanka keskeytetty</string>
<string name="import_unsupported_format">Tukematon tiedostomuoto</string>
@@ -554,4 +526,44 @@ limitations under the License.
<string name="stats_sensors_heart_rate">Sykenopeus</string>
<string name="stats_sensors_power">Teho</string>
<string name="no_compatible_file_manager_installed">Yhteensopiva tiedostojen hallinta puuttuu</string>
<string name="settings_export_filename_title">Tiedostonimen muoto</string>
<string name="settings_export_section">Vienti</string>
<string name="settings_recording_customize_layout_title">Muokkaa tallennuksen asettelua</string>
<string name="settings_sensor_bluetooth_service_filter_enabled">Näytä vain Bluetooth-laitteet, jotka ilmoittavat tarvittavat palvelut</string>
<string name="settings_public_api_dashboard_enabled_summary_off">Tallennettuja tietoja ei jaeta automaattisesti muiden sovellusten kanssa.</string>
<string name="voice_per_mile">per maili</string>
<string name="voice_per_kilometer">kilometriä kohti</string>
<string name="lap_time">Kierrosaika</string>
<string name="pace">Tahti</string>
<string name="aggregated_stats_filter_no_results">Määritetylle suodattimelle ei ole toimintoja</string>
<string name="activity_type_swimming">uiminen</string>
<string name="activity_type_swimming_open">uiminen avovedessä</string>
<string name="settings_activity_defaults_category">Aktiviteetin oletusarvot</string>
<string name="gps_recording_status">%1$s: %2$s</string>
<string name="settings_import_section">Tuonti</string>
<string name="settings_public_api_dashboard_enabled_title">Automaattinen tiedonsiirto</string>
<string name="settings_public_api_dashboard_enabled_summary_on">Tallennuksen aloittanut sovellus voi myös käyttää tallennettuja tietoja.</string>
<string name="menu_filter">Suodatin</string>
<string name="settings_recording_idle_speed_title">Joutokäyntinopeuden kynnysarvo</string>
<string name="stats_sensors_cadence">Kadenssi</string>
<string name="stats_clock">Kello</string>
<string name="current_heart_rate">Nykyinen syke</string>
<string name="average_heart_rate">Keskimääräinen syke</string>
<string name="speed">Nopeus</string>
<string name="lap_speed">Kierrosnopeus</string>
<string name="total_distance">Kokonaismatka</string>
<string name="always">Aina</string>
<string name="show_on_map_format_ask">Kysyä</string>
<string name="error_crash_title">%1$s kaatui</string>
<string name="share_crash_report">Jaa kaatumisraportti</string>
<string name="report_bug">Ilmoita virheestä</string>
<string name="generic_dismiss">Vapauta</string>
<string name="gps_recording_without_signal">OpenTracks tallentaa ilman GPS-tietoja.</string>
<string name="settings_defaults_title">Oletusyksiköt ja toiminta</string>
<string name="settings_defaults_summary">Suositeltavat yksiköt, Oletusaktiviteetti, Seurannan oletusnimi</string>
<string name="select_show_on_map_behavior">Valitse\" Näytä kartalla\"käyttäytyminen</string>
<string name="settings_sensors_summary">Pyöräilyanturit, Pyörän ympärysmitta, Juoksuanturit</string>
<string name="settings_announcements_title">Ääni-ilmoitukset</string>
<string name="settings_announcements_summary">Aika, etäisyys, äänennopeus</string>
<string name="settings_gps_summary">Aikaväli, etäisyysväli, maksimietäisyys, tarkkuus</string>
</resources>
-22
View File
@@ -97,7 +97,6 @@
<string name="generic_description_line">Description : %1$s</string>
<string name="generic_name">Nom</string>
<string name="generic_name_line">Nom : %1$s</string>
<string name="generic_paused">Suspendue</string>
<string name="generic_recording">Enregistrement en cours…</string>
<string name="generic_save">Enregistrer</string>
<string name="generic_tracks">Parcours</string>
@@ -107,7 +106,6 @@
<string name="image_arrow">Flèche</string>
<string name="image_marker">Repère</string>
<string name="image_marker_count">Nombre de repères</string>
<string name="image_pause">Pause</string>
<string name="image_photo_marker">Repère de photo</string>
<string name="image_record">Enregistrer</string>
<string name="image_stop">Arrêter</string>
@@ -122,7 +120,6 @@
<string name="marker_name_format">Repère %1$d</string>
<string name="marker_title">%1$d sur %2$d</string>
<string name="marker_edit_marker_type">Type de repère (p. ex. : cascade)</string>
<string name="marker_edit_marker_type_hint">Type de repère</string>
<string name="marker_list_empty_message">Vous n\'avez aucun repère</string>
<string name="menu_aggregated_statistics">Statistiques cumulées</string>
<string name="menu_delete">Supprimer</string>
@@ -141,19 +138,12 @@
<string name="menu_start_gps">Démarrer le GPS</string>
<string name="menu_stop_gps">Arrêter le GPS</string>
<string name="recording_service">Service d\'enregistrement</string>
<string name="sensor_state_battery">Niveau de charge de la pile</string>
<string name="sensor_state_cadence">Cadence</string>
<string name="sensor_state_cadence_value">%1$d tr/min</string>
<string name="sensor_state_heart_rate">Fréquence cardiaque</string>
<string name="sensor_state_heart_rate_value">%1$d b/m</string>
<string name="sensor_state_power">Alimentation</string>
<string name="sensor_state_power_value">%1$d W</string>
<string name="settings_not_while_recording">Cette option n\'est pas accessible pendant l\'enregistrement d\'un parcours.</string>
<string name="settings_show">Afficher</string>
<string name="settings_advanced">Options avancées</string>
<string name="settings_chart_by_distance">Par distance</string>
<string name="settings_chart_by_time">Par heure</string>
<string name="settings_recording">Enregistrement</string>
<string name="settings_recording_default_activity_title">Type d\'activité par défaut</string>
<string name="settings_recording_location_frequency_summary">%1$s entre les positions enregistrées</string>
<string name="settings_recording_max_recording_distance_summary">Un nouveau segment sera créé si la distance entre deux positions enregistrées est supérieure à %1$s</string>
@@ -166,7 +156,6 @@
<string name="settings_recording_track_name_date_local_option">Date (format local)</string>
<string name="settings_recording_track_name_number_option">Numéro</string>
<string name="settings_recording_track_name_title">Nom par défaut du parcours</string>
<string name="settings_reset">Réinitialiser</string>
<string name="settings_reset_confirm_message">Les valeurs par défaut seront rétablies pour tous les paramètres.</string>
<string name="settings_reset_confirm_title">Réinitialiser maintenant?</string>
<string name="settings_reset_done">Les valeurs par défaut de tous les paramètres ont bien été rétablies</string>
@@ -242,17 +231,6 @@
<item quantity="one">%1$.1f mille à l\'heure</item>
<item quantity="other">%1$.1f milles à l\'heure</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s par kilomètre</string>
<string name="voice_pace_per_mile">%1$s par mille</string>
<string name="voice_template">%1$s en %2$s à %3$s</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="one">distance totale %1$.2f kilomètre</item>
<item quantity="other">distance totale %1$.2f kilomètres</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="one">distance totale %1$.2f mile</item>
<item quantity="other">distance totale %1$.2f miles</item>
</plurals>
<string name="waypoint_type_atm">guichet automatique bancaire</string>
<string name="waypoint_type_bank">banque</string>
<string name="waypoint_type_bar">bar</string>
-22
View File
@@ -97,7 +97,6 @@
<string name="generic_description_line">Description : %1$s</string>
<string name="generic_name">Nom</string>
<string name="generic_name_line">Nom : %1$s</string>
<string name="generic_paused">En pause</string>
<string name="generic_recording">Enregistrement…</string>
<string name="generic_save">Enregistrer</string>
<string name="generic_tracks">Parcours</string>
@@ -107,7 +106,6 @@
<string name="image_arrow">Flèche</string>
<string name="image_marker">Repère</string>
<string name="image_marker_count">Nombre de repères</string>
<string name="image_pause">Pause</string>
<string name="image_photo_marker">Repère de photo</string>
<string name="image_record">Enregistrer</string>
<string name="image_stop">Arrêter</string>
@@ -122,7 +120,6 @@
<string name="marker_name_format">Repère %1$d</string>
<string name="marker_title">%1$d sur %2$d</string>
<string name="marker_edit_marker_type">Type de repère (exemple : cascade)</string>
<string name="marker_edit_marker_type_hint">Type de repère</string>
<string name="marker_list_empty_message">Vous n\'avez aucun repère.</string>
<string name="menu_aggregated_statistics">Statistiques cumulées</string>
<string name="menu_delete">Supprimer</string>
@@ -141,19 +138,12 @@
<string name="menu_start_gps">Démarrer le GPS</string>
<string name="menu_stop_gps">Arrêter le GPS</string>
<string name="recording_service">Service enregistrement</string>
<string name="sensor_state_battery">Niveau de la batterie</string>
<string name="sensor_state_cadence">Cadence</string>
<string name="sensor_state_cadence_value">%1$d tr/min</string>
<string name="sensor_state_heart_rate">Fréquence cardiaque</string>
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
<string name="sensor_state_power">Puissance</string>
<string name="sensor_state_power_value">%1$d W</string>
<string name="settings_not_while_recording">Non disponible pendant l\'enregistrement d\'un parcours.</string>
<string name="settings_show">Afficher</string>
<string name="settings_advanced">Avancé</string>
<string name="settings_chart_by_distance">En fonction de la distance</string>
<string name="settings_chart_by_time">En fonction de la durée</string>
<string name="settings_recording">Enregistrement</string>
<string name="settings_recording_default_activity_title">Type activité par déf.</string>
<string name="settings_recording_location_frequency_summary">%1$s entre chaque enregistrement de la position.</string>
<string name="settings_recording_max_recording_distance_summary">Une nouvelle section est créée si la distance entre deux positions est supérieure à %1$s.</string>
@@ -166,7 +156,6 @@
<string name="settings_recording_track_name_date_local_option">Date (format local)</string>
<string name="settings_recording_track_name_number_option">Numéro</string>
<string name="settings_recording_track_name_title">Nom parcours par défaut</string>
<string name="settings_reset">Réinitialiser</string>
<string name="settings_reset_confirm_message">Les valeurs par défaut seront rétablies pour tous les paramètres.</string>
<string name="settings_reset_confirm_title">Réinitialiser maintenant ?</string>
<string name="settings_reset_done">Les valeurs par défaut de tous les paramètres ont bien été rétablies.</string>
@@ -242,17 +231,6 @@
<item quantity="one">%1$.1f mile par heure</item>
<item quantity="other">%1$.1f miles par heure</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s par kilomètre</string>
<string name="voice_pace_per_mile">%1$s par mile</string>
<string name="voice_template">%1$s en %2$s à %3$s</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="one">distance totale %1$.2f kilomètre</item>
<item quantity="other">distance totale %1$.2f kilomètres</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="one">distance totale %1$.2f mile</item>
<item quantity="other">distance totale %1$.2f miles</item>
</plurals>
<string name="waypoint_type_atm">bancomat</string>
<string name="waypoint_type_bank">banque</string>
<string name="waypoint_type_bar">bar</string>
+49 -35
View File
@@ -13,8 +13,7 @@ distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<resources>
--><resources>
<string name="about_preference_title">À propos d\'OpenTracks</string>
<string name="about_description"><i>OpenTracks</i> est une application de suivi sportif qui respecte totalement votre vie privée.</string>
<string name="about_url">Page web du projet : <a href="%1$s">%1$s</a></string>
@@ -151,7 +150,7 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
<string name="description_sensor_cadence">Cadence (tr/min)</string>
<string name="description_sensor_heart_rate">Fréquence cardiaque (bpm)</string>
<string name="description_sensor_power">Puissance (W)</string>
<string name="description_default_speed_or_pace">Par type d activité</string>
<string name="description_default_speed_or_pace">Par type d\'activité</string>
<string name="description_speed_imperial">Vitesse (mi/h)</string>
<string name="description_speed_metric">Vitesse (km/h)</string>
<string name="description_time">Durée</string>
@@ -169,7 +168,6 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
<string name="generic_description_line">Description : %1$s</string>
<string name="generic_name">Nom</string>
<string name="generic_name_line">Nom : %1$s</string>
<string name="generic_paused">En pause</string>
<string name="generic_recording">Enregistrement…</string>
<string name="generic_save">Enregistrer</string>
<string name="generic_tracks">Parcours</string>
@@ -181,7 +179,6 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
<string name="image_arrow">Flèche</string>
<string name="image_marker">Repère</string>
<string name="image_marker_count">Nombre de repères</string>
<string name="image_pause">Pause</string>
<string name="image_photo_marker">Repère de photo</string>
<string name="image_record">Enregistrer</string>
<string name="image_stop">Arrêter</string>
@@ -201,7 +198,6 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
<!-- Marker Detail -->
<!-- Marker Edit -->
<string name="marker_edit_marker_type">Type de repère (exemple : cascade)</string>
<string name="marker_edit_marker_type_hint">Type de repère</string>
<!-- Marker List -->
<string name="marker_list_empty_message">Vous n\'avez aucun repère</string>
<!-- Menu -->
@@ -229,17 +225,11 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
<string name="permission_gps_failed">OpenTracks nécessite une autorisation pour utiliser le GPS.</string>
<!-- Search -->
<!-- Sensor State -->
<string name="sensor_state_battery">Niveau de la batterie</string>
<string name="sensor_state_cadence">Cadences</string>
<string name="sensor_state_cadence_value">%1$d tr/min</string>
<string name="sensor_state_heart_rate">Fréquence cardiaque</string>
<string name="sensor_state_heart_rate_value">%1$d ppm</string>
<string name="sensor_state_power">Puissance</string>
<string name="sensor_state_power_value">%1$d W</string>
<string name="sensor_could_not_scan">Impossible de rechercher les appareils Bluetooth (erreur %1$i).</string>
<string name="bluetooth_disabled">Veuillez activer Bluetooth.</string>
<string name="settings_not_while_recording">Non disponible pendant l\'enregistrement d\'un parcours</string>
<string name="settings_show">Afficher</string>
<!-- Settings Advanced -->
<string name="settings_advanced">Avancé</string>
<!-- Settings Chart -->
@@ -250,7 +240,6 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
<string name="settings_recording_show_on_lockscreen_while_recording_summary">Pendant l\'enregistrement, afficher les statistiques sans déverrouiller l\'appareil.</string>
<string name="settings_recording_keep_screen_on_while_recording_title">Garder l\'écran allumé</string>
<string name="settings_recording_keep_screen_on_while_recording_summary">Pendant l\'enregistrement, garder l\'écran allumé.</string>
<string name="settings_recording">Enregistrement</string>
<string name="settings_recording_default_activity_title">Type activité par déf</string>
<string name="settings_recording_location_frequency_summary">%1$s entre chaque enregistrement de la position</string>
<string name="settings_recording_max_recording_distance_summary">Une nouvelle section est créée si la distance entre deux positions est supérieure à %1$s</string>
@@ -264,15 +253,11 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
<string name="settings_recording_track_name_number_option">Numéro</string>
<string name="settings_recording_track_name_title">Nom parcours par défaut</string>
<!-- Settings Reset -->
<string name="settings_reset">Réinitialiser</string>
<string name="settings_reset_confirm_message">Les valeurs par défaut seront rétablies pour tous les paramètres.</string>
<string name="settings_reset_confirm_title">Réinitialiser maintenant ?</string>
<string name="settings_reset_done">Les valeurs par défaut de tous les paramètres ont bien été rétablies</string>
<string name="settings_error_initial_values_restored">Désolé, mais une erreur sest produite. Tous les paramètres ont été rétablis aux valeurs par défaut.</string>
<!-- Settings Sensor -->
<string name="settings_sensor_bluetooth">Bluetooth</string>
<string name="settings_sensor_connecting">Connecté à %1$s</string>
<string name="settings_sensor_disconnected">Déconnecté de %1$s</string>
<!-- Settings Stats -->
<string name="settings_stats_rate_title">Mode de calcul souhaité</string>
<string name="settings_stats_units_imperial">Unités impériales (mi, pi)</string>
@@ -360,17 +345,6 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
<item quantity="one">%1$.1f mile par heure</item>
<item quantity="other">%1$.1f miles par heure</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s par kilomètre</string>
<string name="voice_pace_per_mile">%1$s par mile</string>
<string name="voice_template">%1$s en %2$s à %3$s</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="one">distance totale %1$.2f kilomètre</item>
<item quantity="other">distance totale %1$.2f kilomètres</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="one">distance totale %1$.2f mile</item>
<item quantity="other">distance totale %1$.2f miles</item>
</plurals>
<!-- Waypoint Type -->
<string name="waypoint_type_atm">distributeur de billets</string>
<string name="waypoint_type_bank">banque</string>
@@ -431,8 +405,6 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
<string name="track_detail_intervals_tab">Intervalles</string>
<string name="interval_list_empty_message">Il n\'y a pas encore d\'intervalle</string>
<string name="aggregated_stats_empty_message">Enregistrez votre première trace pour voir les statistiques agrégées</string>
<string name="voice_pace_lap">Temps au tour de %1$s</string>
<string name="voice_speed_lap">Vitesse du tour de %1$s</string>
<string name="settings_default_export_uri_title">Répertoire d\'exportation des traces</string>
<string name="instant_export_enabled_title">Exportation instantanée après l\'entraînement</string>
<string name="stats_loss">Dénivelé négatif</string>
@@ -442,7 +414,6 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
<string name="settings_night_mode_option_system">Système</string>
<string name="stats_split_interval">Intervalle partagé</string>
<string name="instant_export_enabled_summary">Exportation de la trace vers le stockage après la fin de l\'enregistrement</string>
<string name="hold_to_pause">Tenir pour faire une pause</string>
<string name="hold_to_stop">Maintenir pour arrêter</string>
<string name="track_distance_notification">Distance : %1$s</string>
<string name="open_track_as_KML">Ouvert comme KML</string>
@@ -513,7 +484,6 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
<string name="stats_sensors_power">Énergie</string>
<string name="permission_bluetooth_failed_rejected">Vous devez accorder manuellement l\'accès aux appareils à proximité à OpenTracks dans les paramètres système.</string>
<string name="settings_recording_customize_layout_title">Personnalisez votre disposition d\'enregistrement</string>
<string name="settings_announcements">Annonces</string>
<string name="settings_announcements_totaltime_frequency">Intervalle de temps</string>
<string name="settings_announcements_distance_frequency">Intervalle de distance</string>
<string name="settings_layout_reset_confirm_title">Réinitialiser vos dispositions \?</string>
@@ -521,7 +491,6 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
<string name="settings_all_reset">Réinitialiser</string>
<string name="location_coordinate">%1$s°</string>
<string name="location_latitude_longitude">%1$s, %2$s</string>
<string name="title_activity_settings_custom_layout">Personnaliser la disposition d\'enregistrement</string>
<string name="permission_bluetooth_failed">OpenTracks a besoin de la permission d\'utiliser le Bluetooth.</string>
<string name="settings_recording_customize_layout_select_columns">Champs de données pas rangée</string>
<string name="field_set_primary">Principal</string>
@@ -556,8 +525,8 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
<string name="generic_undo">Annuler</string>
<string name="menu_add_custom_layout">Nouvelle présentation</string>
<string name="generic_filter">Filtre</string>
<string name="generic_to">A</string>
<string name="generic_from">Sur</string>
<string name="generic_to">Au</string>
<string name="generic_from">Du</string>
<string name="menu_select_layout">Sélectionner la mise en page</string>
<string name="menu_filter">Filtre</string>
<string name="custom_layout_list_edit_name">Tapez le nom du modèle à ajouter</string>
@@ -573,4 +542,49 @@ Si le dispositif GPS signale des données inexactes (par exemple, la localisatio
<string name="export_cannot_write_to_dir">Impossible d\'écrire dans le répertoire d\'exportation.</string>
<string name="export_dir_not_writable">" (non inscriptible !)"</string>
<string name="no_compatible_file_manager_installed">Aucun gestionnaire de fichiers compatible n\'est installé</string>
<string name="settings_public_api_enabled_title">API publique</string>
<string name="average_heart_rate">Fréquence cardiaque moyenne</string>
<string name="current_heart_rate">Fréquence cardiaque actuelle</string>
<plurals name="voiceDistanceMiles">
<item quantity="one">%1$.2f mile</item>
<item quantity="other">%1$.2f miles</item>
</plurals>
<string name="lap_time">Temps par tour</string>
<string name="speed">Vitesse</string>
<string name="settings_public_api_dashboard_enabled_summary_off">Les données enregistrées ne seront pas automatiquement partagées avec d\'autres applications.</string>
<string name="settings_public_api_enabled_summary_on">D\'autres applications installées peuvent démarrer ou arrêter les enregistrements.</string>
<string name="settings_public_api_enabled_summary_off">Seul OpenTracks peut démarrer et arrêter les enregistrements.</string>
<plurals name="voiceDistanceKilometers">
<item quantity="one">%1$.2f kilomètre</item>
<item quantity="other">%1$.2f kilomètres</item>
</plurals>
<string name="total_distance">Distance totale</string>
<string name="activity_type_swimming">natation</string>
<string name="activity_type_swimming_open">natation en eau libre</string>
<string name="activity_type_workout">entraînement</string>
<string name="generic_dismiss">Oublier</string>
<string name="gps_recording_status">%1$s : %2$s</string>
<string name="settings_api_title">API publique</string>
<string name="settings_public_api_disabled_toast">L\'API publique d\'OpenTracks est désactivé : Elle peut être activé dans les paramètres.</string>
<string name="voice_per_kilometer">par kilomètre</string>
<string name="voice_per_mile">par mile</string>
<string name="pace">Rythme</string>
<string name="lap_speed">Vitesse par tour</string>
<string name="show_on_map_format_ask">Demander</string>
<string name="show_on_dashboard">Tableau de bord de l\'API OpenTracks</string>
<string name="always">Toujours</string>
<string name="share_crash_report">Partager le rapport de crash</string>
<string name="report_bug">Signaler un problème</string>
<string name="error_crash_title">%1$s a crashé</string>
<string name="gps_recording_without_signal">OpenTracks enregistre actuellement sans les données GPS.</string>
<string name="settings_export_filename_title">Format du nom de fichier</string>
<string name="select_show_on_map_behavior">Sélectionner le comportement \"Montrer sur la carte\"</string>
<string name="settings_public_api_dashboard_enabled_title">Transfert automatique des données</string>
<string name="settings_public_api_dashboard_enabled_summary_on">Une application qui a commencé un enregistrement peut aussi accéder aux données enregistrées.</string>
<string name="settings_announcements_average_speed_pace">Allure/vitesse moyenne</string>
<string name="settings_announcements_lap_speed_pace">Allure/vitesse au tour</string>
<string name="settings_announcements_average_heart_rate">Moyenne de fréquence cardiaque</string>
<string name="settings_announcements_lap_heart_rate">Fréquence cardiaque au tour</string>
<string name="image_discard">Ignorer</string>
<string name="track_discarding">Ignorer la trace</string>
</resources>
-31
View File
@@ -177,7 +177,6 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
<string name="generic_description_line">Descrición: %1$s</string>
<string name="generic_name">Nome</string>
<string name="generic_name_line">Nome: %1$s</string>
<string name="generic_paused">En pausa</string>
<string name="generic_recording">Gravando…</string>
<string name="generic_save">Gardar</string>
<string name="generic_tracks">Traxectos</string>
@@ -191,7 +190,6 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
<string name="image_arrow">Frecha</string>
<string name="image_marker">Marcador</string>
<string name="image_marker_count">Reconto de marcadores</string>
<string name="image_pause">Pausar</string>
<string name="image_photo_marker">Marcador de fotos</string>
<string name="image_record">Gravar</string>
<string name="image_stop">Deter</string>
@@ -211,7 +209,6 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
<!-- Marker Detail -->
<!-- Marker Edit -->
<string name="marker_edit_marker_type">Tipo de marcador (por exemplo, fervenza)</string>
<string name="marker_edit_marker_type_hint">Tipo de marcador</string>
<!-- Marker List -->
<string name="marker_list_empty_message">Non tes marcadores</string>
<!-- Menu -->
@@ -239,17 +236,11 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
<string name="permission_gps_failed">OpenTracks precisa permiso para usar o GPS.</string>
<!-- Search -->
<!-- Sensor State -->
<string name="sensor_state_battery">Nivel da batería</string>
<string name="sensor_state_cadence">Cadencia</string>
<string name="sensor_state_cadence_value">%1$d rpm</string>
<string name="sensor_state_heart_rate">Frecuencia cardíaca</string>
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
<string name="sensor_state_power">Potencia</string>
<string name="sensor_state_power_value">%1$d W</string>
<string name="sensor_could_not_scan">Non se escanearon dispositivos Bluetooth (fallo %1$i).</string>
<string name="bluetooth_disabled">Activa o Bluetooth.</string>
<string name="settings_not_while_recording">Non dispoñible durante a gravación dunha ruta</string>
<string name="settings_show">Mostrar</string>
<!-- Settings Advanced -->
<string name="settings_advanced">Opcións avanzadas</string>
<string name="settings_default_trackfileformat">Formato do ficheiro a exportar/compartir</string>
@@ -263,7 +254,6 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
<string name="settings_recording_keep_screen_on_while_recording_summary">Ao gravar, manten a pantalla acesa.</string>
<string name="settings_recording_fullscreen_on_while_recording_title">Pantalla completa</string>
<string name="settings_recording_fullscreen_on_while_recording_summary">Mentras grava, mostrar a pantalla completa.</string>
<string name="settings_recording">Gravación</string>
<string name="settings_recording_default_activity_title">Tipo de actividade predeterminada</string>
<string name="settings_recording_location_frequency_summary">%1$s entre as situacións gravadas</string>
<string name="settings_recording_max_recording_distance_summary">Créase un novo segmento se a distancia entre as situacións é superior a %1$s</string>
@@ -277,15 +267,11 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
<string name="settings_recording_track_name_number_option">Número</string>
<string name="settings_recording_track_name_title">Nome da ruta por omisión</string>
<!-- Settings Reset -->
<string name="settings_reset">Restablecer</string>
<string name="settings_reset_confirm_message">Toda a configuración volverá aos valores predeterminados.</string>
<string name="settings_reset_confirm_title">Restablecer agora?</string>
<string name="settings_reset_done">Restablecéronse todos os valores predeterminados da configuración</string>
<string name="settings_error_initial_values_restored">Sentímolo, pero algo fallou. Os axustes foron restablecidos aos valores por omisión.</string>
<!-- Settings Sensor -->
<string name="settings_sensor_bluetooth">Bluetooth</string>
<string name="settings_sensor_connecting">Conectado a %1$s</string>
<string name="settings_sensor_disconnected">Desconectado de %1$s</string>
<string name="settings_sensor_wheel_circumference">Circunferencia da roda (mm)</string>
<!-- Settings Stats -->
<string name="settings_stats_rate_title">Indicador preferido</string>
@@ -376,17 +362,6 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
<item quantity="one">1 quilómetro por hora</item>
<item quantity="other">%1$.1f quilómetros por hora</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s por quilómetro</string>
<string name="voice_pace_per_mile">%1$s por quilómetro</string>
<string name="voice_template">%1$s en %2$s a %3$s</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="one">distancia total 1 quilómetro</item>
<item quantity="other">distancia total %1$.2f quilómetros</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="one">distancia total 1 milla</item>
<item quantity="other">distancia total %1$.2f millas</item>
</plurals>
<!-- Waypoint Type -->
<string name="waypoint_type_atm">Caixeiro automático</string>
<string name="waypoint_type_bank">banco</string>
@@ -443,7 +418,6 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
<string name="share_image_subject">Quixera compartir unha imaxe contigo</string>
<string name="share_image_body">Creo que che podería gustar esta imaxe.</string>
<string name="hold_to_stop">Mantén preso para deter</string>
<string name="hold_to_pause">Mantén preso para pausar</string>
<string name="export_all_do_it_for_all">facelo para todos os conflitos</string>
<string name="export_track_errors">Rutas non exportadas</string>
<string name="generic_skip">Omitir</string>
@@ -461,7 +435,6 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
<string name="settings_night_mode_option_night">Noite</string>
<string name="stats_split_interval">Intervalo parcial</string>
<string name="track_detail_intervals_tab">Intervalos</string>
<string name="voice_pace_lap">Tempo da volta de %1$s</string>
<string name="instant_export_enabled_title">Exportación instantánea tras o adestramento</string>
<string name="settings_default_export_uri_title">Directorio onde exportar as rutas</string>
<string name="export_track_already_exists_msg">A ruta %1$s xa existe no directorio de destino.</string>
@@ -473,7 +446,6 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
<string name="settings_night_mode_title">Decorado IU</string>
<string name="settings_night_mode_option_system">Sistema</string>
<string name="interval_list_empty_message">Aínda non hai intervalos</string>
<string name="voice_speed_lap">Velocidade da volta de %1$s</string>
<string name="instant_export_enabled_summary">Rematou a exportación da ruta á almacenaxe tras a gravación</string>
<string name="import_thread_interrupted">Fío interrumpido</string>
<string name="export_progress_summary_new_msg">Exportadas as novas rutas</string>
@@ -521,11 +493,9 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
<string name="stats_sensors_cadence">Cadencia</string>
<string name="location_coordinate">%1$sº</string>
<string name="location_latitude_longitude">%1$s, %2$s</string>
<string name="title_activity_settings_custom_layout">Personaliza a disposición ao gravar</string>
<string name="field_remove_from_layout">Eliminar</string>
<string name="field_set_primary">Primario</string>
<string name="field_set_secondary">Secundario</string>
<string name="settings_announcements">Anuncios</string>
<string name="settings_announcements_totaltime_frequency">Intervalo temporal</string>
<string name="settings_generic_sensor">Xenérico</string>
<string name="settings_cycling_sensor">Ciclismo</string>
@@ -579,7 +549,6 @@ Se te detés ou estás en interiores, non se gardarán datos do sensor (mais ser
<string name="export_dir_not_writable">" (non escribible!)"</string>
<string name="no_compatible_file_manager_installed">Non compatible xestor de ficheiros instalados</string>
<string name="settings_api_title">API pública</string>
<string name="settings_announcements_report_heart_rate">Informar do pulso</string>
<string name="settings_public_api_enabled_title">API pública</string>
<string name="settings_public_api_disabled_toast">API pública de OpenTracks desactivada: pode activarse nos axustes.</string>
<string name="lap_time">Tempo da volta</string>
-22
View File
@@ -117,7 +117,6 @@ limitations under the License.
<string name="generic_description_line">विवरण: %1$s</string>
<string name="generic_name">नाम</string>
<string name="generic_name_line">नाम: %1$s</string>
<string name="generic_paused">पॉज़ किया गया</string>
<string name="generic_recording">रेकॉर्ड हो रहा है…</string>
<string name="generic_save">सहेजें</string>
<string name="generic_tracks">ट्रैक</string>
@@ -129,7 +128,6 @@ limitations under the License.
<string name="image_arrow">तीर</string>
<string name="image_marker">मार्कर</string>
<string name="image_marker_count">मार्कर गणना</string>
<string name="image_pause">पॉज़ करें</string>
<string name="image_photo_marker">फ़ोटो मार्कर</string>
<string name="image_record">रिकॉर्ड करें</string>
<string name="image_stop">रोकें</string>
@@ -148,7 +146,6 @@ limitations under the License.
<!-- Marker Detail -->
<!-- Marker Edit -->
<string name="marker_edit_marker_type">मार्कर प्रकार (उदा., झरना)</string>
<string name="marker_edit_marker_type_hint">मार्कर प्रकार</string>
<!-- Marker List -->
<string name="marker_list_empty_message">आपके पास कोई मार्कर नहीं है</string>
<!-- Menu -->
@@ -172,21 +169,14 @@ limitations under the License.
<string name="recording_service">रिकॉर्डिंग सेवा</string>
<!-- Search -->
<!-- Sensor State -->
<string name="sensor_state_battery">बैटरी स्‍तर</string>
<string name="sensor_state_cadence">केडेंस</string>
<string name="sensor_state_cadence_value">%1$d rpm</string>
<string name="sensor_state_heart_rate">हृदय गति</string>
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
<string name="sensor_state_power">पॉवर</string>
<string name="sensor_state_power_value">%1$d W</string>
<string name="settings_not_while_recording">ट्रैक रिकॉर्ड करते समय उपलब्ध नहीं</string>
<string name="settings_show">दिखाएं</string>
<!-- Settings Advanced -->
<string name="settings_advanced">उन्नत</string>
<!-- Settings Chart -->
<string name="settings_chart_by_distance">दूरी के अनुसार</string>
<string name="settings_chart_by_time">समय के अनुसार</string>
<string name="settings_recording">रिकॉर्डिंग</string>
<string name="settings_recording_default_activity_title">डिफ़ॉल्ट गतिविधि प्रकार</string>
<string name="settings_recording_location_frequency_summary">रिकॉर्ड किए गए स्थानों के बीच %1$s</string>
<string name="settings_recording_max_recording_distance_summary">यदि रिकॉर्ड किए गए दो स्थानों के बीच दूरी %1$s से अधिक हो तो एक नया खंड बनाया जाता है</string>
@@ -200,7 +190,6 @@ limitations under the License.
<string name="settings_recording_track_name_number_option">नंबर</string>
<string name="settings_recording_track_name_title">डिफ़ॉल्ट ट्रैक नाम</string>
<!-- Settings Reset -->
<string name="settings_reset">रीसेट करें</string>
<string name="settings_reset_confirm_message">सभी सेटिंग को डिफ़ॉल्ट मानों पर उलट दिया जाएगा.</string>
<string name="settings_reset_confirm_title">अभी रीसेट करें?</string>
<string name="settings_reset_done">सभी सेटिंग को सामान्य मानों में उलट दिया गया है</string>
@@ -291,17 +280,6 @@ limitations under the License.
<item quantity="one">%1$.1f मील प्रति घंटा</item>
<item quantity="other">%1$.1f मील प्रति घंट</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s प्रति किलोमीटर</string>
<string name="voice_pace_per_mile">%1$s प्रति मील</string>
<string name="voice_template">%3$s पर %2$s में %1$s</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="one">कुल दूरी %1$.2f किलोमीटर</item>
<item quantity="other">कुल दूरी %1$.2f किलोमीटर</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="one">कुल दूरी %1$.2f मील</item>
<item quantity="other">कुल दूरी %1$.2f मील</item>
</plurals>
<!-- Waypoint Type -->
<string name="waypoint_type_atm">ATM</string>
<string name="waypoint_type_bank">बैंक</string>
-24
View File
@@ -117,7 +117,6 @@ limitations under the License.
<string name="generic_description_line">Opis: %1$s</string>
<string name="generic_name">Ime</string>
<string name="generic_name_line">Ime: %1$s</string>
<string name="generic_paused">Pauzirano</string>
<string name="generic_recording">Snimanje…</string>
<string name="generic_save">Spremi</string>
<string name="generic_tracks">Trase</string>
@@ -129,7 +128,6 @@ limitations under the License.
<string name="image_arrow">Strelica</string>
<string name="image_marker">Oznaka</string>
<string name="image_marker_count">Broj oznaka</string>
<string name="image_pause">Pauza</string>
<string name="image_photo_marker">Oznaka fotografije</string>
<string name="image_record">Snimanje</string>
<string name="image_stop">Stop</string>
@@ -148,7 +146,6 @@ limitations under the License.
<!-- Marker Detail -->
<!-- Marker Edit -->
<string name="marker_edit_marker_type">Vrsta oznake (npr. slap)</string>
<string name="marker_edit_marker_type_hint">Vrsta oznake</string>
<!-- Marker List -->
<string name="marker_list_empty_message">Nemate nijednu oznaku</string>
<!-- Menu -->
@@ -172,21 +169,14 @@ limitations under the License.
<string name="recording_service">Usluga snimanja</string>
<!-- Search -->
<!-- Sensor State -->
<string name="sensor_state_battery">Razina baterije</string>
<string name="sensor_state_cadence">Kadenca</string>
<string name="sensor_state_cadence_value">%1$d o/min</string>
<string name="sensor_state_heart_rate">Brzina otkucaja srca</string>
<string name="sensor_state_heart_rate_value">%1$d otkuc./min.</string>
<string name="sensor_state_power">Napajanje</string>
<string name="sensor_state_power_value">%1$d W</string>
<string name="settings_not_while_recording">Nije dostupno tijekom snimanja staze</string>
<string name="settings_show">Prikaži</string>
<!-- Settings Advanced -->
<string name="settings_advanced">Napredno</string>
<!-- Settings Chart -->
<string name="settings_chart_by_distance">Prema udaljenosti</string>
<string name="settings_chart_by_time">Prema vremenu</string>
<string name="settings_recording">Snimanje</string>
<string name="settings_recording_default_activity_title">Zadana vrsta aktivnosti</string>
<string name="settings_recording_location_frequency_summary">%1$s između snimljenih lokacija</string>
<string name="settings_recording_max_recording_distance_summary">Novi segment izrađuje se ako je udaljenost između dviju lokacija veća od %1$s</string>
@@ -200,7 +190,6 @@ limitations under the License.
<string name="settings_recording_track_name_number_option">Broj</string>
<string name="settings_recording_track_name_title">Zadani naziv staze</string>
<!-- Settings Reset -->
<string name="settings_reset">Poništiti</string>
<string name="settings_reset_confirm_message">Sve će se postavke vratiti na zadane vrijednosti.</string>
<string name="settings_reset_confirm_title">Želite li sada vratiti na zadano?</string>
<string name="settings_reset_done">Sve su postavke vraćene na zadane vrijednosti</string>
@@ -296,19 +285,6 @@ limitations under the License.
<item quantity="few">%1$.1f milje na sat</item>
<item quantity="other">%1$.1f milja na sat</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s po kilometru</string>
<string name="voice_pace_per_mile">%1$s po milji</string>
<string name="voice_template">%1$s za %2$s brzinom od %3$s</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="one">ukupna udaljenost %1$.2f kilometar</item>
<item quantity="few">ukupna udaljenost %1$.2f kilometra</item>
<item quantity="other">ukupna udaljenost %1$.2f kilometara</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="one">ukupna udaljenost %1$.2f milja</item>
<item quantity="few">ukupna udaljenost %1$.2f milje</item>
<item quantity="other">ukupna udaljenost %1$.2f milja</item>
</plurals>
<!-- Waypoint Type -->
<string name="waypoint_type_atm">Bankomat</string>
<string name="waypoint_type_bank">banka</string>
+67 -28
View File
@@ -117,7 +117,6 @@ limitations under the License.
<string name="generic_description_line">Leírás: %1$s</string>
<string name="generic_name">Név</string>
<string name="generic_name_line">Név: %1$s</string>
<string name="generic_paused">Szüneteltetett</string>
<string name="generic_recording">Rögzítés…</string>
<string name="generic_save">Mentés</string>
<string name="generic_tracks">Számok</string>
@@ -129,7 +128,6 @@ limitations under the License.
<string name="image_arrow">Nyíl</string>
<string name="image_marker">Jelölő</string>
<string name="image_marker_count">Jelölőszámláló</string>
<string name="image_pause">Szünet</string>
<string name="image_photo_marker">Fényképjelölő</string>
<string name="image_record">Rögzítés</string>
<string name="image_stop">Leállítás</string>
@@ -148,7 +146,6 @@ limitations under the License.
<!-- Marker Detail -->
<!-- Marker Edit -->
<string name="marker_edit_marker_type">Jelölő típusa (pl. vízesés)</string>
<string name="marker_edit_marker_type_hint">Jelölő típusa</string>
<!-- Marker List -->
<string name="marker_list_empty_message">Nincsenek jelölők</string>
<!-- Menu -->
@@ -172,21 +169,14 @@ limitations under the License.
<string name="recording_service">Rögzítőszolgáltatás</string>
<!-- Search -->
<!-- Sensor State -->
<string name="sensor_state_battery">Akkumulátor töltöttségi szintje</string>
<string name="sensor_state_cadence">Fordulatszám</string>
<string name="sensor_state_cadence_value">%1$d fordulat/perc</string>
<string name="sensor_state_heart_rate">Szívritmus</string>
<string name="sensor_state_heart_rate_value">%1$d ütés/perc</string>
<string name="sensor_state_power">Teljesítmény</string>
<string name="sensor_state_power_value">%1$d W</string>
<string name="settings_not_while_recording">Pálya rögzítése közben nem érhető el</string>
<string name="settings_show">Megjelenítés</string>
<!-- Settings Advanced -->
<string name="settings_advanced">Speciális</string>
<!-- Settings Chart -->
<string name="settings_chart_by_distance">Távolság szerint</string>
<string name="settings_chart_by_time">Idő szerint</string>
<string name="settings_recording">Rögzítés</string>
<string name="settings_recording_default_activity_title">Alapértelmezett tevékenységtípus</string>
<string name="settings_recording_location_frequency_summary">%1$s helyszínrögzítések között</string>
<string name="settings_recording_max_recording_distance_summary">Új szegmens jön létre, ha a két hely közötti távolság nagyobb, mint %1$s</string>
@@ -200,7 +190,6 @@ limitations under the License.
<string name="settings_recording_track_name_number_option">Szám</string>
<string name="settings_recording_track_name_title">Pálya alapértelmezett neve</string>
<!-- Settings Reset -->
<string name="settings_reset">Visszaállítás</string>
<string name="settings_reset_confirm_message">Minden beállítás visszaáll az alapértelmezett értékekre.</string>
<string name="settings_reset_confirm_title">Visszaállítja most?</string>
<string name="settings_reset_done">Minden beállítás visszaállt az alapértelmezett értékre</string>
@@ -292,17 +281,6 @@ limitations under the License.
<item quantity="one">1 mérföld óránként</item>
<item quantity="other">%1$.1f mérföld óránként</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s kilométerenként</string>
<string name="voice_pace_per_mile">%1$s mérföldenként</string>
<string name="voice_template">%1$s %2$s alatt %3$s sebességgel</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="one">össztávolság: 1 kilométer</item>
<item quantity="other">össztávolság: %1$.2f kilométer</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="one">össztávolság: 1 mérföld</item>
<item quantity="other">össztávolság: %1$.2f mérföld</item>
</plurals>
<!-- Waypoint Type -->
<string name="waypoint_type_atm">bankautomata</string>
<string name="waypoint_type_bank">bank</string>
@@ -388,7 +366,6 @@ limitations under the License.
<string name="interval_list_empty_message">Még nincs intervallum</string>
<string name="settings_default_export_uri_title">Pálya export könyvtár</string>
<string name="instant_export_enabled_summary">Sáv exportálása a tárolóba a felvétel befejezése után</string>
<string name="hold_to_pause">Tartsa a szünethez</string>
<string name="hold_to_stop">Tartsa lenyomva a leállításhoz</string>
<string name="track_distance_notification">Távolság: %1$s</string>
<string name="instant_export_enabled_title">Azonnali edzés utáni export</string>
@@ -402,7 +379,6 @@ limitations under the License.
<string name="import_unsupported_format">Nem támogatott fájlformátum</string>
<string name="description_default_speed_or_pace">Tevékenységtípus szerint</string>
<string name="export_without_photos">fotók nélkül</string>
<string name="voice_speed_lap">%1$s körsebessége</string>
<string name="help_gps_troubleshooting_content"> Mit tehetsz:
\n a) ellenőrizze, hogy a GPS engedélyezve van-e,
\n b) javítsa a GPS-vételt (pl. menjen a szabadba),
@@ -425,12 +401,8 @@ limitations under the License.
<string name="settings_night_mode_option_system">Rendszer</string>
<string name="settings_night_mode_option_day">Nap</string>
<string name="settings_night_mode_option_night">Éjszaka</string>
<string name="settings_error_initial_values_restored">Sajnáljuk, de hiba történt. Minden beállítás visszaállt az alapértelmezett értékekre.</string>
<string name="settings_sensor_connecting">Csatlakoztatva %1$s</string>
<string name="settings_sensor_disconnected">Megszakadt a kapcsolat %1$s</string>
<string name="stats_loss">Veszteség</string>
<string name="track_recording_notification_accuracy">Helyszín pontossága: %1$s</string>
<string name="voice_pace_lap">Köridő %1$s</string>
<string name="export_progress_summary_overwrite_msg">Sávok felülírása</string>
<string name="export_progress_summary_skip_msg">Kihagyott sávok</string>
<string name="export_progress_summary_errors_msg">Hibák</string>
@@ -494,4 +466,71 @@ limitations under the License.
<string name="settings_sensor_cycling_cadence">Kerékpározás: lépésszám</string>
<string name="settings_sensor_cycling_distance_speed">Kerékpározás: táv és sebesség</string>
<string name="settings_sensor_running_speed_and_cadence">Futás: távolság, sebesség és ritmus</string>
<string name="generic_today">Ma</string>
<string name="generic_yesterday">Tegnap</string>
<string name="generic_filter">Szűrő</string>
<string name="generic_to">Hogy</string>
<string name="generic_from">Tól től</string>
<string name="activity_type_swimming">úszás</string>
<string name="activity_type_swimming_open">úszás nyílt vízben</string>
<string name="activity_type_workout">edzés</string>
<string name="export_cannot_write_to_dir">Nem lehet írni az exportkönyvtárba.</string>
<string name="export_dir_not_writable">" (nem írható!)"</string>
<string name="generic_choose_an_option">Válasszon egy opciót</string>
<string name="menu_select_layout">Válassza Ki Az Elrendezést</string>
<string name="menu_add_custom_layout">Új Elrendezés</string>
<string name="menu_filter">Szűrő</string>
<string name="settings_defaults_title">Alapértelmezett egységek és tevékenység</string>
<string name="gps_recording_status">%1$s: %2$s</string>
<string name="settings_defaults_summary">Preferált Egységek, Alapértelmezett Tevékenység, Alapértelmezett Név Követése</string>
<string name="settings_ui_title">Felhasználói Felület</string>
<string name="settings_ui_summary">Megjelenés, Felvétel Elrendezése, Téma</string>
<string name="settings_gps_summary">Időintervallum, távolság intervallum, Max távolság, pontosság</string>
<string name="settings_sensors_title">Bluetooth Érzékelők</string>
<string name="generic_dismiss">Elbocsátás</string>
<string name="settings_sensors_summary">Kerékpáros Érzékelők, Kerék Kerülete, Futásérzékelők</string>
<string name="settings_announcements_title">Voice Közlemények</string>
<string name="settings_export_filename_title">A fájlnév formátuma</string>
<string name="settings_public_api_dashboard_enabled_summary_off">A rögzített adatokat nem osztják meg automatikusan más alkalmazásokkal.</string>
<string name="field_remove_from_layout">Eltávolítás</string>
<string name="stats_sensors_power">Teljesítmény</string>
<string name="stats_sensors_cadence">Ütem</string>
<string name="settings_all_reset">Visszaállítás</string>
<string name="settings_layout_reset_confirm_message">Minden elrendezési beállítás visszaáll az alapértelmezett értékekre. Ez nem törli az eszközön lévő zeneszámokat.</string>
<string name="settings_recording_idle_speed_title">Alapjárati fordulatszám-küszöbérték</string>
<string name="custom_layout_list_title">Elrendezések</string>
<string name="custom_layout_list_edit_name">Írja be az elrendezés nevét a hozzáadáshoz</string>
<string name="aggregated_stats_filter_no_results">A megadott szűrőhöz nincsenek tevékenységek</string>
<string name="speed">Sebesség</string>
<string name="total_distance">Teljes távolság</string>
<string name="settings_generic_sensor">Általános</string>
<string name="no_compatible_file_manager_installed">Nincs kompatibilis fájlkezelő telepítve</string>
<string name="field_set_secondary">Másodlagos</string>
<string name="field_set_primary">Elsődleges</string>
<string name="settings_running_sensor">Futás</string>
<string name="settings_public_api_enabled_summary_on">Más telepített alkalmazások elindíthatják vagy leállíthatják a felvételeket.</string>
<string name="settings_public_api_dashboard_enabled_title">Automatikus adatátvitel</string>
<string name="settings_public_api_dashboard_enabled_summary_on">A felvételt elindító alkalmazás szintén hozzáférhet a rögzített adatokhoz.</string>
<string name="stats_sensors_heart_rate">Pulzusszám</string>
<string name="stats_clock">Óra</string>
<string name="current_heart_rate">Jelenlegi pulzusszám</string>
<string name="average_heart_rate">Átlagos pulzusszám</string>
<string name="settings_sensor_bluetooth_service_filter_enabled">Csak azokat a Bluetooth-eszközöket jelenítse meg, amelyek bejelentik a szükséges szolgáltatásokat</string>
<string name="settings_import_section">Behozatal</string>
<string name="settings_export_section">Kivitel</string>
<string name="settings_layout_reset_confirm_title">Állítsa vissza az elrendezéseket\?</string>
<string name="settings_layout_reset_done">Az összes elrendezési beállítás visszaállt az alapértelmezett értékekre</string>
<string name="custom_layout_list_layout_removed">Az elrendezést eltávolították</string>
<string name="settings_recording_customize_layout_title">A felvétel elrendezésének testreszabása</string>
<string name="settings_recording_customize_layout_select_columns">Adatmezők soronként</string>
<string name="custom_layout_list_edit_already_exists">Az elrendezés neve már létezik</string>
<string name="stats_custom_layout_default_layout">Alapértelmezett Elrendezés</string>
<string name="settings_layout_reset">Az Egyéni Elrendezés Visszaállítása</string>
<string name="settings_cycling_sensor">Kerékpározás</string>
<string name="location_coordinate">%1$s°</string>
<string name="location_latitude_longitude">%1$s, %2$s</string>
<string name="always">Mindig</string>
<string name="error_crash_title">%1$s összeomlott</string>
<string name="settings_announcements_summary">Idő, Távolság, Hangsebesség</string>
<string name="settings_units_category">Egységek</string>
</resources>
-21
View File
@@ -97,7 +97,6 @@
<string name="generic_description_line">Keterangan: %1$s</string>
<string name="generic_name">Nama</string>
<string name="generic_name_line">Nama: %1$s</string>
<string name="generic_paused">Dijeda</string>
<string name="generic_recording">Merekam…</string>
<string name="generic_save">Simpan</string>
<string name="generic_tracks">Lintasan</string>
@@ -107,7 +106,6 @@
<string name="image_arrow">Panah</string>
<string name="image_marker">Penanda</string>
<string name="image_marker_count">Hitungan penanda</string>
<string name="image_pause">Jeda</string>
<string name="image_photo_marker">Penanda foto</string>
<string name="image_record">Rekam</string>
<string name="image_stop">Hentikan</string>
@@ -122,7 +120,6 @@
<string name="marker_name_format">Penanda %1$d</string>
<string name="marker_title">%1$d dari %2$d</string>
<string name="marker_edit_marker_type">Jenis penanda (misal: air terjun)</string>
<string name="marker_edit_marker_type_hint">Jenis penanda</string>
<string name="marker_list_empty_message">Anda tidak memiliki penanda</string>
<string name="menu_aggregated_statistics">Statistik agregat</string>
<string name="menu_delete">Hapus</string>
@@ -141,19 +138,12 @@
<string name="menu_start_gps">Nyalakan GPS</string>
<string name="menu_stop_gps">Matikan GPS</string>
<string name="recording_service">Layanan perekaman</string>
<string name="sensor_state_battery">Level baterai</string>
<string name="sensor_state_cadence">Tempo</string>
<string name="sensor_state_cadence_value">%1$d rpm</string>
<string name="sensor_state_heart_rate">Denyut jantung</string>
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
<string name="sensor_state_power">Daya</string>
<string name="sensor_state_power_value">%1$d W</string>
<string name="settings_not_while_recording">Tidak tersedia saat merekam trek</string>
<string name="settings_show">Tampilkan</string>
<string name="settings_advanced">Lanjutan</string>
<string name="settings_chart_by_distance">Menurut jarak</string>
<string name="settings_chart_by_time">Menurut waktu</string>
<string name="settings_recording">Perekaman</string>
<string name="settings_recording_default_activity_title">Jenis aktivitas default</string>
<string name="settings_recording_location_frequency_summary">%1$s antara lokasi yang direkam</string>
<string name="settings_recording_max_recording_distance_summary">Segmen baru dibuat jika jarak antara dua lokasi lebih besar dari %1$s</string>
@@ -166,7 +156,6 @@
<string name="settings_recording_track_name_date_local_option">Tanggal (lokal)</string>
<string name="settings_recording_track_name_number_option">Angka</string>
<string name="settings_recording_track_name_title">Nama trek default</string>
<string name="settings_reset">Setel ulang</string>
<string name="settings_reset_confirm_message">Semua pengaturan akan dikembalikan ke nilai baku. Ini tidak akan menghapus trek apapun pada perangkat.</string>
<string name="settings_reset_confirm_title">Setel ulang sekarang?</string>
<string name="settings_reset_done">Semua setelan telah dikembalikan ke nilai default</string>
@@ -239,15 +228,6 @@
<plurals name="voiceSpeedMilesPerHour">
<item quantity="other">%1$.1f mil per jam</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s per kilometer</string>
<string name="voice_pace_per_mile">%1$s per mil</string>
<string name="voice_template">%1$s dalam %2$s pada kecepatan %3$s</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="other">jarak total %1$.2f kilometer</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="other">jarak total %1$.2f mil</item>
</plurals>
<string name="waypoint_type_atm">ATM</string>
<string name="waypoint_type_bank">bank</string>
<string name="waypoint_type_bar">bar</string>
@@ -307,7 +287,6 @@
<string name="help_support_title">Bagaimana mendukung OpenTracks\?</string>
<string name="import_progress_summary_errors_msg">Kesalahan</string>
<string name="open_track_as_GPX">Buka sebagai GPX</string>
<string name="settings_error_initial_values_restored">Maaf, tapi terjadi kesalahan. Semua pengaturan telah dikembalikan ke nilai baku.</string>
<string name="track_speed_notification">Kecepatan: %1$s</string>
<string name="import_unable_to_import_file">Tidak bisa mengimpor berkas: %1$s</string>
<string name="open_track_as_trackfileformat">Buka sebagai %1$s</string>
+1 -30
View File
@@ -157,7 +157,6 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
<string name="generic_description_line">Descrizione: %1$s</string>
<string name="generic_name">Nome</string>
<string name="generic_name_line">Nome: %1$s</string>
<string name="generic_paused">In pausa</string>
<string name="generic_recording">Registrazione…</string>
<string name="generic_save">Salva</string>
<string name="generic_tracks">Percorsi</string>
@@ -169,7 +168,6 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
<string name="image_arrow">Freccia</string>
<string name="image_marker">Indicatore</string>
<string name="image_marker_count">Contatore indicatori</string>
<string name="image_pause">Pausa</string>
<string name="image_photo_marker">Indicatore fotografico</string>
<string name="image_record">Registra</string>
<string name="image_stop">Interrompi</string>
@@ -188,7 +186,6 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
<!-- Marker Detail -->
<!-- Marker Edit -->
<string name="marker_edit_marker_type">Tipo di indicatore (ad es. cascata)</string>
<string name="marker_edit_marker_type_hint">Tipo di indicatore</string>
<!-- Marker List -->
<string name="marker_list_empty_message">Non ci sono indicatori</string>
<!-- Menu -->
@@ -212,21 +209,15 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
<string name="recording_service">Servizio di registrazione</string>
<!-- Search -->
<!-- Sensor State -->
<string name="sensor_state_battery">Livello batteria</string>
<string name="sensor_state_cadence">Cadenza</string>
<string name="sensor_state_cadence_value">%1$d giri al minuto</string>
<string name="sensor_state_heart_rate">Battito cardiaco</string>
<string name="sensor_state_heart_rate_value">%1$d battiti al minuto</string>
<string name="sensor_state_power">Potenza</string>
<string name="sensor_state_power_value">%1$d W</string>
<string name="settings_not_while_recording">Non disponibile durante la registrazione di un percorso</string>
<string name="settings_show">Mostra</string>
<!-- Settings Advanced -->
<string name="settings_advanced">Avanzate</string>
<!-- Settings Chart -->
<string name="settings_chart_by_distance">Per distanza</string>
<string name="settings_chart_by_time">Per durata</string>
<string name="settings_recording">Registrazione</string>
<string name="settings_recording_default_activity_title">Tipo di attività predefinita</string>
<string name="settings_recording_location_frequency_summary">%1$s tra posizioni registrate</string>
<string name="settings_recording_max_recording_distance_summary">Viene creato un nuovo segmento se la distanza tra due punti è maggiore di %1$s</string>
@@ -240,7 +231,6 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
<string name="settings_recording_track_name_number_option">Numero</string>
<string name="settings_recording_track_name_title">Nome percorso predefinito</string>
<!-- Settings Reset -->
<string name="settings_reset">Reimposta</string>
<string name="settings_reset_confirm_message">Tutte le impostazioni verranno ripristinate sui valori predefiniti. Questo non eliminerà alcuna traccia dal dispositivo.</string>
<string name="settings_reset_confirm_title">Reimpostare ora?</string>
<string name="settings_reset_done">Tutte le impostazioni sono ripristinate sui valori predefiniti</string>
@@ -332,17 +322,6 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
<item quantity="one">1 miglio all\'ora</item>
<item quantity="other">%1$.1f miglia all\'ora</item>
</plurals>
<string name="voice_pace_per_kilometer">%1$s per chilometro</string>
<string name="voice_pace_per_mile">%1$s per miglio</string>
<string name="voice_template">%1$s in %2$s a %3$s</string>
<plurals name="voiceTotalDistanceKilometers">
<item quantity="one">distanza totale 1 chilometro</item>
<item quantity="other">distanza totale %1$.2f chilometri</item>
</plurals>
<plurals name="voiceTotalDistanceMiles">
<item quantity="one">distanza totale 1 miglio</item>
<item quantity="other">distanza totale %1$.2f miglia</item>
</plurals>
<!-- Waypoint Type -->
<string name="waypoint_type_atm">Bancomat</string>
<string name="waypoint_type_bank">banca</string>
@@ -396,10 +375,8 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
<string name="waypoint_type_water_fountain">fontana ad acqua</string>
<string name="waypoint_type_waypoint">tappa</string>
<string name="settings_night_mode_title">Tema dell\'interfaccia utente</string>
<string name="settings_error_initial_values_restored">Mi dispiace, ma si è verificato un errore. Tutte le impostazioni sono state riportate ai valori predefiniti.</string>
<string name="stats_split_interval">Intervallo di divisione</string>
<string name="aggregated_stats_empty_message">Registra il tuo primo percorso per vedere le statistiche aggregate</string>
<string name="voice_speed_lap">Velocità per giro di %1$s</string>
<string name="share_image_subject">Vorrei condividere un\'immagine con te</string>
<string name="settings_default_export_uri_title">Cartella di esportazione dei percorsi</string>
<string name="help_track_export_content"> Le tracce possono essere esportate dalle Impostazioni con formato KMZ, KML o GPX. KMZ/KML contiene tutti i dati; GPX contiene solo le posizioni. Le tracce condivise tramite l\'icona <i>condividi</i> sono esportate come KMZ. </string>
@@ -463,14 +440,10 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
<string name="settings_night_mode_option_system">Sistema</string>
<string name="settings_night_mode_option_day">Chiaro</string>
<string name="settings_night_mode_option_night">Scuro</string>
<string name="settings_sensor_connecting">Connesso a %1$s</string>
<string name="settings_sensor_disconnected">Disconnesso da %1$s</string>
<string name="track_detail_intervals_tab">Intervalli</string>
<string name="interval_list_empty_message">Non c\'è ancora nessun intervallo</string>
<string name="voice_pace_lap">Tempo sul giro di %1$s</string>
<string name="share_image_body">Penso che potresti essere interessat* a questa immagine.</string>
<string name="hold_to_stop">Tieni premuto per fermare</string>
<string name="hold_to_pause">Tieni premuto per mettere in pausa</string>
<string name="instant_export_enabled_summary">Esporta la traccia nella memoria al termine della registrazione</string>
<string name="instant_export_enabled_title">Esportazione istantanea post-allenamento</string>
<string name="generic_open_track">Traccia aperta</string>
@@ -534,7 +507,6 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
<string name="settings_layout_reset_done">Tutte le impostazioni del layout sono state reimpostate ai valori predefiniti</string>
<string name="settings_generic_sensor">Generico</string>
<string name="value_float_kilometer_hour">%1$.1f km/h</string>
<string name="title_activity_settings_custom_layout">Personalizza Layout di Registrazione</string>
<string name="settings_open_tracks_title">Binari aperti</string>
<string name="settings_open_tracks_summary">Tutto a proposito del progetto OpenTracks</string>
<string name="settings_ui_title">Interfaccia Utente</string>
@@ -549,7 +521,6 @@ Infatti, un\'applicazione deve supportare <i>ACTION_VIEW</i> con MIME <i>applica
<string name="settings_units_category">Unità</string>
<string name="settings_activity_defaults_category">Predefiniti dell\'Attività</string>
<string name="settings_reset_summary">Reimposta Impostazioni ai Valori Predefiniti</string>
<string name="settings_announcements">Annunci</string>
<string name="settings_layout_reset">Reimposta Layout Personalizzato</string>
<string name="settings_layout_reset_confirm_message">Tutte le impostazioni di layout saranno reimpostate ai valori predefiniti. Questo non eliminerà alcuna traccia dal dispositivo.</string>
<string name="settings_layout_reset_confirm_title">Rempostare i tuoi layout\?</string>

Some files were not shown because too many files have changed in this diff Show More