mirror of
https://codeberg.org/OpenTracksApp/OpenTracks.git
synced 2026-10-24 11:15:18 +02:00
Compare commits
276 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 693904529d | |||
| 08143a546a | |||
| eb49156ee7 | |||
| 51c03d8d75 | |||
| 666cbbad68 | |||
| 1cbc93c303 | |||
| afd1232940 | |||
| a3407ccbea | |||
| c259f9b8bd | |||
| b1a556bf91 | |||
| ab70874d59 | |||
| e6367b1dfa | |||
| 8db381c448 | |||
| ef111b7959 | |||
| 56c6cb1f19 | |||
| 874c5eb8ae | |||
| 1a087b1117 | |||
| 3120cd8da0 | |||
| 4263c000c0 | |||
| f4073ead63 | |||
| 2f90784442 | |||
| 2cab394d03 | |||
| 55f1bcb30b | |||
| 33a17784e6 | |||
| 7cb97b0e6b | |||
| 1cb3db496a | |||
| d49d6c9857 | |||
| 12f0c3313f | |||
| a78e059612 | |||
| 0774ee512f | |||
| 4c55468571 | |||
| 201f2d1b27 | |||
| 595ad7f7b5 | |||
| d518507193 | |||
| 888f59133d | |||
| 5bb5b3b344 | |||
| b584a95c9c | |||
| 9ba152c469 | |||
| 1191f2e1e2 | |||
| e5aed794ba | |||
| 7956063598 | |||
| 0f356de2ca | |||
| 5b4b54694c | |||
| 9c271972d2 | |||
| 744f11eaa0 | |||
| 3c16f67882 | |||
| 12d1a50995 | |||
| 21404fed50 | |||
| 990c91f978 | |||
| 6a262426a5 | |||
| 1b2998f423 | |||
| d24dd2b005 | |||
| 341fd02f9a | |||
| 6833ea7282 | |||
| a1da53864e | |||
| 28d49de047 | |||
| 4ae9d24960 | |||
| 0b0b1a0d8d | |||
| 090cdbf712 | |||
| 8258d607c3 | |||
| 686a2a9b8f | |||
| 7ddb6b32bb | |||
| 5cd639c852 | |||
| ae9906fb18 | |||
| 96bcac397b | |||
| d7b207afac | |||
| 1672ba99ad | |||
| a6d4a05839 | |||
| 860b90da37 | |||
| 46d7385d25 | |||
| 25fbd9490c | |||
| 6d33adffce | |||
| 92cecb6f3a | |||
| e6bdc9a41d | |||
| e234e9c493 | |||
| 73d6ca6ca6 | |||
| 1ef7a6ecc4 | |||
| 94a0b57362 | |||
| 4ebaf366d6 | |||
| 911f2c525f | |||
| a310f773a1 | |||
| 8a247e5b38 | |||
| 1045ade71a | |||
| 4307dceb70 | |||
| 59ea50b96f | |||
| 8d015fee6c | |||
| 653352255e | |||
| ebcdd87481 | |||
| 8d1af8f2cf | |||
| 766739c222 | |||
| 54fa6aa3e2 | |||
| 1dc737410b | |||
| 4093899a82 | |||
| 9236eb6944 | |||
| 9f00b0606b | |||
| 20a18b86dc | |||
| 34cfc235c3 | |||
| f733d18a60 | |||
| 221b61c7f1 | |||
| ca64f2c749 | |||
| 3d083928eb | |||
| f47ab142f2 | |||
| 6e4d46a14d | |||
| fffeb40200 | |||
| a5e5d0ca51 | |||
| 7791ff8659 | |||
| 3db0a53377 | |||
| 58dac8b706 | |||
| f29b6d4088 | |||
| 80fb4f9998 | |||
| 6340e55fff | |||
| 625549d381 | |||
| 7d9878b32e | |||
| a5553211af | |||
| 044e84154c | |||
| f61d718b2d | |||
| c7a54dcee8 | |||
| 3dc2ee3462 | |||
| 6817ff3234 | |||
| fb0400001a | |||
| 16591b3e80 | |||
| 28da32f573 | |||
| c687308d97 | |||
| 65c8e8542e | |||
| ca4cb648e7 | |||
| 53240c3d1a | |||
| 95b27f66fb | |||
| f31e146cda | |||
| 696939112a | |||
| 73ce97a63e | |||
| 5988ae3d3f | |||
| 58655814b2 | |||
| 11f1b6e72d | |||
| 8f537f33a7 | |||
| 4db72230ff | |||
| fd92793c2a | |||
| 05e45b6870 | |||
| 7521f906ed | |||
| 3222a0c497 | |||
| caf3d957cd | |||
| 005d00cfaa | |||
| c227d54f26 | |||
| bc62320b9f | |||
| 0ad32f676c | |||
| fff5f2d406 | |||
| be653b73ee | |||
| 4580f2a7bb | |||
| 5dd56892fb | |||
| e3460d94ed | |||
| 920ad5129a | |||
| fba08fe8dd | |||
| 5746a41905 | |||
| 361ae909e7 | |||
| 4b59660ea1 | |||
| cabf5d238e | |||
| 9c902b89ed | |||
| c31b8a5802 | |||
| 901c548d13 | |||
| b77de1e10d | |||
| b8c7fba7d8 | |||
| 466719fbc8 | |||
| 4f0ab71503 | |||
| daa4689f44 | |||
| 023a5aa221 | |||
| 291633c1d5 | |||
| 00990076fb | |||
| e672df7a60 | |||
| 82eb237117 | |||
| 832005565a | |||
| 894699f009 | |||
| f45dba258b | |||
| 17be49af70 | |||
| e91d36fc16 | |||
| 56f333180b | |||
| 9af8b0d353 | |||
| 57c0750980 | |||
| 8e36ee2e7d | |||
| ec2e527fd1 | |||
| d968e5d0c1 | |||
| 4257f21cae | |||
| 26e7059af2 | |||
| 94595f2a1f | |||
| 1fa76301e2 | |||
| ce2c608cc9 | |||
| 916f26dfda | |||
| a108edc125 | |||
| 1a1a8a851b | |||
| ddd1efeb58 | |||
| 6c30dd8509 | |||
| 21fe59f32c | |||
| f79b2b51c8 | |||
| b16e9ad964 | |||
| 65f8ba16b3 | |||
| 9b48993cd0 | |||
| 54cec3e821 | |||
| daeb972c8a | |||
| 73872e8926 | |||
| c15fa21a56 | |||
| e9d1080e5d | |||
| d0b3f45151 | |||
| 32b0b02d28 | |||
| d6617f61b7 | |||
| b5180f235f | |||
| e879eedbd6 | |||
| c7ca6800f7 | |||
| fed884a6ce | |||
| 02a77e5ce7 | |||
| 6f97399aeb | |||
| 1c4f0e67ab | |||
| ebed386d96 | |||
| e44f63feb7 | |||
| 34c5a3ab97 | |||
| eac47db058 | |||
| e72d2a750c | |||
| f54856c3f1 | |||
| 81f6bbe955 | |||
| c162c0a0ff | |||
| 385d05dcdb | |||
| 308ce4ac07 | |||
| f8a0241e1f | |||
| c74a5c8749 | |||
| defdd49a65 | |||
| 46cdae399d | |||
| a19f363b4a | |||
| b55b25e00d | |||
| d527770a0a | |||
| fb75b0fa58 | |||
| 1c986e48f2 | |||
| 7f666c571e | |||
| 3c23a9f540 | |||
| ec08717d01 | |||
| 30dc440d43 | |||
| 919e670f95 | |||
| 8ff95efc65 | |||
| b2b98210d5 | |||
| b3f2db4619 | |||
| caede289d0 | |||
| 7a09e32261 | |||
| 388f1d0213 | |||
| f44d72a51f | |||
| 5e9b1d1cb7 | |||
| 305c0d2502 | |||
| 4306634fb2 | |||
| 9fded8953d | |||
| a416b4b0e7 | |||
| e795fbf07d | |||
| 41401e2f13 | |||
| 848c5a8db8 | |||
| becd65f9f5 | |||
| ece4470fec | |||
| de08707000 | |||
| d7a5bf8231 | |||
| 10453e3d4e | |||
| 4d4898e01a | |||
| 286fbc9b45 | |||
| b1ea89a548 | |||
| 2e5643aa0d | |||
| f48e175578 | |||
| 252909b133 | |||
| 125cafa79d | |||
| d15810f908 | |||
| a89e25b00c | |||
| f256c25cb6 | |||
| db75b28d5b | |||
| 87c4428a86 | |||
| 8f1eda9726 | |||
| dc88007154 | |||
| 8f82375fa4 | |||
| dd37526914 | |||
| 16d2f080b2 | |||
| 2cce5c56cd | |||
| 24be37aea5 | |||
| f1c9f7512b | |||
| 03a200ec4b | |||
| 93eefe5cf2 | |||
| 792e88acaa |
+1
-1
@@ -4,7 +4,7 @@ end_of_line = lf
|
|||||||
indent_size = 4
|
indent_size = 4
|
||||||
indent_style = space
|
indent_style = space
|
||||||
insert_final_newline = false
|
insert_final_newline = false
|
||||||
max_line_length = 100
|
max_line_length = 200
|
||||||
tab_width = 4
|
tab_width = 4
|
||||||
ij_continuation_indent_size = 8
|
ij_continuation_indent_size = 8
|
||||||
ij_formatter_off_tag = @formatter:off
|
ij_formatter_off_tag = @formatter:off
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
name: Android Test
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
name: Android Lint
|
||||||
|
runs-on: docker
|
||||||
|
container:
|
||||||
|
image: 'ubuntu:android-24.04'
|
||||||
|
steps:
|
||||||
|
- name: Checkout sources
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
fetch-depth: 1
|
||||||
|
|
||||||
|
- name: Lint
|
||||||
|
shell: bash
|
||||||
|
run: ./gradlew lint
|
||||||
|
|
||||||
|
android-check:
|
||||||
|
runs-on: docker
|
||||||
|
container:
|
||||||
|
image: 'ubuntu:android-24.04'
|
||||||
|
steps:
|
||||||
|
- name: Checkout sources
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
fetch-depth: 1
|
||||||
|
|
||||||
|
- name: Test
|
||||||
|
shell: bash
|
||||||
|
run: ./gradlew testNightlyDebugUnitTest --stacktrace
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
# These are supported funding model platforms
|
|
||||||
|
|
||||||
liberapay: OpenTracks
|
|
||||||
github: [rgmf, pstorch, dennisguse]
|
|
||||||
custom: https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
version: 2
|
|
||||||
updates:
|
|
||||||
- package-ecosystem: "gradle"
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: "daily"
|
|
||||||
- package-ecosystem: "github-actions"
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: "daily"
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
#https://github.com/marketplace/actions/android-emulator-runner
|
|
||||||
name: Build APK
|
|
||||||
on:
|
|
||||||
push
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
apk-build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-tags: true
|
|
||||||
fetch-depth: 0 #TODO See https://github.com/actions/checkout/issues/1471
|
|
||||||
|
|
||||||
- uses: actions/setup-java@v4
|
|
||||||
with:
|
|
||||||
distribution: 'adopt'
|
|
||||||
java-version: '17'
|
|
||||||
|
|
||||||
- name: Assemble APK
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
echo ${NIGHTLY_STORE_FILE} | base64 -d > KEY_NIGHTLY.jks
|
|
||||||
./gradlew assembleNightlyRelease -Dnightly_store_file=KEY_NIGHTLY.jks -Dnightly_store_password="${NIGHTLY_STORE_PASSWORD}" -Dnightly_key_alias="${NIGHTLY_KEY_ALIAS}" -Dnightly_key_password="${NIGHTLY_STORE_PASSWORD}"
|
|
||||||
env:
|
|
||||||
NIGHTLY_STORE_FILE: ${{ secrets.NIGHTLY_STORE_FILE }}
|
|
||||||
NIGHTLY_STORE_PASSWORD: ${{ secrets.NIGHTLY_STORE_PASSWORD }}
|
|
||||||
NIGHTLY_KEY_ALIAS: ${{ secrets.NIGHTLY_KEY_ALIAS }}
|
|
||||||
|
|
||||||
- name: Archive
|
|
||||||
if: always()
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: OpenTracks-APK.apk
|
|
||||||
path: ./build/outputs/apk/nightly/*.apk
|
|
||||||
retention-days: 7
|
|
||||||
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
name: Linting
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
analyse:
|
|
||||||
name: Analyse
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-tags: true
|
|
||||||
fetch-depth: 0 #TODO See https://github.com/actions/checkout/issues/1471
|
|
||||||
|
|
||||||
- uses: actions/setup-java@v4
|
|
||||||
with:
|
|
||||||
distribution: 'adopt'
|
|
||||||
java-version: '17'
|
|
||||||
|
|
||||||
- run: ./gradlew lint
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
#https://github.com/marketplace/actions/android-emulator-runner
|
|
||||||
name: Test
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
timeout-minutes: 45
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-tags: true
|
|
||||||
fetch-depth: 0 #TODO See https://github.com/actions/checkout/issues/1471
|
|
||||||
|
|
||||||
- uses: actions/setup-java@v4
|
|
||||||
with:
|
|
||||||
distribution: 'adopt'
|
|
||||||
java-version: '17'
|
|
||||||
|
|
||||||
- name: Enable KVM
|
|
||||||
run: |
|
|
||||||
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
|
|
||||||
sudo udevadm control --reload-rules
|
|
||||||
sudo udevadm trigger --name-match=kvm
|
|
||||||
|
|
||||||
- name: run tests
|
|
||||||
uses: reactivecircus/android-emulator-runner@v2.34.0
|
|
||||||
with:
|
|
||||||
arch: x86_64
|
|
||||||
api-level: 34
|
|
||||||
script: ./gradlew connectedCheck
|
|
||||||
|
|
||||||
- name: Archive
|
|
||||||
if: always()
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: code-coverage-report
|
|
||||||
path: build/reports/androidTests/
|
|
||||||
retention-days: 7
|
|
||||||
|
|
||||||
+2
-2
@@ -3,7 +3,7 @@
|
|||||||
## Testing
|
## Testing
|
||||||
|
|
||||||
Just use OpenTracks and tell us what can be improved by opening an
|
Just use OpenTracks and tell us what can be improved by opening an
|
||||||
issue [here](https://github.com/OpenTracksApp/OpenTracks/issues/new/choose).
|
issue [here](https://codeberg.org/OpenTracksApp/OpenTracks/issues/new/choose).
|
||||||
|
|
||||||
If we broke things (happens now and then), please tell us also.
|
If we broke things (happens now and then), please tell us also.
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ Translations are hosted on [hosted.weblate.org](https://hosted.weblate.org/engag
|
|||||||
You have a cool idea for a feature that is missing in OpenTracks?
|
You have a cool idea for a feature that is missing in OpenTracks?
|
||||||
And you would like to help by implementing it?
|
And you would like to help by implementing it?
|
||||||
If not, you can just take a look at
|
If not, you can just take a look at
|
||||||
the [issue tracker](https://github.com/OpenTracksApp/OpenTracks/issues).
|
the [issue tracker](https://codeberg.org/OpenTracksApp/OpenTracks/issues).
|
||||||
|
|
||||||
Advices:
|
Advices:
|
||||||
|
|
||||||
|
|||||||
@@ -40,10 +40,9 @@ _OpenTracks_ is a sport tracking application that completely respects your priva
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
Translations are hosted on <a href="https://hosted.weblate.org/engage/opentracks/">
|
Translations are hosted on <a href="https://translate.codeberg.org/engage/opentracks/">translate.codeberg.org/projects/opentracks/</a>.
|
||||||
hosted.weblate.org</a>.
|
<a href="https://translate.codeberg.org/engage/opentracks/">
|
||||||
<a href="https://hosted.weblate.org/engage/opentracks/">
|
<img src="https://translate.codeberg.org/widget/opentracks/opentracks-src-main-res-values-strings-xml-main/horizontal-auto.svg" alt="Translation status" />
|
||||||
<img src="https://hosted.weblate.org/widgets/opentracks/-/horizontal-auto.svg" alt="Translation status" />
|
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
@@ -112,8 +111,7 @@ The API is disabled by default to protect the user's privacy, but it can easily
|
|||||||
`Classes`:
|
`Classes`:
|
||||||
* **Start a recording:** `de.dennisguse.opentracks.publicapi.StartRecording`
|
* **Start a recording:** `de.dennisguse.opentracks.publicapi.StartRecording`
|
||||||
* Set track data: `TRACK_NAME`, `TRACK_DESCRIPTION`, `TRACK_CATEGORY`, and `TRACK_ICON` (
|
* Set track data: `TRACK_NAME`, `TRACK_DESCRIPTION`, `TRACK_CATEGORY`, and `TRACK_ICON` (
|
||||||
non-localized identifier
|
see `ActivityType.id` defined in [/src/main/java/de/dennisguse/opentracks/util/TrackIconUtils.java#L38](/src/main/java/de/dennisguse/opentracks/data/model/ActivityType.java)).
|
||||||
see [/src/main/java/de/dennisguse/opentracks/util/TrackIconUtils.java#L38](/src/main/java/de/dennisguse/opentracks/util/TrackIconUtils.java#L38)).
|
|
||||||
NOTE: if `TRACK_ICON` is not present, `TRACK_CATEGORY` will be used to determine the icon (
|
NOTE: if `TRACK_ICON` is not present, `TRACK_CATEGORY` will be used to determine the icon (
|
||||||
localized).
|
localized).
|
||||||
* Send recorded data to another application via _Dashboard API_: `STATS_TARGET_PACKAGE` and
|
* Send recorded data to another application via _Dashboard API_: `STATS_TARGET_PACKAGE` and
|
||||||
@@ -134,6 +132,10 @@ adb shell am start -n "de.dennisguse.opentracks.playstore/de.dennisguse.opentrac
|
|||||||
```
|
```
|
||||||
|
|
||||||
## File formats compatibility with open-source software
|
## File formats compatibility with open-source software
|
||||||
|
|
||||||
|
KML/KMZ can be used to export indoor activities (no GPS present).
|
||||||
|
GPX exports only those points that have a GPS coordinate present (sensor data is aggregated though).
|
||||||
|
|
||||||
| | [GPX 1.1](https://www.topografix.com/GPX/1/1/) | [KML 2.3](https://docs.opengeospatial.org/is/12-007r2/12-007r2.html) | [KMZ 2.3](https://docs.opengeospatial.org/is/12-007r2/12-007r2.html) |
|
| | [GPX 1.1](https://www.topografix.com/GPX/1/1/) | [KML 2.3](https://docs.opengeospatial.org/is/12-007r2/12-007r2.html) | [KMZ 2.3](https://docs.opengeospatial.org/is/12-007r2/12-007r2.html) |
|
||||||
|-----------------------------------------------------------|--------------------------------------------------------------------------------|----------------------------------------------------------------------|----------------------------------------------------------------------|
|
|-----------------------------------------------------------|--------------------------------------------------------------------------------|----------------------------------------------------------------------|----------------------------------------------------------------------|
|
||||||
| [OpenLayers 7.1.0](https://openlayers.org/) | ? | [no](https://github.com/openlayers/openlayers/issues/14104) | [no](https://github.com/openlayers/openlayers/issues/14104) |
|
| [OpenLayers 7.1.0](https://openlayers.org/) | ? | [no](https://github.com/openlayers/openlayers/issues/14104) | [no](https://github.com/openlayers/openlayers/issues/14104) |
|
||||||
@@ -143,15 +145,15 @@ adb shell am start -n "de.dennisguse.opentracks.playstore/de.dennisguse.opentrac
|
|||||||
| [FitTrackee](https://github.com/SamR1/FitTrackee) | yes | n/a | n/a |
|
| [FitTrackee](https://github.com/SamR1/FitTrackee) | yes | n/a | n/a |
|
||||||
| [SportsTracker](https://github.com/ssaring/sportstracker) | yes, [single tracks only](https://github.com/ssaring/sportstracker/issues/260) | no | no |
|
| [SportsTracker](https://github.com/ssaring/sportstracker) | yes, [single tracks only](https://github.com/ssaring/sportstracker/issues/260) | no | no |
|
||||||
| [ExifTool](https://exiftool.org) | [yes](https://exiftool.org/forum/index.php?topic=15972.0) | no | no |
|
| [ExifTool](https://exiftool.org) | [yes](https://exiftool.org/forum/index.php?topic=15972.0) | no | no |
|
||||||
| [Wanderer](https://wanderer.to/) | yes | yes | yes |
|
| [Wanderer](https://wanderer.to/) | yes | yes | yes |
|
||||||
|
| [GPX.Studio]https://gpx.studio/) | yes | no | no |
|
||||||
|
|
||||||
## Dashboard API (incl. map)
|
## Dashboard API (incl. map)
|
||||||
|
|
||||||
As of v3.3.1, OpenTracks supports custom dashboards for displaying previously recorded and live
|
As of v3.3.1, OpenTracks supports custom dashboards for displaying previously recorded and live
|
||||||
tracks.
|
tracks.
|
||||||
|
|
||||||
The reference implementation is [OSMDashboard](https://github.com/OpenTracksApp/OSMDashboard), which
|
The reference implementation is [OSMDashboard](https://codeberg.org/OpenTracksApp/OSMDashboard), which
|
||||||
presents an OpenStreetMap map (showing the current track, incl. updates). The Dashboard API is also
|
presents an OpenStreetMap map (showing the current track, incl. updates). The Dashboard API is also
|
||||||
used by [Gadgetbridge](https://codeberg.org/Freeyourgadget/Gadgetbridge/) for displaying live track
|
used by [Gadgetbridge](https://codeberg.org/Freeyourgadget/Gadgetbridge/) for displaying live track
|
||||||
statistics on supported wearables.
|
statistics on supported wearables.
|
||||||
|
|||||||
+1
-1
@@ -31,4 +31,4 @@ By using explicit Intents for the calls and URIs with specific temporary read pe
|
|||||||
|
|
||||||
All required information can be found in `IntentDashboardUtils.java`.
|
All required information can be found in `IntentDashboardUtils.java`.
|
||||||
|
|
||||||
A _reference implementation_ is the [OSMDashboard](https://github.com/OpenTracksApp/OSMDashboard).
|
A _reference implementation_ is the [OSMDashboard](https://codeberg.org/OpenTracksApp/OSMDashboard).
|
||||||
|
|||||||
+3
-3
@@ -3,10 +3,10 @@
|
|||||||
## Craft new releases
|
## Craft new releases
|
||||||
|
|
||||||
1. Execute use `RELEASE.sh`.
|
1. Execute use `RELEASE.sh`.
|
||||||
2. Push to Github
|
2. Push to Codeberg
|
||||||
3. Create release on Github (incl. changelog)
|
3. Create release on Codeberg (incl. changelog)
|
||||||
This actually creates a tag that is later used by F-Droid
|
This actually creates a tag that is later used by F-Droid
|
||||||
4. Pull from Github
|
4. Pull from Codeberg
|
||||||
5. Build reproducible release and attach to release
|
5. Build reproducible release and attach to release
|
||||||
6. ... wait until reproducibility is verified by F-Droid
|
6. ... wait until reproducibility is verified by F-Droid
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
* Garmin HRM-Dual (Reference: 010-12883-00)
|
* Garmin HRM-Dual (Reference: 010-12883-00)
|
||||||
* CYCPLUS H1
|
* CYCPLUS H1
|
||||||
* Mojawa Haptifit Terra - all you have to do is connect the app to device called "HT"
|
* Mojawa Haptifit Terra - all you have to do is connect the app to device called "HT"
|
||||||
|
* Decathlon HRM Band
|
||||||
|
|
||||||
## 0x1816: Cycling Cadence and Speed Service
|
## 0x1816: Cycling Cadence and Speed Service
|
||||||
|
|
||||||
@@ -68,7 +69,7 @@ We do not support type of movement (i.e., walking vs running).
|
|||||||
Sadly, Bluetooth sensors providing _air pressure_ via Environmental Sensing Service seem to be very rare.
|
Sadly, Bluetooth sensors providing _air pressure_ via Environmental Sensing Service seem to be very rare.
|
||||||
|
|
||||||
* [Flybeeper Pressure Sensor](https://market.flybeeper.com/device/ps1)
|
* [Flybeeper Pressure Sensor](https://market.flybeeper.com/device/ps1)
|
||||||
* NoTrustIssues: https://github.com/OpenTracksApp/NoTrustIssues
|
* NoTrustIssues: https://codeberg.org/OpenTracksApp/NoTrustIssues
|
||||||
An Android app that exposes the internal barometer via Environmental Sensing Service.
|
An Android app that exposes the internal barometer via Environmental Sensing Service.
|
||||||
|
|
||||||
### Internal: tested Barometric Sensor Smartphones
|
### Internal: tested Barometric Sensor Smartphones
|
||||||
|
|||||||
+1
-1
@@ -48,4 +48,4 @@ read
|
|||||||
git add -u
|
git add -u
|
||||||
git commit -m "$COMMIT_MESSAGE"
|
git commit -m "$COMMIT_MESSAGE"
|
||||||
|
|
||||||
echo -e "Next steps:\n1. Push to Github\n2. Create release on Github: https://github.com/OpenTracksApp/OpenTracks/releases"
|
echo -e "Next steps:\n1. Push to Codeberg\n2. Create release on Codeberg: https://codeberg.org/OpenTracksApp/OpenTracks/releases"
|
||||||
+3
-3
@@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
|
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64/
|
||||||
|
|
||||||
JAVA_VERSION=`java --version`
|
JAVA_VERSION=`java --version`
|
||||||
if [[ $JAVA_VERSION != "openjdk 17."* ]]; then
|
if [[ $JAVA_VERSION != "openjdk 21."* ]]; then
|
||||||
echo "OpenJDK version should be 17.X"
|
echo "OpenJDK version should be 21.X"
|
||||||
exit -1;
|
exit -1;
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
+27
-15
@@ -6,7 +6,7 @@ buildscript {
|
|||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:8.11.1'
|
classpath 'com.android.tools.build:gradle:8.13.2'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,8 +46,8 @@ android {
|
|||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId 'de.dennisguse.opentracks'
|
applicationId 'de.dennisguse.opentracks'
|
||||||
versionCode 6237
|
versionCode 6513
|
||||||
versionName "v4.21.1"
|
versionName "v4.24.1"
|
||||||
|
|
||||||
buildConfigField "String", "VERSION_NAME_FULL", "\"${getVersionName()}\""
|
buildConfigField "String", "VERSION_NAME_FULL", "\"${getVersionName()}\""
|
||||||
|
|
||||||
@@ -57,6 +57,17 @@ android {
|
|||||||
testInstrumentationRunner 'de.dennisguse.opentracks.TestRunner'
|
testInstrumentationRunner 'de.dennisguse.opentracks.TestRunner'
|
||||||
testInstrumentationRunnerArguments clearPackageData: 'true'
|
testInstrumentationRunnerArguments clearPackageData: 'true'
|
||||||
}
|
}
|
||||||
|
testOptions {
|
||||||
|
managedDevices {
|
||||||
|
localDevices {
|
||||||
|
mediumPhone {
|
||||||
|
device = "Medium Phone"
|
||||||
|
apiLevel = 35
|
||||||
|
systemImageSource = "aosp"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
signingConfigs {
|
signingConfigs {
|
||||||
nightly {
|
nightly {
|
||||||
if (System.getProperty('nightly_store_file') != null) {
|
if (System.getProperty('nightly_store_file') != null) {
|
||||||
@@ -104,7 +115,7 @@ android {
|
|||||||
versionNameSuffix 'irreproducible'
|
versionNameSuffix 'irreproducible'
|
||||||
}
|
}
|
||||||
reproducible {
|
reproducible {
|
||||||
// Developer Binaries: https://github.com/OpenTracksApp/OSMDashboard/releases/download/v%v/de.dennisguse.opentracks.playstore_%v.apk
|
// Developer Binaries: https://codeberg.org/OpenTracksApp/OSMDashboard/releases/download/v%v/de.dennisguse.opentracks.playstore_%v.apk
|
||||||
// FDroid: https://f-droid.org/de/packages/de.dennisguse.opentracks.playstore
|
// FDroid: https://f-droid.org/de/packages/de.dennisguse.opentracks.playstore
|
||||||
// PlayStore: https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore
|
// PlayStore: https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore
|
||||||
dimension 'version'
|
dimension 'version'
|
||||||
@@ -146,19 +157,20 @@ dependencies {
|
|||||||
implementation 'androidx.preference:preference:1.2.1'
|
implementation 'androidx.preference:preference:1.2.1'
|
||||||
implementation 'androidx.documentfile:documentfile:1.1.0'
|
implementation 'androidx.documentfile:documentfile:1.1.0'
|
||||||
implementation 'androidx.gridlayout:gridlayout:1.1.0'
|
implementation 'androidx.gridlayout:gridlayout:1.1.0'
|
||||||
implementation 'com.google.android.material:material:1.12.0'
|
implementation 'com.google.android.material:material:1.13.0'
|
||||||
implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
|
implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
|
||||||
implementation 'androidx.core:core:1.16.0'
|
implementation 'androidx.core:core:1.17.0'
|
||||||
implementation 'androidx.core:core-splashscreen:1.0.1'
|
implementation 'androidx.core:core-splashscreen:1.2.0'
|
||||||
implementation 'androidx.mediarouter:mediarouter:1.8.1'
|
implementation 'androidx.mediarouter:mediarouter:1.8.1'
|
||||||
implementation 'androidx.core:core-location-altitude:1.0.0-alpha03'
|
implementation 'androidx.core:core-location-altitude:1.0.0-beta01'
|
||||||
|
implementation 'androidx.work:work-runtime:2.11.0'
|
||||||
|
|
||||||
androidTestImplementation 'androidx.test:core:1.6.1'
|
androidTestImplementation 'androidx.test:core:1.7.0'
|
||||||
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
|
androidTestImplementation 'androidx.test.ext:junit:1.3.0'
|
||||||
androidTestImplementation 'androidx.test:rules:1.6.1'
|
androidTestImplementation 'androidx.test:rules:1.7.0'
|
||||||
androidTestImplementation 'androidx.test:runner:1.6.2'
|
androidTestImplementation 'androidx.test:runner:1.7.0'
|
||||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
|
androidTestImplementation 'androidx.test.espresso:espresso-core:3.7.0'
|
||||||
androidTestImplementation 'org.mockito:mockito-android:5.18.0'
|
androidTestImplementation 'org.mockito:mockito-android:5.21.0'
|
||||||
|
|
||||||
androidTestUtil 'androidx.test:orchestrator:1.5.1'
|
androidTestUtil 'androidx.test:orchestrator:1.6.1'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
v4.21.0: OpenTracks
|
||||||
|
|
||||||
|
Změny:
|
||||||
|
- Seznam stop podporuje posunutí pro odstranění
|
||||||
|
- Reimplementovány motivy (pro dynamické barvy a OLED)
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
v4.21.1: OpenTracks
|
||||||
|
|
||||||
|
Oprava chyby:
|
||||||
|
- Opraven pád v rozhraní exportu/importu (vznikl ve v4.21.0)
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
v4.22.0: OpenTracks
|
||||||
|
|
||||||
|
Změny:
|
||||||
|
- Přesun na https://codeberg.org/OpenTracksApp/OpenTracks
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
v3.0.1: OpenTracks
|
||||||
|
|
||||||
|
Änderungen:
|
||||||
|
- Markierungen teilen
|
||||||
|
- Umstrukturierte Einstellungen
|
||||||
|
- Zurück-Schaltfläche in der Aktionsleiste entfernt
|
||||||
|
- Export: Option zur Einstellung der Fotogröße entfernt
|
||||||
|
- Export: KML als Format ist jetzt auswählbar
|
||||||
|
|
||||||
|
Fehlerbehebungen:
|
||||||
|
- Exportverzeichnis ist jetzt /OpenTracks/
|
||||||
|
- Querformatmodus stürzt nicht mehr ab
|
||||||
|
- KML/KMZ-Export behoben
|
||||||
|
|
||||||
|
Entwickler:
|
||||||
|
- Tests sind ausführbar (aber viele schlagen fehl)
|
||||||
|
- Kontinuierliche Integration mit TravisCI aktiviert (keine Tests)
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
v3.1.0: OpenTracks
|
||||||
|
|
||||||
|
Änderungen:
|
||||||
|
- Anzeige der Strecke in Karten-Apps hinzugefügt (getestet mit OsmAnd und Maps.ME)
|
||||||
|
- Während der Verfolgung werden Streckenstatistiken angezeigt, ohne das Gerät entsperren zu müssen
|
||||||
|
- Querformat für die Detailansicht der Strecke entfernt (war fehlerhaft)
|
||||||
|
- Verlauf der Suchvorschläge entfernt
|
||||||
|
|
||||||
|
Fehlerbehebung:
|
||||||
|
- Speicherberechtigung für „Alle importieren/Alle exportieren” anfordern
|
||||||
|
|
||||||
|
Entwickler:
|
||||||
|
- Upgrade auf Gradle 5.6
|
||||||
|
- Release-Builds nicht minimieren
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
v4.23.0: OpenTracks
|
||||||
|
|
||||||
|
Änderungen:
|
||||||
|
- Benutzeroberfläche: Durchschnittsgeschwindigkeit des aktuellen Segments hinzugefügt
|
||||||
|
(derzeit nur in neuen Layouts verfügbar)
|
||||||
|
- Durch Klicken auf die Benachrichtigung wird die eigentliche Aufzeichnungs-Benutzeroberfläche geöffnet
|
||||||
|
|
||||||
|
Entwickler:
|
||||||
|
- Veralteter JobIntentService durch WorkManager ersetzt
|
||||||
|
- Verwende .isEmpty() außer für CharSequence und Stream.toList()
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
v4.23.1: OpenTracks
|
||||||
|
|
||||||
|
Änderungen:
|
||||||
|
|
||||||
|
- Neue UI-Komponente zur Anzeige der verstrichenen Zeit im aktuellen Segment
|
||||||
|
|
||||||
|
Fehlerbehebung:
|
||||||
|
- Sofortiger Export nach Workout abgestürzt (eingeführt in v4.23.0)
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
v4.23.2: OpenTracks
|
||||||
|
|
||||||
|
Änderungen:
|
||||||
|
- Vorausschauende Rückwärtsfunktion funktioniert vollständig
|
||||||
|
|
||||||
|
Fehlerbehebung:
|
||||||
|
- Absturz im Zusammenhang mit dem Dateinamen der Strecke in den Einstellungen behoben
|
||||||
|
|
||||||
|
Entwickler:
|
||||||
|
- Datenklasse für Statistiken eingeführt
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
v4.22.0: OpenTracks
|
||||||
|
|
||||||
|
Changes:
|
||||||
|
- Migration to https://codeberg.org/OpenTracksApp/OpenTracks
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
v4.22.1: OpenTracks
|
||||||
|
|
||||||
|
Changes:
|
||||||
|
- First release via Codeberg
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
v4.22.2: OpenTracks
|
||||||
|
|
||||||
|
Bugfix:
|
||||||
|
- Voice annoucements setting for time and unit were linked
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
v4.23.0: OpenTracks
|
||||||
|
|
||||||
|
Changes:
|
||||||
|
- UI: added average pace of current segment
|
||||||
|
(currently only available in new layouts)
|
||||||
|
- Clicking on notification opens actual recording UI
|
||||||
|
|
||||||
|
Developer:
|
||||||
|
- Deprecated JobIntentService replaced with WorkManager
|
||||||
|
- Use .isEmpty() except for CharSequence and Stream.toList()
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
v4.23.1: OpenTracks
|
||||||
|
|
||||||
|
Changes:
|
||||||
|
- New UI component to show elapsed time in the current segment
|
||||||
|
|
||||||
|
Bugfix:
|
||||||
|
- Instant post-workout export crashed (introduced in v4.23.0)
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
v4.23.2: OpenTracks
|
||||||
|
|
||||||
|
Changes:
|
||||||
|
- Predictive back works completely
|
||||||
|
|
||||||
|
Bugfix:
|
||||||
|
- Fixed in crash related to the track filename in the settings
|
||||||
|
|
||||||
|
Developer:
|
||||||
|
- Introduced data class for Statistics
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
v4.24.0: OpenTracks
|
||||||
|
|
||||||
|
Changes:
|
||||||
|
- PublicAPI: start track only sets field if data is present
|
||||||
|
- Marker photos can be shared again
|
||||||
|
- Removed KMZ without photos
|
||||||
|
- Heart rate of 0.0 is treated as invalid (except for SensorStatistics)
|
||||||
|
- Removed import workaround for special coordinates (100/200)
|
||||||
|
(was used by MyTracks to export/import special trackpoints)
|
||||||
|
|
||||||
|
Developer:
|
||||||
|
- Track and Marker are records
|
||||||
|
- AggregatedStatistics are computed in database
|
||||||
|
- Split into TrackStatisticsUpdater and SegmentStatisticUpdater
|
||||||
|
- Introduced Iterator classes (instead of passing Cursor or List)
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
v4.24.1: OpenTracks
|
||||||
|
|
||||||
|
Bugfix:
|
||||||
|
- Restore compatibility with OSM Dashboard v6.4.1 and earlier (introduced in v4.24.0)
|
||||||
|
- Crash when using default track name by number (introduced in v4.24.0)
|
||||||
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
v4.20.0: OpenTracks
|
||||||
|
|
||||||
|
Athruithe:
|
||||||
|
- Ceadaítear athrú ar fhritháireamh crios ama rianta
|
||||||
|
- Comhéadan Úsáideora Marcóra Simplithe
|
||||||
|
|
||||||
|
Ceartú:
|
||||||
|
- Imeall-2-imeall: imoibríonn le méarchlár fíorúil
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
v4.21.0: OpenTracks
|
||||||
|
|
||||||
|
Athruithe:
|
||||||
|
- Tacaíonn liosta na rianta le svaidhpeáil chun scriosadh
|
||||||
|
- Téamaí athchurtha i bhfeidhm (do DynamicColor agus OLED)
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
v4.21.1: OpenTracks
|
||||||
|
|
||||||
|
Ceartú fabht:
|
||||||
|
- Tuairteáil socraithe ar chomhéadan úsáideora easpórtála/allmhairithe (tugtha isteach i v4.21.0)
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
v4.22.0: OpenTracks
|
||||||
|
|
||||||
|
Athruithe:
|
||||||
|
- Aistriú go https://codeberg.org/OpenTracksApp/OpenTracks
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
v4.23.2: OpenTracks
|
||||||
|
|
||||||
|
Cambios:
|
||||||
|
- a volta predictiva funciona
|
||||||
|
|
||||||
|
Arranxo:
|
||||||
|
- do fallo que daba relacionado co nome do ficheiro nos axustes
|
||||||
|
|
||||||
|
Desenvolvemento:
|
||||||
|
- Engádese data class para as Estatísticas
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
v4.22.0: OpenTracks
|
||||||
|
|
||||||
|
Modifiche:
|
||||||
|
- Migrazione a https://codeberg.org/OpenTracksApp/OpenTracks
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
v4.22.1: OpenTracks
|
||||||
|
|
||||||
|
Modiciche:
|
||||||
|
- Primo rilascio da Codeberg
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
v4.22.2: OpenTracks
|
||||||
|
|
||||||
|
Correzione di errori:
|
||||||
|
- L'impostazione degli annunci vocali per l'ora e l'unità di misura è stata collegata
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
(versionName): OpenTracks
|
||||||
|
|
||||||
|
Modifiche:
|
||||||
|
-
|
||||||
|
|
||||||
|
Correzioni di errori:
|
||||||
|
-
|
||||||
|
|
||||||
|
Sviluppatore:
|
||||||
|
-
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
v3.0.0: Opentracks
|
v3.0.0: திறந்தபாதைகள்
|
||||||
|
|
||||||
ஓபன்ட்ராக்சின் முதல் வெளியீடு (அதாவது, மைட்ராக்சிலிருந்து ஆர்ட் ஃபோர்க்)
|
திறந்தபாதைகளின் முதல் வெளியீடு (அதாவது, மைட்ராக்சிலிருந்து ஆர்ட் ஃபோர்க்)
|
||||||
|
|
||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- மைட்ராக்சிலிருந்து ஓபன்ட்ராக்சுக்கு மறுபெயரிடப்பட்டது
|
- மைட்ராக்சிலிருந்து ஓபன்ட்ராக்சுக்கு மறுபெயரிடப்பட்டது
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
v3.8.0: Opentracks
|
v3.8.0: திறந்தபாதைகள்
|
||||||
|
|
||||||
மாற்றத்தை உடைத்தல்:
|
மாற்றத்தை உடைத்தல்:
|
||||||
- சிபிஎக்ச் இறக்குமதி/ஏற்றுமதி விரைவு, கேடென்ச் மற்றும் ஆர்ட்ரேட் டிராக் பாயிண்ட் எக்ச்டென்சன்/வி 2 வழியாக
|
- சிபிஎக்ச் இறக்குமதி/ஏற்றுமதி விரைவு, கேடென்ச் மற்றும் ஆர்ட்ரேட் டிராக் பாயிண்ட் எக்ச்டென்சன்/வி 2 வழியாக
|
||||||
@@ -6,7 +6,7 @@ v3.8.0: Opentracks
|
|||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- டாச்போர்டு ஏபிஐ: குறிப்பான்களுக்கான அணுகலை வழங்குதல் (ஓபன்ட்ராக்சில் காண்பிக்க திரும்பப்பெறுதல்)
|
- டாச்போர்டு ஏபிஐ: குறிப்பான்களுக்கான அணுகலை வழங்குதல் (ஓபன்ட்ராக்சில் காண்பிக்க திரும்பப்பெறுதல்)
|
||||||
- புதிய மார்க்கர் படவுரு (ஆரஞ்சு புச் முள், எச்.வி.சி)
|
- புதிய மார்க்கர் படவுரு (ஆரஞ்சு புச் முள், எச்.வி.சி)
|
||||||
- இறக்குமதிக்கான கோப்புகளை கோப்பு மேலாளர் வழியாக தேர்ந்தெடுக்கலாம்
|
- இறக்குமதிக்கான கோப்புகளைக் கோப்பு மேலாளர் வழியாகத் தேர்ந்தெடுக்கலாம்
|
||||||
|
|
||||||
பிழைத்திருத்தங்கள்:
|
பிழைத்திருத்தங்கள்:
|
||||||
- ஒருங்கிணைந்த புள்ளிவிவரங்கள் இடைமுகம் விருப்பமான விகிதத்தை மதிக்கிறது
|
- ஒருங்கிணைந்த புள்ளிவிவரங்கள் இடைமுகம் விருப்பமான விகிதத்தை மதிக்கிறது
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
v3.9.0: Opentracks
|
v3.9.0: திறந்தபாதைகள்
|
||||||
|
|
||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- தடங்களை அவற்றின் UUID உடன் ஏற்றுமதி செய்யுங்கள்
|
- தடங்களை அவற்றின் UUID உடன் ஏற்றுமதி செய்யுங்கள்
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
v3.12.0: ஓபன்ட்ராக்ச்
|
v3.12.0: திறந்தபாதைகள்
|
||||||
|
|
||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- ஊடலை சென்சார் முகவரிகள்
|
- ஊடலை சென்சார் முகவரிகள்
|
||||||
- இடைவெளிகள்: உயர ஆதாயத்தைக் காட்டு
|
- இடைவெளிகள்: உயர ஆதாயத்தைக் காட்டு
|
||||||
- ஏற்றுமதி: இயல்புநிலை ஏற்றுமதி அடைவு
|
- ஏற்றுமதி: இயல்புநிலை ஏற்றுமதி அடைவு
|
||||||
- ஏற்றுமதி: ஒரு பாதையை முடித்த பிறகு தானியங்கி ஏற்றுமதி
|
- ஏற்றுமதி: ஒரு பாதையை முடித்தபிறகு தானியங்கி ஏற்றுமதி
|
||||||
- கையேடு இறக்குமதி/ஏற்றுமதி: புதிய பயனர் இடைமுகம்
|
- கையேடு இறக்குமதி/ஏற்றுமதி: புதிய பயனர் இடைமுகம்
|
||||||
- கையேடு ஏற்றுமதி: கையேடு ஏற்றுமதியில் மேலெழுத விருப்பம்
|
- கையேடு ஏற்றுமதி: கையேடு ஏற்றுமதியில் மேலெழுத விருப்பம்
|
||||||
|
|
||||||
@@ -19,4 +19,4 @@ v3.12.0: ஓபன்ட்ராக்ச்
|
|||||||
|
|
||||||
டெவலப்பர்:
|
டெவலப்பர்:
|
||||||
- வியூ பிண்டிங்சைப் பயன்படுத்துங்கள்
|
- வியூ பிண்டிங்சைப் பயன்படுத்துங்கள்
|
||||||
- தரவுத்தளம் வெளிநாட்டு விசையை செயல்படுத்துகிறது மற்றும் அடுக்கு நீக்குதல்களைப் பயன்படுத்துகிறது
|
- தரவுத்தளம் வெளிநாட்டு விசையைச் செயல்படுத்துகிறது மற்றும் அடுக்கு நீக்குதல்களைப் பயன்படுத்துகிறது
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
v3.15.0: ஓபன்ட்ராக்ச்
|
v3.15.0: திறந்தபாதைகள்
|
||||||
|
|
||||||
எச்சரிக்கை:
|
எச்சரிக்கை:
|
||||||
இந்த வெளியீடு மாற்ற முடியாத தரவுத்தள மாற்றங்களைப் பயன்படுத்துகிறது.
|
இந்த வெளியீடு மாற்ற முடியாத தரவுத்தள மாற்றங்களைப் பயன்படுத்துகிறது.
|
||||||
KMZ/KML ஏற்றுமதி/இறக்குமதி நடத்தை மாற்றப்படுவதால், (அ) மேம்படுத்துவதற்கு முன் காப்புப்பிரதி எடுக்க பரிந்துரைக்கப்படுகிறது, பின்னர் (ஆ).
|
KMZ/KML ஏற்றுமதி/இறக்குமதி நடத்தை மாற்றப்படுவதால், (அ) மேம்படுத்துவதற்கு முன் காப்புப்பிரதி எடுக்கப் பரிந்துரைக்கப்படுகிறது, பின்னர் (ஆ).
|
||||||
பரிந்துரைக்கப்பட்ட வடிவம்: KMZ.
|
பரிந்துரைக்கப்பட்ட வடிவம்: KMZ.
|
||||||
|
|
||||||
மாற்றங்களை உடைத்தல்:
|
மாற்றங்களை உடைத்தல்:
|
||||||
- டிராக் பிரிவுகளின் உள் சேமிப்பு மாற்றப்பட்டுள்ளது
|
- டிராக் பிரிவுகளின் உள் சேமிப்பு மாற்றப்பட்டுள்ளது
|
||||||
(பயனர் உருவாக்கிய நிகழ்வுகள் இப்போது இடம் இல்லாமல் டிராக் பாயிண்டுகளாகக் கருதப்படுகின்றன, ஆனால் நேர முத்திரையுடன்)
|
(பயனர் உருவாக்கிய நிகழ்வுகள் இப்போது இடம் இல்லாமல் டிராக் பாயிண்டுகளாகக் கருதப்படுகின்றன, ஆனால் நேர முத்திரையுடன்)
|
||||||
- சி.பி.எச் நேரத்திற்கு பதிலாக சாதன நேரம் சேமிக்கப்படுகிறது
|
- சி.பி.எச் நேரத்திற்கு பதிலாகச் சாதன நேரம் சேமிக்கப்படுகிறது
|
||||||
(இருக்கும் தரவு மாற்றியமைக்கப்படவில்லை)
|
(இருக்கும் தரவு மாற்றியமைக்கப்படவில்லை)
|
||||||
- டாச்போர்டு பநிஇ வி 2
|
- டாச்போர்டு பநிஇ வி 2
|
||||||
(தயவுசெய்து OSMDashboard 2.10.0 ஐ மேம்படுத்தவும்)
|
(தயவுசெய்து OSMDashboard 2.10.0 ஐ மேம்படுத்தவும்)
|
||||||
|
|
||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
.
|
- KML/KMZ சரியாகக் காப்புப் பிரதி எடுக்கவும் மீட்டமைக்கவும் பயன்படுத்தலாம் (புள்ளிவிவரங்கள் உட்பட)
|
||||||
|
|
||||||
டெவலப்பர்:
|
டெவலப்பர்:
|
||||||
- மறுவேலை செய்யப்பட்ட தட பிரிவு மற்றும் அது சேமிப்பு (முன்னர் இடைநிறுத்தம்/மீண்டும் மார்க்கர்)
|
- மறுவேலை செய்யப்பட்ட தட பிரிவு மற்றும் அது சேமிப்பு (முன்னர் இடைநிறுத்தம்/மீண்டும் மார்க்கர்)
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
v3.16.0: ஓபன்ட்ராக்ச்
|
v3.16.0: திறந்தபாதைகள்
|
||||||
|
|
||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- சைக்கிள் ஓட்டுதல்: பி.எல்.இ வேக சென்சாரிலிருந்து தூரத்தைப் பெறுங்கள்
|
- சைக்கிள் ஓட்டுதல்: பி.எல்.இ வேக சென்சாரிலிருந்து தூரத்தைப் பெறுங்கள்
|
||||||
- பதிவு செய்யும் போது வழங்கப்பட்ட இடைமுகம் மறுவேலை
|
- பதிவு செய்யும்போது வழங்கப்பட்ட இடைமுகம் மறுவேலை
|
||||||
- இடைமுகம் செயல்திறன் மேம்படுத்தல்கள்
|
- இடைமுகம் செயல்திறன் மேம்படுத்தல்கள்
|
||||||
- ஏற்றுமதி செய்யப்பட்ட கோப்பு பெயர்கள்: <முதல் 32bits uuid> _ <டிராக்கின் பெயர்>
|
- ஏற்றுமதி செய்யப்பட்ட கோப்புப் பெயர்கள்: <முதல் 32bits uuid> _ <டிராக்கின் பெயர்>
|
||||||
- பல கோப்புகளை நோக்கம் வழியாக இறக்குமதி செய்யுங்கள் (எ.கா., கேசெட் பிரிட்சிலிருந்து)
|
- பல கோப்புகளை நோக்கம் வழியாக இறக்குமதி செய்யுங்கள் (எ.கா., கேசெட் பிரிட்சிலிருந்து)
|
||||||
- சி.பி.எக்ச்: ஏற்றுமதி ஆற்றல் தரவு
|
- சி.பி.எக்ச்: ஏற்றுமதி ஆற்றல் தரவு
|
||||||
- புதுப்பிக்கப்பட்ட மொழிபெயர்ப்புகள்
|
- புதுப்பிக்கப்பட்ட மொழிபெயர்ப்புகள்
|
||||||
|
|
||||||
பிழைத்திருத்த:
|
பிழைத்திருத்த:
|
||||||
- குரல் அறிவிப்பு நிமிடங்களை சரியாகப் பயன்படுத்துங்கள்
|
- குரல் அறிவிப்பு நிமிடங்களைச் சரியாகப் பயன்படுத்துங்கள்
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
v3.17.0: Opentracks
|
v3.17.0: திறந்தபாதைகள்
|
||||||
|
|
||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- கயாக்கிங்கிற்கு ஐகானைச் சேர்க்கவும்
|
- கயாக்கிங்கிற்கு ஐகானைச் சேர்க்கவும்
|
||||||
- விளக்கப்படங்கள் காணாமல் போன சென்சார் தரவை சரியாக வரையவும்
|
- விளக்கப்படங்கள் காணாமல் போன சென்சார் தரவைச் சரியாக வரையவும்
|
||||||
- இயல்புநிலை: பதிவு செய்யும் போது ஆயத்தொலைவுகளைக் காட்டு
|
- இயல்புநிலை: பதிவு செய்யும்போது ஆயத்தொலைவுகளைக் காட்டு
|
||||||
|
|
||||||
பிழைத்திருத்தங்கள்:
|
பிழைத்திருத்தங்கள்:
|
||||||
- சிபிஎக்ச் ச்கீமா சரி செய்யப்பட்டது
|
- சிபிஎக்ச் ச்கீமா சரி செய்யப்பட்டது
|
||||||
- சிபிஎக்ச் உயரத்தை சென்சார் தூரமாக ஏற்றுமதி செய்தது
|
- சிபிஎக்ச் உயரத்தை சென்சார் தூரமாக ஏற்றுமதி செய்தது
|
||||||
- வேகம்/தூர சென்சார் பயன்படுத்தினால் புள்ளிவிவரங்கள் சரியாக கணக்கிடப்படவில்லை
|
- வேகம்/தூர சென்சார் பயன்படுத்தினால் புள்ளிவிவரங்கள் சரியாகக் கணக்கிடப்படவில்லை
|
||||||
|
|
||||||
டெவலப்பர்:
|
டெவலப்பர்:
|
||||||
- தூரம்/வேக மதிப்பு பொருள்கள்
|
- தூரம்/வேக மதிப்புப் பொருள்கள்
|
||||||
- பகிர்வு முன்னேற்றங்கள் வழியாக தகவல்தொடர்புகளை மாற்றியது
|
- பகிர்வு முன்னேற்றங்கள் வழியாகத் தகவல்தொடர்புகளை மாற்றியது
|
||||||
- நிலையான அல்லாத பணி பைண்டரைப் பயன்படுத்தவும்
|
- நிலையான அல்லாத பணி பைண்டரைப் பயன்படுத்தவும்
|
||||||
- குறியீடு தளத்தில் உயரத்தைப் பயன்படுத்தவும் (உயரத்திற்கு பதிலாக)
|
- குறியீடு தளத்தில் உயரத்தைப் பயன்படுத்தவும் (உயரத்திற்கு பதிலாக)
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
v3.18.0: ஓபன்ட்ராக்ச்
|
v3.18.0: திறந்தபாதைகள்
|
||||||
|
|
||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- உயரம் EGM2008 இல் காட்டப்பட்டுள்ளது (WGS84 என சேமிக்கப்படுகிறது/ஏற்றுமதி செய்யப்படுகிறது)
|
- உயரம் EGM2008 இல் காட்டப்பட்டுள்ளது (WGS84 எனச் சேமிக்கப்படுகிறது/ஏற்றுமதி செய்யப்படுகிறது)
|
||||||
|
|
||||||
பிழைத்திருத்த:
|
பிழைத்திருத்த:
|
||||||
- நிலையான நினைவக கசிவு (V3.17.0 இல் அறிமுகப்படுத்தப்பட்டது)
|
- நிலையான நினைவக கசிவு (V3.17.0 இல் அறிமுகப்படுத்தப்பட்டது)
|
||||||
- விளக்கப்படங்கள்: உயரம் M/ft இல் இருக்க வேண்டும் (V3.17.1 இல் அறிமுகப்படுத்தப்பட்டது)
|
- விளக்கப்படங்கள்: உயரம் M/ft இல் இருக்க வேண்டும் (V3.17.1 இல் அறிமுகப்படுத்தப்பட்டது)
|
||||||
- விளக்கப்படங்கள்: பதிவு சரியாக புதுப்பிக்கப்படவில்லை (V3.17.3 இல் அறிமுகப்படுத்தப்பட்டது)
|
- விளக்கப்படங்கள்: பதிவு சரியாகப் புதுப்பிக்கப்படவில்லை (V3.17.3 இல் அறிமுகப்படுத்தப்பட்டது)
|
||||||
.
|
- TrackDataHub பதிவுசெய்தல் தொலைநிலை இடைவெளியைக் கணக்கில் எடுத்துக்கொள்ளவில்லை (v3.17.2 இல் அறிமுகப்படுத்தப்பட்டது)
|
||||||
|
|
||||||
டெவலப்பர்:
|
டெவலப்பர்:
|
||||||
- பி.என்.சி க்ரஞ்சிங் முடக்கு (இனப்பெருக்கம் உருவாக்க)
|
- பி.என்.சி க்ரஞ்சிங் முடக்கு (இனப்பெருக்கம் உருவாக்க)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
v3.18.3: ஓபன்ட்ராக்ச்
|
v3.18.3: திறந்தபாதைகள்
|
||||||
|
|
||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- KML பாகுபடுத்தலுக்கு/GX: KOURS இன் ஆர்டர் தேவையில்லை
|
- KML பாகுபடுத்தலுக்கு/GX: KOURS இன் ஆர்டர் தேவையில்லை
|
||||||
- ட்ராக் இறக்குமதியாளர்: நேர முத்திரை மூலம் இருப்பிடங்களை மறுசீரமைக்கிறது
|
- ட்ராக் இறக்குமதியாளர்: நேர முத்திரைமூலம் இருப்பிடங்களை மறுசீரமைக்கிறது
|
||||||
- ஆண்ட்ராய்டு <8.0.0 (ஏபிஐ 26) க்கான அகற்றப்பட்ட லாஞ்சர் ஐகான்கள் அகற்றப்பட்டன
|
- ஆண்ட்ராய்டு <8.0.0 (ஏபிஐ 26) க்கான அகற்றப்பட்ட லாஞ்சர் ஐகான்கள் அகற்றப்பட்டன
|
||||||
(சற்று வித்தியாசமாகத் தோன்றலாம், ஆனால் இனப்பெருக்கம் செய்யக்கூடிய கட்டமைப்புகளுக்கான சிக்கல்களைத் தவிர்க்கவும்)
|
(சற்று வித்தியாசமாகத் தோன்றலாம், ஆனால் இனப்பெருக்கம் செய்யக்கூடிய கட்டமைப்புகளுக்கான சிக்கல்களைத் தவிர்க்கவும்)
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
v3.18.6: Opentracks
|
v3.18.6: திறந்தபாதைகள்
|
||||||
|
|
||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- "வரைபடத்தில் காட்டு"- KMZ க்கு பதிலாக KML வழியாக செயல்பாடு
|
- "வரைபடத்தில் காட்டு"- KMZ க்கு பதிலாக KML வழியாகச் செயல்பாடு
|
||||||
- குரல் அறிவிப்பில் பயன்பாட்டு பெயர் இல்லை
|
- குரல் அறிவிப்பில் பயன்பாட்டு பெயர் இல்லை
|
||||||
- பதிவு செய்யும் போது: ஒவ்வொரு நொடியும் உயர ஆதாயம்/இழப்பு புதுப்பிக்கப்படும்
|
- பதிவு செய்யும்போது: ஒவ்வொரு நொடியும் உயர ஆதாயம்/இழப்பு புதுப்பிக்கப்படும்
|
||||||
- கடை விளக்கங்கள் மொழிபெயர்க்கப்பட்டவை
|
- கடை விளக்கங்கள் மொழிபெயர்க்கப்பட்டவை
|
||||||
|
|
||||||
பஃபிக்ச்:
|
பஃபிக்ச்:
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
v3.19.0: Opentracks
|
v3.19.0: திறந்தபாதைகள்
|
||||||
|
|
||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- இயங்கும் விரைவு மற்றும் கேடென்ச் (ஆர்.சி.எச்) சென்சார்களுக்கான உதவி செயல்படுத்தப்பட்டது
|
- இயங்கும் விரைவு மற்றும் கேடென்ச் (ஆர்.சி.எச்) சென்சார்களுக்கான உதவி செயல்படுத்தப்பட்டது
|
||||||
- ஒரு பாதையைப் பகிரும்போது: ஒரு பங்கு படம் உருவாக்கப்பட்டது
|
- ஒரு பாதையைப் பகிரும்போது: ஒரு பங்குப் படம் உருவாக்கப்பட்டது
|
||||||
- பதிவைத் தொடங்கும்போது அதிர்வு இல்லை
|
- பதிவைத் தொடங்கும்போது அதிர்வு இல்லை
|
||||||
- பதிவு செய்யும் போது: இடைமுகம் மிக அண்மைக் காலத்தில் பெறப்பட்ட உயரம், விரைவு மற்றும் தாங்கி (சேமிக்கப்படாவிட்டாலும் கூட) காட்டுகிறது
|
- பதிவு செய்யும்போது: இடைமுகம் மிக அண்மைக் காலத்தில் பெறப்பட்ட உயரம், விரைவு மற்றும் தாங்கி (சேமிக்கப்படாவிட்டாலும் கூட) காட்டுகிறது
|
||||||
|
|
||||||
பிழைத்திருத்த:
|
பிழைத்திருத்த:
|
||||||
- மொத்த கால கணக்கீட்டில் இடைநிறுத்தப்பட்ட காலங்கள் இருக்கக்கூடாது (மறு இறக்குமதி தேவை)
|
- மொத்த கால கணக்கீட்டில் இடைநிறுத்தப்பட்ட காலங்கள் இருக்கக் கூடாது (மறு இறக்குமதி தேவை)
|
||||||
- (மீண்டும்) இருந்தால் தனிப்பயன் சுருக்கங்களைப் பயன்படுத்தவும்
|
- (மீண்டும்) இருந்தால் தனிப்பயன் சுருக்கங்களைப் பயன்படுத்தவும்
|
||||||
|
|
||||||
டெவலப்பர்:
|
டெவலப்பர்:
|
||||||
- SDK31 மற்றும் AGP7.0.0 க்கு மேம்படுத்தவும் (JDK11 தேவை)
|
- SDK31 மற்றும் AGP7.0.0 க்கு மேம்படுத்தவும் (JDK11 தேவை)
|
||||||
.
|
- டிராக் ரெக்கார்டிங் சேவை: எக்ஸ்டாக்டட் சென்சார் ஃப்யூஷன் (டிராக்பாயிண்ட் கிரியேட்டர்) மற்றும் டிராக்பாயிண்ட் ஸ்டோரேஜ் (டிராக் ரெக்கார்டிங் மேனேஜர்)
|
||||||
- எக்ச்போர்ட்டிம்போர்ட்டெச்ட் இப்போது தீர்மானிக்கும்/ மாறிலி
|
- எக்ச்போர்ட்டிம்போர்ட்டெச்ட் இப்போது தீர்மானிக்கும்/ மாறிலி
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
v3.20.2: ஓபன்ட்ராக்ச்
|
v3.20.2: திறந்தபாதைகள்
|
||||||
|
|
||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- மிதவைகளுக்குப் பதிலாக உயரத்தை ஆதாயம் மற்றும் இழப்பு என்பது எண்கள்
|
- மிதவைகளுக்குப் பதிலாக உயரத்தை ஆதாயம் மற்றும் இழப்பு என்பது எண்கள்
|
||||||
@@ -6,6 +6,6 @@ v3.20.2: ஓபன்ட்ராக்ச்
|
|||||||
|
|
||||||
பிழைத்திருத்த:
|
பிழைத்திருத்த:
|
||||||
- ஆண்ட்ராய்டு 12 இல் செயலிழப்பதைத் தவிர்ப்பதற்கு நிலுவைத் தொகைக்கு கொடி_இம் செய்யக்கூடியதாக அமைக்கவும்
|
- ஆண்ட்ராய்டு 12 இல் செயலிழப்பதைத் தவிர்ப்பதற்கு நிலுவைத் தொகைக்கு கொடி_இம் செய்யக்கூடியதாக அமைக்கவும்
|
||||||
- பயனர் பெடலிங் செய்யாதபோது எதற்கும் பதிலாக காடென்ச் சென்சார் 0 ஐ வழங்குகிறது
|
- பயனர் பெடலிங் செய்யாதபோது எதற்கும் பதிலாகக் காடென்ச் சென்சார் 0 ஐ வழங்குகிறது
|
||||||
- வேக சென்சார் நிறுத்தப்படும்போது கடைசி வேகத்திற்கு பதிலாக 0 ஐ வழங்குகிறது
|
- வேக சென்சார் நிறுத்தப்படும்போது கடைசி வேகத்திற்கு பதிலாக 0 ஐ வழங்குகிறது
|
||||||
- சென்சார்களுடன், நகரும் நேரம் நகரும் போது நிறுத்தப்படும்
|
- சென்சார்களுடன், நகரும் நேரம் நகரும்போது நிறுத்தப்படும்
|
||||||
|
|||||||
@@ -1,19 +1,19 @@
|
|||||||
v3.21.0: Opentracks
|
v3.21.0: திறந்தபாதைகள்
|
||||||
|
|
||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- பதிவு செய்யும் போது: டிராக் பாயிண்டுகளின் செயலற்ற/செயலற்ற அல்லாத உருவாக்கத்தை அகற்று
|
- பதிவு செய்யும்போது: டிராக் பாயிண்டுகளின் செயலற்ற அல்லாத உருவாக்கத்தை அகற்று
|
||||||
- அமைப்புகள் இப்போது தனி கோப்புறைகளில் உள்ளன
|
- அமைப்புகள் இப்போது தனி கோப்புறைகளில் உள்ளன
|
||||||
.
|
- அறிவிப்பிலிருந்து OpenTracks ஐத் திறந்து (பதிவு செய்யும்போது) மீண்டும் அழுத்தினால் டிராக் பட்டியல் திறக்கும்.
|
||||||
- GPX compatibilty: support <speed> க்கு import
|
- GPX compatibilty: support <speed> க்கு import
|
||||||
|
|
||||||
பிழைத்திருத்தங்கள்:
|
பிழைத்திருத்தங்கள்:
|
||||||
- உயரம் மற்றும் தூரம் (பி.எல்.இ சென்சாரிலிருந்து): தரவு உண்மையில் சேமிக்கப்பட்டிருந்தால் மட்டுமே கவுண்டர்களை மீட்டமைக்கவும்
|
- உயரம் மற்றும் தூரம் (பி.எல்.இ சென்சாரிலிருந்து): தரவு உண்மையில் சேமிக்கப்பட்டிருந்தால் மட்டுமே கவுண்டர்களை மீட்டமைக்கவும்
|
||||||
- விரைவு இல்லாமல் இறக்குமதி செய்ய, கணினி விரைவு தேவை
|
- விரைவு இல்லாமல் இறக்குமதி செய்ய, கணினி விரைவு தேவை
|
||||||
- ப்ளூ இயங்கும் சென்சார் இணைக்கப்படவில்லை, தற்போது போல புகாரளிக்கக்கூடாது
|
- ப்ளூ இயங்கும் சென்சார் இணைக்கப்படவில்லை, தற்போது போலப் புகாரளிக்கக் கூடாது
|
||||||
- BLE இயங்கும் சென்சார்: பதிவு செய்யும் போது தரவைக் காட்டு
|
- BLE இயங்கும் சென்சார்: பதிவு செய்யும்போது தரவைக் காட்டு
|
||||||
- செயல்பாட்டை மாற்றும்போது செயல்பாட்டு வகை படவுரு புதுப்பிக்கப்படவில்லை
|
- செயல்பாட்டை மாற்றும்போது செயல்பாட்டு வகை படவுரு புதுப்பிக்கப்படவில்லை
|
||||||
|
|
||||||
டெவலப்பர்:
|
டெவலப்பர்:
|
||||||
- நிலையான குறிப்பு வழியாக பகிரப்பட்டவை
|
- நிலையான குறிப்பு வழியாகப் பகிரப்பட்டவை
|
||||||
- நினைவக தரவுத்தளத்திற்கு எதிராக சோதனைகள் செயல்படுத்தப்படுகின்றன
|
- நினைவக தரவுத்தளத்திற்கு எதிராகச் சோதனைகள் செயல்படுத்தப்படுகின்றன
|
||||||
- ட்ராக் ரெக்கார்டிங்மேனேசர் கடைசி ட்ராக் பாயிண்ட்டை நினைவகத்தில் வைத்திருக்கிறது
|
- ட்ராக் ரெக்கார்டிங்மேனேசர் கடைசி ட்ராக் பாயிண்ட்டை நினைவகத்தில் வைத்திருக்கிறது
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ V3.22.0: Opentracks
|
|||||||
|
|
||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- பயணம் செய்தால் மட்டுமே இடங்கள் சேமிக்கப்படும்> தூர இடைவெளியைப் பதிவுசெய்க
|
- பயணம் செய்தால் மட்டுமே இடங்கள் சேமிக்கப்படும்> தூர இடைவெளியைப் பதிவுசெய்க
|
||||||
(செயலற்ற/செயலற்ற கண்டறிதலில் இருந்து செயல்பாட்டுக்கு மேல் அகற்றப்பட்டது)
|
(செயலற்ற கண்டறிதலிலிருந்து செயல்பாட்டுக்கு மேல் அகற்றப்பட்டது)
|
||||||
- ஒரு கடிகாரத்தைக் காட்ட இடைமுகம் ஐ கட்டமைக்க முடியும்
|
- ஒரு கடிகாரத்தைக் காட்ட இடைமுகம் ஐ கட்டமைக்க முடியும்
|
||||||
- செயலற்ற விரைவு இப்போது கட்டமைக்கப்படுகிறது
|
- செயலற்ற விரைவு இப்போது கட்டமைக்கப்படுகிறது
|
||||||
|
|
||||||
பிழைத்திருத்த:
|
பிழைத்திருத்த:
|
||||||
- இடைவெளிகள்: லாபம் ஆனால் இழப்பு சேமிக்கப்படாதபோது செயலிழப்பு
|
- இடைவெளிகள்: லாபம் ஆனால் இழப்பு சேமிக்கப்படாதபோது செயலிழப்பு
|
||||||
- பதிவு செய்யும் போது: குரல் அறிவிப்புகளை முடக்கும்போது செயலிழப்பைத் தடுக்கவும்
|
- பதிவு செய்யும்போது: குரல் அறிவிப்புகளை முடக்கும்போது செயலிழப்பைத் தடுக்கவும்
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ v3.23.0: Opentracks
|
|||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- இடைமுகம் சுயவிவரங்கள் சேர்க்கப்பட்டன
|
- இடைமுகம் சுயவிவரங்கள் சேர்க்கப்பட்டன
|
||||||
- தேர்ந்தெடுக்கப்பட்ட தடங்களுக்கான ஒருங்கிணைந்த புள்ளிவிவரங்கள்
|
- தேர்ந்தெடுக்கப்பட்ட தடங்களுக்கான ஒருங்கிணைந்த புள்ளிவிவரங்கள்
|
||||||
-நகரும் நேரம் வேலை செய்வதை நிறுத்துவதால் மீண்டும் செயல்படுத்தப்பட்ட செயலற்ற/செயலற்ற டிராக் பாயிண்ட்ச் (V3.22.0 இல் அறிமுகப்படுத்தப்பட்டது)
|
-நகரும் நேரம் வேலை செய்வதை நிறுத்துவதால் மீண்டும் செயல்படுத்தப்பட்ட செயலற்ற டிராக் பாயிண்ட்ச் (V3.22.0 இல் அறிமுகப்படுத்தப்பட்டது)
|
||||||
|
|
||||||
பிழைத்திருத்தங்கள்:
|
பிழைத்திருத்தங்கள்:
|
||||||
- பி.எல்.இ சென்சார்கள்: துண்டிக்கப்படுவதற்கான தரவை அழிக்கவும்
|
- பி.எல்.இ சென்சார்கள்: துண்டிக்கப்படுவதற்கான தரவை அழிக்கவும்
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
v3.24.0: Opentracks
|
v3.24.0: திறந்தபாதைகள்
|
||||||
|
|
||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- சி.பி.எச் விருப்பமானது (உட்புற பயன்பாட்டிற்கும்): தூரத்தை வழங்கும் பி.எல்.இ சென்சார்களைப் பயன்படுத்தினால் பயன்படுத்தப்பட்டால்
|
- சி.பி.எச் விருப்பமானது (உட்புற பயன்பாட்டிற்கும்): தூரத்தை வழங்கும் பி.எல்.இ சென்சார்களைப் பயன்படுத்தினால் பயன்படுத்தப்பட்டால்
|
||||||
- அமைப்புகள்: சாதனங்களின் BLE வடிகட்டலை முடக்க விருப்பம்
|
- அமைப்புகள்: சாதனங்களின் BLE வடிகட்டலை முடக்க விருப்பம்
|
||||||
- விளக்கப்படங்கள்: உயரம் 0M க்கு பதிலாக குறைந்தபட்ச மதிப்பில் தொடங்குகிறது.
|
- விளக்கப்படங்கள்: உயரம் 0M க்கு பதிலாகக் குறைந்தபட்ச மதிப்பில் தொடங்குகிறது.
|
||||||
- சேமிக்கப்பட்ட நேர மண்டல தகவல்களைக் காண்பிப்பதை இடைமுகம் ஆதரிக்கிறது
|
- சேமிக்கப்பட்ட நேர மண்டல தகவல்களைக் காண்பிப்பதை இடைமுகம் ஆதரிக்கிறது
|
||||||
|
|
||||||
பிழைத்திருத்த:
|
பிழைத்திருத்த:
|
||||||
- கடிகாரம் சரியான நேரத்தில் பயணித்ததால் விபத்துக்கான மறு சேர்க்கப்பட்ட பணித்தொகுப்பு (V3.23.0 இல் பணித்தொகுப்பு அகற்றப்பட்டது)
|
- கடிகாரம் சரியான நேரத்தில் பயணித்ததால் விபத்துக்கான மறு சேர்க்கப்பட்ட பணித்தொகுப்பு (V3.23.0 இல் பணித்தொகுப்பு அகற்றப்பட்டது)
|
||||||
- பி.எல்.இ சைக்கிள் ஓட்டுதல் சென்சார் (ஆர்.டி.எஃப்.எம்) க்கான தேவையற்ற பணித்தொகுப்பு அகற்றப்பட்டது
|
- பி.எல்.இ சைக்கிள் ஓட்டுதல் சென்சார் (ஆர்.டி.எஃப்.எம்) க்கான தேவையற்ற பணித்தொகுப்பு அகற்றப்பட்டது
|
||||||
- காணாமல் போன தரவை சிபிஎக்ச் இறக்குமதியாளர் சரியாக கையாளவில்லை
|
- காணாமல் போன தரவை சிபிஎக்ச் இறக்குமதியாளர் சரியாகக் கையாளவில்லை
|
||||||
|
|
||||||
டெவலப்பர்:
|
டெவலப்பர்:
|
||||||
-BLE சென்சார்கள் புல் அடிப்படையிலானதை விட தரவு நிகழ்வு-இயக்கப்படும் என்று தெரிவிக்கின்றன
|
-BLE சென்சார்கள் புல் அடிப்படையிலானதை விடத் தரவு நிகழ்வு-இயக்கப்படும் என்று தெரிவிக்கின்றன
|
||||||
- பதிவு செய்வதற்கான ஒருங்கிணைப்பு சோதனைகளை மறுவேலை செய்து சேர்த்தது
|
- பதிவு செய்வதற்கான ஒருங்கிணைப்பு சோதனைகளை மறுவேலை செய்து சேர்த்தது
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
v3.24.1: Opentracks
|
v3.24.1: திறந்தபாதைகள்
|
||||||
|
|
||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- பிற பயன்பாடுகளிலிருந்து பதிவுகளைத் தொடங்க பநிஇ சேர்க்கப்பட்டது (இயல்பாக முடக்கப்பட்டுள்ளது)
|
- பிற பயன்பாடுகளிலிருந்து பதிவுகளைத் தொடங்க பநிஇ சேர்க்கப்பட்டது (இயல்பாக முடக்கப்பட்டுள்ளது)
|
||||||
@@ -6,7 +6,7 @@ v3.24.1: Opentracks
|
|||||||
-பிளே தூர சென்சார்கள்: முந்தைய சி.பி.எச்-இடங்களின் அடிப்படையில் சி.பி.எச்-இடங்களை சேமிக்கவும்
|
-பிளே தூர சென்சார்கள்: முந்தைய சி.பி.எச்-இடங்களின் அடிப்படையில் சி.பி.எச்-இடங்களை சேமிக்கவும்
|
||||||
|
|
||||||
பிழைத்திருத்த:
|
பிழைத்திருத்த:
|
||||||
- பதிவு செய்யும் போது: விளக்கப்படங்களைத் திறக்கும்போது நிலையான செயலிழப்பு
|
- பதிவு செய்யும்போது: விளக்கப்படங்களைத் திறக்கும்போது நிலையான செயலிழப்பு
|
||||||
- ட்ராக்டாடாஅப் நிறுத்தத்திற்குப் பிறகு செயலாக்கத்தை முடிக்க வேண்டும் ()
|
- ட்ராக்டாடாஅப் நிறுத்தத்திற்குப் பிறகு செயலாக்கத்தை முடிக்க வேண்டும் ()
|
||||||
- தடங்களை நீக்கும்போது அரிதான செயலிழப்பைத் தடுக்கவும்
|
- தடங்களை நீக்கும்போது அரிதான செயலிழப்பைத் தடுக்கவும்
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
V3.27.0: Opentracks
|
V3.27.0: திறந்தபாதைகள்
|
||||||
|
|
||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- குரல் அன்னியூசென்ச்: 100 மீ, 200 மீ மற்றும் 500 மீ
|
- குரல் அன்னியூசென்ச்: 100 மீ, 200 மீ மற்றும் 500 மீ
|
||||||
- இடைவெளி: 100 மீ மற்றும் 500 மீ சேர்க்கவும்
|
- இடைவெளி: 100 மீ மற்றும் 500 மீ சேர்
|
||||||
- கடிகாரம் இப்போது விநாடிகளையும் காட்டுகிறது
|
- கடிகாரம் இப்போது விநாடிகளையும் காட்டுகிறது
|
||||||
- சி.பி.எக்ச், கே.எம்.எல், கே.எம்.இசட்: கிடைமட்ட துல்லியத்தை ஏற்றுமதி செய்து இறக்குமதி செய்க
|
- சி.பி.எக்ச், கே.எம்.எல், கே.எம்.இசட்: கிடைமட்ட துல்லியத்தை ஏற்றுமதி செய்து இறக்குமதி செய்க
|
||||||
- சி.பி.எக்ச்: கிளச்ட்ரச்ட் நீட்டிப்பு வழியாக ஒட்டுமொத்த தூரத்தை ஏற்றுமதி செய்யுங்கள்
|
- சி.பி.எக்ச்: கிளச்ட்ரச்ட் நீட்டிப்பு வழியாக ஒட்டுமொத்த தூரத்தை ஏற்றுமதி செய்யுங்கள்
|
||||||
@@ -13,5 +13,5 @@ V3.27.0: Opentracks
|
|||||||
- தூர இடைவெளியைப் பதிவுசெய்வது;
|
- தூர இடைவெளியைப் பதிவுசெய்வது;
|
||||||
ட்ராக் பாயிண்டுகள் மிக நெருக்கமாக இருந்தபோதிலும் பதிவு செய்யப்பட்டன
|
ட்ராக் பாயிண்டுகள் மிக நெருக்கமாக இருந்தபோதிலும் பதிவு செய்யப்பட்டன
|
||||||
- ச்டாப் ரெக்கார்டிங் (ரேச் நிலை) இல் செயலிழப்பதைத் தடுக்கவும்
|
- ச்டாப் ரெக்கார்டிங் (ரேச் நிலை) இல் செயலிழப்பதைத் தடுக்கவும்
|
||||||
- பல சென்சார்களைப் பயன்படுத்தும் போது செயலிழப்பைத் தடுக்கவும் (ரேச் நிலை)
|
- பல சென்சார்களைப் பயன்படுத்தும்போது செயலிழப்பைத் தடுக்கவும் (ரேச் நிலை)
|
||||||
- அறிவிப்பு வழியாக ஓபன்ட்ராக்சைத் திறக்கும்போது செயலிழப்பைத் தடுக்கவும்
|
- அறிவிப்பு வழியாக ஓபன்ட்ராக்சைத் திறக்கும்போது செயலிழப்பைத் தடுக்கவும்
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
v4.0.0: Opentracks
|
v4.0.0: திறந்தபாதைகள்
|
||||||
|
|
||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- கீழ் பயன்பாட்டு பட்டியுடன் இடைமுகம் மறுசீரமைப்பு.
|
- கீழ் பயன்பாட்டு பட்டியுடன் இடைமுகம் மறுசீரமைப்பு.
|
||||||
- பொது ஏபிஐ: சரியாக செயல்படுத்தப்பட்டது.
|
- பொது ஏபிஐ: சரியாகச் செயல்படுத்தப்பட்டது.
|
||||||
- தூய்மைப்படுத்துதல்: ட்ராக்ஃபைல்ஃபார்மட்டுக்கு வெளிப்படையான விருப்பத்தேர்வுகளைப் பயன்படுத்தவும்.
|
- தூய்மைப்படுத்துதல்: ட்ராக்ஃபைல்ஃபார்மட்டுக்கு வெளிப்படையான விருப்பத்தேர்வுகளைப் பயன்படுத்தவும்.
|
||||||
- BLE ஏண்ட்லரில் மேம்பாடுகள்.
|
- BLE ஏண்ட்லரில் மேம்பாடுகள்.
|
||||||
- விதிவிலக்கு கையாளுபவரைச் சேர்த்து பிழை செயல்பாட்டைக் காட்டுங்கள், இதனால் பயனர்கள் பிழைகள் பற்றிய அறிக்கைகளை அனுப்ப முடியும்.
|
- விதிவிலக்கு கையாளுபவரைச் சேர்த்து பிழை செயல்பாட்டைக் காட்டுங்கள், இதனால் பயனர்கள் பிழைகள்பற்றிய அறிக்கைகளை அனுப்ப முடியும்.
|
||||||
- ஆண்ட்ராய்டு 13: துவக்கி படவுரு, ஒரு கருப்பொருள் ஐகானை வழங்கவும்.
|
- ஆண்ட்ராய்டு 13: துவக்கி படவுரு, ஒரு கருப்பொருள் ஐகானை வழங்கவும்.
|
||||||
- டிராக் தலைப்பு மூலதனத்தை வாக்கியங்களுக்கு மாற்றவும்.
|
- டிராக் தலைப்பு மூலதனத்தை வாக்கியங்களுக்கு மாற்றவும்.
|
||||||
- மொழிபெயர்ப்புகள் புதுப்பிக்கப்பட்டன.
|
- மொழிபெயர்ப்புகள் புதுப்பிக்கப்பட்டன.
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
V4.0.1: Opentracks
|
V4.0.1: திறந்தபாதைகள்
|
||||||
|
|
||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- குரல் அறிவிப்புகள் இப்போது கட்டமைக்கப்படுகின்றன
|
- குரல் அறிவிப்புகள் இப்போது கட்டமைக்கப்படுகின்றன
|
||||||
- முழுத்திரை பயன்முறை இப்போது ஆண்ட்ராய்டு இன் வழிசெலுத்தல் பட்டையும் மறைக்கிறது
|
- முழுத்திரை பயன்முறை இப்போது ஆண்ட்ராய்டு இன் வழிசெலுத்தல் பட்டையும் மறைக்கிறது
|
||||||
- பி.எல்.இ சென்சார்களுக்கான இணைப்பு இப்போது வேகமாக இருக்க வேண்டும்
|
- பி.எல்.இ சென்சார்களுக்கான இணைப்பு இப்போது வேகமாக இருக்க வேண்டும்
|
||||||
- பதிவு செய்யும் போது அமைப்புகளை மீட்டமைக்க அனுமதிக்கவும்
|
- பதிவு செய்யும்போது அமைப்புகளை மீட்டமைக்க அனுமதிக்கவும்
|
||||||
- பதிவு செய்யும் போது இறக்குமதி/ஏற்றுமதி அமைப்புகளை மாற்ற அனுமதிக்கவும்
|
- பதிவு செய்யும்போது இறக்குமதி/ஏற்றுமதி அமைப்புகளை மாற்ற அனுமதிக்கவும்
|
||||||
- KML/KMZ: Google இலிருந்து ஏற்ற ஐகான்களைப் பயன்படுத்த வேண்டாம்
|
- KML/KMZ: Google இலிருந்து ஏற்ற ஐகான்களைப் பயன்படுத்த வேண்டாம்
|
||||||
|
|
||||||
பிழைத்திருத்த:
|
பிழைத்திருத்த:
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ V4.5.0: Opentracks
|
|||||||
- புதிய அலகு: மீட்டர் கொண்ட மைல்கள்
|
- புதிய அலகு: மீட்டர் கொண்ட மைல்கள்
|
||||||
|
|
||||||
பிழைத்திருத்த:
|
பிழைத்திருத்த:
|
||||||
- சி.பி.எச் முடக்கப்பட்ட எச்சரிக்கைகள் மீண்டும் மீண்டும் காட்டப்பட்டுள்ளன (#1429)
|
- சி.பி.எச் முடக்கப்பட்ட எச்சரிக்கைகள் மறுநிகழ்வுகள் காட்டப்பட்டுள்ளன (#1429)
|
||||||
|
|
||||||
டெவலப்பர்:
|
டெவலப்பர்:
|
||||||
- சாவா பதிவுகளைப் பயன்படுத்தவும்
|
- சாவா பதிவுகளைப் பயன்படுத்தவும்
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
V4.9.0: Opentracks
|
V4.9.0: திறந்தபாதைகள்
|
||||||
|
|
||||||
குறிப்பு: மாற்றத்தை உடைத்தல்
|
குறிப்பு: மாற்றத்தை உடைத்தல்
|
||||||
|
|
||||||
இந்த வெளியீடு ஓபன்ட்ராக்ச் நகர்த்துவதையும் நகர்த்தப்படுவதையும் எவ்வாறு தீர்மானிக்கிறது என்பதை மாற்றுகிறது.
|
இந்த வெளியீடு ஓபன்ட்ராக்ச் நகர்த்துவதையும் நகர்த்தப்படுவதையும் எவ்வாறு தீர்மானிக்கிறது என்பதை மாற்றுகிறது.
|
||||||
இப்போது வரை, விரைவு (சி.பி.எச் அல்லது சென்சார்) ஒரு வாசலைப் பயன்படுத்துவதன் மூலம் பயன்படுத்தப்பட்டது (எ.கா., 0.3 மீ/வி க்கும் குறைவாக).
|
இப்போது வரை, விரைவு (சி.பி.எச் அல்லது சென்சார்) ஒரு வாசலைப் பயன்படுத்துவதன் மூலம் பயன்படுத்தப்பட்டது (எ.கா., 0.3 மீ/வி க்கும் குறைவாக).
|
||||||
இருப்பினும், இது மிகவும் சத்தமாக இருக்கலாம்.
|
இருப்பினும், இது மிகவும் சத்தமாக இருக்கலாம்.
|
||||||
இனிமேல், ஒரு காலக்கெடு காலம் பயன்படுத்தப்படுகிறது (அதாவது, கடைசி ஃச் விநாடிகளில் குறிப்பிடத்தக்க நிலை மாற்றம் இல்லை).
|
இனிமேல், ஒரு காலக்கெடு காலம் பயன்படுத்தப்படுகிறது (அதாவது, கடைசி ஃச் விநாடிகளில் குறிப்பிடத் தக்க நிலை மாற்றம் இல்லை).
|
||||||
இந்த காலம் பயனர் கட்டமைக்கக்கூடியது.
|
இந்தக் காலம் பயனர் கட்டமைக்கக்கூடியது.
|
||||||
சும்மா ஆகும் நிகழ்வுகள் தரவுத்தள உள்ளிட்டவற்றில் சேமிக்கப்படுகின்றன. ஒரு நேர முத்திரை, எனவே புள்ளிவிவரங்களை மீண்டும் கணக்கிட முடியும்.
|
சும்மா ஆகும் நிகழ்வுகள் தரவுத்தள உள்ளிட்டவற்றில் சேமிக்கப்படுகின்றன. ஒரு நேர முத்திரை, எனவே புள்ளிவிவரங்களை மீண்டும் கணக்கிட முடியும்.
|
||||||
|
|
||||||
இந்த பதிப்பிலிருந்து தரமிறக்குதல் செயல்படுத்தப்படவில்லை.
|
இந்தப் பதிப்பிலிருந்து தரமிறக்குதல் செயல்படுத்தப்படவில்லை.
|
||||||
மேம்படுத்துவதற்கு முன் அனைத்தையும் காப்புப் பிரதி எடுக்கவும்.
|
மேம்படுத்துவதற்கு முன் அனைத்தையும் காப்புப் பிரதி எடுக்கவும்.
|
||||||
|
|
||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- செயலற்ற கண்டறிதல் வேகத்தை விட "இயக்கம் இல்லை" காலத்தைப் பயன்படுத்துகிறது
|
- செயலற்ற கண்டறிதல் வேகத்தைவிட "இயக்கம் இல்லை" காலத்தைப் பயன்படுத்துகிறது
|
||||||
- ச்கூட்டர் செயல்பாடு சேர்க்கப்பட்டது
|
- ச்கூட்டர் செயல்பாடு சேர்க்கப்பட்டது
|
||||||
|
|
||||||
பிழைத்திருத்த:
|
பிழைத்திருத்த:
|
||||||
- பதிவு செய்யும் போது, ட்ராக்லிச்ட் அனைத்து தடங்களையும் பதிவாக காட்டியது
|
- பதிவு செய்யும்போது, ட்ராக்லிச்ட் அனைத்து தடங்களையும் பதிவாகக் காட்டியது
|
||||||
|
|
||||||
டெவலப்பர்:
|
டெவலப்பர்:
|
||||||
- மீண்டும் இயக்கப்பட்ட அறிவிலிமையம் நடவடிக்கை சோதனைகளை இயக்கும்
|
- மீண்டும் இயக்கப்பட்ட அறிவிலிமையம் நடவடிக்கை சோதனைகளை இயக்கும்
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
V4.10.0: Opentracks
|
V4.10.0: திறந்தபாதைகள்
|
||||||
|
|
||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- BLE சுற்றுச்சூழல் உணர்திறன் (காற்றழுத்தமானி) வழியாக உதவி ஆதாயம்/இழப்பு
|
- BLE சுற்றுச்சூழல் உணர்திறன் (காற்றழுத்தமானி) வழியாக உதவி ஆதாயம்/இழப்பு
|
||||||
|
|||||||
@@ -7,5 +7,5 @@ v4.10.1: ஓபன்ட்ராக்ச்
|
|||||||
பிழைத்திருத்த:
|
பிழைத்திருத்த:
|
||||||
- பி.எல்.இ சென்சார் மறு இணைப்பு விபத்துக்குள்ளானது (V4.9.6 இல் அறிமுகப்படுத்தப்பட்டது)
|
- பி.எல்.இ சென்சார் மறு இணைப்பு விபத்துக்குள்ளானது (V4.9.6 இல் அறிமுகப்படுத்தப்பட்டது)
|
||||||
- சைக்கிள் ஓட்டுதல் ஆற்றல் செயலாக்கப்படவில்லை (V4.9.6 இல் அறிமுகப்படுத்தப்பட்டது)
|
- சைக்கிள் ஓட்டுதல் ஆற்றல் செயலாக்கப்படவில்லை (V4.9.6 இல் அறிமுகப்படுத்தப்பட்டது)
|
||||||
- சைக்கிள் ஓட்டுதல் மற்றும் தூரம் மீண்டும் மீண்டும் தரவை அனுமதிக்கிறது
|
- சைக்கிள் ஓட்டுதல் மற்றும் தூரம் மறுநிகழ்வு தரவை அனுமதிக்கிறது
|
||||||
- BLE காற்றழுத்தமானி தரவு சரியாக செயலாக்கப்படவில்லை
|
- BLE காற்றழுத்தமானி தரவு சரியாகச் செயலாக்கப்படவில்லை
|
||||||
|
|||||||
@@ -2,4 +2,4 @@ v4.11.2: ஓபன்ட்ராக்ச்
|
|||||||
|
|
||||||
பிழைத்திருத்த:
|
பிழைத்திருத்த:
|
||||||
- திரை திரும்பும்போது பதிவு நிறுத்தப்பட்டது (V4.11.1 இல் அறிமுகப்படுத்தப்பட்டது)
|
- திரை திரும்பும்போது பதிவு நிறுத்தப்பட்டது (V4.11.1 இல் அறிமுகப்படுத்தப்பட்டது)
|
||||||
.
|
. (மாற்றியமைத்தல் da3dd29b8e44624a8222caea9067955f252ef5f8)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
v4.13.0: ஓபன்ட்ராக்ச்
|
v4.13.0: திறந்தபாதைகள்
|
||||||
|
|
||||||
மாற்றங்கள்:
|
மாற்றங்கள்:
|
||||||
- பொது பநிஇ வழியாக குறிப்பான்களை உருவாக்க முடியும்
|
- பொது பநிஇ வழியாகக் குறிப்பான்களை உருவாக்க முடியும்
|
||||||
இது எந்த இடத்திலும் பதிவுசெய்த பிறகு குறிப்பான்களை உருவாக்க அனுமதிக்கிறது.
|
இது எந்த இடத்திலும் பதிவுசெய்த பிறகு குறிப்பான்களை உருவாக்க அனுமதிக்கிறது.
|
||||||
குறைபாடு: குறிப்பான்கள் இனி வரைபடங்களில் காட்டப்படவில்லை.
|
குறைபாடு: குறிப்பான்கள் இனி வரைபடங்களில் காட்டப்படவில்லை.
|
||||||
குறிப்பு: பதிப்பிற்குப் பிறகு இந்த பநிஇ ஐ ஆதரிக்கிறது: v4.1.0
|
குறிப்பு: பதிப்பிற்குப் பிறகு இந்த பநிஇ ஐ ஆதரிக்கிறது: v4.1.0
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
V4.19.3: Opentracks
|
V4.19.3: Opentracks
|
||||||
|
|
||||||
பிழைத்திருத்த:
|
பிழைத்திருத்த:
|
||||||
- உயரத்திற்கு காபிம ஏற்றுமதியை சரிசெய்யவும் (1000 மீ.
|
- உயரத்திற்கு காபிம ஏற்றுமதியை சரிசெய்யவும் (1000 மீட்டரில் வெட்டப்பட்டது)
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
v4.19.5: OpenTracks
|
||||||
|
|
||||||
|
பிழைத்திருத்தம்:
|
||||||
|
- துவக்கி ஐகான் சில நேரங்களில் மிகச் சிறியதாகக் காட்டப்பட்டது
|
||||||
|
- உள்ளூர்மயமாக்கப்பட்ட செயல்பாட்டு வகையைப் பயன்படுத்தி விவரப் பக்கத்தில் டிராக் ஐகான்
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
v4.19.6: OpenTracks
|
||||||
|
|
||||||
|
மாற்றங்கள்:
|
||||||
|
- Edge-2-edge இப்போது அனைத்து Android பதிப்புகளிலும் வேலை செய்ய வேண்டும்
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
v4.20.0: OpenTracks
|
||||||
|
|
||||||
|
மாற்றங்கள்:
|
||||||
|
- டிராக்குகளின் நேர மண்டல ஆஃப்செட்டை மாற்ற அனுமதிக்கவும்
|
||||||
|
- எளிமைப்படுத்தப்பட்ட மார்க்கர் UI
|
||||||
|
|
||||||
|
பிழைத்திருத்தம்:
|
||||||
|
- எட்ஜ்-2-எட்ஜ்: மெய்நிகர் விசைப்பலகைக்கு எதிர்வினையாற்று
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
v4.21.0: OpenTracks
|
||||||
|
|
||||||
|
மாற்றங்கள்:
|
||||||
|
- டிராக் பட்டியல் ஸ்வைப்-டு-டிலீட்டை ஆதரிக்கிறது
|
||||||
|
- மீண்டும் செயல்படுத்தப்பட்ட தீம்கள் (டைனமிக் கலர் மற்றும் OLED க்கு)
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
v4.21.1: OpenTracks
|
||||||
|
|
||||||
|
பிழைத்திருத்தம்:
|
||||||
|
- ஏற்றுமதி/இறக்குமதி UI இல் ஏற்பட்ட செயலிழப்பு சரி செய்யப்பட்டது (v4.21.0 இல் அறிமுகப்படுத்தப்பட்டது)
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
v4.22.0: OpenTracks
|
||||||
|
|
||||||
|
மாற்றங்கள்:
|
||||||
|
- https://codeberg.org/OpenTracksApp/OpenTracks க்கு இடம்பெயர்தல்
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
v4.22.1: OpenTracks
|
||||||
|
|
||||||
|
மாற்றங்கள்:
|
||||||
|
- கோட்பெர்க் வழியாக முதல் வெளியீடு
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
v4.22.2: திறந்தபாதைகள்
|
||||||
|
பிழைத்திருத்தம்:
|
||||||
|
- நேரம் மற்றும் அலகுக்கான குரல் அறிவிப்பு அமைப்பு இணைக்கப்பட்டது
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
v4.23.0: OpenTracks
|
||||||
|
|
||||||
|
மாற்றங்கள்:
|
||||||
|
- UI: தற்போதைய பிரிவின் சராசரி வேகத்தைச் சேர்த்தது
|
||||||
|
(தற்போது புதிய தளவமைப்புகளில் மட்டுமே கிடைக்கிறது)
|
||||||
|
- அறிவிப்பைக் சொடுக்கு செய்வதன் மூலம் உண்மையான பதிவு இடைமுகம் திறக்கும்
|
||||||
|
|
||||||
|
டெவலப்பர்:
|
||||||
|
- நிராகரிக்கப்பட்ட JobIntentService, WorkManager உடன் மாற்றப்பட்டது
|
||||||
|
- CharSequence மற்றும் Stream.toList() தவிர .isEmpty() ஐப் பயன்படுத்தவும்
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
v4.23.1: OpenTracks
|
||||||
|
|
||||||
|
மாற்றங்கள்:
|
||||||
|
- தற்போதைய பிரிவில் கழிந்த நேரத்தைக் காட்ட புதிய இடைமுகம் கூறு
|
||||||
|
|
||||||
|
பிழைத்திருத்தம்:
|
||||||
|
- உடற்பயிற்சிக்குப் பிந்தைய உடனடி ஏற்றுமதி செயலிழந்தது (v4.23.0 இல் அறிமுகப்படுத்தப்பட்டது)
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
v4.23.2: OpenTracks
|
||||||
|
|
||||||
|
மாற்றங்கள்:
|
||||||
|
- முன்கணிப்பு முற்றிலும் வேலை செய்கிறது
|
||||||
|
|
||||||
|
பிழைத்திருத்தம்:
|
||||||
|
- அமைப்புகளில் டிராக் கோப்புப் பெயருடன் தொடர்புடைய செயலிழப்பில் சரி செய்யப்பட்டது
|
||||||
|
|
||||||
|
டெவலப்பர்:
|
||||||
|
- புள்ளிவிவரங்களுக்கான தரவு வகுப்பு அறிமுகப்படுத்தப்பட்டது
|
||||||
@@ -1,22 +1,22 @@
|
|||||||
一款尊重您的隐私的运动追踪应用。
|
尊重您隐私的运动追踪伙伴。
|
||||||
|
|
||||||
健康幸福的生活总少不了各种运动和户外活动。
|
运动与户外活动能带来快乐、提升技能、增强自信。
|
||||||
|
|
||||||
使用本应用,您可以保持对您的训练数据的有效追踪,为您的健康助力。
|
通过跟踪训练数据,珍视您的健康。
|
||||||
本应用可以在您跑步或散步时记录数据,也可以在您骑车时作为一个大屏幕自行车电脑。
|
记录您的跑步或步行数据,并提供大屏的专用骑行码表。
|
||||||
您可以为路上的有趣位置创建标记,还可以用图片作为标记。
|
用照片标记沿途有趣的地点。
|
||||||
您的数据会被详尽地记录下来,供您查阅分析。
|
保留详细记录的统计数据以供分析。
|
||||||
您的数据只会分享给您想要分享给的人。
|
仅分享您愿意公开的数据。
|
||||||
|
|
||||||
* 语音播报
|
* 语音播报。
|
||||||
* 支持蓝牙LE传感器:心率、速度和距离(骑车)、踏频(骑车)和功率计(骑车)。
|
* 支持蓝牙低功耗传感器:心率、速度和距离(骑行)、踏频(骑行)、功率计(骑行)。
|
||||||
* 海拔增减:通过气压传感器。
|
* 海拔上升和下降:通过气压传感器。
|
||||||
* EGM2008 海拔显示(平均海平面以上);导出为 WGS84。
|
* 采用 EGM2008 显示海拔(平均海平面以上);导出为 WGS84。
|
||||||
* 导出路线数据,支持 KMZ(包括照片)、KML 和 GPX 格式。
|
* 以 KMZ(含照片)、KML 或 GPX 格式导出轨迹数据。
|
||||||
* 不需要联网,不需要额外权限。
|
* 无需互联网访问或额外权限。
|
||||||
* 深色和浅色主题,跟随系统设置。
|
* 深色和浅色主题,跟随系统设置。
|
||||||
* 没有广告。
|
* 无广告。
|
||||||
|
|
||||||
本应用是开源软件
|
自由软件/开放源代码
|
||||||
意味着您可以使用、学习、修改和分发本应用的源代码。
|
意味着您可以使用、研究、修改和分享源代码。
|
||||||
本应用使用 Apache 2.0 协议发布。
|
采用 Apache 2.0 许可
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
一款尊重您的隐私的运动追踪应用。
|
尊重您隐私的运动追踪伙伴。
|
||||||
|
|||||||
Vendored
BIN
Binary file not shown.
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
validateDistributionUrl=true
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
#
|
#
|
||||||
# Copyright © 2015-2021 the original authors.
|
# Copyright © 2015 the original authors.
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
# you may not use this file except in compliance with the License.
|
# you may not use this file except in compliance with the License.
|
||||||
@@ -114,7 +114,6 @@ case "$( uname )" in #(
|
|||||||
NONSTOP* ) nonstop=true ;;
|
NONSTOP* ) nonstop=true ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
|
||||||
|
|
||||||
|
|
||||||
# Determine the Java command to use to start the JVM.
|
# Determine the Java command to use to start the JVM.
|
||||||
@@ -172,7 +171,6 @@ fi
|
|||||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||||
if "$cygwin" || "$msys" ; then
|
if "$cygwin" || "$msys" ; then
|
||||||
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||||
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
|
|
||||||
|
|
||||||
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
||||||
|
|
||||||
@@ -205,15 +203,14 @@ fi
|
|||||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||||
|
|
||||||
# Collect all arguments for the java command:
|
# Collect all arguments for the java command:
|
||||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
||||||
# and any embedded shellness will be escaped.
|
# and any embedded shellness will be escaped.
|
||||||
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
|
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
|
||||||
# treated as '${Hostname}' itself on the command line.
|
# treated as '${Hostname}' itself on the command line.
|
||||||
|
|
||||||
set -- \
|
set -- \
|
||||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||||
-classpath "$CLASSPATH" \
|
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
|
||||||
org.gradle.wrapper.GradleWrapperMain \
|
|
||||||
"$@"
|
"$@"
|
||||||
|
|
||||||
# Stop when "xargs" is not available.
|
# Stop when "xargs" is not available.
|
||||||
|
|||||||
Vendored
+1
-2
@@ -70,11 +70,10 @@ goto fail
|
|||||||
:execute
|
:execute
|
||||||
@rem Setup the command line
|
@rem Setup the command line
|
||||||
|
|
||||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
|
||||||
|
|
||||||
|
|
||||||
@rem Execute Gradle
|
@rem Execute Gradle
|
||||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
|
||||||
|
|
||||||
:end
|
:end
|
||||||
@rem End local scope for the variables with windows NT shell
|
@rem End local scope for the variables with windows NT shell
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://docs.renovatebot.com/renovate-schema.json"
|
||||||
|
}
|
||||||
@@ -52,7 +52,6 @@ public class EspressoDeleteTrackTest {
|
|||||||
onView(allOf(withParent(withId(R.id.track_list)), withParentIndex(0))).perform(longClick());
|
onView(allOf(withParent(withId(R.id.track_list)), withParentIndex(0))).perform(longClick());
|
||||||
|
|
||||||
// open menu and delete selected track
|
// open menu and delete selected track
|
||||||
//TODO openActionBarOverflowOrOptionsMenu(); doesn't work
|
|
||||||
onView(
|
onView(
|
||||||
allOf(withContentDescription("More options"),
|
allOf(withContentDescription("More options"),
|
||||||
childAtPosition(
|
childAtPosition(
|
||||||
|
|||||||
@@ -1,99 +0,0 @@
|
|||||||
package de.dennisguse.opentracks.chart;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertNull;
|
|
||||||
|
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
|
|
||||||
import java.time.Duration;
|
|
||||||
|
|
||||||
import de.dennisguse.opentracks.data.models.Altitude;
|
|
||||||
import de.dennisguse.opentracks.data.models.Distance;
|
|
||||||
import de.dennisguse.opentracks.data.models.Speed;
|
|
||||||
import de.dennisguse.opentracks.data.models.TrackPoint;
|
|
||||||
import de.dennisguse.opentracks.settings.UnitSystem;
|
|
||||||
import de.dennisguse.opentracks.stats.TrackStatistics;
|
|
||||||
|
|
||||||
@RunWith(AndroidJUnit4.class)
|
|
||||||
public class ChartPointTest {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void create_by_time() {
|
|
||||||
// given
|
|
||||||
TrackStatistics statistics = new TrackStatistics();
|
|
||||||
statistics.setTotalTime(Duration.ofSeconds(1000));
|
|
||||||
|
|
||||||
// when
|
|
||||||
ChartPoint point = ChartPoint.create(statistics, TrackStubUtils.createDefaultTrackPoint(), Speed.of(0), false, UnitSystem.IMPERIAL_FEET);
|
|
||||||
|
|
||||||
// then
|
|
||||||
assertEquals(1000000, (long) point.timeOrDistance());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void create_by_distance() {
|
|
||||||
// given
|
|
||||||
TrackStatistics statistics = new TrackStatistics();
|
|
||||||
statistics.setTotalDistance(Distance.of(1000));
|
|
||||||
|
|
||||||
// when
|
|
||||||
ChartPoint point = ChartPoint.create(statistics, TrackStubUtils.createDefaultTrackPoint(), Speed.of(0), true, UnitSystem.METRIC);
|
|
||||||
|
|
||||||
// then
|
|
||||||
assertEquals(1, (long) point.timeOrDistance());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
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 = ChartPoint.create(statistics, trackPoint, Speed.of(10), false, UnitSystem.METRIC);
|
|
||||||
|
|
||||||
// then
|
|
||||||
assertEquals(50, point.altitude(), 0.01);
|
|
||||||
assertEquals(36, point.speed(), 0.01);
|
|
||||||
assertEquals(1.66, point.pace(), 0.01);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void create_sensorNotAvailable() {
|
|
||||||
// given
|
|
||||||
TrackStatistics statistics = new TrackStatistics();
|
|
||||||
TrackPoint trackPoint = TrackStubUtils.createDefaultTrackPoint()
|
|
||||||
.setAltitude(Altitude.EGM2008.of(50));
|
|
||||||
// when
|
|
||||||
ChartPoint point = ChartPoint.create(statistics, trackPoint, Speed.of(10), false, UnitSystem.METRIC);
|
|
||||||
|
|
||||||
// then
|
|
||||||
assertNull(point.heartRate());
|
|
||||||
assertNull(point.cadence());
|
|
||||||
assertNull(point.power());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void create_sensorAvailable() {
|
|
||||||
// given
|
|
||||||
TrackPoint trackPoint = TrackStubUtils.createDefaultTrackPoint()
|
|
||||||
.setAltitude(Altitude.EGM2008.of(50))
|
|
||||||
.setHeartRate(100f)
|
|
||||||
.setCadence(101f)
|
|
||||||
.setPower(102f);
|
|
||||||
|
|
||||||
TrackStatistics statistics = new TrackStatistics();
|
|
||||||
|
|
||||||
// when
|
|
||||||
ChartPoint point = ChartPoint.create(statistics, trackPoint, Speed.of(10), false, UnitSystem.METRIC);
|
|
||||||
|
|
||||||
// then
|
|
||||||
assertEquals(100.0, point.heartRate(), 0.01);
|
|
||||||
assertEquals(101.0, point.cadence(), 0.01);
|
|
||||||
assertEquals(102.0, point.power(), 0.01);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2012 Google Inc.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
|
||||||
* use this file except in compliance with the License. You may obtain a copy of
|
|
||||||
* the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.dennisguse.opentracks.chart;
|
|
||||||
|
|
||||||
import java.time.Instant;
|
|
||||||
|
|
||||||
import de.dennisguse.opentracks.data.models.Altitude;
|
|
||||||
import de.dennisguse.opentracks.data.models.Distance;
|
|
||||||
import de.dennisguse.opentracks.data.models.Position;
|
|
||||||
import de.dennisguse.opentracks.data.models.Speed;
|
|
||||||
import de.dennisguse.opentracks.data.models.TrackPoint;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Commons utilities for creating stubs of track, location.
|
|
||||||
*
|
|
||||||
* @author Youtao Liu
|
|
||||||
*/
|
|
||||||
//TODO Move to ChartPointTest
|
|
||||||
class TrackStubUtils {
|
|
||||||
|
|
||||||
public static final double INITIAL_ALTITUDE = 22;
|
|
||||||
public static final long INITIAL_TIME = 1000L;
|
|
||||||
private static final double INITIAL_LATITUDE = 22;
|
|
||||||
private static final double INITIAL_LONGITUDE = 22;
|
|
||||||
private static final Distance INITIAL_ACCURACY = Distance.of(5);
|
|
||||||
private static final Speed INITIAL_SPEED = Speed.of(10);
|
|
||||||
private static final float INITIAL_BEARING = 3.0f;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a MyTracks location with default values.
|
|
||||||
*
|
|
||||||
* @return a track stub.
|
|
||||||
*/
|
|
||||||
public static TrackPoint createDefaultTrackPoint() {
|
|
||||||
return createDefaultTrackPoint(INITIAL_LATITUDE, INITIAL_LONGITUDE, INITIAL_ALTITUDE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a {@link TrackPoint} stub with specified values.
|
|
||||||
*
|
|
||||||
* @return a SensorDataSetLocation stub.
|
|
||||||
*/
|
|
||||||
private static TrackPoint createDefaultTrackPoint(double latitude, double longitude, double altitude) {
|
|
||||||
return new TrackPoint(TrackPoint.Type.TRACKPOINT,
|
|
||||||
new Position(
|
|
||||||
Instant.ofEpochMilli(INITIAL_TIME),
|
|
||||||
latitude,
|
|
||||||
longitude,
|
|
||||||
INITIAL_ACCURACY,
|
|
||||||
Altitude.WGS84.of(altitude),
|
|
||||||
INITIAL_ACCURACY,
|
|
||||||
INITIAL_BEARING,
|
|
||||||
INITIAL_SPEED
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -6,22 +6,24 @@ import android.util.Pair;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.time.Duration;
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
import java.time.ZoneOffset;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
||||||
|
import de.dennisguse.opentracks.data.MarkerIterator;
|
||||||
import de.dennisguse.opentracks.data.TrackPointIterator;
|
import de.dennisguse.opentracks.data.TrackPointIterator;
|
||||||
|
import de.dennisguse.opentracks.data.models.ActivityType;
|
||||||
import de.dennisguse.opentracks.data.models.Altitude;
|
import de.dennisguse.opentracks.data.models.Altitude;
|
||||||
import de.dennisguse.opentracks.data.models.Distance;
|
import de.dennisguse.opentracks.data.models.Distance;
|
||||||
import de.dennisguse.opentracks.data.models.Marker;
|
import de.dennisguse.opentracks.data.models.Marker;
|
||||||
import de.dennisguse.opentracks.data.models.Position;
|
import de.dennisguse.opentracks.data.models.Position;
|
||||||
import de.dennisguse.opentracks.data.models.Speed;
|
import de.dennisguse.opentracks.data.models.Speed;
|
||||||
|
import de.dennisguse.opentracks.data.models.Statistics;
|
||||||
import de.dennisguse.opentracks.data.models.Track;
|
import de.dennisguse.opentracks.data.models.Track;
|
||||||
import de.dennisguse.opentracks.data.models.TrackPoint;
|
import de.dennisguse.opentracks.data.models.TrackPoint;
|
||||||
import de.dennisguse.opentracks.stats.TrackStatistics;
|
|
||||||
import de.dennisguse.opentracks.stats.TrackStatisticsUpdater;
|
|
||||||
import de.dennisguse.opentracks.ui.markers.MarkerUtils;
|
import de.dennisguse.opentracks.ui.markers.MarkerUtils;
|
||||||
import de.dennisguse.opentracks.util.FileUtils;
|
import de.dennisguse.opentracks.util.FileUtils;
|
||||||
|
|
||||||
@@ -37,11 +39,15 @@ public class TestDataUtil {
|
|||||||
* Create a track without any trackPoints.
|
* Create a track without any trackPoints.
|
||||||
*/
|
*/
|
||||||
public static Track createTrack(Track.Id trackId) {
|
public static Track createTrack(Track.Id trackId) {
|
||||||
Track track = new Track();
|
return new Track(
|
||||||
track.setId(trackId);
|
trackId,
|
||||||
track.setName("Test: " + trackId.id());
|
UUID.randomUUID(),
|
||||||
|
"Test: " + trackId.id(),
|
||||||
return track;
|
"",
|
||||||
|
"",
|
||||||
|
ActivityType.UNKNOWN,
|
||||||
|
ZoneOffset.UTC,
|
||||||
|
Statistics.DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -85,14 +91,10 @@ public class TestDataUtil {
|
|||||||
createTrackPoint(i, TrackPoint.Type.SEGMENT_END_MANUAL)
|
createTrackPoint(i, TrackPoint.Type.SEGMENT_END_MANUAL)
|
||||||
);
|
);
|
||||||
|
|
||||||
//TODO Use TrackStatisticsUpdater
|
|
||||||
TrackStatistics stats = new TrackStatistics();
|
|
||||||
stats.setTotalDistance(Distance.of(0));
|
|
||||||
stats.setTotalTime(Duration.ofMillis(0));
|
|
||||||
List<Marker> markers = List.of(
|
List<Marker> markers = List.of(
|
||||||
new Marker(trackId, trackPoints.get(1), "Marker 1", "Marker description 1", "Marker category 3", "", null),
|
new Marker(null, trackId, "Marker 1", "Marker description 1", "Marker typeLocalized 3", trackPoints.get(1).getPosition(), null),
|
||||||
new Marker(trackId, trackPoints.get(4), "Marker 2", "Marker description 2", "Marker category 3", "", null),
|
new Marker(null, trackId, "Marker 2", "Marker description 2", "Marker typeLocalized 3", trackPoints.get(4).getPosition(), null),
|
||||||
new Marker(trackId, trackPoints.get(5), "Marker 3", "Marker description 3", "Marker category 3", "", null)
|
new Marker(null, trackId, "Marker 3", "Marker description 3", "Marker typeLocalized 3", trackPoints.get(5).getPosition(), null)
|
||||||
);
|
);
|
||||||
|
|
||||||
return new TrackData(track, trackPoints, markers);
|
return new TrackData(track, trackPoints, markers);
|
||||||
@@ -126,8 +128,7 @@ public class TestDataUtil {
|
|||||||
trackPoint.setHeartRate(100f + i % 80);
|
trackPoint.setHeartRate(100f + i % 80);
|
||||||
trackPoint.setCadence(300f + i);
|
trackPoint.setCadence(300f + i);
|
||||||
trackPoint.setPower(400f + i);
|
trackPoint.setPower(400f + i);
|
||||||
trackPoint.setAltitudeGain(ALTITUDE_GAIN);
|
trackPoint.setAltitudeGainLoss(ALTITUDE_GAIN, ALTITUDE_LOSS);
|
||||||
trackPoint.setAltitudeLoss(ALTITUDE_LOSS);
|
|
||||||
return trackPoint;
|
return trackPoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,45 +146,41 @@ public class TestDataUtil {
|
|||||||
*/
|
*/
|
||||||
public static void insertTrackWithLocations(ContentProviderUtils contentProviderUtils, Track track, List<TrackPoint> trackPoints) {
|
public static void insertTrackWithLocations(ContentProviderUtils contentProviderUtils, Track track, List<TrackPoint> trackPoints) {
|
||||||
contentProviderUtils.insertTrack(track);
|
contentProviderUtils.insertTrack(track);
|
||||||
contentProviderUtils.bulkInsertTrackPoint(trackPoints, track.getId());
|
contentProviderUtils.bulkInsertTrackPoint(trackPoints, track.id());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Marker createMarkerWithPhoto(Context context, Track.Id trackId, TrackPoint trackPoint) throws IOException {
|
public static Marker createMarkerWithPhoto(Context context, Track.Id trackId, TrackPoint trackPoint) throws IOException {
|
||||||
|
return createMarkerWithPhoto(context, trackId, trackPoint, "Marker description");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Marker createMarkerWithPhoto(Context context, Track.Id trackId, TrackPoint trackPoint, String description) throws IOException {
|
||||||
File dstFile = new File(MarkerUtils.getImageUrl(context, trackId));
|
File dstFile = new File(MarkerUtils.getImageUrl(context, trackId));
|
||||||
dstFile.createNewFile();
|
dstFile.createNewFile();
|
||||||
Uri photoUri = FileUtils.getUriForFile(context, dstFile);
|
Uri photoUri = FileUtils.getUriForFile(context, dstFile);
|
||||||
|
|
||||||
//TODO Use TrackStatisticsUpdater
|
return new Marker(
|
||||||
TrackStatistics stats = new TrackStatistics();
|
null,
|
||||||
stats.setTotalDistance(Distance.of(0));
|
trackId,
|
||||||
stats.setTotalTime(Duration.ofMillis(0));
|
"Marker name",
|
||||||
|
description,
|
||||||
return new Marker(trackId, trackPoint, "Marker name", "Marker description", "Marker category", "", photoUri);
|
"Marker typeLocalized",
|
||||||
|
trackPoint.getPosition(),
|
||||||
|
photoUri);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<TrackPoint> getTrackPoints(ContentProviderUtils contentProviderUtils, Track.Id trackId) {
|
public static List<TrackPoint> getTrackPoints(ContentProviderUtils contentProviderUtils, Track.Id trackId) {
|
||||||
try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, null)) {
|
try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointIterator(trackId, null)) {
|
||||||
ArrayList<TrackPoint> trackPoints = new ArrayList<>();
|
ArrayList<TrackPoint> trackPoints = new ArrayList<>();
|
||||||
while (trackPointIterator.hasNext()) {
|
trackPointIterator.forEachRemaining(trackPoints::add);
|
||||||
trackPoints.add(trackPointIterator.next());
|
|
||||||
}
|
|
||||||
return trackPoints;
|
return trackPoints;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Pair<Track.Id, TrackStatistics> buildTrackWithTrackPoints(ContentProviderUtils contentProviderUtils, int numberOfPoints) {
|
public static List<Marker> getMarkers(ContentProviderUtils contentProviderUtils, Track.Id trackId) {
|
||||||
Track dummyTrack = new Track();
|
try (MarkerIterator trackPointIterator = contentProviderUtils.getMarkerIterator(trackId)) {
|
||||||
dummyTrack.setId(new Track.Id(System.currentTimeMillis()));
|
ArrayList<Marker> markers = new ArrayList<>();
|
||||||
dummyTrack.setName("Dummy Track");
|
trackPointIterator.forEachRemaining(markers::add);
|
||||||
contentProviderUtils.insertTrack(dummyTrack);
|
return markers;
|
||||||
TrackStatisticsUpdater trackStatisticsUpdater = new TrackStatisticsUpdater();
|
|
||||||
for (int i = 0; i < numberOfPoints; i++) {
|
|
||||||
TrackPoint tp = TestDataUtil.createTrackPoint(i);
|
|
||||||
contentProviderUtils.insertTrackPoint(tp, dummyTrack.getId());
|
|
||||||
trackStatisticsUpdater.addTrackPoint(tp);
|
|
||||||
}
|
}
|
||||||
dummyTrack.setTrackStatistics(trackStatisticsUpdater.getTrackStatistics());
|
|
||||||
contentProviderUtils.updateTrack(dummyTrack);
|
|
||||||
return new Pair<>(dummyTrack.getId(), trackStatisticsUpdater.getTrackStatistics());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,8 +41,7 @@ public class TestSensorDataUtil {
|
|||||||
if (power != null) {
|
if (power != null) {
|
||||||
tp.setPower(power);
|
tp.setPower(power);
|
||||||
}
|
}
|
||||||
tp.setAltitudeGain(3f);
|
tp.setAltitudeGainLoss(3, 3);
|
||||||
tp.setAltitudeLoss(3f);
|
|
||||||
trackPointList.add(tp);
|
trackPointList.add(tp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,73 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2012 Google Inc.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
|
||||||
* use this file except in compliance with the License. You may obtain a copy of
|
|
||||||
* the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.dennisguse.opentracks.data;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
|
|
||||||
import android.content.ContentUris;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.net.Uri;
|
|
||||||
|
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
|
||||||
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import de.dennisguse.opentracks.data.tables.MarkerColumns;
|
|
||||||
import de.dennisguse.opentracks.data.tables.TrackPointsColumns;
|
|
||||||
import de.dennisguse.opentracks.data.tables.TracksColumns;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests {@link CustomContentProvider}.
|
|
||||||
*
|
|
||||||
* @author Youtao Liu
|
|
||||||
*/
|
|
||||||
public class CustomContentProviderTest {
|
|
||||||
|
|
||||||
private CustomContentProvider customContentProvider;
|
|
||||||
private final Context context = ApplicationProvider.getApplicationContext();
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void setUp() {
|
|
||||||
customContentProvider = new CustomContentProvider() {
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests {@link CustomContentProvider#onCreate(android.content.Context)}.
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testOnCreate() {
|
|
||||||
assertTrue(customContentProvider.onCreate(context));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests {@link CustomContentProvider#getType(Uri)}.
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testGetType() {
|
|
||||||
assertEquals(TracksColumns.CONTENT_TYPE, customContentProvider.getType(TracksColumns.CONTENT_URI));
|
|
||||||
assertEquals(TracksColumns.CONTENT_ITEMTYPE, customContentProvider.getType(ContentUris.appendId(TracksColumns.CONTENT_URI.buildUpon(), 1).build()));
|
|
||||||
|
|
||||||
assertEquals(TrackPointsColumns.CONTENT_TYPE, customContentProvider.getType(TrackPointsColumns.CONTENT_URI_BY_ID));
|
|
||||||
assertEquals(TrackPointsColumns.CONTENT_ITEMTYPE, customContentProvider.getType(ContentUris.appendId(TrackPointsColumns.CONTENT_URI_BY_TRACKID.buildUpon(), 1).build()));
|
|
||||||
|
|
||||||
assertEquals(MarkerColumns.CONTENT_TYPE, customContentProvider.getType(MarkerColumns.CONTENT_URI));
|
|
||||||
assertEquals(MarkerColumns.CONTENT_ITEMTYPE, customContentProvider.getType(ContentUris.appendId(MarkerColumns.CONTENT_URI.buildUpon(), 1).build()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+201
-199
@@ -27,7 +27,6 @@ import android.content.ContentUris;
|
|||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.location.Location;
|
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
|
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
@@ -42,28 +41,32 @@ import java.io.File;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
import java.time.ZoneOffset;
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.time.temporal.ChronoUnit;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import de.dennisguse.opentracks.content.data.TestDataUtil;
|
import de.dennisguse.opentracks.content.data.TestDataUtil;
|
||||||
import de.dennisguse.opentracks.content.data.TestSensorDataUtil;
|
import de.dennisguse.opentracks.content.data.TestSensorDataUtil;
|
||||||
|
import de.dennisguse.opentracks.data.models.ActivityType;
|
||||||
import de.dennisguse.opentracks.data.models.Altitude;
|
import de.dennisguse.opentracks.data.models.Altitude;
|
||||||
|
import de.dennisguse.opentracks.data.models.AltitudeExtremities;
|
||||||
|
import de.dennisguse.opentracks.data.models.AltitudeGainLoss;
|
||||||
import de.dennisguse.opentracks.data.models.Distance;
|
import de.dennisguse.opentracks.data.models.Distance;
|
||||||
import de.dennisguse.opentracks.data.models.HeartRate;
|
|
||||||
import de.dennisguse.opentracks.data.models.Marker;
|
import de.dennisguse.opentracks.data.models.Marker;
|
||||||
|
import de.dennisguse.opentracks.data.models.MarkerBuilder;
|
||||||
import de.dennisguse.opentracks.data.models.Position;
|
import de.dennisguse.opentracks.data.models.Position;
|
||||||
import de.dennisguse.opentracks.data.models.Speed;
|
import de.dennisguse.opentracks.data.models.Speed;
|
||||||
|
import de.dennisguse.opentracks.data.models.Statistics;
|
||||||
import de.dennisguse.opentracks.data.models.Track;
|
import de.dennisguse.opentracks.data.models.Track;
|
||||||
|
import de.dennisguse.opentracks.data.models.TrackBuilder;
|
||||||
import de.dennisguse.opentracks.data.models.TrackPoint;
|
import de.dennisguse.opentracks.data.models.TrackPoint;
|
||||||
import de.dennisguse.opentracks.data.tables.MarkerColumns;
|
import de.dennisguse.opentracks.data.tables.MarkerColumns;
|
||||||
import de.dennisguse.opentracks.data.tables.TrackPointsColumns;
|
import de.dennisguse.opentracks.data.tables.TrackPointsColumns;
|
||||||
import de.dennisguse.opentracks.data.tables.TracksColumns;
|
import de.dennisguse.opentracks.data.tables.TracksColumns;
|
||||||
import de.dennisguse.opentracks.stats.SensorStatistics;
|
import de.dennisguse.opentracks.data.statistics.SensorStatistics;
|
||||||
import de.dennisguse.opentracks.stats.TrackStatistics;
|
|
||||||
import de.dennisguse.opentracks.util.FileUtils;
|
import de.dennisguse.opentracks.util.FileUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -115,7 +118,7 @@ public class CustomContentProviderUtilsTest {
|
|||||||
private void testIterator(Track.Id trackId, int numPoints) {
|
private void testIterator(Track.Id trackId, int numPoints) {
|
||||||
TrackPoint.Id lastPointId = initializeTrack(trackId, numPoints);
|
TrackPoint.Id lastPointId = initializeTrack(trackId, numPoints);
|
||||||
List<TrackPoint> locations = new ArrayList<>(numPoints);
|
List<TrackPoint> locations = new ArrayList<>(numPoints);
|
||||||
try (TrackPointIterator it = contentProviderUtils.getTrackPointLocationIterator(trackId, null)) {
|
try (TrackPointIterator it = contentProviderUtils.getTrackPointIterator(trackId, null)) {
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
TrackPoint trackPoint = it.next();
|
TrackPoint trackPoint = it.next();
|
||||||
assertNotNull(trackPoint);
|
assertNotNull(trackPoint);
|
||||||
@@ -128,11 +131,19 @@ public class CustomContentProviderUtilsTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private TrackPoint.Id initializeTrack(Track.Id id, int numPoints) {
|
private TrackPoint.Id initializeTrack(Track.Id id, int numPoints) {
|
||||||
Track track = new Track();
|
Track createdTrack = new Track(
|
||||||
track.setId(id);
|
id,
|
||||||
track.setName("Test: " + id.id());
|
UUID.randomUUID(),
|
||||||
contentProviderUtils.insertTrack(track);
|
"Test: " + id,
|
||||||
track = contentProviderUtils.getTrack(id);
|
"",
|
||||||
|
"",
|
||||||
|
ActivityType.UNKNOWN,
|
||||||
|
ZoneOffset.UTC,
|
||||||
|
Statistics.DEFAULT);
|
||||||
|
|
||||||
|
contentProviderUtils.insertTrack(createdTrack);
|
||||||
|
|
||||||
|
Track track = contentProviderUtils.getTrack(id);
|
||||||
assertNotNull(track);
|
assertNotNull(track);
|
||||||
|
|
||||||
List<TrackPoint> trackPoints = new ArrayList<>(numPoints);
|
List<TrackPoint> trackPoints = new ArrayList<>(numPoints);
|
||||||
@@ -153,7 +164,7 @@ public class CustomContentProviderUtilsTest {
|
|||||||
// Load all inserted trackPoints.
|
// Load all inserted trackPoints.
|
||||||
TrackPoint.Id lastPointId = null;
|
TrackPoint.Id lastPointId = null;
|
||||||
int counter = 0;
|
int counter = 0;
|
||||||
try (TrackPointIterator it = contentProviderUtils.getTrackPointLocationIterator(id, null)) {
|
try (TrackPointIterator it = contentProviderUtils.getTrackPointIterator(id, null)) {
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
TrackPoint trackPoint = it.next();
|
TrackPoint trackPoint = it.next();
|
||||||
lastPointId = trackPoint.getId();
|
lastPointId = trackPoint.getId();
|
||||||
@@ -194,8 +205,8 @@ public class CustomContentProviderUtilsTest {
|
|||||||
when(cursorMock.getString(columnIndex)).thenReturn(name);
|
when(cursorMock.getString(columnIndex)).thenReturn(name);
|
||||||
|
|
||||||
Track track = ContentProviderUtils.createTrack(cursorMock);
|
Track track = ContentProviderUtils.createTrack(cursorMock);
|
||||||
assertEquals(trackId, track.getId());
|
assertEquals(trackId, track.id());
|
||||||
assertEquals(name, track.getName());
|
assertEquals(name, track.name());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertCount(int trackCount, int trackPointCount, int markerCount) {
|
private void assertCount(int trackCount, int trackPointCount, int markerCount) {
|
||||||
@@ -220,8 +231,15 @@ public class CustomContentProviderUtilsTest {
|
|||||||
Track.Id trackId = new Track.Id(System.currentTimeMillis());
|
Track.Id trackId = new Track.Id(System.currentTimeMillis());
|
||||||
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
||||||
|
|
||||||
Marker marker = new Marker(trackId, contentProviderUtils.getLastValidTrackPoint(trackId));
|
contentProviderUtils.insertMarker(new Marker(
|
||||||
contentProviderUtils.insertMarker(marker);
|
null,
|
||||||
|
trackId,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
getLastValidTrackPoint(trackId).getPosition(),
|
||||||
|
null
|
||||||
|
));
|
||||||
|
|
||||||
assertCount(1, 10, 1);
|
assertCount(1, 10, 1);
|
||||||
|
|
||||||
@@ -239,14 +257,14 @@ public class CustomContentProviderUtilsTest {
|
|||||||
public void testDeleteAllTracks_withMarkerAndPhoto() throws IOException {
|
public void testDeleteAllTracks_withMarkerAndPhoto() throws IOException {
|
||||||
// Insert track, points and marker with photo at first.
|
// Insert track, points and marker with photo at first.
|
||||||
Track.Id trackId = new Track.Id(System.currentTimeMillis());
|
Track.Id trackId = new Track.Id(System.currentTimeMillis());
|
||||||
Track track = TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
||||||
|
|
||||||
TrackPoint trackPoint = contentProviderUtils.getLastValidTrackPoint(trackId);
|
TrackPoint trackPoint = getLastValidTrackPoint(trackId);
|
||||||
Marker marker = TestDataUtil.createMarkerWithPhoto(context, trackId, trackPoint);
|
Marker marker = TestDataUtil.createMarkerWithPhoto(context, trackId, trackPoint);
|
||||||
contentProviderUtils.insertMarker(marker);
|
contentProviderUtils.insertMarker(marker);
|
||||||
|
|
||||||
assertCount(1, 10, 1);
|
assertCount(1, 10, 1);
|
||||||
assertTrue(marker.hasPhoto());
|
assertNotNull(marker.photoUrl());
|
||||||
File dir = FileUtils.getPhotoDir(context, trackId);
|
File dir = FileUtils.getPhotoDir(context, trackId);
|
||||||
assertTrue(dir.isDirectory());
|
assertTrue(dir.isDirectory());
|
||||||
assertEquals(1, dir.list().length);
|
assertEquals(1, dir.list().length);
|
||||||
@@ -276,8 +294,15 @@ public class CustomContentProviderUtilsTest {
|
|||||||
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId2, 10);
|
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId2, 10);
|
||||||
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId3, 10);
|
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId3, 10);
|
||||||
|
|
||||||
Marker marker = new Marker(trackId1, contentProviderUtils.getLastValidTrackPoint(trackId2));
|
contentProviderUtils.insertMarker(new Marker(
|
||||||
contentProviderUtils.insertMarker(marker);
|
null,
|
||||||
|
trackId1,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
getLastValidTrackPoint(trackId1).getPosition(),
|
||||||
|
null
|
||||||
|
));
|
||||||
|
|
||||||
assertCount(3, 30, 1);
|
assertCount(3, 30, 1);
|
||||||
|
|
||||||
@@ -304,19 +329,19 @@ public class CustomContentProviderUtilsTest {
|
|||||||
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId3, 10);
|
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId3, 10);
|
||||||
|
|
||||||
// Insert a marker in tracks trackId and trackId + 1.
|
// Insert a marker in tracks trackId and trackId + 1.
|
||||||
TrackPoint trackPoint1 = contentProviderUtils.getLastValidTrackPoint(trackId1);
|
TrackPoint trackPoint1 = getLastValidTrackPoint(trackId1);
|
||||||
Marker marker1 = TestDataUtil.createMarkerWithPhoto(context, trackId1, trackPoint1);
|
Marker marker1 = TestDataUtil.createMarkerWithPhoto(context, trackId1, trackPoint1);
|
||||||
contentProviderUtils.insertMarker(marker1);
|
contentProviderUtils.insertMarker(marker1);
|
||||||
File dir1 = FileUtils.getPhotoDir(context, trackId1);
|
File dir1 = FileUtils.getPhotoDir(context, trackId1);
|
||||||
|
|
||||||
TrackPoint trackPoint2 = contentProviderUtils.getLastValidTrackPoint(trackId2);
|
TrackPoint trackPoint2 = getLastValidTrackPoint(trackId2);
|
||||||
Marker marker2 = TestDataUtil.createMarkerWithPhoto(context, trackId2, trackPoint2);
|
Marker marker2 = TestDataUtil.createMarkerWithPhoto(context, trackId2, trackPoint2);
|
||||||
contentProviderUtils.insertMarker(marker2);
|
contentProviderUtils.insertMarker(marker2);
|
||||||
File dir2 = FileUtils.getPhotoDir(context, trackId2);
|
File dir2 = FileUtils.getPhotoDir(context, trackId2);
|
||||||
|
|
||||||
// Check.
|
// Check.
|
||||||
assertCount(3, 30, 2);
|
assertCount(3, 30, 2);
|
||||||
assertTrue(marker1.hasPhoto());
|
assertNotNull(marker1.photoUrl());
|
||||||
assertTrue(dir1.isDirectory());
|
assertTrue(dir1.isDirectory());
|
||||||
assertEquals(1, dir1.list().length);
|
assertEquals(1, dir1.list().length);
|
||||||
assertTrue(dir1.exists());
|
assertTrue(dir1.exists());
|
||||||
@@ -348,7 +373,7 @@ public class CustomContentProviderUtilsTest {
|
|||||||
|
|
||||||
// then
|
// then
|
||||||
assertEquals(initialTrackNumber + 1, allTracks.size());
|
assertEquals(initialTrackNumber + 1, allTracks.size());
|
||||||
assertEquals(trackId, allTracks.get(allTracks.size() - 1).getId());
|
assertEquals(trackId, allTracks.get(allTracks.size() - 1).id());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -375,61 +400,57 @@ public class CustomContentProviderUtilsTest {
|
|||||||
contentProviderUtils.insertTrack(track);
|
contentProviderUtils.insertTrack(track);
|
||||||
|
|
||||||
// when / then
|
// when / then
|
||||||
assertNotNull(contentProviderUtils.getTrack(track.getUuid()));
|
assertNotNull(contentProviderUtils.getTrack(track.uuid()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests the method {@link ContentProviderUtils#updateTrack(Track)}
|
|
||||||
*/
|
|
||||||
@Test
|
@Test
|
||||||
public void testUpdateTrack() {
|
public void testUpdateTrack() {
|
||||||
// given
|
// given
|
||||||
Track.Id trackId = new Track.Id(System.currentTimeMillis());
|
Track.Id trackId = new Track.Id(System.currentTimeMillis());
|
||||||
Track track = TestDataUtil.createTrack(trackId);
|
TrackBuilder track = new TrackBuilder(TestDataUtil.createTrack(trackId));
|
||||||
String nameOld = "name1";
|
String nameOld = "name1";
|
||||||
String nameNew = "name2";
|
String nameNew = "name2";
|
||||||
track.setName(nameOld);
|
track.setName(nameOld);
|
||||||
|
|
||||||
// when / then
|
// when / then
|
||||||
contentProviderUtils.insertTrack(track);
|
contentProviderUtils.insertTrack(track.getTrack());
|
||||||
assertEquals(nameOld, contentProviderUtils.getTrack(trackId).getName());
|
assertEquals(nameOld, contentProviderUtils.getTrack(trackId).name());
|
||||||
track.setName(nameNew);
|
track.setName(nameNew);
|
||||||
contentProviderUtils.updateTrack(track);
|
contentProviderUtils.updateTrack(track.getTrack());
|
||||||
assertEquals(nameNew, contentProviderUtils.getTrack(trackId).getName());
|
assertEquals(nameNew, contentProviderUtils.getTrack(trackId).name());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests the method {@link ContentProviderUtils#createContentValues(Marker)}.
|
|
||||||
*/
|
|
||||||
@Test
|
@Test
|
||||||
public void testCreateContentValues_marker() {
|
public void testCreateContentValues_marker() {
|
||||||
Track.Id trackId = new Track.Id(System.currentTimeMillis());
|
Track.Id trackId = new Track.Id(System.currentTimeMillis());
|
||||||
Pair<Track, List<TrackPoint>> track = TestDataUtil.createTrack(trackId, 10);
|
Pair<Track, List<TrackPoint>> track = TestDataUtil.createTrack(trackId, 10);
|
||||||
|
|
||||||
|
TrackBuilder trackBuilder = new TrackBuilder(track.first);
|
||||||
|
|
||||||
// AverageSpeed
|
// AverageSpeed
|
||||||
TrackStatistics statistics = new TrackStatistics();
|
trackBuilder.setStatistics(new Statistics(
|
||||||
statistics.setStartTime(Instant.ofEpochMilli(1000));
|
Instant.ofEpochMilli(1000),
|
||||||
statistics.setStopTime(Instant.ofEpochMilli(2500));
|
Instant.ofEpochMilli(2500),
|
||||||
statistics.setTotalTime(Duration.ofMillis(1500));
|
Duration.ofMillis(1500),
|
||||||
statistics.setMovingTime(Duration.ofMillis(700));
|
Duration.ofMillis(700),
|
||||||
statistics.setTotalDistance(Distance.of(750.0));
|
Distance.of(750),
|
||||||
statistics.setTotalAltitudeGain(50.0f);
|
Speed.of(60),
|
||||||
statistics.setMaxSpeed(Speed.of(60.0));
|
new AltitudeExtremities(1250, 1200),
|
||||||
statistics.setMaxAltitude(1250.0);
|
new AltitudeGainLoss(50, 50),
|
||||||
statistics.setMinAltitude(1200.0);
|
null,
|
||||||
|
null
|
||||||
|
));
|
||||||
|
contentProviderUtils.insertTrack(trackBuilder.getTrack());
|
||||||
|
|
||||||
track.first.setTrackStatistics(statistics);
|
MarkerBuilder marker = new MarkerBuilder(trackId, track.second.get(0));
|
||||||
contentProviderUtils.insertTrack(track.first);
|
|
||||||
|
|
||||||
Marker marker = new Marker(trackId, track.second.get(0));
|
|
||||||
marker.setDescription(TEST_DESC);
|
marker.setDescription(TEST_DESC);
|
||||||
contentProviderUtils.insertMarker(marker);
|
contentProviderUtils.insertMarker(marker.getMarker());
|
||||||
|
|
||||||
ContentProviderUtils contentProviderUtils = new ContentProviderUtils(contentResolverMock);
|
ContentProviderUtils contentProviderUtils = new ContentProviderUtils(contentResolverMock);
|
||||||
|
|
||||||
Marker.Id markerId = new Marker.Id(System.currentTimeMillis());
|
Marker.Id markerId = new Marker.Id(System.currentTimeMillis());
|
||||||
marker.setId(markerId);
|
marker.setId(markerId);
|
||||||
ContentValues contentValues = contentProviderUtils.createContentValues(marker);
|
ContentValues contentValues = contentProviderUtils.createContentValues(marker.getMarker(), trackId);
|
||||||
assertEquals(markerId.id(), contentValues.get(MarkerColumns._ID));
|
assertEquals(markerId.id(), contentValues.get(MarkerColumns._ID));
|
||||||
assertEquals((int) (TestDataUtil.INITIAL_LONGITUDE * 1000000), contentValues.get(MarkerColumns.LONGITUDE));
|
assertEquals((int) (TestDataUtil.INITIAL_LONGITUDE * 1000000), contentValues.get(MarkerColumns.LONGITUDE));
|
||||||
assertEquals(TEST_DESC, contentValues.get(MarkerColumns.DESCRIPTION));
|
assertEquals(TEST_DESC, contentValues.get(MarkerColumns.DESCRIPTION));
|
||||||
@@ -446,15 +467,18 @@ public class CustomContentProviderUtilsTest {
|
|||||||
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
||||||
|
|
||||||
// Insert at first.
|
// Insert at first.
|
||||||
Marker marker1 = new Marker(trackId, contentProviderUtils.getLastValidTrackPoint(trackId));
|
Marker.Id marker1Id = contentProviderUtils.insertMarker(new Marker(
|
||||||
marker1.setDescription(TEST_DESC);
|
null,
|
||||||
contentProviderUtils.insertMarker(marker1);
|
trackId,
|
||||||
|
"",
|
||||||
|
TEST_DESC,
|
||||||
|
"",
|
||||||
|
getLastValidTrackPoint(trackId).getPosition(),
|
||||||
|
null
|
||||||
|
));
|
||||||
|
|
||||||
// Check insert was done.
|
// Check insert was done.
|
||||||
assertEquals(contentProviderUtils.getMarkers(trackId).size(), 1);
|
assertEquals(1, TestDataUtil.getMarkers(contentProviderUtils, trackId).size());
|
||||||
|
|
||||||
// Get marker id that needs to delete.
|
|
||||||
Marker.Id marker1Id = contentProviderUtils.insertMarker(marker1);
|
|
||||||
|
|
||||||
// Delete
|
// Delete
|
||||||
contentProviderUtils.deleteMarker(context, marker1Id);
|
contentProviderUtils.deleteMarker(context, marker1Id);
|
||||||
@@ -473,18 +497,18 @@ public class CustomContentProviderUtilsTest {
|
|||||||
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
||||||
|
|
||||||
// Insert at first.
|
// Insert at first.
|
||||||
TrackPoint trackPoint = contentProviderUtils.getLastValidTrackPoint(trackId);
|
TrackPoint trackPoint = getLastValidTrackPoint(trackId);
|
||||||
Marker marker1 = TestDataUtil.createMarkerWithPhoto(context, trackId, trackPoint);
|
Marker marker1 = TestDataUtil.createMarkerWithPhoto(context, trackId, trackPoint);
|
||||||
contentProviderUtils.insertMarker(marker1);
|
contentProviderUtils.insertMarker(marker1);
|
||||||
|
|
||||||
// Check insert was done.
|
// Check insert was done.
|
||||||
assertEquals(contentProviderUtils.getMarkers(trackId).size(), 1);
|
assertEquals(1, TestDataUtil.getMarkers(contentProviderUtils, trackId).size());
|
||||||
|
|
||||||
// Get marker id that needs to delete.
|
// Get marker id that needs to delete.
|
||||||
Marker.Id marker1Id = contentProviderUtils.insertMarker(marker1);
|
Marker.Id marker1Id = contentProviderUtils.insertMarker(marker1);
|
||||||
|
|
||||||
// Check marker has photo and it's in the external storage.
|
// Check marker has photo and it's in the external storage.
|
||||||
assertTrue(marker1.hasPhoto());
|
assertNotNull(marker1.photoUrl());
|
||||||
File dir = FileUtils.getPhotoDir(context, trackId);
|
File dir = FileUtils.getPhotoDir(context, trackId);
|
||||||
assertTrue(dir.isDirectory());
|
assertTrue(dir.isDirectory());
|
||||||
assertEquals(1, dir.list().length);
|
assertEquals(1, dir.list().length);
|
||||||
@@ -523,20 +547,31 @@ public class CustomContentProviderUtilsTest {
|
|||||||
// TestDataUtil.insertTrackWithLocations(contentProviderUtils, track);
|
// TestDataUtil.insertTrackWithLocations(contentProviderUtils, track);
|
||||||
|
|
||||||
// Insert at first.
|
// Insert at first.
|
||||||
Marker marker1 = new Marker(trackId, contentProviderUtils.getLastValidTrackPoint(trackId));
|
Marker.Id marker1Id = contentProviderUtils.insertMarker(new Marker(
|
||||||
marker1.setDescription(MOCK_DESC);
|
null,
|
||||||
Marker.Id marker1Id = contentProviderUtils.insertMarker(marker1);
|
trackId,
|
||||||
|
"",
|
||||||
Marker marker2 = new Marker(trackId, contentProviderUtils.getLastValidTrackPoint(trackId));
|
MOCK_DESC,
|
||||||
marker2.setDescription(MOCK_DESC);
|
"",
|
||||||
Marker.Id marker2Id = contentProviderUtils.insertMarker(marker2);
|
getLastValidTrackPoint(trackId).getPosition(),
|
||||||
|
null
|
||||||
|
));
|
||||||
|
Marker.Id marker2Id = contentProviderUtils.insertMarker(new Marker(
|
||||||
|
null,
|
||||||
|
trackId,
|
||||||
|
"",
|
||||||
|
MOCK_DESC,
|
||||||
|
"",
|
||||||
|
getLastValidTrackPoint(trackId).getPosition(),
|
||||||
|
null
|
||||||
|
));
|
||||||
|
|
||||||
// Delete
|
// Delete
|
||||||
assertNotNull(contentProviderUtils.getMarker(marker1Id));
|
assertNotNull(contentProviderUtils.getMarker(marker1Id));
|
||||||
contentProviderUtils.deleteMarker(context, marker1Id);
|
contentProviderUtils.deleteMarker(context, marker1Id);
|
||||||
assertNull(contentProviderUtils.getMarker(marker1Id));
|
assertNull(contentProviderUtils.getMarker(marker1Id));
|
||||||
|
|
||||||
assertEquals(MOCK_DESC, contentProviderUtils.getMarker(marker2Id).getDescription());
|
assertEquals(MOCK_DESC, contentProviderUtils.getMarker(marker2Id).description());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -547,14 +582,17 @@ public class CustomContentProviderUtilsTest {
|
|||||||
Track.Id trackId = new Track.Id(System.currentTimeMillis());
|
Track.Id trackId = new Track.Id(System.currentTimeMillis());
|
||||||
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
||||||
|
|
||||||
Marker marker1 = new Marker(trackId, contentProviderUtils.getLastValidTrackPoint(trackId));
|
for (int i = 0; i < 4; i++) {
|
||||||
Marker marker2 = new Marker(trackId, contentProviderUtils.getLastValidTrackPoint(trackId));
|
contentProviderUtils.insertMarker(new Marker(
|
||||||
Marker marker3 = new Marker(trackId, contentProviderUtils.getLastValidTrackPoint(trackId));
|
null,
|
||||||
Marker marker4 = new Marker(trackId, contentProviderUtils.getLastValidTrackPoint(trackId));
|
trackId,
|
||||||
contentProviderUtils.insertMarker(marker1);
|
"",
|
||||||
contentProviderUtils.insertMarker(marker2);
|
MOCK_DESC,
|
||||||
contentProviderUtils.insertMarker(marker3);
|
"",
|
||||||
contentProviderUtils.insertMarker(marker4);
|
getLastValidTrackPoint(trackId).getPosition(),
|
||||||
|
null
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
assertEquals(Integer.valueOf(4), contentProviderUtils.getNextMarkerNumber(trackId));
|
assertEquals(Integer.valueOf(4), contentProviderUtils.getNextMarkerNumber(trackId));
|
||||||
}
|
}
|
||||||
@@ -568,11 +606,18 @@ public class CustomContentProviderUtilsTest {
|
|||||||
Track.Id trackId = new Track.Id(System.currentTimeMillis());
|
Track.Id trackId = new Track.Id(System.currentTimeMillis());
|
||||||
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
||||||
|
|
||||||
Marker marker = new Marker(trackId, contentProviderUtils.getLastValidTrackPoint(trackId));
|
Marker.Id markerId = contentProviderUtils.insertMarker(
|
||||||
marker.setDescription(TEST_DESC);
|
new Marker(
|
||||||
Marker.Id markerId = contentProviderUtils.insertMarker(marker);
|
null,
|
||||||
|
trackId,
|
||||||
|
"",
|
||||||
|
TEST_DESC,
|
||||||
|
"",
|
||||||
|
getLastValidTrackPoint(trackId).getPosition(),
|
||||||
|
null
|
||||||
|
));
|
||||||
|
|
||||||
assertEquals(TEST_DESC, contentProviderUtils.getMarker(markerId).getDescription());
|
assertEquals(TEST_DESC, contentProviderUtils.getMarker(markerId).description());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -584,16 +629,29 @@ public class CustomContentProviderUtilsTest {
|
|||||||
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
||||||
|
|
||||||
// Insert at first.
|
// Insert at first.
|
||||||
Marker marker = new Marker(trackId, contentProviderUtils.getLastValidTrackPoint(trackId));
|
Marker.Id markerId = contentProviderUtils.insertMarker(
|
||||||
marker.setDescription(TEST_DESC);
|
new Marker(
|
||||||
Marker.Id markerId = contentProviderUtils.insertMarker(marker);
|
null,
|
||||||
|
trackId,
|
||||||
|
"",
|
||||||
|
TEST_DESC,
|
||||||
|
"",
|
||||||
|
getLastValidTrackPoint(trackId).getPosition(),
|
||||||
|
null
|
||||||
|
));
|
||||||
|
|
||||||
// Update
|
// Update
|
||||||
marker = contentProviderUtils.getMarker(markerId);
|
contentProviderUtils.updateMarker(context, new Marker(
|
||||||
marker.setDescription(TEST_DESC_NEW);
|
markerId,
|
||||||
contentProviderUtils.updateMarker(context, marker);
|
trackId,
|
||||||
|
"",
|
||||||
|
TEST_DESC_NEW,
|
||||||
|
"",
|
||||||
|
getLastValidTrackPoint(trackId).getPosition(),
|
||||||
|
null
|
||||||
|
));
|
||||||
|
|
||||||
assertEquals(TEST_DESC_NEW, contentProviderUtils.getMarker(markerId).getDescription());
|
assertEquals(TEST_DESC_NEW, contentProviderUtils.getMarker(markerId).description());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -607,10 +665,8 @@ public class CustomContentProviderUtilsTest {
|
|||||||
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
||||||
|
|
||||||
// Insert at first.
|
// Insert at first.
|
||||||
TrackPoint trackPoint = contentProviderUtils.getLastValidTrackPoint(trackId);
|
TrackPoint trackPoint = getLastValidTrackPoint(trackId);
|
||||||
Marker marker = TestDataUtil.createMarkerWithPhoto(context, trackId, trackPoint);
|
Marker.Id markerId = contentProviderUtils.insertMarker(TestDataUtil.createMarkerWithPhoto(context, trackId, trackPoint, TEST_DESC));
|
||||||
marker.setDescription(TEST_DESC);
|
|
||||||
Marker.Id markerId = contentProviderUtils.insertMarker(marker);
|
|
||||||
|
|
||||||
File dir = new File(FileUtils.getPhotoDir(context), "" + trackId.id());
|
File dir = new File(FileUtils.getPhotoDir(context), "" + trackId.id());
|
||||||
assertTrue(dir.exists());
|
assertTrue(dir.exists());
|
||||||
@@ -618,14 +674,13 @@ public class CustomContentProviderUtilsTest {
|
|||||||
assertEquals(1, dir.list().length);
|
assertEquals(1, dir.list().length);
|
||||||
|
|
||||||
// Update
|
// Update
|
||||||
marker = contentProviderUtils.getMarker(markerId);
|
MarkerBuilder marker = new MarkerBuilder(contentProviderUtils.getMarker(markerId));
|
||||||
marker.setName(TEST_NAME_NEW);
|
marker.setName(TEST_NAME_NEW);
|
||||||
marker.setDescription(TEST_DESC_NEW);
|
marker.setDescription(TEST_DESC_NEW);
|
||||||
contentProviderUtils.updateMarker(context, marker);
|
contentProviderUtils.updateMarker(context, marker.getMarker());
|
||||||
|
|
||||||
assertEquals(TEST_NAME_NEW, contentProviderUtils.getMarker(markerId).getName());
|
assertEquals(TEST_NAME_NEW, contentProviderUtils.getMarker(markerId).name());
|
||||||
assertEquals(TEST_DESC_NEW, contentProviderUtils.getMarker(markerId).getDescription());
|
assertEquals(TEST_DESC_NEW, contentProviderUtils.getMarker(markerId).description());
|
||||||
assertTrue(marker.hasPhoto());
|
|
||||||
assertTrue(dir.exists());
|
assertTrue(dir.exists());
|
||||||
assertTrue(dir.isDirectory());
|
assertTrue(dir.isDirectory());
|
||||||
assertEquals(1, dir.list().length);
|
assertEquals(1, dir.list().length);
|
||||||
@@ -642,9 +697,8 @@ public class CustomContentProviderUtilsTest {
|
|||||||
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
||||||
|
|
||||||
// Insert at first.
|
// Insert at first.
|
||||||
TrackPoint trackPoint = contentProviderUtils.getLastValidTrackPoint(trackId);
|
TrackPoint trackPoint = getLastValidTrackPoint(trackId);
|
||||||
Marker marker = TestDataUtil.createMarkerWithPhoto(context, trackId, trackPoint);
|
Marker marker = TestDataUtil.createMarkerWithPhoto(context, trackId, trackPoint, TEST_DESC);
|
||||||
marker.setDescription(TEST_DESC);
|
|
||||||
Marker.Id markerId = contentProviderUtils.insertMarker(marker);
|
Marker.Id markerId = contentProviderUtils.insertMarker(marker);
|
||||||
|
|
||||||
File dir = new File(FileUtils.getPhotoDir(context), "" + trackId.id());
|
File dir = new File(FileUtils.getPhotoDir(context), "" + trackId.id());
|
||||||
@@ -653,15 +707,14 @@ public class CustomContentProviderUtilsTest {
|
|||||||
assertEquals(1, dir.list().length);
|
assertEquals(1, dir.list().length);
|
||||||
|
|
||||||
// Update
|
// Update
|
||||||
marker = contentProviderUtils.getMarker(markerId);
|
MarkerBuilder markerBuilder = new MarkerBuilder(contentProviderUtils.getMarker(markerId));
|
||||||
marker.setName(TEST_NAME_NEW);
|
markerBuilder.setName(TEST_NAME_NEW);
|
||||||
marker.setDescription(TEST_DESC_NEW);
|
markerBuilder.setDescription(TEST_DESC_NEW);
|
||||||
marker.setPhotoUrl(null);
|
markerBuilder.setPhotoUrl(null);
|
||||||
contentProviderUtils.updateMarker(context, marker);
|
contentProviderUtils.updateMarker(context, markerBuilder.getMarker());
|
||||||
|
|
||||||
assertEquals(TEST_NAME_NEW, contentProviderUtils.getMarker(markerId).getName());
|
assertEquals(TEST_NAME_NEW, contentProviderUtils.getMarker(markerId).name());
|
||||||
assertEquals(TEST_DESC_NEW, contentProviderUtils.getMarker(markerId).getDescription());
|
assertEquals(TEST_DESC_NEW, contentProviderUtils.getMarker(markerId).description());
|
||||||
assertFalse(marker.hasPhoto());
|
|
||||||
assertFalse(dir.exists());
|
assertFalse(dir.exists());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -676,11 +729,9 @@ public class CustomContentProviderUtilsTest {
|
|||||||
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
||||||
|
|
||||||
// Insert two markers with photos.
|
// Insert two markers with photos.
|
||||||
TrackPoint trackPoint = contentProviderUtils.getLastValidTrackPoint(trackId);
|
TrackPoint trackPoint = getLastValidTrackPoint(trackId);
|
||||||
Marker marker = TestDataUtil.createMarkerWithPhoto(context, trackId, trackPoint);
|
Marker marker = TestDataUtil.createMarkerWithPhoto(context, trackId, trackPoint, TEST_DESC);
|
||||||
marker.setDescription(TEST_DESC);
|
Marker otherMarker = TestDataUtil.createMarkerWithPhoto(context, trackId, trackPoint, TEST_DESC);
|
||||||
Marker otherMarker = TestDataUtil.createMarkerWithPhoto(context, trackId, trackPoint);
|
|
||||||
otherMarker.setDescription(TEST_DESC);
|
|
||||||
Marker.Id markerId = contentProviderUtils.insertMarker(marker);
|
Marker.Id markerId = contentProviderUtils.insertMarker(marker);
|
||||||
contentProviderUtils.insertMarker(otherMarker);
|
contentProviderUtils.insertMarker(otherMarker);
|
||||||
|
|
||||||
@@ -690,12 +741,14 @@ public class CustomContentProviderUtilsTest {
|
|||||||
assertEquals(2, dir.list().length);
|
assertEquals(2, dir.list().length);
|
||||||
|
|
||||||
// Update one marker deleting photo.
|
// Update one marker deleting photo.
|
||||||
marker = contentProviderUtils.getMarker(markerId);
|
MarkerBuilder markerBuilder = new MarkerBuilder(contentProviderUtils.getMarker(markerId));
|
||||||
marker.setPhotoUrl(null);
|
markerBuilder.setPhotoUrl(null);
|
||||||
contentProviderUtils.updateMarker(context, marker);
|
contentProviderUtils.updateMarker(context, markerBuilder.getMarker());
|
||||||
|
|
||||||
assertEquals(TEST_DESC, contentProviderUtils.getMarker(markerId).getDescription());
|
// then
|
||||||
assertFalse(marker.hasPhoto());
|
marker = contentProviderUtils.getMarker(markerId);
|
||||||
|
assertEquals(TEST_DESC, contentProviderUtils.getMarker(markerId).description());
|
||||||
|
assertNull(marker.photoUrl());
|
||||||
assertTrue(dir.exists());
|
assertTrue(dir.exists());
|
||||||
assertTrue(dir.isDirectory());
|
assertTrue(dir.isDirectory());
|
||||||
assertEquals(1, dir.list().length);
|
assertEquals(1, dir.list().length);
|
||||||
@@ -726,50 +779,6 @@ public class CustomContentProviderUtilsTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests the method {@link ContentProviderUtils#createTrackPoint(Cursor)}.
|
|
||||||
*/
|
|
||||||
//TODO incomplete
|
|
||||||
@Test
|
|
||||||
public void testCreateTrackPoint() {
|
|
||||||
// given
|
|
||||||
when(cursorMock.getColumnIndex(TrackPointsColumns._ID)).thenReturn(1);
|
|
||||||
|
|
||||||
when(cursorMock.getColumnIndexOrThrow(TrackPointsColumns.LONGITUDE)).thenReturn(2);
|
|
||||||
when(cursorMock.isNull(2)).thenReturn(false);
|
|
||||||
int longitude = 11;
|
|
||||||
when(cursorMock.getInt(2)).thenReturn(longitude * 1000000);
|
|
||||||
|
|
||||||
when(cursorMock.getColumnIndexOrThrow(TrackPointsColumns.LATITUDE)).thenReturn(3);
|
|
||||||
when(cursorMock.isNull(3)).thenReturn(false);
|
|
||||||
int latitude = 22;
|
|
||||||
when(cursorMock.getInt(3)).thenReturn(latitude * 1000000);
|
|
||||||
|
|
||||||
when(cursorMock.getColumnIndexOrThrow(TrackPointsColumns.TIME)).thenReturn(4);
|
|
||||||
when(cursorMock.isNull(4)).thenReturn(false);
|
|
||||||
long time = System.currentTimeMillis();
|
|
||||||
when(cursorMock.getLong(4)).thenReturn(time);
|
|
||||||
|
|
||||||
when(cursorMock.getColumnIndexOrThrow(TrackPointsColumns.SPEED)).thenReturn(5);
|
|
||||||
when(cursorMock.isNull(5)).thenReturn(false);
|
|
||||||
float speed = 2.2f;
|
|
||||||
when(cursorMock.getFloat(5)).thenReturn(speed);
|
|
||||||
|
|
||||||
when(cursorMock.getColumnIndexOrThrow(TrackPointsColumns.SENSOR_HEARTRATE)).thenReturn(6);
|
|
||||||
when(cursorMock.isNull(6)).thenReturn(false);
|
|
||||||
when(cursorMock.getFloat(6)).thenReturn(75f);
|
|
||||||
|
|
||||||
// when
|
|
||||||
TrackPoint trackPoint = contentProviderUtils.createTrackPoint(cursorMock);
|
|
||||||
|
|
||||||
// then
|
|
||||||
assertEquals(latitude, trackPoint.getPosition().latitude(), 0.01);
|
|
||||||
assertEquals(longitude, trackPoint.getPosition().longitude(), 0.01);
|
|
||||||
assertEquals(time, trackPoint.getTime().toEpochMilli());
|
|
||||||
assertEquals(speed, trackPoint.getSpeed().toMPS(), 0.01);
|
|
||||||
assertEquals(HeartRate.of(75f), trackPoint.getHeartRate());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests the method
|
* Tests the method
|
||||||
* {@link ContentProviderUtils#insertTrackPoint(TrackPoint, Track.Id)}.
|
* {@link ContentProviderUtils#insertTrackPoint(TrackPoint, Track.Id)}.
|
||||||
@@ -778,7 +787,7 @@ public class CustomContentProviderUtilsTest {
|
|||||||
public void testInsertTrackPoint() {
|
public void testInsertTrackPoint() {
|
||||||
// Insert track, point at first.
|
// Insert track, point at first.
|
||||||
Track.Id trackId = new Track.Id(System.currentTimeMillis());
|
Track.Id trackId = new Track.Id(System.currentTimeMillis());
|
||||||
Track track = TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
||||||
|
|
||||||
contentProviderUtils.insertTrackPoint(TestDataUtil.createTrackPoint(22), trackId);
|
contentProviderUtils.insertTrackPoint(TestDataUtil.createTrackPoint(22), trackId);
|
||||||
// when
|
// when
|
||||||
@@ -792,7 +801,7 @@ public class CustomContentProviderUtilsTest {
|
|||||||
public void testInsertAndLoadTrackPoint() {
|
public void testInsertAndLoadTrackPoint() {
|
||||||
// given
|
// given
|
||||||
Track.Id trackId = new Track.Id(System.currentTimeMillis());
|
Track.Id trackId = new Track.Id(System.currentTimeMillis());
|
||||||
Track track = TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
||||||
|
|
||||||
TrackPoint trackPoint = TestDataUtil.createTrackPoint(5);
|
TrackPoint trackPoint = TestDataUtil.createTrackPoint(5);
|
||||||
trackPoint.setHeartRate(1F);
|
trackPoint.setHeartRate(1F);
|
||||||
@@ -810,19 +819,6 @@ public class CustomContentProviderUtilsTest {
|
|||||||
assertEquals(trackPoint.getPower(), trackPoints.get(10).getPower());
|
assertEquals(trackPoint.getPower(), trackPoints.get(10).getPower());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests the method {@link ContentProviderUtils#getLastValidTrackPoint(Track.Id)}.
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testGetLastValidTrackPoint() {
|
|
||||||
// Insert track, points at first.
|
|
||||||
Track.Id trackId = new Track.Id(System.currentTimeMillis());
|
|
||||||
Track track = TestDataUtil.createTrackAndInsert(contentProviderUtils, trackId, 10);
|
|
||||||
|
|
||||||
TrackPoint lastTrackPoint = contentProviderUtils.getLastValidTrackPoint(trackId);
|
|
||||||
checkLocation(9, lastTrackPoint.getLocation());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetTrackPointCursor_asc() {
|
public void testGetTrackPointCursor_asc() {
|
||||||
// given
|
// given
|
||||||
@@ -831,8 +827,8 @@ public class CustomContentProviderUtilsTest {
|
|||||||
contentProviderUtils.insertTrack(track.first);
|
contentProviderUtils.insertTrack(track.first);
|
||||||
|
|
||||||
List<TrackPoint.Id> trackpointIds = track.second.stream()
|
List<TrackPoint.Id> trackpointIds = track.second.stream()
|
||||||
.map(it -> ContentUris.parseId(contentProviderUtils.insertTrackPoint(it, track.first.getId())))
|
.map(it -> ContentUris.parseId(contentProviderUtils.insertTrackPoint(it, track.first.id())))
|
||||||
.map(TrackPoint.Id::new).collect(Collectors.toList());
|
.map(TrackPoint.Id::new).toList();
|
||||||
|
|
||||||
// when
|
// when
|
||||||
try (Cursor cursor = contentProviderUtils.getTrackPointCursor(trackId, trackpointIds.get(8))) {
|
try (Cursor cursor = contentProviderUtils.getTrackPointCursor(trackId, trackpointIds.get(8))) {
|
||||||
@@ -842,20 +838,20 @@ public class CustomContentProviderUtilsTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetTrackPointLocationIterator_asc() {
|
public void testGetTrackPointIterator_asc() {
|
||||||
// given
|
// given
|
||||||
Track.Id trackId = new Track.Id(System.currentTimeMillis());
|
Track.Id trackId = new Track.Id(System.currentTimeMillis());
|
||||||
Pair<Track, List<TrackPoint>> track = TestDataUtil.createTrack(trackId, 10);
|
Pair<Track, List<TrackPoint>> track = TestDataUtil.createTrack(trackId, 10);
|
||||||
contentProviderUtils.insertTrack(track.first);
|
contentProviderUtils.insertTrack(track.first);
|
||||||
|
|
||||||
List<TrackPoint.Id> trackpointIds = track.second.stream()
|
List<TrackPoint.Id> trackpointIds = track.second.stream()
|
||||||
.map(it -> ContentUris.parseId(contentProviderUtils.insertTrackPoint(it, track.first.getId())))
|
.map(it -> ContentUris.parseId(contentProviderUtils.insertTrackPoint(it, track.first.id())))
|
||||||
.map(TrackPoint.Id::new).collect(Collectors.toList());
|
.map(TrackPoint.Id::new).toList();
|
||||||
|
|
||||||
TrackPoint.Id startTrackPointId = trackpointIds.get(0);
|
TrackPoint.Id startTrackPointId = trackpointIds.get(0);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, trackpointIds.get(0));
|
TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointIterator(trackId, trackpointIds.get(0));
|
||||||
|
|
||||||
// then
|
// then
|
||||||
for (int i = 0; i < trackpointIds.size(); i++) {
|
for (int i = 0; i < trackpointIds.size(); i++) {
|
||||||
@@ -863,24 +859,15 @@ public class CustomContentProviderUtilsTest {
|
|||||||
TrackPoint trackPoint = trackPointIterator.next();
|
TrackPoint trackPoint = trackPointIterator.next();
|
||||||
assertEquals(startTrackPointId.id() + i, trackPoint.getId().id());
|
assertEquals(startTrackPointId.id() + i, trackPoint.getId().id());
|
||||||
|
|
||||||
checkLocation(i, trackPoint.getLocation());
|
Position position = trackPoint.getPosition();
|
||||||
|
assertEquals(TestDataUtil.INITIAL_LATITUDE + i / 10000.0, position.latitude(), 0.01);
|
||||||
|
assertEquals(TestDataUtil.INITIAL_LONGITUDE - i / 10000.0, position.longitude(), 0.01);
|
||||||
|
assertEquals(i / 100.0, position.horizontalAccuracy().distance_m(), 0.01);
|
||||||
|
assertEquals(i * TestDataUtil.ALTITUDE_INTERVAL, position.altitude().toM(), 0.01);
|
||||||
}
|
}
|
||||||
assertFalse(trackPointIterator.hasNext());
|
assertFalse(trackPointIterator.hasNext());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks the value of a location.
|
|
||||||
*
|
|
||||||
* @param i the index of this location which created in the method {@link TestDataUtil#createTrack(Track.Id, int)}
|
|
||||||
* @param location the location to be checked
|
|
||||||
*/
|
|
||||||
private void checkLocation(int i, Location location) {
|
|
||||||
assertEquals(TestDataUtil.INITIAL_LATITUDE + (double) i / 10000.0, location.getLatitude(), 0.01);
|
|
||||||
assertEquals(TestDataUtil.INITIAL_LONGITUDE - (double) i / 10000.0, location.getLongitude(), 0.01);
|
|
||||||
assertEquals((float) i / 100.0f, location.getAccuracy(), 0.01);
|
|
||||||
assertEquals(i * TestDataUtil.ALTITUDE_INTERVAL, location.getAltitude(), 0.01);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFormatIdListForUri() {
|
public void testFormatIdListForUri() {
|
||||||
assertEquals("", ContentProviderUtils.formatIdListForUri());
|
assertEquals("", ContentProviderUtils.formatIdListForUri());
|
||||||
@@ -1220,4 +1207,19 @@ public class CustomContentProviderUtilsTest {
|
|||||||
public void testGetSensorStats_withSeveralRandomStartSegments() {
|
public void testGetSensorStats_withSeveralRandomStartSegments() {
|
||||||
testGetSensorStats_randomData(5000, true);
|
testGetSensorStats_randomData(5000, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private TrackPoint getLastValidTrackPoint(Track.Id trackId) {
|
||||||
|
try (TrackPointIterator trackPointsCursor = contentProviderUtils.getTrackPointIterator(trackId, null)) {
|
||||||
|
List<TrackPoint> trackpoints = new ArrayList<>();
|
||||||
|
while (trackPointsCursor.hasNext())
|
||||||
|
trackpoints.add(trackPointsCursor.next());
|
||||||
|
trackpoints = trackpoints.reversed();
|
||||||
|
|
||||||
|
return trackpoints.reversed()
|
||||||
|
.stream()
|
||||||
|
.filter(it -> List.of(TrackPoint.Type.TRACKPOINT, TrackPoint.Type.SEGMENT_START_AUTOMATIC).contains(it.getType()))
|
||||||
|
.findFirst().orElseThrow();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+31
-33
@@ -48,10 +48,8 @@ public class CustomSQLiteOpenHelperTest {
|
|||||||
public static Map<String, String> getSQL(SQLiteDatabase db, String type) {
|
public static Map<String, String> getSQL(SQLiteDatabase db, String type) {
|
||||||
HashMap<String, String> sqlMap = new HashMap<>();
|
HashMap<String, String> sqlMap = new HashMap<>();
|
||||||
try (Cursor cursor = db.query("sqlite_master", new String[]{"name", "SQL"}, "type=?", new String[]{type}, null, null, "name")) {
|
try (Cursor cursor = db.query("sqlite_master", new String[]{"name", "SQL"}, "type=?", new String[]{type}, null, null, "name")) {
|
||||||
if (cursor != null) {
|
while (cursor.moveToNext()) {
|
||||||
while (cursor.moveToNext()) {
|
sqlMap.put(cursor.getString(0), cursor.getString(1));
|
||||||
sqlMap.put(cursor.getString(0), cursor.getString(1));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return sqlMap;
|
return sqlMap;
|
||||||
@@ -64,12 +62,10 @@ public class CustomSQLiteOpenHelperTest {
|
|||||||
*/
|
*/
|
||||||
private static boolean hasSqlCreate(SQLiteDatabase db, String sqlCreate) {
|
private static boolean hasSqlCreate(SQLiteDatabase db, String sqlCreate) {
|
||||||
try (Cursor cursor = db.rawQuery("SELECT SQL FROM sqlite_master", null)) {
|
try (Cursor cursor = db.rawQuery("SELECT SQL FROM sqlite_master", null)) {
|
||||||
if (cursor != null) {
|
while (cursor.moveToNext()) {
|
||||||
while (cursor.moveToNext()) {
|
String sql = cursor.getString(0);
|
||||||
String sql = cursor.getString(0);
|
if (sqlCreate.equals(sql)) {
|
||||||
if (sqlCreate.equals(sql)) {
|
return true;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -104,18 +100,18 @@ public class CustomSQLiteOpenHelperTest {
|
|||||||
// Open database with SQL upgrade
|
// Open database with SQL upgrade
|
||||||
Map<String, String> tableByUpgrade;
|
Map<String, String> tableByUpgrade;
|
||||||
Map<String, String> indicesByUpgrade;
|
Map<String, String> indicesByUpgrade;
|
||||||
try (SQLiteDatabase dbUpgraded = new CustomSQLiteOpenHelper(context, DATABASE_NAME).getReadableDatabase()) {
|
try (CustomSQLiteOpenHelper dbUpgraded = new CustomSQLiteOpenHelper(context, DATABASE_NAME)) {
|
||||||
tableByUpgrade = getSQL(dbUpgraded, "table");
|
tableByUpgrade = getSQL(dbUpgraded.getReadableDatabase(), "table");
|
||||||
indicesByUpgrade = getSQL(dbUpgraded, "index");
|
indicesByUpgrade = getSQL(dbUpgraded.getReadableDatabase(), "index");
|
||||||
}
|
}
|
||||||
context.deleteDatabase(DATABASE_NAME);
|
context.deleteDatabase(DATABASE_NAME);
|
||||||
|
|
||||||
// Open database via creation script
|
// Open database via creation script
|
||||||
Map<String, String> tablesByCreate;
|
Map<String, String> tablesByCreate;
|
||||||
Map<String, String> indicesByCreate;
|
Map<String, String> indicesByCreate;
|
||||||
try (SQLiteDatabase dbCreated = new CustomSQLiteOpenHelper(context, DATABASE_NAME).getReadableDatabase()) {
|
try (CustomSQLiteOpenHelper dbCreated = new CustomSQLiteOpenHelper(context, DATABASE_NAME)) {
|
||||||
tablesByCreate = getSQL(dbCreated, "table");
|
tablesByCreate = getSQL(dbCreated.getReadableDatabase(), "table");
|
||||||
indicesByCreate = getSQL(dbCreated, "index");
|
indicesByCreate = getSQL(dbCreated.getReadableDatabase(), "index");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -138,14 +134,16 @@ public class CustomSQLiteOpenHelperTest {
|
|||||||
@Test
|
@Test
|
||||||
public void onDowngrade_ToVersion23() {
|
public void onDowngrade_ToVersion23() {
|
||||||
// Create most recent database schema
|
// Create most recent database schema
|
||||||
new CustomSQLiteOpenHelper(context, DATABASE_NAME).getReadableDatabase().close();
|
try(CustomSQLiteOpenHelper db = new CustomSQLiteOpenHelper(context, DATABASE_NAME)) {
|
||||||
|
db.getReadableDatabase();
|
||||||
|
}
|
||||||
|
|
||||||
// Downgrade schema to version 23 (base version)
|
// Downgrade schema to version 23 (base version)
|
||||||
Map<String, String> tablesByDowngrade;
|
Map<String, String> tablesByDowngrade;
|
||||||
Map<String, String> indicesByDowngrade;
|
Map<String, String> indicesByDowngrade;
|
||||||
try (SQLiteDatabase db = new CustomSQLiteOpenHelper(context, DATABASE_NAME, 23).getReadableDatabase()) {
|
try (CustomSQLiteOpenHelper db = new CustomSQLiteOpenHelper(context, DATABASE_NAME, 23)) {
|
||||||
tablesByDowngrade = getSQL(db, "table");
|
tablesByDowngrade = getSQL(db.getReadableDatabase(), "table");
|
||||||
indicesByDowngrade = getSQL(db, "index");
|
indicesByDowngrade = getSQL(db.getReadableDatabase(), "index");
|
||||||
}
|
}
|
||||||
|
|
||||||
// then - verify table structure
|
// then - verify table structure
|
||||||
@@ -159,9 +157,9 @@ public class CustomSQLiteOpenHelperTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void track_uuid_unique() {
|
public void track_uuid_unique() {
|
||||||
try (SQLiteDatabase db = new CustomSQLiteOpenHelper(context, DATABASE_NAME).getWritableDatabase()) {
|
try (CustomSQLiteOpenHelper db = new CustomSQLiteOpenHelper(context, DATABASE_NAME)) {
|
||||||
db.execSQL("INSERT INTO tracks (uuid) VALUES (0x00)");
|
db.getWritableDatabase().execSQL("INSERT INTO tracks (uuid) VALUES (0x00)");
|
||||||
db.execSQL("INSERT INTO tracks (uuid) VALUES (0x00)");
|
db.getWritableDatabase().execSQL("INSERT INTO tracks (uuid) VALUES (0x00)");
|
||||||
fail("unique constraint not enforced");
|
fail("unique constraint not enforced");
|
||||||
} catch (SQLiteConstraintException e) {
|
} catch (SQLiteConstraintException e) {
|
||||||
assertTrue(e.getMessage().contains("UNIQUE constraint failed: tracks.uuid"));
|
assertTrue(e.getMessage().contains("UNIQUE constraint failed: tracks.uuid"));
|
||||||
@@ -172,7 +170,8 @@ public class CustomSQLiteOpenHelperTest {
|
|||||||
public void upgrade_data_to_30() {
|
public void upgrade_data_to_30() {
|
||||||
// given: a track in version 29
|
// given: a track in version 29
|
||||||
createVersion23();
|
createVersion23();
|
||||||
try (SQLiteDatabase db29 = new CustomSQLiteOpenHelper(context, DATABASE_NAME, 29).getWritableDatabase()) {
|
try (CustomSQLiteOpenHelper db = new CustomSQLiteOpenHelper(context, DATABASE_NAME, 29)) {
|
||||||
|
SQLiteDatabase db29 = db.getWritableDatabase();
|
||||||
db29.beginTransaction();
|
db29.beginTransaction();
|
||||||
db29.execSQL("INSERT INTO tracks (_id) VALUES (1)");
|
db29.execSQL("INSERT INTO tracks (_id) VALUES (1)");
|
||||||
|
|
||||||
@@ -205,7 +204,8 @@ public class CustomSQLiteOpenHelperTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// when / then
|
// when / then
|
||||||
try (SQLiteDatabase db30 = new CustomSQLiteOpenHelper(context, DATABASE_NAME, 30).getWritableDatabase()) {
|
try (CustomSQLiteOpenHelper db = new CustomSQLiteOpenHelper(context, DATABASE_NAME, 30)) {
|
||||||
|
SQLiteDatabase db30 = db.getWritableDatabase();
|
||||||
{
|
{
|
||||||
// Track 1
|
// Track 1
|
||||||
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
|
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
|
||||||
@@ -265,7 +265,7 @@ public class CustomSQLiteOpenHelperTest {
|
|||||||
|
|
||||||
private void createVersion23() {
|
private void createVersion23() {
|
||||||
// Manually create database schema with version 23 (base version)
|
// Manually create database schema with version 23 (base version)
|
||||||
SQLiteDatabase dbBase = new SQLiteOpenHelper(context, DATABASE_NAME, null, 23) {
|
try(SQLiteOpenHelper dbBase = new SQLiteOpenHelper(context, DATABASE_NAME, null, 23) {
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(SQLiteDatabase db) {
|
public void onCreate(SQLiteDatabase db) {
|
||||||
}
|
}
|
||||||
@@ -273,12 +273,10 @@ public class CustomSQLiteOpenHelperTest {
|
|||||||
@Override
|
@Override
|
||||||
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
|
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
|
||||||
}
|
}
|
||||||
}.getWritableDatabase();
|
}) {
|
||||||
|
dbBase.getWritableDatabase().execSQL(TRACKS_CREATE_TABLE_V23);
|
||||||
dbBase.execSQL(TRACKS_CREATE_TABLE_V23);
|
dbBase.getWritableDatabase().execSQL(TRACKPOINTS_CREATE_TABLE_V23);
|
||||||
dbBase.execSQL(TRACKPOINTS_CREATE_TABLE_V23);
|
dbBase.getWritableDatabase().execSQL(WAYPOINTS_CREATE_TABLE_V23);
|
||||||
dbBase.execSQL(WAYPOINTS_CREATE_TABLE_V23);
|
}
|
||||||
|
|
||||||
dbBase.close();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9,6 +9,7 @@ import org.junit.runner.RunWith;
|
|||||||
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import de.dennisguse.opentracks.data.models.Track;
|
import de.dennisguse.opentracks.data.models.Track;
|
||||||
|
|
||||||
@@ -20,7 +21,7 @@ public class TrackSelectionTest extends TestCase {
|
|||||||
TrackSelection filter = new TrackSelection();
|
TrackSelection filter = new TrackSelection();
|
||||||
|
|
||||||
// when
|
// when
|
||||||
SelectionData selection = filter.buildSelection();
|
ContentProviderUtils.SelectionData selection = filter.buildSelection();
|
||||||
|
|
||||||
// Then
|
// Then
|
||||||
assertNull(selection.selection());
|
assertNull(selection.selection());
|
||||||
@@ -34,12 +35,11 @@ public class TrackSelectionTest extends TestCase {
|
|||||||
TrackSelection filter = new TrackSelection().addTrackId(trackId);
|
TrackSelection filter = new TrackSelection().addTrackId(trackId);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
SelectionData selection = filter.buildSelection();
|
ContentProviderUtils.SelectionData selection = filter.buildSelection();
|
||||||
|
|
||||||
// Then
|
// Then
|
||||||
assertEquals(selection.selection(), "_id IN (?)");
|
assertEquals("_id IN (?)", selection.selection());
|
||||||
assertEquals(selection.selectionArgs().length, 1);
|
assertEquals(List.of("1"), selection.selectionArgs());
|
||||||
assertEquals(selection.selectionArgs()[0], "1");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -54,28 +54,24 @@ public class TrackSelectionTest extends TestCase {
|
|||||||
.addTrackId(trackId3);
|
.addTrackId(trackId3);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
SelectionData selection = filter.buildSelection();
|
ContentProviderUtils.SelectionData selection = filter.buildSelection();
|
||||||
|
|
||||||
// Then
|
// Then
|
||||||
assertEquals(selection.selection(), "_id IN (?,?,?)");
|
assertEquals("_id IN (?,?,?)", selection.selection());
|
||||||
assertEquals(selection.selectionArgs().length, 3);
|
assertEquals(List.of("1", "2", "3"), selection.selectionArgs());
|
||||||
assertEquals(selection.selectionArgs()[0], "1");
|
|
||||||
assertEquals(selection.selectionArgs()[1], "2");
|
|
||||||
assertEquals(selection.selectionArgs()[2], "3");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFilterBuildSelection_onlyOneCategory() {
|
public void testFilterBuildSelection_onlyOneactivity_type_localized() {
|
||||||
// given
|
// given
|
||||||
TrackSelection filter = new TrackSelection().addActivityType("running");
|
TrackSelection filter = new TrackSelection().addActivityType("running");
|
||||||
|
|
||||||
// when
|
// when
|
||||||
SelectionData selection = filter.buildSelection();
|
ContentProviderUtils.SelectionData selection = filter.buildSelection();
|
||||||
|
|
||||||
// Then
|
// Then
|
||||||
assertEquals(selection.selection(), "category IN (?)");
|
assertEquals("activity_type_localized IN (?)", selection.selection());
|
||||||
assertEquals(selection.selectionArgs().length, 1);
|
assertEquals(List.of("running"), selection.selectionArgs());
|
||||||
assertEquals(selection.selectionArgs()[0], "running");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -88,15 +84,11 @@ public class TrackSelectionTest extends TestCase {
|
|||||||
.addActivityType("trail walking");
|
.addActivityType("trail walking");
|
||||||
|
|
||||||
// when
|
// when
|
||||||
SelectionData selection = filter.buildSelection();
|
ContentProviderUtils.SelectionData selection = filter.buildSelection();
|
||||||
|
|
||||||
// Then
|
// Then
|
||||||
assertEquals(selection.selection(), "category IN (?,?,?,?)");
|
assertEquals("activity_type_localized IN (?,?,?,?)", selection.selection());
|
||||||
assertEquals(selection.selectionArgs().length, 4);
|
assertEquals(List.of("running", "road biking", "mountain biking", "trail walking"), selection.selectionArgs());
|
||||||
assertEquals(selection.selectionArgs()[0], "running");
|
|
||||||
assertEquals(selection.selectionArgs()[1], "road biking");
|
|
||||||
assertEquals(selection.selectionArgs()[2], "mountain biking");
|
|
||||||
assertEquals(selection.selectionArgs()[3], "trail walking");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -109,9 +101,9 @@ public class TrackSelectionTest extends TestCase {
|
|||||||
TrackSelection filterOk = new TrackSelection().addDateRange(instant, instant.plus(Duration.ofDays(1)));
|
TrackSelection filterOk = new TrackSelection().addDateRange(instant, instant.plus(Duration.ofDays(1)));
|
||||||
|
|
||||||
// when
|
// when
|
||||||
SelectionData selectionWrong1 = filterWrong1.buildSelection();
|
ContentProviderUtils.SelectionData selectionWrong1 = filterWrong1.buildSelection();
|
||||||
SelectionData selectionWrong2 = filterWrong2.buildSelection();
|
ContentProviderUtils.SelectionData selectionWrong2 = filterWrong2.buildSelection();
|
||||||
SelectionData selectionOk = filterOk.buildSelection();
|
ContentProviderUtils.SelectionData selectionOk = filterOk.buildSelection();
|
||||||
|
|
||||||
// Then
|
// Then
|
||||||
assertNull(selectionWrong1.selection());
|
assertNull(selectionWrong1.selection());
|
||||||
@@ -120,10 +112,8 @@ public class TrackSelectionTest extends TestCase {
|
|||||||
assertNull(selectionWrong2.selection());
|
assertNull(selectionWrong2.selection());
|
||||||
assertNull(selectionWrong2.selectionArgs());
|
assertNull(selectionWrong2.selectionArgs());
|
||||||
|
|
||||||
assertEquals(selectionOk.selection(), "starttime BETWEEN ? AND ?");
|
assertEquals("time_start BETWEEN ? AND ?", selectionOk.selection());
|
||||||
assertEquals(selectionOk.selectionArgs().length, 2);
|
assertEquals(List.of(Long.toString(instant.toEpochMilli()), Long.toString(instant.toEpochMilli() + oneDay)) , selectionOk.selectionArgs());
|
||||||
assertEquals(selectionOk.selectionArgs()[0], Long.toString(instant.toEpochMilli()));
|
|
||||||
assertEquals(selectionOk.selectionArgs()[1], Long.toString(instant.toEpochMilli() + oneDay));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -140,16 +130,11 @@ public class TrackSelectionTest extends TestCase {
|
|||||||
.addActivityType("road biking");
|
.addActivityType("road biking");
|
||||||
|
|
||||||
// when
|
// when
|
||||||
SelectionData selection = filter.buildSelection();
|
ContentProviderUtils.SelectionData selection = filter.buildSelection();
|
||||||
|
|
||||||
// Then
|
// Then
|
||||||
assertEquals(selection.selection(), "_id IN (?,?,?) AND category IN (?,?)");
|
assertEquals("_id IN (?,?,?) AND activity_type_localized IN (?,?)", selection.selection());
|
||||||
assertEquals(selection.selectionArgs().length, 5);
|
assertEquals(List.of("1", "2", "3", "running", "road biking"), selection.selectionArgs());
|
||||||
assertEquals(selection.selectionArgs()[0], "1");
|
|
||||||
assertEquals(selection.selectionArgs()[1], "2");
|
|
||||||
assertEquals(selection.selectionArgs()[2], "3");
|
|
||||||
assertEquals(selection.selectionArgs()[3], "running");
|
|
||||||
assertEquals(selection.selectionArgs()[4], "road biking");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -169,16 +154,11 @@ public class TrackSelectionTest extends TestCase {
|
|||||||
.addDateRange(instant, instant.plusMillis(oneDay));
|
.addDateRange(instant, instant.plusMillis(oneDay));
|
||||||
|
|
||||||
// when
|
// when
|
||||||
SelectionData selection = filter.buildSelection();
|
ContentProviderUtils.SelectionData selection = filter.buildSelection();
|
||||||
|
|
||||||
// Then
|
// Then
|
||||||
assertEquals(selection.selection(), "_id IN (?,?,?) AND starttime BETWEEN ? AND ?");
|
assertEquals("_id IN (?,?,?) AND time_start BETWEEN ? AND ?", selection.selection());
|
||||||
assertEquals(selection.selectionArgs().length, 5);
|
assertEquals(List.of("1", "2", "3", Long.toString(instant.toEpochMilli()), Long.toString(instant.toEpochMilli() + oneDay)), selection.selectionArgs());
|
||||||
assertEquals(selection.selectionArgs()[0], "1");
|
|
||||||
assertEquals(selection.selectionArgs()[1], "2");
|
|
||||||
assertEquals(selection.selectionArgs()[2], "3");
|
|
||||||
assertEquals(selection.selectionArgs()[3], Long.toString(instant.toEpochMilli()));
|
|
||||||
assertEquals(selection.selectionArgs()[4], Long.toString(instant.toEpochMilli() + oneDay));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -193,14 +173,10 @@ public class TrackSelectionTest extends TestCase {
|
|||||||
.addDateRange(instant, instant.plusMillis(oneDay));
|
.addDateRange(instant, instant.plusMillis(oneDay));
|
||||||
|
|
||||||
// when
|
// when
|
||||||
SelectionData selection = filter.buildSelection();
|
ContentProviderUtils.SelectionData selection = filter.buildSelection();
|
||||||
|
|
||||||
// Then
|
// Then
|
||||||
assertEquals(selection.selection(), "category IN (?,?) AND starttime BETWEEN ? AND ?");
|
assertEquals("activity_type_localized IN (?,?) AND time_start BETWEEN ? AND ?", selection.selection());
|
||||||
assertEquals(selection.selectionArgs().length, 4);
|
assertEquals(List.of("running", "road biking", Long.toString(instant.toEpochMilli()), Long.toString(instant.toEpochMilli() + oneDay)), selection.selectionArgs());
|
||||||
assertEquals(selection.selectionArgs()[0], "running");
|
|
||||||
assertEquals(selection.selectionArgs()[1], "road biking");
|
|
||||||
assertEquals(selection.selectionArgs()[2], Long.toString(instant.toEpochMilli()));
|
|
||||||
assertEquals(selection.selectionArgs()[3], Long.toString(instant.toEpochMilli() + oneDay));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -21,7 +21,7 @@ public class DistanceFormatterTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testFormatDistance_metric() {
|
public void testFormatDistance_metric() {
|
||||||
DistanceFormatter formatter = DistanceFormatter.Builder()
|
DistanceFormatter formatter = DistanceFormatter.Builder()
|
||||||
.setDecimalCount(2)
|
.setDecimalPlaces(2)
|
||||||
.setUnit(UnitSystem.METRIC)
|
.setUnit(UnitSystem.METRIC)
|
||||||
.build(context);
|
.build(context);
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ public class DistanceFormatterTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testFormatDistance_imperial() {
|
public void testFormatDistance_imperial() {
|
||||||
DistanceFormatter formatter = DistanceFormatter.Builder()
|
DistanceFormatter formatter = DistanceFormatter.Builder()
|
||||||
.setDecimalCount(2)
|
.setDecimalPlaces(2)
|
||||||
.setUnit(UnitSystem.IMPERIAL_FEET)
|
.setUnit(UnitSystem.IMPERIAL_FEET)
|
||||||
.build(context);
|
.build(context);
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ public class DistanceFormatterTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testFormatDistance_nautical() {
|
public void testFormatDistance_nautical() {
|
||||||
DistanceFormatter formatter = DistanceFormatter.Builder()
|
DistanceFormatter formatter = DistanceFormatter.Builder()
|
||||||
.setDecimalCount(2)
|
.setDecimalPlaces(2)
|
||||||
.setUnit(UnitSystem.NAUTICAL_IMPERIAL)
|
.setUnit(UnitSystem.NAUTICAL_IMPERIAL)
|
||||||
.build(context);
|
.build(context);
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ public class SpeedFormatterTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testGetSpeedParts_pace_metric() {
|
public void testGetSpeedParts_pace_metric() {
|
||||||
SpeedFormatter formatter = SpeedFormatter.Builder()
|
SpeedFormatter formatter = SpeedFormatter.Builder()
|
||||||
.setDecimalCount(2)
|
|
||||||
.setUnit(UnitSystem.METRIC)
|
.setUnit(UnitSystem.METRIC)
|
||||||
.setReportSpeedOrPace(false)
|
.setReportSpeedOrPace(false)
|
||||||
.build(context);
|
.build(context);
|
||||||
@@ -29,73 +28,67 @@ public class SpeedFormatterTest {
|
|||||||
assertEquals("4:59", formatter.getSpeedParts(Speed.of(3.34)).first);
|
assertEquals("4:59", formatter.getSpeedParts(Speed.of(3.34)).first);
|
||||||
assertEquals("5:00", formatter.getSpeedParts(Speed.of(3.33)).first);
|
assertEquals("5:00", formatter.getSpeedParts(Speed.of(3.33)).first);
|
||||||
|
|
||||||
assertEquals("min/km", formatter.getSpeedParts(Speed.zero()).second);
|
assertEquals("min/km", formatter.getSpeedParts(Speed.ZERO).second);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetSpeedParts_pace_imperial() {
|
public void testGetSpeedParts_pace_imperial() {
|
||||||
SpeedFormatter formatter = SpeedFormatter.Builder()
|
SpeedFormatter formatter = SpeedFormatter.Builder()
|
||||||
.setDecimalCount(2)
|
|
||||||
.setUnit(UnitSystem.IMPERIAL_FEET)
|
.setUnit(UnitSystem.IMPERIAL_FEET)
|
||||||
.setReportSpeedOrPace(false)
|
.setReportSpeedOrPace(false)
|
||||||
.build(context);
|
.build(context);
|
||||||
|
|
||||||
assertEquals("8:02", formatter.getSpeedParts(Speed.of(3.34)).first);
|
assertEquals("8:02", formatter.getSpeedParts(Speed.of(3.34)).first);
|
||||||
assertEquals("min/mi", formatter.getSpeedParts(Speed.zero()).second);
|
assertEquals("min/mi", formatter.getSpeedParts(Speed.ZERO).second);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetSpeedParts_pace_nautical() {
|
public void testGetSpeedParts_pace_nautical() {
|
||||||
SpeedFormatter formatter = SpeedFormatter.Builder()
|
SpeedFormatter formatter = SpeedFormatter.Builder()
|
||||||
.setDecimalCount(2)
|
|
||||||
.setUnit(UnitSystem.NAUTICAL_IMPERIAL)
|
.setUnit(UnitSystem.NAUTICAL_IMPERIAL)
|
||||||
.setReportSpeedOrPace(false)
|
.setReportSpeedOrPace(false)
|
||||||
.build(context);
|
.build(context);
|
||||||
|
|
||||||
assertEquals("9:14", formatter.getSpeedParts(Speed.of(3.34)).first);
|
assertEquals("9:14", formatter.getSpeedParts(Speed.of(3.34)).first);
|
||||||
assertEquals("min/NM", formatter.getSpeedParts(Speed.zero()).second);
|
assertEquals("min/NM", formatter.getSpeedParts(Speed.ZERO).second);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetSpeedParts_speed_metric() {
|
public void testGetSpeedParts_speed_metric() {
|
||||||
SpeedFormatter formatter = SpeedFormatter.Builder()
|
SpeedFormatter formatter = SpeedFormatter.Builder()
|
||||||
.setDecimalCount(2)
|
|
||||||
.setUnit(UnitSystem.METRIC)
|
.setUnit(UnitSystem.METRIC)
|
||||||
.setReportSpeedOrPace(true)
|
.setReportSpeedOrPace(true)
|
||||||
.build(context);
|
.build(context);
|
||||||
|
|
||||||
assertEquals("11.9", formatter.getSpeedParts(Speed.of(3.31)).first);
|
assertEquals("11.9", formatter.getSpeedParts(Speed.of(3.31)).first);
|
||||||
assertEquals("km/h", formatter.getSpeedParts(Speed.zero()).second);
|
assertEquals("km/h", formatter.getSpeedParts(Speed.ZERO).second);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetSpeedParts_speed_imperial() {
|
public void testGetSpeedParts_speed_imperial() {
|
||||||
SpeedFormatter formatter = SpeedFormatter.Builder()
|
SpeedFormatter formatter = SpeedFormatter.Builder()
|
||||||
.setDecimalCount(2)
|
|
||||||
.setUnit(UnitSystem.IMPERIAL_FEET)
|
.setUnit(UnitSystem.IMPERIAL_FEET)
|
||||||
.setReportSpeedOrPace(true)
|
.setReportSpeedOrPace(true)
|
||||||
.build(context);
|
.build(context);
|
||||||
|
|
||||||
assertEquals("7.5", formatter.getSpeedParts(Speed.of(3.34)).first);
|
assertEquals("7.5", formatter.getSpeedParts(Speed.of(3.34)).first);
|
||||||
assertEquals("mph", formatter.getSpeedParts(Speed.zero()).second);
|
assertEquals("mph", formatter.getSpeedParts(Speed.ZERO).second);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetSpeedParts_speed_nautical() {
|
public void testGetSpeedParts_speed_nautical() {
|
||||||
SpeedFormatter formatter = SpeedFormatter.Builder()
|
SpeedFormatter formatter = SpeedFormatter.Builder()
|
||||||
.setDecimalCount(2)
|
|
||||||
.setUnit(UnitSystem.NAUTICAL_IMPERIAL)
|
.setUnit(UnitSystem.NAUTICAL_IMPERIAL)
|
||||||
.setReportSpeedOrPace(true)
|
.setReportSpeedOrPace(true)
|
||||||
.build(context);
|
.build(context);
|
||||||
|
|
||||||
assertEquals("6.5", formatter.getSpeedParts(Speed.of(3.34)).first);
|
assertEquals("6.5", formatter.getSpeedParts(Speed.of(3.34)).first);
|
||||||
assertEquals("kn", formatter.getSpeedParts(Speed.zero()).second);
|
assertEquals("kn", formatter.getSpeedParts(Speed.ZERO).second);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFormatSpeed() {
|
public void testFormatSpeed() {
|
||||||
SpeedFormatter formatter = SpeedFormatter.Builder()
|
SpeedFormatter formatter = SpeedFormatter.Builder()
|
||||||
.setDecimalCount(2)
|
|
||||||
.setUnit(UnitSystem.METRIC)
|
.setUnit(UnitSystem.METRIC)
|
||||||
.setReportSpeedOrPace(false)
|
.setReportSpeedOrPace(false)
|
||||||
.build(context);
|
.build(context);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user