mirror of
https://codeberg.org/comaps/comaps
synced 2026-01-11 06:44:18 +00:00
Compare commits
236 Commits
zyphlar-pa
...
traffic
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9d64525897 | ||
|
|
426a9661ab | ||
|
|
6dbde46dca | ||
|
|
7ed4a6ddd9 | ||
|
|
645ca792f7 | ||
|
|
cd64d14830 | ||
|
|
67b1d918ba | ||
|
|
48a3e5d4b0 | ||
|
|
d4c002851b | ||
|
|
9d4801886e | ||
|
|
5a26b72431 | ||
|
|
859b89e127 | ||
|
|
8fcf00b0ca | ||
|
|
5c2cedb19a | ||
|
|
67a3866529 | ||
|
|
90fdf0ed72 | ||
|
|
2b7ee4ba44 | ||
|
|
cd1201cb02 | ||
|
|
e6937b211a | ||
|
|
27ad70d729 | ||
|
|
a9700156db | ||
|
|
1d87e0e987 | ||
|
|
f7882636cd | ||
|
|
40fbea11e7 | ||
|
|
e87727c168 | ||
|
|
d82b545e30 | ||
|
|
781d973faa | ||
|
|
d6818786f7 | ||
|
|
615f57c604 | ||
|
|
af20e2b42b | ||
|
|
05f6dfad7b | ||
|
|
2b867a64a0 | ||
|
|
c0fd405798 | ||
|
|
207d6c833d | ||
|
|
d47aa09053 | ||
|
|
fbc150fae2 | ||
|
|
d88ed01bc1 | ||
|
|
3ec32e4415 | ||
|
|
9065f45b21 | ||
|
|
46d363ae24 | ||
|
|
0dc62c47dd | ||
|
|
3c9eeb9a75 | ||
|
|
ae23afd72e | ||
|
|
800cc0641b | ||
|
|
1b74062447 | ||
|
|
6a694c5d3e | ||
|
|
dda13b8d3d | ||
|
|
c1340a9941 | ||
|
|
a313526aed | ||
|
|
32d1a3a36e | ||
|
|
3a45740884 | ||
|
|
4e624bd04b | ||
|
|
a3d1ed83c3 | ||
|
|
38dbad0f7e | ||
|
|
7fe5823140 | ||
|
|
091d510ba1 | ||
|
|
f07c8d66d8 | ||
|
|
c9f50cdc72 | ||
|
|
2ed9bc1880 | ||
|
|
d098ecae15 | ||
|
|
9e06ec815e | ||
|
|
bf6cf27f8c | ||
|
|
bf36c875d5 | ||
|
|
30b2df89cd | ||
|
|
ba2d653a30 | ||
|
|
d6eacd7364 | ||
|
|
07c75e627e | ||
|
|
e7bde9aa05 | ||
|
|
5ba708caff | ||
|
|
48e8f32e01 | ||
|
|
38e98df6cc | ||
|
|
0713e22328 | ||
|
|
3ed31a575f | ||
|
|
ac87e3c585 | ||
|
|
ef806cf18a | ||
|
|
d46c0fec76 | ||
|
|
1d42d3b431 | ||
|
|
2663eda820 | ||
|
|
16708aae7f | ||
|
|
6963637b1b | ||
|
|
57f55f1022 | ||
|
|
01476d3dc7 | ||
|
|
90d7cadc3f | ||
|
|
3a6f21dbd1 | ||
|
|
221fe69840 | ||
|
|
167f0b8377 | ||
|
|
df7d507e1b | ||
|
|
fe737602d8 | ||
|
|
daa147a721 | ||
|
|
bd555afe61 | ||
|
|
73a70d943e | ||
|
|
dde50bd0a1 | ||
|
|
0106dc3fe5 | ||
|
|
034856f033 | ||
|
|
f53c794fdd | ||
|
|
dcab6ee5a0 | ||
|
|
edc15ac982 | ||
|
|
871cd73592 | ||
|
|
958be3dee6 | ||
|
|
06f63dcb9a | ||
|
|
bebac8d8a7 | ||
|
|
a25602dbe0 | ||
|
|
98796cd6f8 | ||
|
|
2729d07732 | ||
|
|
61b15d623d | ||
|
|
03d6847be3 | ||
|
|
3b1fca01e3 | ||
|
|
be3792b93a | ||
|
|
7283e4ecb4 | ||
|
|
75c7d146af | ||
|
|
d988ab3326 | ||
|
|
798affe0ef | ||
|
|
93a1f9d1a6 | ||
|
|
3f58c6ee20 | ||
|
|
a20d1453e0 | ||
|
|
e825753487 | ||
|
|
cc58eaa50a | ||
|
|
75197a11a8 | ||
|
|
d03b47bee0 | ||
|
|
daf344b27f | ||
|
|
121bdc4af8 | ||
|
|
6656c7e441 | ||
|
|
f32493faaa | ||
|
|
4f4d376a4a | ||
|
|
4324e329e5 | ||
|
|
9eeac05fdf | ||
|
|
b418cf659c | ||
|
|
964368f5d4 | ||
|
|
23922f1c2b | ||
|
|
f02b1538e7 | ||
|
|
dd65e89f8f | ||
|
|
f132022e60 | ||
|
|
247f88254e | ||
|
|
81a31d6b42 | ||
|
|
89d1365fee | ||
|
|
9fb08bdc56 | ||
|
|
371a58f6f9 | ||
|
|
af8b748c59 | ||
|
|
a43e83d280 | ||
|
|
04b2059ca0 | ||
|
|
ed15925251 | ||
|
|
173b5e1718 | ||
|
|
26aa5e5f54 | ||
|
|
f31541efb2 | ||
|
|
db3ed87b92 | ||
|
|
fbaa5470fd | ||
|
|
0681171d69 | ||
|
|
e3d86be324 | ||
|
|
ef3de2c781 | ||
|
|
d574b536ba | ||
|
|
2d3ca8014b | ||
|
|
df13e279b6 | ||
|
|
b48310e6a5 | ||
|
|
b98fe1999c | ||
|
|
d47713516d | ||
|
|
d72bd9e00e | ||
|
|
8cffe8fa64 | ||
|
|
ae5dea4a53 | ||
|
|
588332a23b | ||
|
|
3eb99e952c | ||
|
|
9f4b6d73ce | ||
|
|
488159e2f9 | ||
|
|
f30316d868 | ||
|
|
daaf52d27d | ||
|
|
ba9980ba36 | ||
|
|
5531b1129b | ||
|
|
394a6673e5 | ||
|
|
62ee9d5b46 | ||
|
|
2592bcf042 | ||
|
|
dd7ed98c1a | ||
|
|
76fce016bb | ||
|
|
7db32a9922 | ||
|
|
fa5608d874 | ||
|
|
185febd8d8 | ||
|
|
7a5ea64ea0 | ||
|
|
a4106505af | ||
|
|
083845a502 | ||
|
|
c6de2a25aa | ||
|
|
4c5fb21c33 | ||
|
|
f566f6f0ef | ||
|
|
9afb28aaa1 | ||
|
|
bd178932c1 | ||
|
|
2894218573 | ||
|
|
63f0799161 | ||
|
|
5b67d668bd | ||
|
|
f7adea08a2 | ||
|
|
c0c8d5da58 | ||
|
|
2ed300ca08 | ||
|
|
52a915211e | ||
|
|
18f1dfac45 | ||
|
|
a7897e2347 | ||
|
|
e3f5dd3ca8 | ||
|
|
de03995e77 | ||
|
|
74d79e5c8e | ||
|
|
e2aff53291 | ||
|
|
a39bdee0d1 | ||
|
|
136293c308 | ||
|
|
356b051036 | ||
|
|
c8d5a07262 | ||
|
|
e94c23d538 | ||
|
|
2ba3030366 | ||
|
|
3455050876 | ||
|
|
cf57942a0b | ||
|
|
3a713c477a | ||
|
|
edb1b7e784 | ||
|
|
53e80b9283 | ||
|
|
7107314e2f | ||
|
|
fafec070c9 | ||
|
|
d7facd5732 | ||
|
|
382e46af63 | ||
|
|
d0a9c564e4 | ||
|
|
a9ceec3995 | ||
|
|
73d61ff655 | ||
|
|
5cdf14386d | ||
|
|
2f6a8564cb | ||
|
|
80a7ed503e | ||
|
|
6e65e60c3d | ||
|
|
f041f910e7 | ||
|
|
dbf253c9d1 | ||
|
|
24d65bd37f | ||
|
|
16cb70a952 | ||
|
|
8827ec3c09 | ||
|
|
7be0b8a256 | ||
|
|
f0f847b214 | ||
|
|
2017907b1f | ||
|
|
bb410fc3bc | ||
|
|
6e8d400611 | ||
|
|
7b420def17 | ||
|
|
737d7b5643 | ||
|
|
9c93f421ac | ||
|
|
1574b5b7cb | ||
|
|
932dda6552 | ||
|
|
6f2f61b30a | ||
|
|
20c9fc5f45 | ||
|
|
be3e3d773b | ||
|
|
0fd7f8d573 |
@@ -1,135 +0,0 @@
|
||||
name: process_subways
|
||||
on:
|
||||
workflow_dispatch: # Manual trigger
|
||||
|
||||
env:
|
||||
PLANET: /home/planet/planet/planet.o5m
|
||||
TMPDIR: /tmp
|
||||
HTML_DIR: "/mnt/4tbexternal/osm-planet/subway/validator"
|
||||
DUMP: "$HTML_DIR"
|
||||
SKIP_PLANET_UPDATE: "1"
|
||||
DEBIAN_FRONTEND: nonnteractive
|
||||
TZ: Etc/UTC
|
||||
|
||||
# /var/www/html/subways is mapped as a volume on cdn-fi-1
|
||||
# as is /tmp/planet
|
||||
jobs:
|
||||
clone-repos:
|
||||
name: Clone Git Repos
|
||||
runs-on: mapfilemaker
|
||||
container:
|
||||
image: codeberg.org/comaps/maps_generator:f6d53d54f794
|
||||
volumes:
|
||||
- /mnt/4tbexternal:/mnt/4tbexternal
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-process-subways-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
steps:
|
||||
- uses: actions/cache@v4
|
||||
with:
|
||||
path: "~"
|
||||
key: cache-${{ github.run_id }}-${{ github.run_attempt }}}
|
||||
- name: Checkout main repo
|
||||
shell: bash
|
||||
run: |
|
||||
echo "Cloning $FORGEJO_SERVER_URL/$FORGEJO_REPOSITORY branch $FORGEJO_REF_NAME"
|
||||
cd ~
|
||||
git clone --depth 1 --recurse-submodules --shallow-submodules -b $FORGEJO_REF_NAME --single-branch $FORGEJO_SERVER_URL/$FORGEJO_REPOSITORY.git comaps
|
||||
- name: Checkout subways repo
|
||||
shell: bash
|
||||
run: |
|
||||
cd ~
|
||||
git clone --depth 1 --single-branch https://codeberg.org/comaps/subways.git
|
||||
|
||||
update-planet-o5m:
|
||||
name: Update O5M Planet
|
||||
runs-on: mapfilemaker
|
||||
container:
|
||||
image: codeberg.org/comaps/maps_generator:f6d53d54f794
|
||||
volumes:
|
||||
- /mnt/4tbexternal/:/mnt/4tbexternal/
|
||||
- /mnt/4tbexternal/osm-planet:/home/planet
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-process-subways-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
steps:
|
||||
- name: Check for O5M Planet File
|
||||
shell: bash
|
||||
run: |
|
||||
if [ ! -f /home/planet/planet/planet.o5m ]; then
|
||||
echo "WARN: No file at /home/planet/planet/planet.o5m"
|
||||
|
||||
if [ ! -f /home/planet/planet/planet-latest.osm.pbf ]; then
|
||||
echo "ERROR: No file at /home/planet/planet/planet-latest.osm.pbf"
|
||||
ls -al /home/planet/
|
||||
ls -al /home/planet/planet/
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Converting planet-latest.osm.pbf to planet.o5m"
|
||||
cd /home/planet/planet/
|
||||
osmconvert -v --drop-author --drop-version --hash-memory=4000 planet-latest.osm.pbf -o=planet.o5m
|
||||
echo "Conversion is done."
|
||||
fi
|
||||
- name: Update O5M planet
|
||||
run: |
|
||||
echo "Starting..."
|
||||
cd /home/planet/planet/
|
||||
rm -f planet-new.o5m
|
||||
osmupdate -v --drop-author --drop-version --hash-memory=4000 --max-merge=32 --out-o5m planet.o5m planet-new.o5m
|
||||
mv planet-new.o5m planet.o5m
|
||||
echo "Done."
|
||||
- name: Notify Zulip
|
||||
run: |
|
||||
curl -X POST https://comaps.zulipchat.com/api/v1/messages \
|
||||
-u $ZULIP_BOT_EMAIL:$ZULIP_API_KEY \
|
||||
--data-urlencode type=stream \
|
||||
--data-urlencode 'to="DevOps"' \
|
||||
--data-urlencode topic=codeberg-bot \
|
||||
--data-urlencode 'content=O5M planet update is done!'
|
||||
|
||||
update-subways:
|
||||
if: inputs.run-subways
|
||||
name: Update Subways
|
||||
runs-on: mapfilemaker
|
||||
needs:
|
||||
- clone-repos
|
||||
container:
|
||||
image: codeberg.org/comaps/maps_generator:f6d53d54f794
|
||||
volumes:
|
||||
- /mnt/4tbexternal/:/mnt/4tbexternal/
|
||||
- /mnt/4tbexternal/osm-planet:/home/planet
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-map-generator-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
steps:
|
||||
- uses: actions/cache@v4
|
||||
with:
|
||||
path: "~"
|
||||
key: cache-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
- name: Update Subways
|
||||
shell: bash
|
||||
run: |
|
||||
cd ~/comaps/
|
||||
cp tools/unix/maps/settings.sh.prod tools/unix/maps/settings.sh
|
||||
./tools/unix/maps/generate_subways.sh
|
||||
- name: Compare with VK validation
|
||||
shell: bash
|
||||
run: |
|
||||
cd ~/subways
|
||||
if [ -f "$HTML_DIR/index.html" ]; then
|
||||
echo "Comparing local validation with VK's validation..."
|
||||
python3 ./scripts/compare_html_validation.py "$HTML_DIR/index.html" \
|
||||
--vk-url "https://maps.vk.com/osm/tools/subways/latest/index.html"
|
||||
else
|
||||
echo "Local index.html not found at $HTML_DIR/index.html"
|
||||
exit 1
|
||||
fi
|
||||
- name: Notify Zulip
|
||||
run: |
|
||||
curl -X POST https://comaps.zulipchat.com/api/v1/messages \
|
||||
-u $ZULIP_BOT_EMAIL:$ZULIP_API_KEY \
|
||||
--data-urlencode type=stream \
|
||||
--data-urlencode 'to="DevOps"' \
|
||||
--data-urlencode topic=codeberg-bot \
|
||||
--data-urlencode 'content=Subways are done!'
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -21,6 +21,7 @@ data/symbols/**/symbols.sdf
|
||||
|
||||
data/bookmarks
|
||||
data/edits.xml
|
||||
data/traffic.xml
|
||||
data/World.mwm
|
||||
data/WorldCoasts.mwm
|
||||
data/world_mwm/*
|
||||
|
||||
17
SECURITY.md
17
SECURITY.md
@@ -1,17 +0,0 @@
|
||||
## Reporting Vulnerabilities
|
||||
You can report a security vulnerability by creating an issue or send mail to security@comaps.app
|
||||
|
||||
## Verifying Fingerprints
|
||||
|
||||
To [verify](https://developer.android.com/studio/command-line/apksigner#usage-verify) the APK, use the following signing certificate fingerprints:
|
||||
```
|
||||
SHA-256: 4894e8e6963627ef660031d8593fe77297f835acb4e23810003e926135023b4c
|
||||
SHA-1: 8b7b5739f917e9f7c681671ced0c9c8562123ade
|
||||
MD5: 9cce0ffea281dc2f0e0a154d6d2e281e
|
||||
```
|
||||
|
||||
To verify CoMaps via [AppVerifier](https://github.com/soupslurpr/AppVerifier), use the following signing certificate fingerprint:
|
||||
```
|
||||
app.comaps
|
||||
48:94:E8:E6:96:36:27:EF:66:00:31:D8:59:3F:E7:72:97:F8:35:AC:B4:E2:38:10:00:3E:92:61:35:02:3B:4C
|
||||
```
|
||||
5
android/app/proguard-rules.pro
vendored
5
android/app/proguard-rules.pro
vendored
@@ -28,3 +28,8 @@
|
||||
# R8 crypts the source line numbers in all log messages.
|
||||
# https://github.com/organicmaps/organicmaps/issues/6559#issuecomment-1812039926
|
||||
-dontoptimize
|
||||
|
||||
# Keep classes for Android TraFF support
|
||||
-keep class app.organicmaps.sdk.traffxml.SourceImplV0_7 { *; }
|
||||
-keep class app.organicmaps.sdk.traffxml.SourceImplV0_8 { *; }
|
||||
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
Bendruomenės vystoma nemokama atvirojo kodo žemėlapių programa, pagrįsta „OpenStreetMap“ duomenimis ir sustiprinta įsipareigojimu užtikrinti skaidrumą, privatumą ir pelno nesiekimą. „CoMaps“ programa yra kilusi iš „Organic Maps“, o pastaroji – iš programos „Maps.ME“.
|
||||
|
||||
Apie šio projekto kilmę, jos priežastis ir palaikomą kryptį galite paskaityti adresu <b><i>codeberg.org/comaps</i></b>.
|
||||
Prisijunkite prie bendruomenės ir padėkite sukurti geriausią žemėlapių programą
|
||||
• Naudokitės programa ir paskleiskite žinią apie ją
|
||||
• Teikite atsiliepimus ir praneškite apie problemas
|
||||
• Atnaujinkite žemėlapių duomenis programoje arba „OpenStreetMap“ svetainėje
|
||||
|
||||
‣ <b>Skirta naudoti neprisijungus prie interneto</b>: planuokite maršrutus ir keliaukite užsienyje be mobiliojo ryšio, ieškokite kelionės taškų tolimuose žygiuose ir pan. Visos programos funkcijos yra pritaikytos veikti be interneto ryšio.
|
||||
‣ <b>Gerbia privatumą</b>: programėlė sukurta, teikiant prioritetą privatumui: neidentifikuoja žmonių, neseka ir nerenka asmeninės informacijos. Be reklamų.
|
||||
‣ <b>Paprasta ir išbaigta</b>: esminės, lengvai naudojamos funkcijos, kurios tiesiog veikia.
|
||||
‣ <b>Taupo bateriją ir vietą</b>: neišsekina baterijos kaip kitos navigacijos programos. Kompaktiški žemėlapiai tausoja vietą jūsų telefone.
|
||||
‣ <b>Nemokama ir kuriama bendruomenės</b>: paprasti žmonės – kaip jūs – padėjo sukurti šią programą, pildydami „OpenStreetMap“ žemėlapį, išbandydami ir pateikdami atsiliepimus apie funkcijas bei prisidėdami savo programavimo įgūdžiais ir pinigais.
|
||||
‣ <b>Atviras ir skaidrus sprendimų priėmimas ir finansai, ne pelno siekianti ir visiškai atviro kodo programa.</b>
|
||||
|
||||
<b>Pagrindinės funkcijos</b>:
|
||||
• Atsisiunčiami išsamūs žemėlapiai su vietomis, kurių nėra „Google Maps“;
|
||||
• Žygių pėsčiomis veiksena su pažymėtais pėsčiųjų takais, stovyklavietėmis, vandens šaltiniais, kalnų viršūnėmis, reljefo linijomis ir kt.;
|
||||
• Pėsčiųjų ir dviračių takai;
|
||||
• Potencialūs kelionės taškai, kaip antai restoranai, degalinės, viešbučiai, parduotuvės, lankytinos vietos ir daugelis kitų;
|
||||
• Paieška pagal pavadinimą, adresą arba lankytinos vietos kategoriją;
|
||||
• Navigacija su balso instrukcijomis pėstiesiems, dviratininkams ir motorinio transporto vairuotojams;
|
||||
• Mėgstamų vietų įsiminimas vienu bakstelėjimu;
|
||||
• „Vikipedijos“ straipsniai, prieinami neprisijungus prie interneto;
|
||||
• Kelionių metro sluoksnis ir maršrutai;
|
||||
• Trasų įrašymas;
|
||||
• Žymių ir trasų eksportavimas ir importavimas KML, KMZ, GPX formatais;
|
||||
• Tamsaus žemėlapio veiksena, skirta naudoti naktį;
|
||||
• Galimybė papildyti žemėlapio duomenis visiems, naudojantis įtaisytuoju baziniu redaktoriumi.
|
||||
|
||||
<b>Laisvė yra čia</b>
|
||||
Atraskite savo kelionę ir keliaukite po pasaulį, kuriame privatumas ir bendruomenė yra svarbiausia!
|
||||
@@ -19,13 +19,13 @@ Pridružite se skupnosti in pomagajte narediti najboljše zemljevidno orodje
|
||||
• Pešpoti in kolesarke poti
|
||||
• Kraji zanimanja, npr. restavracije, bencinske črpalke, hoteli, trgovine, znamenitosti in mnogo več
|
||||
• Iščite po imenu, hišnemu naslovu ali po vrsti
|
||||
• Usmerjanje z glasovnimi navodili za hojo, kolesarjenje ali vožnjo avtomobila.
|
||||
• Usmerjanje z glasovnimi obvestili za hojo, kolesarjenje ali vožnjo avtomobila.
|
||||
• Zaznamujte svoje najljubše kraje s preprostim dotikom
|
||||
• Wikipedijini članki brez povezave
|
||||
• Prometna plast podzemne železnice z usmerjanjem
|
||||
• Izvozite ali uvozite zaznamke in sledi v oblikah KML, KMZ, GPX
|
||||
• Temni prikaz za uporabo ponoči
|
||||
• Izboljšajte podatke zemljevida za vse z uporabo vgrajenega urejevalnika
|
||||
• Izboljšajtw podatke zemljevida za vse z uporabo vgrajenega urejevalnika
|
||||
|
||||
<b>Svoboda je tu</b>
|
||||
Odkijte več o vašem potovanju, usmerjajte se po svetu s poudarkom na zasebnosti in skupnostnem delovanju!
|
||||
|
||||
@@ -1 +1 @@
|
||||
Enostavno usmerjanje – Odkrijte več o svojem potovanju – Podprto v skupnosti
|
||||
Enostavno usmerjanje – Odkrij več o svojem potovanju – Podprto v skupnosti
|
||||
|
||||
@@ -1 +1 @@
|
||||
CoMaps – hodi in vozi brez povezave, zasebno
|
||||
CoMaps–Hodi, kolesari, vozi brez povezave, zasebno
|
||||
|
||||
@@ -1 +1 @@
|
||||
version: 2025.03.02-7-FDroid+25030207
|
||||
version: 2025.07.23-4-FDroid+25072304
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
Bendruomenės vystoma nemokama atvirojo kodo žemėlapių programa, pagrįsta „OpenStreetMap“ duomenimis ir sustiprinta įsipareigojimu užtikrinti skaidrumą, privatumą ir pelno nesiekimą.
|
||||
|
||||
Prisijunkite prie bendruomenės ir padėkite sukurti geriausią žemėlapių programą
|
||||
• Naudokitės programa ir paskleiskite žinią apie ją
|
||||
• Teikite atsiliepimus ir praneškite apie problemas
|
||||
• Atnaujinkite žemėlapių duomenis programoje arba „OpenStreetMap“ svetainėje
|
||||
|
||||
<i>Jūsų atsiliepimai ir 5 žvaigždučių vertinimai yra geriausias palaikymas mums!</i>
|
||||
|
||||
‣ <b>Paprasta ir išbaigta</b>: esminės, lengvai naudojamos funkcijos, kurios tiesiog veikia.
|
||||
‣ <b>Skirta naudoti neprisijungus prie interneto</b>: planuokite maršrutus ir keliaukite užsienyje be mobiliojo ryšio, ieškokite kelionės taškų tolimuose žygiuose ir pan. Visos programos funkcijos yra pritaikytos veikti be interneto ryšio.
|
||||
‣ <b>Gerbia privatumą</b>: programėlė sukurta, teikiant prioritetą privatumui: neidentifikuoja žmonių, neseka ir nerenka asmeninės informacijos. Be reklamų.
|
||||
‣ <b>Taupo bateriją ir vietą</b>: neišsekina baterijos kaip kitos navigacijos programos. Kompaktiški žemėlapiai tausoja vietą jūsų telefone.
|
||||
‣ <b>Nemokama ir kuriama bendruomenės</b>: paprasti žmonės – kaip jūs – padėjo sukurti šią programą, pildydami „OpenStreetMap“ žemėlapį, išbandydami ir pateikdami atsiliepimus apie funkcijas bei prisidėdami savo programavimo įgūdžiais ir pinigais.
|
||||
‣ <b>Atviras ir skaidrus sprendimų priėmimas ir finansai, ne pelno siekianti ir visiškai atviro kodo programa.</b>
|
||||
|
||||
<b>Pagrindinės funkcijos</b>:
|
||||
• Atsisiunčiami išsamūs žemėlapiai su vietomis, kurių nėra „Google Maps“;
|
||||
• Žygių pėsčiomis veiksena su pažymėtais pėsčiųjų takais, stovyklavietėmis, vandens šaltiniais, kalnų viršūnėmis, reljefo linijomis ir kt.;
|
||||
• Pėsčiųjų ir dviračių takai;
|
||||
• Potencialūs kelionės taškai, kaip antai restoranai, degalinės, viešbučiai, parduotuvės, lankytinos vietos ir daugelis kitų;
|
||||
• Paieška pagal pavadinimą, adresą arba lankytinos vietos kategoriją;
|
||||
• Navigacija su balso instrukcijomis pėstiesiems, dviratininkams ir motorinio transporto vairuotojams;
|
||||
• Mėgstamų vietų įsiminimas vienu bakstelėjimu;
|
||||
• „Vikipedijos“ straipsniai, prieinami neprisijungus prie interneto;
|
||||
• Kelionių metro sluoksnis ir maršrutai;
|
||||
• Trasų įrašymas;
|
||||
• Žymių ir trasų eksportavimas ir importavimas KML, KMZ, GPX formatais;
|
||||
• Tamsaus žemėlapio veiksena, skirta naudoti naktį;
|
||||
• Galimybė papildyti žemėlapio duomenis visiems, naudojantis įtaisytuoju baziniu redaktoriumi;
|
||||
• „Android Auto“ palaikymas.
|
||||
|
||||
Praneškite apie programos problemas, siūlykite idėjas ir prisijunkite prie mūsų bendruomenės svetainėje <b><i>comaps.app</i></b>.
|
||||
|
||||
<b>Laisvė yra čia</b>
|
||||
Atraskite savo kelionę ir keliaukite po pasaulį, kuriame privatumas ir bendruomenė yra svarbiausia!
|
||||
@@ -1 +1 @@
|
||||
Enostavno usmerjanje – Odkrijte več o svojem potovanju – Podprto v skupnosti
|
||||
Enostavno usmerjanje – Odkrij več o svojem potovanju – Podprto v skupnosti
|
||||
|
||||
@@ -62,6 +62,21 @@
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:scheme="https" />
|
||||
</intent>
|
||||
<intent>
|
||||
<action android:name="org.traffxml.traff.GET_CAPABILITIES"/>
|
||||
</intent>
|
||||
<intent>
|
||||
<action android:name="org.traffxml.traff.POLL"/>
|
||||
</intent>
|
||||
<intent>
|
||||
<action android:name="org.traffxml.traff.SUBSCRIBE"/>
|
||||
</intent>
|
||||
<intent>
|
||||
<action android:name="org.traffxml.traff.SUBSCRIPTION_CHANGE"/>
|
||||
</intent>
|
||||
<intent>
|
||||
<action android:name="org.traffxml.traff.UNSUBSCRIBE"/>
|
||||
</intent>
|
||||
</queries>
|
||||
|
||||
<supports-screens
|
||||
|
||||
@@ -948,7 +948,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
|
||||
mDisused.setVisibility(Editor.nativeCanMarkPlaceAsDisused() ? View.VISIBLE : View.GONE);
|
||||
|
||||
if (Editor.nativeAreSomeFeatureChangesUploaded())
|
||||
if (Editor.nativeIsMapObjectUploaded())
|
||||
{
|
||||
mReset.setText(R.string.editor_place_doesnt_exist);
|
||||
return;
|
||||
@@ -966,7 +966,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
|
||||
private void reset()
|
||||
{
|
||||
if (Editor.nativeAreSomeFeatureChangesUploaded())
|
||||
if (Editor.nativeIsMapObjectUploaded())
|
||||
{
|
||||
placeDoesntExist();
|
||||
return;
|
||||
|
||||
@@ -12,6 +12,7 @@ public class LayersUtils
|
||||
availableLayers.add(Mode.OUTDOORS);
|
||||
availableLayers.add(Mode.ISOLINES);
|
||||
availableLayers.add(Mode.SUBWAY);
|
||||
availableLayers.add(Mode.TRAFFIC);
|
||||
return availableLayers;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,11 +98,6 @@ public class NavigationController implements TrafficManager.TrafficCallback, Nav
|
||||
mSpeedLimit = topFrame.findViewById(R.id.nav_speed_limit);
|
||||
mCurrentSpeed = topFrame.findViewById(R.id.nav_current_speed);
|
||||
|
||||
View mTopbar = topFrame.findViewById(R.id.statutbar);
|
||||
ViewCompat.setOnApplyWindowInsetsListener(mTopbar,(v, windowInsets) -> {
|
||||
UiUtils.setViewNavigationTopInsetsMargin(v, windowInsets);
|
||||
return windowInsets;
|
||||
});
|
||||
// Show a blank view below the navbar to hide the menu content
|
||||
final View navigationBarBackground = mFrame.findViewById(R.id.nav_bottom_sheet_nav_bar);
|
||||
final View nextTurnContainer = mFrame.findViewById(R.id.nav_next_turn_container);
|
||||
|
||||
@@ -6,10 +6,12 @@ import android.view.View;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.XmlRes;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceFragmentCompat;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.WindowInsetUtils.ScrollableContentInsetsListener;
|
||||
|
||||
@@ -42,6 +44,7 @@ abstract class BaseXmlSettingsFragment extends PreferenceFragmentCompat
|
||||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
view.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.bg_cards));
|
||||
RecyclerView recyclerView = getListView();
|
||||
ViewCompat.setOnApplyWindowInsetsListener(recyclerView, new ScrollableContentInsetsListener(recyclerView));
|
||||
}
|
||||
|
||||
@@ -3,14 +3,21 @@ package app.organicmaps.settings;
|
||||
import static app.organicmaps.leftbutton.LeftButtonsHolder.DISABLE_BUTTON_CODE;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.preference.EditTextPreference;
|
||||
import androidx.preference.ListPreference;
|
||||
import androidx.preference.MultiSelectListPreference;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceCategory;
|
||||
import androidx.preference.PreferenceManager;
|
||||
@@ -35,6 +42,7 @@ import app.organicmaps.sdk.routing.RoutingOptions;
|
||||
import app.organicmaps.sdk.search.SearchRecents;
|
||||
import app.organicmaps.sdk.settings.MapLanguageCode;
|
||||
import app.organicmaps.sdk.settings.UnitLocale;
|
||||
import app.organicmaps.sdk.traffxml.AndroidTransport;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.NetworkPolicy;
|
||||
import app.organicmaps.sdk.util.PowerManagment;
|
||||
@@ -47,6 +55,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Set;
|
||||
|
||||
public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements LanguagesFragment.Listener
|
||||
{
|
||||
@@ -68,6 +77,10 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
|
||||
initAutoDownloadPrefsCallbacks();
|
||||
initLargeFontSizePrefsCallbacks();
|
||||
initTransliterationPrefsCallbacks();
|
||||
initTrafficHttpEnabledPrefsCallbacks();
|
||||
initTrafficHttpUrlPrefsCallbacks();
|
||||
initTrafficAppsPrefs();
|
||||
initTrafficLegacyEnabledPrefsCallbacks();
|
||||
init3dModePrefsCallbacks();
|
||||
initPerspectivePrefsCallbacks();
|
||||
initAutoZoomPrefsCallbacks();
|
||||
@@ -144,6 +157,46 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
|
||||
pref.setSummary(locale.getDisplayLanguage());
|
||||
}
|
||||
|
||||
private void updateTrafficHttpUrlSummary()
|
||||
{
|
||||
final Preference pref = getPreference(getString(R.string.pref_traffic_http_url));
|
||||
String summary = Config.getTrafficHttpUrl();
|
||||
if (summary.length() == 0)
|
||||
pref.setSummary(R.string.traffic_http_url_not_set);
|
||||
else
|
||||
pref.setSummary(summary);
|
||||
}
|
||||
|
||||
private void updateTrafficAppsSummary()
|
||||
{
|
||||
final MultiSelectListPreference pref = getPreference(getString(R.string.pref_traffic_apps));
|
||||
/*
|
||||
* If the preference is disabled, it has not been initialized. This is the case if no TraFF
|
||||
* apps were found. The code below would crash when trying to access the entries, and there
|
||||
* is no need to update the summary if the setting cannot be changed.
|
||||
*/
|
||||
if (!pref.isEnabled())
|
||||
return;
|
||||
String[] apps = Config.getTrafficApps();
|
||||
if (apps.length == 0)
|
||||
pref.setSummary(R.string.traffic_apps_none_selected);
|
||||
else
|
||||
{
|
||||
String summary = "";
|
||||
for (int i = 0; i < apps.length; i++)
|
||||
{
|
||||
if (i > 0)
|
||||
summary = summary + ", ";
|
||||
int index = pref.findIndexOfValue(apps[i]);
|
||||
if (i >= 0)
|
||||
summary = summary + pref.getEntries()[index];
|
||||
else
|
||||
summary = summary + apps[i];
|
||||
}
|
||||
pref.setSummary(summary);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateRoutingSettingsPrefsSummary()
|
||||
{
|
||||
final Preference pref = getPreference(getString(R.string.prefs_routing));
|
||||
@@ -171,6 +224,8 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
|
||||
updateVoiceInstructionsPrefsSummary();
|
||||
updateRoutingSettingsPrefsSummary();
|
||||
updateMapLanguageCodeSummary();
|
||||
updateTrafficHttpUrlSummary();
|
||||
updateTrafficAppsSummary();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -232,6 +287,91 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
|
||||
});
|
||||
}
|
||||
|
||||
private void initTrafficHttpEnabledPrefsCallbacks()
|
||||
{
|
||||
final Preference pref = getPreference(getString(R.string.pref_traffic_http_enabled));
|
||||
|
||||
((TwoStatePreference)pref).setChecked(Config.getTrafficHttpEnabled());
|
||||
pref.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
final boolean oldVal = Config.getTrafficHttpEnabled();
|
||||
final boolean newVal = (Boolean) newValue;
|
||||
if (oldVal != newVal)
|
||||
Config.setTrafficHttpEnabled(newVal);
|
||||
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
private void initTrafficHttpUrlPrefsCallbacks()
|
||||
{
|
||||
final Preference pref = getPreference(getString(R.string.pref_traffic_http_url));
|
||||
|
||||
((EditTextPreference)pref).setText(Config.getTrafficHttpUrl());
|
||||
pref.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
final String oldVal = Config.getTrafficHttpUrl();
|
||||
final String newVal = (String) newValue;
|
||||
if (!oldVal.equals(newVal))
|
||||
Config.setTrafficHttpUrl(newVal);
|
||||
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
private void initTrafficAppsPrefs()
|
||||
{
|
||||
final MultiSelectListPreference pref = getPreference(getString(R.string.pref_traffic_apps));
|
||||
|
||||
PackageManager pm = getContext().getPackageManager();
|
||||
List<ResolveInfo> receivers = pm.queryBroadcastReceivers(new Intent(AndroidTransport.ACTION_TRAFF_GET_CAPABILITIES), 0);
|
||||
|
||||
if (receivers == null || receivers.isEmpty())
|
||||
{
|
||||
pref.setSummary(R.string.traffic_apps_not_available);
|
||||
pref.setEnabled(false);
|
||||
return;
|
||||
}
|
||||
|
||||
pref.setEnabled(true);
|
||||
|
||||
List<String> entryList = new ArrayList<>(receivers.size());
|
||||
List<String> valueList = new ArrayList<>(receivers.size());
|
||||
|
||||
for (ResolveInfo receiver : receivers)
|
||||
{
|
||||
// friendly name
|
||||
entryList.add(receiver.loadLabel(pm).toString());
|
||||
// actual value (we just need the package name, broadcasts are sent to any receiver in the package)
|
||||
valueList.add(receiver.activityInfo.applicationInfo.packageName);
|
||||
}
|
||||
|
||||
pref.setEntries(entryList.toArray(new CharSequence[0]));
|
||||
pref.setEntryValues(valueList.toArray(new CharSequence[0]));
|
||||
|
||||
pref.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
// newValue is a Set<String>, each item is a package ID
|
||||
String[] apps = ((Set<String>)newValue).toArray(new String[0]);
|
||||
Config.setTrafficApps(apps);
|
||||
updateTrafficAppsSummary();
|
||||
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
private void initTrafficLegacyEnabledPrefsCallbacks()
|
||||
{
|
||||
final Preference pref = getPreference(getString(R.string.pref_traffic_legacy_enabled));
|
||||
|
||||
((TwoStatePreference)pref).setChecked(Config.getTrafficLegacyEnabled());
|
||||
pref.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
final boolean oldVal = Config.getTrafficLegacyEnabled();
|
||||
final boolean newVal = (Boolean) newValue;
|
||||
if (oldVal != newVal)
|
||||
Config.setTrafficLegacyEnabled(newVal);
|
||||
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
private void initUseMobileDataPrefsCallbacks()
|
||||
{
|
||||
final ListPreference mobilePref = getPreference(getString(R.string.pref_use_mobile_data));
|
||||
|
||||
@@ -196,7 +196,7 @@ public final class UiUtils
|
||||
public static void showHomeUpButton(MaterialToolbar toolbar)
|
||||
{
|
||||
toolbar.setNavigationIcon(
|
||||
UiUtils.getStyledResourceId(toolbar.getContext(), androidx.appcompat.R.attr.homeAsUpIndicator));
|
||||
ThemeUtils.getResource(toolbar.getContext(), androidx.appcompat.R.attr.homeAsUpIndicator));
|
||||
}
|
||||
|
||||
// this method returns the total height of the display (in pixels) including notch and other touchable areas
|
||||
@@ -281,14 +281,6 @@ public final class UiUtils
|
||||
view.setPadding(systemInsets.left, systemInsets.top, systemInsets.right, view.getPaddingBottom());
|
||||
}
|
||||
|
||||
public static void setViewNavigationTopInsetsMargin(View view, WindowInsetsCompat windowInsets)
|
||||
{
|
||||
final Insets systemInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
|
||||
lp.topMargin = systemInsets.top;
|
||||
view.setLayoutParams(lp);
|
||||
}
|
||||
|
||||
public static void setupNavigationIcon(@NonNull MaterialToolbar toolbar, @NonNull View.OnClickListener listener)
|
||||
{
|
||||
View customNavigationButton = toolbar.findViewById(R.id.back);
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?appBackground"
|
||||
android:background="?cardBackground"
|
||||
android:clipToPadding="false"
|
||||
android:fadeScrollbars="false"
|
||||
android:fillViewport="true">
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
android:id="@+id/scrollView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?appBackground"
|
||||
android:background="?cardBackground"
|
||||
android:fadeScrollbars="false"
|
||||
android:fillViewport="true"
|
||||
android:clipToPadding="false">
|
||||
|
||||
@@ -11,12 +11,13 @@
|
||||
<FrameLayout
|
||||
android:layout_width="match_parent"
|
||||
android:id="@+id/statutbar"
|
||||
android:layout_height="1dp"
|
||||
android:layout_height="15dp"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:id="@+id/street_frame"
|
||||
android:layout_width="500dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/margin_half_plus_eight"
|
||||
android:layout_marginEnd="@dimen/margin_quarter"
|
||||
app:cardCornerRadius="@dimen/margin_half"
|
||||
android:elevation="@dimen/nav_elevation"
|
||||
@@ -51,6 +52,7 @@
|
||||
app:layout_constraintEnd_toStartOf="@+id/street_frame"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/statutbar"
|
||||
android:layout_marginTop="@dimen/margin_half_plus_eight"
|
||||
android:layout_marginStart="@dimen/margin_quarter"
|
||||
android:clickable="true"
|
||||
android:elevation="@dimen/nav_elevation">
|
||||
|
||||
@@ -3,8 +3,7 @@
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:background="?appBackground">
|
||||
android:orientation="vertical">
|
||||
|
||||
<include
|
||||
layout="@layout/toolbar_extended"/>
|
||||
@@ -18,8 +17,7 @@
|
||||
android:id="@+id/fragment_container"
|
||||
style="@style/MwmWidget.FrameLayout.Elevation"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?appBackground"/>
|
||||
android:layout_height="match_parent"/>
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?appBackground"
|
||||
android:background="?cardBackground"
|
||||
android:clipToPadding="false"
|
||||
android:fadeScrollbars="false"
|
||||
android:fillViewport="true">
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?appBackground">
|
||||
android:background="?cardBackground">
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:background="?appBackground"
|
||||
android:background="?cardBackground"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical">
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?appBackground"
|
||||
android:background="?cardBackground"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical">
|
||||
|
||||
|
||||
@@ -3,8 +3,7 @@
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:background="?appBackground">
|
||||
android:orientation="vertical">
|
||||
|
||||
<include
|
||||
layout="@layout/toolbar_default"/>
|
||||
|
||||
@@ -2,11 +2,18 @@
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:background="?appBackground"
|
||||
android:background="?cardBackground"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<include layout="@layout/toolbar_default"/>
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/toolbar"
|
||||
style="@style/MwmWidget.ToolbarStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="end|center_vertical"
|
||||
android:theme="@style/MwmWidget.ToolbarTheme">
|
||||
</com.google.android.material.appbar.MaterialToolbar>
|
||||
<LinearLayout
|
||||
android:layout_marginTop="@dimen/margin_half_double_plus"
|
||||
android:orientation="horizontal"
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
android:id="@+id/scrollView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?appBackground"
|
||||
android:background="?cardBackground"
|
||||
android:fadeScrollbars="false"
|
||||
android:fillViewport="true"
|
||||
android:clipToPadding="false">
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:background="?appBackground">
|
||||
android:background="?cardBackground">
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/toolbar"
|
||||
style="@style/MwmWidget.ToolbarStyle"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:background="?appBackground">
|
||||
android:background="?cardBackground">
|
||||
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/header"
|
||||
|
||||
@@ -15,13 +15,7 @@
|
||||
android:theme="@style/MwmWidget.ToolbarTheme">
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/save"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center"
|
||||
android:layout_gravity="end|center_vertical"
|
||||
android:background="?selectableItemBackgroundBorderless"
|
||||
android:padding="@dimen/margin_half"
|
||||
android:textAppearance="@style/MwmTextAppearance.Toolbar.Title"
|
||||
style="@style/MwmWidget.Downloader.ToolbarButton"
|
||||
android:text="@string/editor_report_problem_send_button"/>
|
||||
</com.google.android.material.appbar.MaterialToolbar>
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?windowBackgroundForced"
|
||||
android:animateLayoutChanges="true"
|
||||
android:clickable="true"
|
||||
android:clipToPadding="false"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_gravity="center"
|
||||
android:orientation="vertical"
|
||||
android:background="?cardBackground"
|
||||
android:background="?windowBackgroundForced"
|
||||
android:padding="@dimen/margin_base">
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?cardBackground"
|
||||
android:minHeight="@dimen/height_item_oneline"
|
||||
android:paddingStart="@dimen/margin_base_plus"
|
||||
android:paddingEnd="@dimen/margin_base_plus">
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?cardBackground"
|
||||
android:minHeight="@dimen/height_item_oneline"
|
||||
android:paddingStart="@dimen/margin_base_plus"
|
||||
android:paddingEnd="@dimen/margin_base_plus">
|
||||
|
||||
@@ -11,12 +11,13 @@
|
||||
<FrameLayout
|
||||
android:layout_width="match_parent"
|
||||
android:id="@+id/statutbar"
|
||||
android:layout_height="1dp"
|
||||
android:layout_height="25dp"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:id="@+id/street_frame"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/margin_half_plus"
|
||||
android:layout_marginStart="@dimen/nav_street_left"
|
||||
android:layout_marginEnd="@dimen/margin_quarter"
|
||||
app:cardCornerRadius="@dimen/margin_half"
|
||||
@@ -54,6 +55,7 @@
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/statutbar"
|
||||
android:layout_marginStart="@dimen/margin_half"
|
||||
android:layout_marginTop="@dimen/margin_half_plus"
|
||||
android:clickable="true"
|
||||
android:elevation="@dimen/nav_elevation">
|
||||
<LinearLayout
|
||||
|
||||
@@ -9,7 +9,7 @@ android:layout_marginHorizontal="@dimen/margin_base"
|
||||
android:layout_marginTop="@dimen/margin_half"
|
||||
app:strokeWidth="1dp"
|
||||
app:strokeColor="@color/base_accent"
|
||||
app:cardBackgroundColor="?cardBackground">
|
||||
app:cardBackgroundColor="@color/bg_cards">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/margin_half_plus"
|
||||
android:textSize="@dimen/text_size_headline"
|
||||
android:fontFamily="@string/robotoMedium"
|
||||
android:textAppearance="@style/MwmTextAppearance.Title.Toolbar"
|
||||
android:gravity="center_horizontal"
|
||||
tools:text="Some long long long placeholder title"/>
|
||||
|
||||
@@ -30,7 +30,8 @@
|
||||
android:layout_alignParentStart="true"
|
||||
android:background="?selectableItemBackgroundBorderless"
|
||||
app:srcCompat="?homeAsUpIndicator"
|
||||
android:scaleType="center" />
|
||||
android:scaleType="center"
|
||||
tools:src="@drawable/ic_expand_more" />
|
||||
|
||||
<RadioGroup
|
||||
android:id="@+id/route_type"
|
||||
|
||||
8
android/app/src/main/res/layout/tab_timepicker.xml
Normal file
8
android/app/src/main/res/layout/tab_timepicker.xml
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
style="@style/MwmWidget.Tab"
|
||||
android:textAppearance="@style/MwmTextAppearance.Body3"
|
||||
tools:drawableStart="@drawable/ic_menu_open"
|
||||
tools:text="Some tab"/>
|
||||
@@ -1,7 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
@@ -10,8 +9,7 @@
|
||||
style="@style/MwmWidget.ToolbarStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:theme="@style/MwmWidget.ToolbarTheme"
|
||||
app:navigationIcon="@drawable/ic_expand_more"/>
|
||||
android:theme="@style/MwmWidget.ToolbarTheme.DownButton"/>
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
android:background="?selectableItemBackgroundBorderless"
|
||||
app:srcCompat="?homeAsUpIndicator"
|
||||
android:scaleType="center"
|
||||
tools:src="@drawable/ic_expand_more"
|
||||
android:contentDescription="@string/back"/>
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
|
||||
8
android/app/src/main/res/layout/toolbar_transparent.xml
Normal file
8
android/app/src/main/res/layout/toolbar_transparent.xml
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/toolbar"
|
||||
style="@style/MwmWidget.ToolbarStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:theme="@style/MwmWidget.ToolbarTheme.Transparent"/>
|
||||
@@ -502,7 +502,7 @@
|
||||
<string name="placepage_edit_bookmark_button">Edita el marcador</string>
|
||||
<string name="placepage_personal_notes_hint">Notes personals (text o html)</string>
|
||||
<string name="editor_reset_edits_message">Voleu descartar tots els canvis locals?</string>
|
||||
<string name="editor_reset_edits_button">Descartar canvis</string>
|
||||
<string name="editor_reset_edits_button">Descarta</string>
|
||||
<string name="editor_remove_place_message">Voleu suprimir el lloc afegit?</string>
|
||||
<string name="editor_remove_place_button">Suprimeix</string>
|
||||
<string name="editor_place_doesnt_exist">El lloc no existeix</string>
|
||||
@@ -920,10 +920,4 @@
|
||||
<string name="prefs_speed_cameras_information">Les advertències de càmeres radar estan deshabilitades als països on estan prohibides per llei.</string>
|
||||
<string name="navigation_start_tts_message">"Iniciant Navegació, idioma d\'instruccions de veu: "</string>
|
||||
<string name="navigation_start_tts_disabled_message">Instruccions de veu desactivades: motor TTS no disponible</string>
|
||||
<string name="advanced">Avançat</string>
|
||||
<string name="download_resources_custom_url_title">Servidor de Mapes Personalitzat</string>
|
||||
<string name="download_resources_custom_url_message">Sobreescriu el servidor de descàrrega de mapes per defecte. Deixa en blanc per a emprar el servidor per defecte de CoMaps.</string>
|
||||
<string name="download_resources_custom_url_hint">https://cdn-fi-1.comaps.app/</string>
|
||||
<string name="download_resources_custom_url_summary_none">No establert</string>
|
||||
<string name="download_resources_custom_url_error_scheme">Per favor introdueix una URL completa que comence amb https:// i acabe amb /</string>
|
||||
</resources>
|
||||
|
||||
@@ -493,7 +493,7 @@
|
||||
<string name="placepage_edit_bookmark_button">Upravit záložku</string>
|
||||
<string name="placepage_personal_notes_hint">Vlastní poznámka (text nebo HTML)</string>
|
||||
<string name="editor_reset_edits_message">Vymazat všechny místní změny?</string>
|
||||
<string name="editor_reset_edits_button">Zahodit změny</string>
|
||||
<string name="editor_reset_edits_button">Zahodit</string>
|
||||
<string name="editor_remove_place_message">Odstranit přidané místo?</string>
|
||||
<string name="editor_remove_place_button">Odstranit</string>
|
||||
<string name="editor_place_doesnt_exist">Místo neexistuje</string>
|
||||
@@ -913,10 +913,4 @@
|
||||
<string name="place_page_update_too_old_map">Aktualizovat oblast mapy</string>
|
||||
<string name="place_page_too_old_to_edit">Úprava OpenStreetMap je zakázaná, protože mapová data jsou příliš stará.</string>
|
||||
<string name="navigation_start_tts_disabled_message">Hlasové pokyny vypnuty: služba TTS není dostupná</string>
|
||||
<string name="download_resources_custom_url_title">Vlastní mapový server</string>
|
||||
<string name="download_resources_custom_url_message">Přepsat výchozí server používaný ke stahování map. Nechte pole prázdné, pokud chcete použít výchozí server CoMaps.</string>
|
||||
<string name="download_resources_custom_url_hint">https://cdn-fi-1.comaps.app/</string>
|
||||
<string name="download_resources_custom_url_error_scheme">Zadejte prosím celou adresu URL začínající na https:// a končící s /</string>
|
||||
<string name="advanced">Pokročilé</string>
|
||||
<string name="download_resources_custom_url_summary_none">Není nastaveno</string>
|
||||
</resources>
|
||||
|
||||
@@ -902,9 +902,4 @@
|
||||
<string name="place_page_update_too_old_map">Opdater kortregion</string>
|
||||
<string name="place_page_too_old_to_edit">Redigering af OpenStreetMap er deaktiveret, fordi kortdataene er for gamle.</string>
|
||||
<string name="navigation_start_tts_disabled_message">Stemmeinstruktioner deaktiveret: TTS-motor ikke tilgængelig</string>
|
||||
<string name="advanced">Avanceret</string>
|
||||
<string name="download_resources_custom_url_title">Brugerdefineret kortserver</string>
|
||||
<string name="download_resources_custom_url_message">Tilsidesæt den som standard anvendte server til download af kort. Lad feltet være tomt for at bruge CoMaps\' standardserver.</string>
|
||||
<string name="download_resources_custom_url_summary_none">Ikke indstillet</string>
|
||||
<string name="download_resources_custom_url_error_scheme">Indtast en fuld URL, der starter med https:// og ender med /</string>
|
||||
</resources>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<string name="delete">Löschen</string>
|
||||
<string name="download_maps">Karten herunterladen</string>
|
||||
<!-- Settings/Downloader - info for country when download fails -->
|
||||
<string name="download_has_failed">Das Herunterladen ist fehlgeschlagen – antippen für einen erneuten Versuch</string>
|
||||
<string name="download_has_failed">Das Herunterladen ist fehlgeschlagen, Antippen für einen neuen Versuch</string>
|
||||
<!-- Settings/Downloader - info for country which started downloading -->
|
||||
<string name="downloading">Wird heruntergeladen …</string>
|
||||
<!-- Choose measurement on first launch alert - choose metric system button -->
|
||||
@@ -27,7 +27,7 @@
|
||||
<!-- A dialog title, that warns a user that Precise Location is disabled and suggests to turn it on -->
|
||||
<string name="limited_accuracy">Eingeschränkte Genauigkeit</string>
|
||||
<!-- A dialog text, that warns a user that Precise Location is disabled and suggests to turn it on -->
|
||||
<string name="precise_location_is_disabled_long_text">Um eine genaue Navigation zu gewährleisten, aktiviere „Genauer Standort“ in den Einstellungen</string>
|
||||
<string name="precise_location_is_disabled_long_text">Um eine genaue Navigation zu gewährleisten, aktivieren Sie „Genauer Standort“ in den Einstellungen</string>
|
||||
<!-- View and button titles for accessibility -->
|
||||
<string name="zoom_to_country">Auf der Karte anzeigen</string>
|
||||
<!-- Message to display at the center of the screen when the country download has failed -->
|
||||
@@ -36,7 +36,7 @@
|
||||
<string name="try_again">Erneut versuchen</string>
|
||||
<string name="about_menu_title">Über CoMaps</string>
|
||||
<!-- Text in About screen -->
|
||||
<string name="about_headline">Freies Projekt, von der Gemeinschaft entwickelt</string>
|
||||
<string name="about_headline">Offenes Projekt, von der Gemeinschaft entwickelt</string>
|
||||
<!-- Text in About screen -->
|
||||
<string name="about_proposition_1">• Ausgereift und einfach zu bedienen</string>
|
||||
<!-- Text in About screen -->
|
||||
@@ -53,10 +53,10 @@
|
||||
<!-- Used in DownloadResources startup screen -->
|
||||
<string name="disconnect_usb_cable">Bitte USB-Kabel entfernen oder Speicherkarte einsetzen, um CoMaps zu verwenden</string>
|
||||
<!-- Used in DownloadResources startup screen -->
|
||||
<string name="not_enough_free_space_on_sdcard">Bitte zuerst den Speicherplatz auf der SD-Karte/USB-Speicher freigeben, um die Anwendung nutzen zu können</string>
|
||||
<string name="download_resources">Bevor Sie die App verwenden, laden Sie bitte die weltweite Übersichtskarte herunter. \nEs werden %s des Speicherplatzes benötigt.</string>
|
||||
<string name="not_enough_free_space_on_sdcard">Bitte zuerst Speicherplatz auf SD-Karte/USB-Speicher freigeben, um die Anwendung zu nutzen</string>
|
||||
<string name="download_resources">Bevor Sie die App verwenden, laden Sie bitte die weltweite Übersichtskarte herunter. \nEs werden %s Speicherplatz benötigt.</string>
|
||||
<string name="download_resources_continue">Zur Karte</string>
|
||||
<string name="downloading_country_can_proceed">%1$s (%2$s) wird heruntergeladen. \nSie können jetzt zur Karte weitergehen.</string>
|
||||
<string name="downloading_country_can_proceed">%1$s (%2$s) wird heruntergeladen. Sie können jetzt \nzur Karte weitergehen.</string>
|
||||
<string name="download_country_ask">%1$s herunterladen? (%2$s)</string>
|
||||
<string name="update_country_ask">%1$s aktualisieren? (%2$s)</string>
|
||||
<!-- REMOVE THIS STRING AFTER REFACTORING -->
|
||||
@@ -84,7 +84,7 @@
|
||||
<!-- Header of settings activity where user defines storage path -->
|
||||
<string name="maps_storage">Karten speichern auf</string>
|
||||
<!-- Detailed description of Maps Storage settings button -->
|
||||
<string name="maps_storage_summary">Wähle den Speicherort für die herunterzuladenden Karten</string>
|
||||
<string name="maps_storage_summary">Wählen Sie den Speicherort für die herunterzuladenden Karten</string>
|
||||
<!-- E.g. "Downloaded maps: 500Mb" in Maps Storage settings -->
|
||||
<string name="maps_storage_downloaded">Heruntergeladene Karten</string>
|
||||
<!-- Free space out of total storage size in Maps Storage settings, e.g. "300 MB free of 2 GB" -->
|
||||
@@ -94,7 +94,7 @@
|
||||
<!-- Error moving map files from one storage to another -->
|
||||
<string name="move_maps_error">Fehler beim Verschieben der Karten</string>
|
||||
<!-- Ask user to wait several minutes (some long process in modal dialog). -->
|
||||
<string name="wait_several_minutes">Dies kann einige Minuten in Anspruch nehmen. \nBitte warten …</string>
|
||||
<string name="wait_several_minutes">Dies kann einige Minuten in Anspruch nehmen. \nBitte warten …</string>
|
||||
<!-- Measurement units title in settings activity -->
|
||||
<string name="measurement_units">Maßeinheiten</string>
|
||||
<!-- Detailed description of Measurement Units settings button -->
|
||||
@@ -105,7 +105,7 @@
|
||||
<!-- Search category for grocery stores; any changes should be duplicated in categories.txt @category_food! -->
|
||||
<string name="category_food">Lebensmittel</string>
|
||||
<!-- Search category for public transport; any changes should be duplicated in categories.txt @category_transport! -->
|
||||
<string name="category_transport">ÖPNV</string>
|
||||
<string name="category_transport">Verkehr</string>
|
||||
<!-- Search category for fuel stations; any changes should be duplicated in categories.txt @category_fuel! -->
|
||||
<string name="category_fuel">Tankstelle</string>
|
||||
<!-- Search category for parking lots; any changes should be duplicated in categories.txt @category_parking! -->
|
||||
@@ -125,7 +125,7 @@
|
||||
<!-- Search category for nightclubs/bars; any changes should be duplicated in categories.txt @category_nightlife! -->
|
||||
<string name="category_nightlife">Nachtleben</string>
|
||||
<!-- Search category for water park/disneyland/playground/toys store; any changes should be duplicated in categories.txt @category_children! -->
|
||||
<string name="category_children">Familienfreizeit</string>
|
||||
<string name="category_children">Freizeit mit Kindern</string>
|
||||
<!-- Search category for banks; any changes should be duplicated in categories.txt @category_bank! -->
|
||||
<string name="category_bank">Bank</string>
|
||||
<!-- Search category for pharmacies; any changes should be duplicated in categories.txt @category_pharmacy! -->
|
||||
@@ -137,7 +137,7 @@
|
||||
<!-- Search category for post offices; any changes should be duplicated in categories.txt @category_post! -->
|
||||
<string name="category_post">Post</string>
|
||||
<!-- Search category for police; any changes should be duplicated in categories.txt @category_police! -->
|
||||
<string name="category_police">Polizei</string>
|
||||
<string name="category_police">Polizeistation</string>
|
||||
<!-- Search category for recycling; any changes should be duplicated in categories.txt @category_recycling! -->
|
||||
<string name="category_recycling">Recycling</string>
|
||||
<!-- Search category for water; any changes should be duplicated in categories.txt @category_water! also used to sort bookmarks by type -->
|
||||
@@ -148,8 +148,8 @@
|
||||
<!-- Notes field in Bookmarks view -->
|
||||
<string name="description">Notizen</string>
|
||||
<!-- Email Subject when sharing bookmark list -->
|
||||
<string name="share_bookmarks_email_subject">CoMaps-Lesezeichen wurden mit dir geteilt</string>
|
||||
<string name="share_bookmarks_email_body">Hallo! \n \nIm Anhang sind meine Lesezeichen der CoMaps-App. Du kannst in CoMaps öffnen. Wenn du die App nicht installiert hast, kannst du sie von https://www.comaps.app/download/ für iOS oder Android herunterladen. \n \nViel Spaß beim Navigieren mit CoMaps!</string>
|
||||
<string name="share_bookmarks_email_subject">CoMaps-Lesezeichen wurden mit Ihnen geteilt</string>
|
||||
<string name="share_bookmarks_email_body">Hallo! \n \nIm Anhang sind meine Lesezeichen der CoMaps App. Sie können sie mit CoMaps öffnen. Wenn Sie die App nicht installiert haben, können Sie sie von https://www.comaps.app/download/ für iOS oder Android herunterladen. \n \nViel Spaß beim Reisen mit CoMaps!</string>
|
||||
<!-- message title of loading file -->
|
||||
<string name="load_kmz_title">Lesezeichen werden geladen</string>
|
||||
<!-- Kmz file successful loading -->
|
||||
@@ -163,15 +163,15 @@
|
||||
<!-- resource for context menu -->
|
||||
<string name="edit">Bearbeiten</string>
|
||||
<!-- Warning message when doing search around current position -->
|
||||
<string name="unknown_current_position">Dein Standort konnte noch nicht ermittelt werden</string>
|
||||
<string name="unknown_current_position">Ihr Standort konnte noch nicht ermittelt werden</string>
|
||||
<!-- Alert message that we can't run Map Storage settings due to some reasons. -->
|
||||
<string name="cant_change_this_setting">Entschuldige, die Einstellungen für die Kartenspeicherung sind aktuell deaktiviert</string>
|
||||
<!-- Alert message that downloading is in progress. -->
|
||||
<string name="downloading_is_active">Die Karte wird jetzt heruntergeladen</string>
|
||||
<string name="downloading_is_active">Die Karte wird heruntergeladen</string>
|
||||
<!-- Share my position using SMS, %1$@ contains om:// and %2$@ https://comaps.app link WITHOUT NAME. @NOTE non-ascii symbols in the link will result in max 70 characters SMS instead of 140. -->
|
||||
<string name="my_position_share_sms">Sieh dir meinen aktuellen Standort auf CoMaps an! %1$s oder %2$s Keine Offline-Karten installiert? Hier herunterladen: https://www.comaps.app/de/download/</string>
|
||||
<string name="my_position_share_sms">Sieh dir meinen aktuellen Standort auf CoMaps an! %1$s oder %2$s Keine Offline-Karten installiert? Hier herunterladen: https://www.comaps.app/download/</string>
|
||||
<!-- Subject for emailed bookmark -->
|
||||
<string name="bookmark_share_email_subject">Hey, sieh dir meine Stecknadel in der CoMaps-App an!</string>
|
||||
<string name="bookmark_share_email_subject">Hey, sieh dir meine Stecknadel auf der CoMaps-Karte an!</string>
|
||||
<!-- Subject for emailed position -->
|
||||
<string name="my_position_share_email_subject">Hey, sieh dir meinen aktuellen Standort auf der CoMaps-Karte an!</string>
|
||||
<!-- Share my position using EMail, %1$@ is om:// and %2$@ is https://comaps.app link WITHOUT NAME -->
|
||||
@@ -179,7 +179,7 @@
|
||||
<!-- Share button text which opens menu with more buttons, like Message, EMail, Facebook etc. -->
|
||||
<string name="share">Teilen</string>
|
||||
<!-- Share by email button text, also used in editor and About. -->
|
||||
<string name="email">E-Mail</string>
|
||||
<string name="email">Email</string>
|
||||
<!-- Text for message when used successfully copied something -->
|
||||
<string name="copied_to_clipboard">In die Zwischenablage kopiert: %s</string>
|
||||
<!-- Used for bookmark editing -->
|
||||
@@ -197,7 +197,7 @@
|
||||
<string name="prefs_group_information">Information</string>
|
||||
<string name="prefs_group_route">Navigation</string>
|
||||
<string name="pref_zoom_title">Zoom-Tasten</string>
|
||||
<string name="pref_zoom_summary">Zur Anzeige auf der Karte</string>
|
||||
<string name="pref_zoom_summary">Auf der Karte anzeigen</string>
|
||||
<!-- Settings «Map» category: «Night style» title -->
|
||||
<string name="pref_map_style_title">Nachtmodus</string>
|
||||
<!-- Generic «Off» string -->
|
||||
@@ -219,9 +219,9 @@
|
||||
<!-- Settings «Route» category: «Tts announce street names» description -->
|
||||
<string name="pref_tts_street_names_description">Wenn aktiviert, wird der Name der Straße oder Ausfahrt, in die abgebogen werden soll, laut angekündigt.</string>
|
||||
<!-- Settings «Route» category: «Tts language» title -->
|
||||
<string name="pref_tts_language_title">Sprache der Sprachführung</string>
|
||||
<string name="pref_tts_language_title">Sprache für Sprachführung</string>
|
||||
<!-- Settings «Route» category: «Test Voice Directions» title -->
|
||||
<string name="pref_tts_test_voice_title">Teste die Sprachanweisungen</string>
|
||||
<string name="pref_tts_test_voice_title">Teste Sprachanweisungen</string>
|
||||
<!-- Settings «Route» category: Pop-up message when clicking «Test Voice Directions» -->
|
||||
<string name="pref_tts_playing_test_voice">Überprüfe die Lautstärke oder die Text-To-Speech-Einstellungen des Systems, wenn du die Stimme jetzt nicht hören kannst</string>
|
||||
<!-- Settings «Route» category: «Tts unavailable» subtitle -->
|
||||
@@ -330,7 +330,7 @@
|
||||
<string name="blue_gray">Graublau</string>
|
||||
<!-- SECTION: Routing dialogs strings -->
|
||||
<string name="dialog_routing_disclaimer_title">Wenn Sie der Route folgen, beachten Sie bitte:</string>
|
||||
<string name="dialog_routing_disclaimer_priority">— Zustand der Straßen, die Verkehrsordnung und Straßenschilder haben stets Vorrang vor Navigationsanweisungen;</string>
|
||||
<string name="dialog_routing_disclaimer_priority">– Zustand der Straßen, die Verkehrsordnung und Straßenschilder haben stets Vorrang vor Navigationsanweisungen;</string>
|
||||
<string name="dialog_routing_disclaimer_precision">– Die Karte kann ungenau sein, und die vorgeschlagene Route ist möglicherweise nicht der optimale Weg, um das Ziel zu erreichen;</string>
|
||||
<string name="dialog_routing_disclaimer_recommendations">— Die vorgeschlagenen Routen sind als Empfehlungen zu verstehen;</string>
|
||||
<string name="dialog_routing_disclaimer_borders">— Bitte seien Sie vorsichtig bei Routen in Grenzgebieten: die Routen, die unsere App erstellt, können manchmal Landesgrenzen in gesperrten Gebieten überschreiten.</string>
|
||||
@@ -543,7 +543,7 @@
|
||||
<string name="big_font">Schrift auf der Karte vergrößern</string>
|
||||
<string name="traffic_update_app">Bitte aktualisieren Sie CoMaps</string>
|
||||
<!-- "traffic" as in "road congestion" -->
|
||||
<string name="traffic_data_unavailable">Es sind keine Verkehrsdaten verfügbar</string>
|
||||
<string name="traffic_data_unavailable">Verkehrsdaten sind nicht verfügbar</string>
|
||||
<string name="enable_logging">Protokollierung aktivieren</string>
|
||||
<!-- Settings: "Send general feedback" button -->
|
||||
<string name="feedback_general">Allgemeines Feedback</string>
|
||||
@@ -873,7 +873,7 @@
|
||||
<string name="avoid_steps">Treppen vermeiden</string>
|
||||
<string name="editor_place_doesnt_exist_description">Beschreibe wie der Ort jetzt aussieht um eine Fehlermeldung an die OpenStreetMap Community zu senden</string>
|
||||
<string name="offline_explanation_title">Offline-Karten</string>
|
||||
<string name="offline_explanation_text">Um die Gegend anzusehen und zu erkunden, musst du eine Karte runterladen.\nLade dir Karten für die Gebiete runter, die du bereisen willst.</string>
|
||||
<string name="offline_explanation_text">Um die Gegend anzusehen, muss eine Karte heruntergeladen werden.\nLaden Sie Karten für die Gebiete herunter, die Sie bereisen möchten.</string>
|
||||
<string name="charge_socket_type2">Typ 2 (ohne Kabel)</string>
|
||||
<string name="charge_socket_type2_cable">Typ 2 (mit Kabel)</string>
|
||||
<string name="charge_socket_type2_combo">Typ 2 Combo</string>
|
||||
@@ -898,15 +898,15 @@
|
||||
<string name="opens_day_at">Öffnet am %1$s um %2$s</string>
|
||||
<string name="closes_day_at">Schließt am %1$s um %2$s</string>
|
||||
<plurals name="minutes_short">
|
||||
<item quantity="one">(%d min)</item>
|
||||
<item quantity="other">(%d min)</item>
|
||||
<item quantity="one">%d min</item>
|
||||
<item quantity="other">%d min</item>
|
||||
</plurals>
|
||||
<string name="editor_business_vacant_button">Geschäft steht leer</string>
|
||||
<string name="editor_mark_business_vacant_title">Geschäft auf leerstehend setzen</string>
|
||||
<string name="editor_submit">Absenden</string>
|
||||
<string name="editor_mark_business_vacant_description">Verwenden Sie diese Option, wenn das Geschäft ausgezogen ist und ein neues Geschäft die leerstehenden Räume übernehmen könnte.</string>
|
||||
<string name="charge_socket_schuko">Schuko</string>
|
||||
<string name="power_management">Stromverbrauch verwalten</string>
|
||||
<string name="power_management">Energiemanagement</string>
|
||||
<string name="place_page_map_too_old_title">Kartendaten veraltet</string>
|
||||
<string name="place_page_map_too_old_description">Die aktuellen Kartendaten sind sehr alt, bitte aktualisiere die Karte.</string>
|
||||
<string name="place_page_app_too_old_description">Die aktuellen Kartendaten sind sehr alt, bitte aktualisiere die CoMaps-App.</string>
|
||||
@@ -915,10 +915,4 @@
|
||||
<string name="prefs_speed_cameras_information">Blitzerwarnungen sind in Ländern deaktiviert, in denen Warnungen durch lokale Gesetze verboten sind.</string>
|
||||
<string name="navigation_start_tts_message">"Navigation wird gestartet, Sprache der Sprachansagen: "</string>
|
||||
<string name="navigation_start_tts_disabled_message">Sprachansagen deaktiviert: TTS-Engine nicht verfügbar</string>
|
||||
<string name="download_resources_custom_url_title">Benutzerdefinierter Kartenserver</string>
|
||||
<string name="advanced">Fortgeschritten</string>
|
||||
<string name="download_resources_custom_url_summary_none">Nicht konfiguriert</string>
|
||||
<string name="download_resources_custom_url_message">Standardserver für Kartendownloads überschreiben. Leer lassen, um den CoMaps-Standardserver zu nutzen.</string>
|
||||
<string name="download_resources_custom_url_error_scheme">Bitte eine vollständige URL eingeben, die mit https:// beginnt und mit / endet</string>
|
||||
<string name="download_resources_custom_url_hint">https://cdn-fi-1.comaps.app/</string>
|
||||
</resources>
|
||||
|
||||
@@ -450,7 +450,7 @@
|
||||
<string name="common_check_internet_connection_dialog">Βεβαιωθείτε ότι η συσκευή σας είναι συνδεδεμένη στο Internet.</string>
|
||||
<string name="downloader_no_space_title">Δεν υπάρχει αρκετός χώρος</string>
|
||||
<string name="downloader_no_space_message">Διαγράψτε μη απαραίτητα δεδομένα</string>
|
||||
<string name="editor_login_error_dialog">Σφάλμα σύνδεσης</string>
|
||||
<string name="editor_login_error_dialog">Σφάλμα σύνδεσης.</string>
|
||||
<string name="editor_profile_changes">Επαληθευμένες αλλαγές</string>
|
||||
<string name="editor_focus_map_on_location">Σύρετε το χάρτη για να τοποθετήσετε το σταυρό στη θέση του τόπου ή της επιχείρησης.</string>
|
||||
<string name="editor_edit_place_title">Επεξεργασία</string>
|
||||
@@ -466,9 +466,9 @@
|
||||
<string name="osm_presentation">Δεδομένα OpenStreetMap που δημιουργήθηκαν από την κοινότητα στις %s. Μάθετε περισσότερα για τον τρόπο επεξεργασίας και ενημέρωσης του χάρτη στο OpenStreetMap.org</string>
|
||||
<!-- OSM explanation on Android login screen -->
|
||||
<string name="login_osm_presentation">Το OpenStreetMap.org (OSM) είναι ένα κοινοτικό έργο για τη δημιουργία ενός ελεύθερου και ανοικτού χάρτη. Είναι η κύρια πηγή δεδομένων χάρτη στους CoMaps και λειτουργεί παρόμοια με τη Wikipedia. Μπορείτε να προσθέσετε ή να επεξεργαστείτε τοποθεσίες και αυτές γίνονται διαθέσιμες σε εκατομμύρια χρήστες σε όλο τον κόσμο. \nΕνταχθείτε στην κοινότητα και βοηθήστε να φτιάξουμε έναν καλύτερο χάρτη για όλους!</string>
|
||||
<string name="login_to_make_edits_visible">Δημιουργήστε έναν λογαριασμό OpenStreetMap ή συνδεθείτε για να δημοσιεύσετε τις επεξεργασίες του χάρτη σας στον κόσμο</string>
|
||||
<string name="login_to_make_edits_visible">Δημιουργήστε έναν λογαριασμό OpenStreetMap ή συνδεθείτε για να δημοσιεύσετε τις επεξεργασίες του χάρτη σας στον κόσμο.</string>
|
||||
<!-- Downloaded 10 **of** 20 <- it is that "of" -->
|
||||
<string name="downloader_of">%1$d από %2$d</string>
|
||||
<string name="downloader_of">%1$d/%2$d</string>
|
||||
<string name="download_over_mobile_header">Να γίνει λήψη μέσω δικτύου κινητής τηλεφωνίας;</string>
|
||||
<string name="download_over_mobile_message">Αυτό μπορεί να είναι πολύ ακριβό για μερικά πακέτα ή στην περίπτωση roaming.</string>
|
||||
<string name="error_enter_correct_house_number">Εισαγάγετε έναν έγκυρο αριθμό κτιρίου</string>
|
||||
@@ -491,7 +491,7 @@
|
||||
<string name="editor_category_unsuitable_title">Δεν μπορείτε να βρείτε την κατάλληλη κατηγορία;</string>
|
||||
<string name="editor_category_unsuitable_text">Οι CoMaps επιτρέπουν την προσθήκη απλών κατηγοριών σημείων μόνο, δηλαδή όχι πόλεων, δρόμων, λιμνών, περιγραμμάτων κτιρίων κ.λπ. Παρακαλούμε προσθέστε τέτοιες κατηγορίες απευθείας στο <a href="https://www.openstreetmap.org">OpenStreetMap.org</a>. Ελέγξτε τον <a href="https://www.comaps.app/support/advanced-map-editing/">οδηγό μας</a> για λεπτομερείς οδηγίες βήμα προς βήμα.</string>
|
||||
<string name="downloader_no_downloaded_maps_title">Δεν έχετε κατεβάσει χάρτες</string>
|
||||
<string name="downloader_no_downloaded_maps_message">Κατεβάστε χάρτες για να κάνετε αναζήτηση και να πλοηγηθείτε χωρίς σύνδεση</string>
|
||||
<string name="downloader_no_downloaded_maps_message">Κατεβάστε χάρτες για να αναζητήσετε μια τοποθεσία και να χρησιμοποιήσετε την πλοήγησης χωρίς σύνδεση.</string>
|
||||
<string name="current_location_unknown_error_title">Η τρέχουσα τοποθεσία είναι άγνωστη.</string>
|
||||
<!-- abbreviation for kilometers per hour -->
|
||||
<string name="kilometers_per_hour">χμ/ω</string>
|
||||
@@ -499,7 +499,7 @@
|
||||
<string name="placepage_edit_bookmark_button">Επεξεργασία αγαπημένου</string>
|
||||
<string name="placepage_personal_notes_hint">Προσωπικές σημειώσεις (κείμενο ή html)</string>
|
||||
<string name="editor_reset_edits_message">Απόρριψη όλων των τοπικών αλλαγών;</string>
|
||||
<string name="editor_reset_edits_button">Απόρριψη αλλαγών</string>
|
||||
<string name="editor_reset_edits_button">Απόρριψη</string>
|
||||
<string name="editor_remove_place_message">Διαγραφή της τοποθεσίας που προστέθηκε;</string>
|
||||
<string name="editor_remove_place_button">Διαγραφή</string>
|
||||
<string name="editor_place_doesnt_exist">Η τοποθεσία δεν υπάρχει</string>
|
||||
@@ -825,15 +825,4 @@
|
||||
<string name="panoramax">εικόνα Panoramax</string>
|
||||
<string name="app_site_url">https://comaps.app/</string>
|
||||
<string name="saved">Αποθηκεύτηκε</string>
|
||||
<string name="opens_at">Ανοίγει στις %s</string>
|
||||
<string name="closes_at">Κλείνει στις %s</string>
|
||||
<string name="opens_day_at">Ανοίγει στις %1$s στις %2$s</string>
|
||||
<string name="closes_day_at">Κλείνει στις %1$s στις %2$s</string>
|
||||
<plurals name="minutes_short">
|
||||
<item quantity="one">%d λεπ</item>
|
||||
<item quantity="other">%d λεπ</item>
|
||||
</plurals>
|
||||
<string name="hours_confirmed_time_ago">Επιβεβαιώθηκε %s</string>
|
||||
<string name="existence_confirmed_time_ago">Ύπαρξη επιβεβαιώθηκε %s</string>
|
||||
<string name="editor_building_levels">Όροφοι (με το ισόγειο, χωρίς την ταράτσα)</string>
|
||||
</resources>
|
||||
|
||||
@@ -392,7 +392,7 @@
|
||||
<string name="editor_time_delete">Eliminar horario</string>
|
||||
<!-- Text for allday switch. -->
|
||||
<string name="editor_time_allday">Todo el día (24 horas)</string>
|
||||
<string name="editor_time_open">Apertura</string>
|
||||
<string name="editor_time_open">Abierto</string>
|
||||
<string name="editor_time_close">Cierre</string>
|
||||
<string name="editor_time_add_closed">Añadir horas de pausa</string>
|
||||
<string name="editor_time_title">Horario de apertura</string>
|
||||
@@ -505,7 +505,7 @@
|
||||
<string name="placepage_edit_bookmark_button">Editar marcador</string>
|
||||
<string name="placepage_personal_notes_hint">Notas personales (texto o html)</string>
|
||||
<string name="editor_reset_edits_message">¿Restablecer todos los cambios locales?</string>
|
||||
<string name="editor_reset_edits_button">Descartar cambios</string>
|
||||
<string name="editor_reset_edits_button">Restablecer</string>
|
||||
<string name="editor_remove_place_message">¿Eliminar el lugar añadido?</string>
|
||||
<string name="editor_remove_place_button">Eliminar</string>
|
||||
<string name="editor_place_doesnt_exist">El lugar no existe</string>
|
||||
@@ -922,10 +922,4 @@
|
||||
<string name="prefs_speed_cameras_information">Las advertencias de radares de velocidad están deshabilitadas en países donde las alertas están prohibidas por ley.</string>
|
||||
<string name="navigation_start_tts_message">"Iniciando Navegación, idioma de las instrucciones por voz: "</string>
|
||||
<string name="navigation_start_tts_disabled_message">Instrucciones por voz deshabilitadas: Motor de TTS no disponible</string>
|
||||
<string name="advanced">Avanzado</string>
|
||||
<string name="download_resources_custom_url_title">Servidor de mapas personalizado</string>
|
||||
<string name="download_resources_custom_url_message">Sobreescribe el servidor de mapas por defecto. Deja en blanco para usar el servidor de CoMaps por defecto.</string>
|
||||
<string name="download_resources_custom_url_summary_none">No establecido</string>
|
||||
<string name="download_resources_custom_url_error_scheme">Por favor introduce un URL completo empezando con https:// y terminando con /</string>
|
||||
<string name="download_resources_custom_url_hint">https://cdn-fi-1.comaps.app/</string>
|
||||
</resources>
|
||||
|
||||
@@ -245,16 +245,16 @@
|
||||
<string name="downloader_near_me_subtitle">نزدیک من</string>
|
||||
<!-- In maps downloader and country place page shows how many maps are downloaded / to download, e.g. "Maps: 3 of 10" -->
|
||||
<string name="downloader_status_maps">نقشهها</string>
|
||||
<string name="downloader_download_all_button">بارگیری همه</string>
|
||||
<string name="downloader_downloading">بارگیری میشود:</string>
|
||||
<string name="downloader_download_all_button">دانلود همه</string>
|
||||
<string name="downloader_downloading">درحال دانلود:</string>
|
||||
<!-- Displayed in a dialog that appears when a user tries to delete a map while the app is in the follow route mode -->
|
||||
<string name="downloader_delete_map_while_routing_dialog">برای حذف نقشه لطفا مسیریابی را متوقف کنید</string>
|
||||
<!-- PointsInDifferentMWM -->
|
||||
<string name="routing_failed_cross_mwm_building">تنها مسیرهایی می توانند ایجاد شوند که به طور کامل در یک نقشه از یک منطقه واحد قرار داشته باشند.</string>
|
||||
<!-- Context menu item for downloader. -->
|
||||
<string name="downloader_download_map">بارگیری نقشه</string>
|
||||
<string name="downloader_download_map">دانلود نقشه</string>
|
||||
<!-- Item status in downloader. -->
|
||||
<string name="downloader_retry">تلاش دوباره</string>
|
||||
<string name="downloader_retry">تلاش مجدد</string>
|
||||
<!-- Item in context menu. -->
|
||||
<string name="downloader_delete_map">حذف نقشه</string>
|
||||
<!-- Item in context menu. -->
|
||||
@@ -294,11 +294,11 @@
|
||||
<!-- deep purple color -->
|
||||
<string name="deep_purple">ارغوانی سیر</string>
|
||||
<!-- light blue color -->
|
||||
<string name="light_blue">آبی کمرنگ</string>
|
||||
<string name="light_blue">آبی کمرنگ</string>
|
||||
<!-- cyan color -->
|
||||
<string name="cyan">فیروزهای</string>
|
||||
<!-- teal color -->
|
||||
<string name="teal">سبز دودی</string>
|
||||
<string name="teal">آبی سیر</string>
|
||||
<!-- lime color -->
|
||||
<string name="lime">زرد لیمویی</string>
|
||||
<!-- deep orange color -->
|
||||
@@ -330,7 +330,7 @@
|
||||
<string name="dialog_routing_select_closer_end">لطفا مقصد تعیین شده را نزدیکتر به جاده انتخاب نمایید</string>
|
||||
<string name="dialog_routing_change_intermediate">ناتوان در تعیین نقطه میانی</string>
|
||||
<string name="dialog_routing_intermediate_not_determined">لطفا نقطه میانی را تنظیم کنید</string>
|
||||
<string name="dialog_routing_system_error">ایرنگ سامانه</string>
|
||||
<string name="dialog_routing_system_error">خطای سیستم</string>
|
||||
<string name="dialog_routing_application_error">ناتوان در ایجاد مسیر به علت خطای برنامه</string>
|
||||
<string name="dialog_routing_try_again">لطفا دوباره تلاش کنید</string>
|
||||
<string name="not_now">اکنون خیر</string>
|
||||
@@ -342,7 +342,7 @@
|
||||
<!-- «Show» context menu -->
|
||||
<string name="show">نمایش</string>
|
||||
<!-- «Hide» context menu -->
|
||||
<string name="hide">پنهان کردن</string>
|
||||
<string name="hide">مخفی کردن</string>
|
||||
<string name="categories">دستهبندیها</string>
|
||||
<string name="history">تاریخچه</string>
|
||||
<string name="search_not_found">متاسفانه چیزی پیدا نشد</string>
|
||||
|
||||
@@ -504,7 +504,7 @@
|
||||
<string name="placepage_edit_bookmark_button">Muokkaa kirjanmerkkiä</string>
|
||||
<string name="placepage_personal_notes_hint">Henkilökohtaiset merkinnät (teksti tai html)</string>
|
||||
<string name="editor_reset_edits_message">Nollataanko kaikki paikalliset muutokset?</string>
|
||||
<string name="editor_reset_edits_button">Hylkää muutokset</string>
|
||||
<string name="editor_reset_edits_button">Nollaa</string>
|
||||
<string name="editor_remove_place_message">Poistetaanko lisätty paikka?</string>
|
||||
<string name="editor_remove_place_button">Poista</string>
|
||||
<string name="editor_place_doesnt_exist">Paikkaa ei ole olemassa</string>
|
||||
@@ -815,7 +815,7 @@
|
||||
<!-- preference string for using auto theme only in navigation mode -->
|
||||
<string name="nav_auto">Automaattinen navigointi</string>
|
||||
<string name="level_value_generic">Kerros: %s</string>
|
||||
<string name="share_bookmarks_email_body">Hei!\n\nLiitteenä kirjanmerkkini. Avaa ne CoMaps-sovelluksella. Jos sinulla ei ole vielä sovellusta, voit ladata sen osoitteesta: https://www.comaps.app/download/\n\nNauti matkustamisesta CoMapsin kanssa!</string>
|
||||
<string name="share_bookmarks_email_body">Hei! \n\nLiitteenä ovat kirjamerkkini; Avaa ne CoMaps -sovelluksessa. Mikäli sinulla ei ole vielä sovellusta asennettuna, voit ladata sen osoitteesta: https://www.comaps.app/download/ \n\nNauti matkustamisesta CoMaps:n kanssa!</string>
|
||||
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
|
||||
<string name="translated_om_site_url">https://comaps.app/fi/</string>
|
||||
<string name="osm_wiki_about_url">https://wiki.openstreetmap.org/wiki/About_OpenStreetMap</string>
|
||||
@@ -911,11 +911,4 @@
|
||||
<string name="prefs_speed_cameras_information">Nopeuskameravaroitukset on poistettu käytöstä niissä maissa, missä varoitukset on kielletty lain nojalla.</string>
|
||||
<string name="power_management">Virranhallinta</string>
|
||||
<string name="navigation_start_tts_message">"Käynnistetään navigointi, ääniohjeistuksen kieli: "</string>
|
||||
<string name="advanced">Lisäasetukset</string>
|
||||
<string name="download_resources_custom_url_title">Mukautettu karttapalvelin</string>
|
||||
<string name="download_resources_custom_url_summary_none">Ei asetettu</string>
|
||||
<string name="download_resources_custom_url_error_scheme">Kirjoita täysi URL-osoite alkaeh https:// ja päättyen /</string>
|
||||
<string name="download_resources_custom_url_message">Ohita karttalatausten oletuspalvelin. Jätä tyhjäksi käyttääksesi CoMapsin oletuspalvelinta.</string>
|
||||
<string name="navigation_start_tts_disabled_message">Ääniohjeistukset pois käytöstä: TTS-moottori ei saatavilla</string>
|
||||
<string name="charge_socket_schuko">EU</string>
|
||||
</resources>
|
||||
|
||||
@@ -506,7 +506,7 @@
|
||||
<string name="placepage_edit_bookmark_button">Modifier le signet</string>
|
||||
<string name="placepage_personal_notes_hint">Notes personnelles (texte ou html)</string>
|
||||
<string name="editor_reset_edits_message">Abandonner toutes les modifications locales ?</string>
|
||||
<string name="editor_reset_edits_button">Annuler les modifications</string>
|
||||
<string name="editor_reset_edits_button">Ignorer</string>
|
||||
<string name="editor_remove_place_message">Supprimer le lieu ajouté ?</string>
|
||||
<string name="editor_remove_place_button">Supprimer</string>
|
||||
<string name="editor_place_doesnt_exist">Ce lieu n’existe pas</string>
|
||||
@@ -921,10 +921,4 @@
|
||||
<string name="prefs_speed_cameras_information">Les avertissements relatifs aux radars de vitesse sont désactivés dans les pays où les alertes sont interdites par la législation locale.</string>
|
||||
<string name="navigation_start_tts_message">"Navigation de démarrage, langue des instructions vocales : "</string>
|
||||
<string name="navigation_start_tts_disabled_message">Instructions vocales désactivées : moteur de synthèse vocale non disponible</string>
|
||||
<string name="advanced">Avancé</string>
|
||||
<string name="download_resources_custom_url_summary_none">Non défini</string>
|
||||
<string name="download_resources_custom_url_hint">https://cdn-fi-1.comaps.app/</string>
|
||||
<string name="download_resources_custom_url_title">Serveur de cartes personnalisé</string>
|
||||
<string name="download_resources_custom_url_error_scheme">Veuillez saisir une URL complète débutant par https:// et se terminant par /</string>
|
||||
<string name="download_resources_custom_url_message">Serveur pour télécharger les cartes. Laissez vide pour utiliser le serveur par défaut CoMaps.</string>
|
||||
</resources>
|
||||
|
||||
@@ -498,7 +498,7 @@
|
||||
<string name="placepage_edit_bookmark_button">Modifica luogo preferito</string>
|
||||
<string name="placepage_personal_notes_hint">Note personali (testo o html)</string>
|
||||
<string name="editor_reset_edits_message">Cancellare tutte le modifiche locali?</string>
|
||||
<string name="editor_reset_edits_button">Scarta modifiche</string>
|
||||
<string name="editor_reset_edits_button">Cancella</string>
|
||||
<string name="editor_remove_place_message">Eliminare il luogo aggiunto?</string>
|
||||
<string name="editor_remove_place_button">Elimina</string>
|
||||
<string name="editor_place_doesnt_exist">Il luogo non esiste</string>
|
||||
@@ -906,10 +906,4 @@
|
||||
<string name="navigation_start_tts_disabled_message">Istruzioni vocali disabilitate: TTS non disponibile</string>
|
||||
<string name="prefs_speed_cameras_information">Gli avvisi di Autovelox sono disabilitati dove proibito dalla legge locale.</string>
|
||||
<string name="navigation_start_tts_message">"Inizio Navigazione, lingua per istruzioni vocali: "</string>
|
||||
<string name="download_resources_custom_url_error_scheme">Aggiungere un URL che inizia con https:// e finisce con /</string>
|
||||
<string name="download_resources_custom_url_summary_none">Non impostato</string>
|
||||
<string name="download_resources_custom_url_hint">https://cdn-fi-1.comaps.app/</string>
|
||||
<string name="download_resources_custom_url_message">Sovrascrivi il server da cui scaricare le mappe. Lascia vuoto per usare i server default di CoMaps.</string>
|
||||
<string name="download_resources_custom_url_title">Server mappe personalizzato</string>
|
||||
<string name="advanced">Avanzate</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
</resources>
|
||||
@@ -491,7 +491,7 @@
|
||||
<string name="placepage_edit_bookmark_button">Taisyti žymę</string>
|
||||
<string name="placepage_personal_notes_hint">Asmeninės pastabos (tekstas arba HTML)</string>
|
||||
<string name="editor_reset_edits_message">Anuliuoti visus vietinius pakeitimus?</string>
|
||||
<string name="editor_reset_edits_button">Atsisakyti pakeitimų</string>
|
||||
<string name="editor_reset_edits_button">Anuliuoti</string>
|
||||
<string name="editor_remove_place_message">Šalinti pridėtą vietą?</string>
|
||||
<string name="editor_remove_place_button">Šalinti</string>
|
||||
<string name="editor_place_doesnt_exist">Ši vieta neegzistuoja</string>
|
||||
@@ -804,7 +804,7 @@
|
||||
<string name="telegram_url">https://t.me/CoMapsApp/</string>
|
||||
<string name="instagram_url">https://www.instagram.com/comaps.app/</string>
|
||||
<string name="panoramax">Panoramax vaizdas</string>
|
||||
<string name="saved">Įrašyta</string>
|
||||
<string name="saved">Išsaugota</string>
|
||||
<string name="ruler">Liniuotė</string>
|
||||
<string name="pref_left_button_title">Kairiojo mygtuko funkcija</string>
|
||||
<string name="pref_backup_now_summary_empty_lists">Neturite jokių žymių ar trasų atsarginei kopijai sudaryti</string>
|
||||
@@ -818,7 +818,7 @@
|
||||
<string name="error_enter_correct_level">Įveskite leistiną aukšto numerį</string>
|
||||
<string name="error_enter_correct_bluesky_page">Įveskite galiojantį „Bluesky“ paskyros vardą ar tinklalapio adresą</string>
|
||||
<string name="error_enter_correct_fediverse_page">Įveskite galiojantį „Mastodon“ paskyros vardą ar tinklalapio adresą</string>
|
||||
<string name="pref_left_button_disable">Mygtuko nerodyti</string>
|
||||
<string name="pref_left_button_disable">Mygtukas nerodomas</string>
|
||||
<string name="pref_backup_summary">Automatinis atsarginių kopijų rašymas į pasirinktą aplanką</string>
|
||||
<string name="pref_backup_now_title">Įrašyti dabar</string>
|
||||
<string name="pref_backup_now_summary_progress">Atsarginė kopija įrašoma…</string>
|
||||
@@ -888,18 +888,4 @@
|
||||
<string name="power_management">Energijos naudojimas</string>
|
||||
<string name="charge_socket_schuko">Buitinis ES</string>
|
||||
<string name="list_description_empty">Paredaguokite sąrašą ir pridėkite aprašymą</string>
|
||||
<string name="place_page_map_too_old_title">Žemėlapio duomenys pasenę</string>
|
||||
<string name="place_page_map_too_old_description">Jūsų naudojami žemėlapio duomenys senstelėję, prašom atnaujinti žemėlapį.</string>
|
||||
<string name="place_page_app_too_old_description">Jūsų naudojami žemėlapio duomenys stipriai pasenę, prašom atnaujinti „CoMaps“ programą.</string>
|
||||
<string name="place_page_update_too_old_map">Atnaujinti regiono žemėlapį</string>
|
||||
<string name="place_page_too_old_to_edit">„OpenStreetMap“ žemėlapio redagavimas negalimas, nes žemėlapio duomenys per seni.</string>
|
||||
<string name="prefs_speed_cameras_information">Įspėjimai apie greičio matuoklius negalimi šalyse, kuriose tai draudžiama įstatymu.</string>
|
||||
<string name="navigation_start_tts_message">"Pradedama navigacija, balso instrukcijų kalba: "</string>
|
||||
<string name="navigation_start_tts_disabled_message">Balso instrukcijos išjungtos: šnekos sintezės sistema neprieinama</string>
|
||||
<string name="advanced">Kita</string>
|
||||
<string name="download_resources_custom_url_title">Pasirinktinis žemėlapių serveris</string>
|
||||
<string name="download_resources_custom_url_message">Žemėlapiams parsisiųsti galite nurodyti kitą, nei numatytasis, serverį. Palikite lauką tuščią, jei norite naudoti numatytąjį „CoMaps“ serverį.</string>
|
||||
<string name="download_resources_custom_url_hint">https://cdn-fi-1.comaps.app/</string>
|
||||
<string name="download_resources_custom_url_summary_none">Nenurodytas</string>
|
||||
<string name="download_resources_custom_url_error_scheme">Įveskite visą URL adresą, pradedant „https://“ ir baigiant „/“</string>
|
||||
</resources>
|
||||
|
||||
@@ -499,7 +499,7 @@
|
||||
<string name="placepage_edit_bookmark_button">Rediģēt grāmatzīmi</string>
|
||||
<string name="placepage_personal_notes_hint">Personīgi pieraksti (teksts vai HTML)</string>
|
||||
<string name="editor_reset_edits_message">Vai izmest visas lokāli saglabātās izmaiņas?</string>
|
||||
<string name="editor_reset_edits_button">Atmest izmaiņas</string>
|
||||
<string name="editor_reset_edits_button">Noraidīt</string>
|
||||
<string name="editor_remove_place_message">Vai dzēst pievienoto vietu?</string>
|
||||
<string name="editor_remove_place_button">Dzēst</string>
|
||||
<string name="editor_place_doesnt_exist">Vieta nepastāv</string>
|
||||
@@ -853,13 +853,4 @@
|
||||
<string name="navigation_start_tts_disabled_message">Balss norādes atspējotas: nav pieejams teksta pārveidošanas runā dzinējs</string>
|
||||
<string name="prefs_speed_cameras_information">Brīdinājumi par ātruma noteikšanas kamerā ir atspējoti valstīs, kurās šādus brīdinājumus aizliedz vietējais likums.</string>
|
||||
<string name="navigation_start_tts_message">"Uzsāk navigāciju, balss norāžu valoda: "</string>
|
||||
<string name="download_resources_custom_url_hint">https://cdn-fi-1.comaps.app/</string>
|
||||
<string name="download_resources_custom_url_summary_none">Nav iestatīts</string>
|
||||
<string name="download_resources_custom_url_error_scheme">Lūgums ievadīt pilnu URL, kas sākas ar https:// un beidzas ar /</string>
|
||||
<string name="advanced">Iestatījumi: izvērsta kopa</string>
|
||||
<plurals name="minutes_short">
|
||||
<item quantity="zero">%d min.</item>
|
||||
<item quantity="one">%d min.</item>
|
||||
<item quantity="other">%d min.</item>
|
||||
</plurals>
|
||||
</resources>
|
||||
|
||||
@@ -732,7 +732,7 @@
|
||||
<!-- App tip #01 -->
|
||||
<string name="app_tip_01">Med dine donasjoner og støtte kan vi lage de beste kartene i verden!</string>
|
||||
<!-- App tip #02 -->
|
||||
<string name="app_tip_02">Liker du appen vår? Vennligst doner for å støtte utviklingen! Liker du den ikke ennå? La oss få vite hvorfor, så fikser vi det!</string>
|
||||
<string name="app_tip_02">Liker du appen vår? Vennligst doner for å støtte utviklingen! Liker du det ikke ennå? Gi oss beskjed, så fikser vi det!</string>
|
||||
<!-- App tip #03 -->
|
||||
<string name="app_tip_03">Hvis du kjenner en programvareutvikler, kan du be ham eller henne implementere en funksjon du trenger.</string>
|
||||
<!-- App tip #04 -->
|
||||
@@ -746,7 +746,7 @@
|
||||
<!-- App tip #08 -->
|
||||
<string name="app_tip_08">Du kan enkelt fikse og forbedre kartdataene.</string>
|
||||
<!-- App tip #09 -->
|
||||
<string name="app_tip_09">Vårt hovedmål er å lage raske, personvernfokuserte, brukervennlige kart som du vil like.</string>
|
||||
<string name="app_tip_09">Vårt hovedmål er å bygge raske, personvernfokuserte, brukervennlige kart som du vil elske.</string>
|
||||
<!-- Text on the Android Auto or CarPlay placeholder screen that maps are displayed on the phone screen -->
|
||||
<string name="car_used_on_the_phone_screen">Du bruker nå CoMaps på telefonskjermen</string>
|
||||
<!-- Text on the phone placeholder screen that maps are displayed on the car screen -->
|
||||
|
||||
@@ -84,10 +84,10 @@
|
||||
<item name="transitRulerBackground">@color/white_4</item>
|
||||
<item name="transitStepDivider">@drawable/dot_divider</item>
|
||||
<item name="accentColorSelector">@color/accent_color_selector</item>
|
||||
<item name="android:textAppearance">@style/MwmTextAppearance.Body3</item>
|
||||
<item name="android:textAppearanceSmall">@style/MwmTextAppearance.Body4</item>
|
||||
<item name="android:textAppearanceMedium">@style/MwmTextAppearance.Body2</item>
|
||||
<item name="android:textAppearanceLarge">@style/MwmTextAppearance.Body1</item>
|
||||
<item name="android:textAppearance">@style/TextAppearance</item>
|
||||
<item name="android:textAppearanceSmall">@style/TextAppearance.Small</item>
|
||||
<item name="android:textAppearanceMedium">@style/TextAppearance.Medium</item>
|
||||
<item name="android:textAppearanceLarge">@style/TextAppearance.Large</item>
|
||||
<item name="drivingOptionsViewBg">@color/bg_primary_dark</item>
|
||||
<item name="elevationProfilePropertyBg">@drawable/bg_rounded_rect</item>
|
||||
<item name="elevationProfilePropIconTint">@color/white_secondary</item>
|
||||
@@ -150,8 +150,6 @@
|
||||
<item name="colorSurfaceContainer">@color/md_theme_surfaceContainer</item>
|
||||
<item name="colorSurfaceContainerHigh">@color/md_theme_surfaceContainerHigh</item>
|
||||
<item name="colorSurfaceContainerHighest">@color/md_theme_surfaceContainerHighest</item>
|
||||
|
||||
<item name="appBackground">?android:attr/colorBackground</item>
|
||||
</style>
|
||||
|
||||
<style name="MwmTheme" parent="MwmTheme.Base"/>
|
||||
|
||||
@@ -501,7 +501,7 @@
|
||||
<string name="placepage_edit_bookmark_button">Bladwijzer bewerken</string>
|
||||
<string name="placepage_personal_notes_hint">Persoonlijke aantekeningen (tekst of html)</string>
|
||||
<string name="editor_reset_edits_message">Alle lokale wijzigingen weggooien?</string>
|
||||
<string name="editor_reset_edits_button">Wijzigingen weggooien</string>
|
||||
<string name="editor_reset_edits_button">Gooi weg</string>
|
||||
<string name="editor_remove_place_message">Toegevoegde locatie verwijderen?</string>
|
||||
<string name="editor_remove_place_button">Verwijder</string>
|
||||
<string name="editor_place_doesnt_exist">Locatie bestaat niet</string>
|
||||
@@ -915,10 +915,4 @@
|
||||
<string name="place_page_app_too_old_description">Uw huidige kaartgegevens zijn erg oud. Update de CoMaps-app.</string>
|
||||
<string name="place_page_update_too_old_map">Kaart regio bijwerken</string>
|
||||
<string name="place_page_too_old_to_edit">Het bewerken van OpenStreetMap is uitgeschakeld omdat de kaartgegevens te oud zijn.</string>
|
||||
<string name="advanced">Geavanceerd</string>
|
||||
<string name="download_resources_custom_url_title">Aangepaste server voor kaarten</string>
|
||||
<string name="download_resources_custom_url_message">Overschrijf de standaard kaartdownloadserver die wordt gebruikt voor kaartdownloads. Laat leeg om de standaardserver van CoMaps te gebruiken.</string>
|
||||
<string name="download_resources_custom_url_hint">https://cdn-fi-1.comaps.app/</string>
|
||||
<string name="download_resources_custom_url_summary_none">Niet ingesteld</string>
|
||||
<string name="download_resources_custom_url_error_scheme">Voer een volledige URL in, beginnend met https:// en eindigend met /</string>
|
||||
</resources>
|
||||
|
||||
@@ -494,7 +494,7 @@
|
||||
<string name="placepage_edit_bookmark_button">Editar favorito</string>
|
||||
<string name="placepage_personal_notes_hint">Notas pessoais (texto ou html)</string>
|
||||
<string name="editor_reset_edits_message">Eliminar todas as alterações locais?</string>
|
||||
<string name="editor_reset_edits_button">Descartar alterações</string>
|
||||
<string name="editor_reset_edits_button">Eliminar</string>
|
||||
<string name="editor_remove_place_message">Eliminar o local adicionado?</string>
|
||||
<string name="editor_remove_place_button">Eliminar</string>
|
||||
<string name="editor_place_doesnt_exist">O local não existe</string>
|
||||
|
||||
@@ -457,7 +457,7 @@
|
||||
<string name="editor_report_problem_other_title">Altă problemă</string>
|
||||
<string name="message_invalid_feature_position">Niciun obiect nu poate fi poziționat aici</string>
|
||||
<!-- Text in About and OSM Login screens. First %@ is replaced by a local, human readable date. -->
|
||||
<string name="osm_presentation">Date OpenStreetMap create de comunitate din data de %s. Aflați mai multe despre cum să editați și să actualizați harta la OpenStreetMap.org</string>
|
||||
<string name="osm_presentation">Date OpenStreetMap create de comunitate la data de %s. Aflați mai multe despre cum să editați și să actualizați harta la OpenStreetMap.org</string>
|
||||
<!-- OSM explanation on Android login screen -->
|
||||
<string name="login_osm_presentation">OpenStreetMap.org (OSM) este un proiect comunitar pentru construirea unei hărți libere și deschise. Este principala sursă de date cartografice în CoMaps și funcționează similar cu Wikipedia. Puteți adăuga sau edita locuri, iar acestea devin disponibile pentru milioane de utilizatori din întreaga lume. \nAlăturați-vă comunității și ajutați la crearea unei hărți mai bune pentru toată lumea!</string>
|
||||
<string name="login_to_make_edits_visible">Creați un cont OpenStreetMap sau conectați-vă pentru a vă publica editările hărții pentru întreaga lume</string>
|
||||
@@ -497,7 +497,7 @@
|
||||
<string name="placepage_edit_bookmark_button">Modifică locul preferat</string>
|
||||
<string name="placepage_personal_notes_hint">Însemnări personale (text sau html)</string>
|
||||
<string name="editor_reset_edits_message">Ștergi toate modificările locale?</string>
|
||||
<string name="editor_reset_edits_button">Renunță la modificări</string>
|
||||
<string name="editor_reset_edits_button">Renunță</string>
|
||||
<string name="editor_remove_place_message">Elimini locul adăugat?</string>
|
||||
<string name="editor_remove_place_button">Elimină</string>
|
||||
<string name="editor_place_doesnt_exist">Locul nu există</string>
|
||||
@@ -892,15 +892,10 @@
|
||||
<string name="place_page_map_too_old_title">Harta este prea veche</string>
|
||||
<string name="place_page_map_too_old_description">Harta dvs. este foarte veche, vă rugăm actualizați-o.</string>
|
||||
<string name="place_page_app_too_old_description">Harta dvs. este foarte veche, vă rugăm actualizați CoMaps.</string>
|
||||
<string name="place_page_update_too_old_map">Actualizează regiunea</string>
|
||||
<string name="place_page_update_too_old_map">Actualizează harta</string>
|
||||
<string name="place_page_too_old_to_edit">Editarea OpenStreetMap este dezactivată pentru că harta descărcată este prea veche.</string>
|
||||
<string name="prefs_speed_cameras_information">Avertizările pentru radare sunt dezactivate unde avertizarea este interzisă de legea locală.</string>
|
||||
<string name="navigation_start_tts_disabled_message">Instrucțiuni vocale dezactivate: Nu este disponibil niciun sistem TTS</string>
|
||||
<string name="charge_socket_count">Număr</string>
|
||||
<string name="unknown_count">Necunoscut</string>
|
||||
<string name="download_resources_custom_url_error_scheme">Introduceți o adresă completă care începe cu https:// și se termină cu /</string>
|
||||
<string name="download_resources_custom_url_summary_none">Nesetat</string>
|
||||
<string name="download_resources_custom_url_title">Server hărți custom</string>
|
||||
<string name="download_resources_custom_url_message">Înlocuiți serverul prestabilit folosit pentru descărcarea hărților. Lăsați liber pentru serverul prestabilit.</string>
|
||||
<string name="advanced">Avansate</string>
|
||||
</resources>
|
||||
|
||||
@@ -507,7 +507,7 @@
|
||||
<string name="placepage_edit_bookmark_button">Редактировать метку</string>
|
||||
<string name="placepage_personal_notes_hint">Примечание (текст или html)</string>
|
||||
<string name="editor_reset_edits_message">Сбросить все локальные правки?</string>
|
||||
<string name="editor_reset_edits_button">Отменить изменения</string>
|
||||
<string name="editor_reset_edits_button">Сбросить</string>
|
||||
<string name="editor_remove_place_message">Удалить добавленный вами объект?</string>
|
||||
<string name="editor_remove_place_button">Удалить</string>
|
||||
<string name="editor_place_doesnt_exist">Места не существует</string>
|
||||
|
||||
@@ -328,7 +328,7 @@
|
||||
<string name="placepage_edit_bookmark_button">Uredi zaznamek</string>
|
||||
<string name="placepage_personal_notes_hint">Osebne opombe (golo besedilo ali HTML)</string>
|
||||
<string name="editor_reset_edits_message">Naj zavržem vse krajevne spremembe?</string>
|
||||
<string name="editor_reset_edits_button">Zavrzi spremembe</string>
|
||||
<string name="editor_reset_edits_button">Zavrzi</string>
|
||||
<string name="editor_remove_place_message">Naj izbrišem dodane kraje?</string>
|
||||
<string name="editor_remove_place_button">Izbriši</string>
|
||||
<string name="editor_place_doesnt_exist">Kraj ne obstaja</string>
|
||||
@@ -657,10 +657,4 @@
|
||||
<string name="navigation_start_tts_disabled_message">Glasovni napotki so onemogočeni: ustvarjalec glasu (TTS) ni na voljo</string>
|
||||
<string name="charge_socket_schuko">standardna evropska vtičnica (Schuko)</string>
|
||||
<string name="list_description_empty">Uredite seznam, da dodate opis</string>
|
||||
<string name="advanced">Napredno</string>
|
||||
<string name="download_resources_custom_url_title">Strežnik zemljevida po meri</string>
|
||||
<string name="download_resources_custom_url_message">Prepiši privzeti strežnik za prenos zemljevidov, ki se uporablja za prenos zemljevidov. Pustite prazno, če želite uporabiti privzeti strežnik CoMaps.</string>
|
||||
<string name="download_resources_custom_url_summary_none">Ni nastavljeno</string>
|
||||
<string name="download_resources_custom_url_error_scheme">Prosimo, vnesite polni URL, ki se začne z https:// in konča z /</string>
|
||||
<string name="download_resources_custom_url_hint">https://cdn-fi-1.comaps.app/</string>
|
||||
</resources>
|
||||
|
||||
@@ -494,7 +494,7 @@
|
||||
<string name="placepage_more_button">Више</string>
|
||||
<string name="placepage_edit_bookmark_button">Измени маркер</string>
|
||||
<string name="editor_reset_edits_message">Брисање свих измена које нису послате?</string>
|
||||
<string name="editor_reset_edits_button">Одбаци промене</string>
|
||||
<string name="editor_reset_edits_button">Обриши</string>
|
||||
<string name="editor_remove_place_message">Брисање додатог места?</string>
|
||||
<string name="editor_remove_place_button">Обриши</string>
|
||||
<string name="editor_place_doesnt_exist">Место не постоји</string>
|
||||
@@ -904,20 +904,4 @@
|
||||
<string name="editor_mark_business_vacant_title">Означи пословни простор као празан</string>
|
||||
<string name="editor_mark_business_vacant_description">Користите да бисте назначили да се фирма иселила и да је пословни простор празан и спреман да прими новог закупца.</string>
|
||||
<string name="editor_submit">Пошаљи</string>
|
||||
<string name="place_page_map_too_old_title">Мапе су застареле</string>
|
||||
<string name="place_page_map_too_old_description">Мапе су старе, преузмите нове.</string>
|
||||
<string name="place_page_app_too_old_description">Мапе су веома старе, преузмите нову везију CoMaps апликације.</string>
|
||||
<string name="place_page_update_too_old_map">Ажурирање регионалних мапа</string>
|
||||
<string name="place_page_too_old_to_edit">Уређивање OpenStreetMap-а је онемогућено јер су подаци мапе сувише стари.</string>
|
||||
<string name="prefs_speed_cameras_information">Упозорења о прекршајним камерама за брзину су онемогућена у земљама у којима су упозорења забрањена законом.</string>
|
||||
<string name="power_management">Управљање напајањем</string>
|
||||
<string name="navigation_start_tts_message">"Покретање навигације, језик гласовних инструкција: "</string>
|
||||
<string name="navigation_start_tts_disabled_message">Гласовне инструкције онемогућене: ТТС мотор није доступан</string>
|
||||
<string name="charge_socket_schuko">Шухо</string>
|
||||
<string name="advanced">Напредно</string>
|
||||
<string name="download_resources_custom_url_title">Сопствени сервер мапа</string>
|
||||
<string name="download_resources_custom_url_message">Замени подразумевани сервер за преузимање мапа који се користи за преузимања мапа. Оставите празно да бисте користили CoMaps сервер.</string>
|
||||
<string name="download_resources_custom_url_hint">https://cdn-fi-1.comaps.app/</string>
|
||||
<string name="download_resources_custom_url_summary_none">Није постављено</string>
|
||||
<string name="download_resources_custom_url_error_scheme">Унесите пуну УРЛ адресу која почиње са https:// и која се завршава са /</string>
|
||||
</resources>
|
||||
|
||||
@@ -858,7 +858,7 @@
|
||||
<string name="ruler">Cetvel</string>
|
||||
<string name="bookmark_color">Yer imi rengi</string>
|
||||
<string name="open_now">Şu an açık</string>
|
||||
<string name="closed_now">Şu anda kapalı</string>
|
||||
<string name="closed_now">Şimdi kapandı</string>
|
||||
<string name="at">%s\'da</string>
|
||||
<string name="pref_backup_title">Yer imleri ve izlerin yedeği</string>
|
||||
<string name="dialog_report_error_with_logs">Lütfen bize hata raporu yollayın:\n - Ayarlardan \"Günlüğe kaydetmeyi etkinleştir\" \n - hatayı tekrarlayın\n - \"Hakkında ve Yardım\" ekranında \"Hata Bildir\" düğmesine basın ve e-posta veya sohbet yoluyla gönderin\n - günlüğe kaydetmeyi devre dışı bırak</string>
|
||||
|
||||
@@ -27,9 +27,9 @@
|
||||
<item>type2_combo</item>
|
||||
<item>nacs</item>
|
||||
<item>chademo</item>
|
||||
<item>type2</item>
|
||||
<item>type2_cable</item>
|
||||
<item>type1</item>
|
||||
<item>type2_cable</item>
|
||||
<item>type2</item>
|
||||
<item>schuko</item>
|
||||
<item>unknown</item>
|
||||
</string-array>
|
||||
|
||||
@@ -66,4 +66,13 @@
|
||||
</declare-styleable>
|
||||
|
||||
<attr name="accentColorSelector" format="color"/>
|
||||
<attr name="bookingFilterTitleColor" format="color"/>
|
||||
<attr name="adsRemovalOptionsBg" format="reference"/>
|
||||
<attr name="adsRemovalOptionsDivider" format="color"/>
|
||||
<attr name="icClearRounded" format="reference"/>
|
||||
<attr name="bookmarkSubscriptionScreenBg" format="reference"/>
|
||||
<attr name="bookmarkSubscriptionCardEdge" format="reference"/>
|
||||
<attr name="bookmarkSubscriptionCardBg" format="color"/>
|
||||
<attr name="bookmarkSubscriptionCardTextColor" format="color"/>
|
||||
<attr name="imgPromoBookingTitle" format="reference"/>
|
||||
</resources>
|
||||
|
||||
@@ -64,7 +64,6 @@
|
||||
<color name="bg_cards">@android:color/white</color>
|
||||
<color name="bg_panel">@color/bg_window</color>
|
||||
<color name="bg_primary_dark">#37653F</color> <!-- secondary dark -->
|
||||
<color name="bg_app">@android:color/white</color>
|
||||
|
||||
<color name="bg_dialog_translucent">#BB000000</color>
|
||||
<color name="bg_text_translucent">#99FFFFFF</color>
|
||||
|
||||
@@ -35,6 +35,11 @@
|
||||
<string name="pref_settings_general" translatable="false">GeneralSettings</string>
|
||||
<string name="pref_navigation" translatable="false">Navigation</string>
|
||||
<string name="pref_information" translatable="false">Information</string>
|
||||
<string name="pref_traffic" translatable="false">Traffic</string>
|
||||
<string name="pref_traffic_http_enabled" translatable="false">TrafficHttpEnabled</string>
|
||||
<string name="pref_traffic_http_url" translatable="false">TrafficHttpUrl</string>
|
||||
<string name="pref_traffic_apps" translatable="false">TrafficApps</string>
|
||||
<string name="pref_traffic_legacy_enabled" translatable="false">TrafficLegacyEnabled</string>
|
||||
<string name="pref_transliteration" translatable="false">Transliteration</string>
|
||||
<string name="pref_power_management" translatable="false">PowerManagment</string>
|
||||
<string name="pref_keep_screen_on" translatable="false">KeepScreenOn</string>
|
||||
|
||||
@@ -215,6 +215,7 @@
|
||||
<!-- Settings information group in settings screen -->
|
||||
<string name="prefs_group_information">Information</string>
|
||||
<string name="prefs_group_route">Navigation</string>
|
||||
<string name="prefs_group_traffic">Traffic information</string>
|
||||
<string name="pref_zoom_title">Zoom buttons</string>
|
||||
<string name="pref_zoom_summary">Display on the map</string>
|
||||
<!-- Settings «Map» category: «Night style» title -->
|
||||
@@ -799,6 +800,24 @@
|
||||
<string name="enable_show_on_lock_screen_description">When enabled, the app will work on the lockscreen even when the device is locked.</string>
|
||||
<!-- Current language of the map! -->
|
||||
<string name="change_map_locale">Map language</string>
|
||||
<!-- Enable live traffic data via HTTP (title) -->
|
||||
<string name="traffic_http_enabled">Enable live traffic data</string>
|
||||
<!-- Enable live traffic data via HTTP (description) -->
|
||||
<string name="traffic_http_enabled_description">When enabled, the app will periodically retrieve traffic information from the configured URL.</string>
|
||||
<!-- URL for live traffic data -->
|
||||
<string name="traffic_http_url">Traffic service URL</string>
|
||||
<!-- Status message indicating that user did not set a traffic URL yet. -->
|
||||
<string name="traffic_http_url_not_set">Not set</string>
|
||||
<!-- TraFF 0.8 apps from which to receive data (title) -->
|
||||
<string name="traffic_apps">Use data from TraFF applications</string>
|
||||
<!-- Status message indicating that no TraFF 0.8 apps are installed -->
|
||||
<string name="traffic_apps_not_available">No apps installed</string>
|
||||
<!-- Status message indicating that no TraFF 0.8 apps are currently selected -->
|
||||
<string name="traffic_apps_none_selected">No apps salected</string>
|
||||
<!-- Enable traffic data from TraFF 0.7 apps (title) -->
|
||||
<string name="traffic_legacy_enabled">Use data from legacy TraFF applications</string>
|
||||
<!-- Enable traffic data from TraFF 0.7 apps (description) -->
|
||||
<string name="traffic_legacy_enabled_description">When enabled, the app will receive and process traffic data from legacy TraFF applications.</string>
|
||||
<!-- OpenStreetMap text on splash screen -->
|
||||
<string name="splash_subtitle">Map data from OpenStreetMap</string>
|
||||
<!-- Telegram group url for the "?" About page -->
|
||||
|
||||
@@ -15,6 +15,11 @@
|
||||
<item name="android:textStyle">bold</item>
|
||||
</style>
|
||||
|
||||
<style name="MwmTextAppearance.Title.Toolbar">
|
||||
<item name="android:textSize">@dimen/text_size_toolbar</item>
|
||||
<item name="android:fontFamily">@string/robotoMedium</item>
|
||||
</style>
|
||||
|
||||
<style name="MwmTextAppearance.Headline">
|
||||
<item name="android:textSize">@dimen/text_size_headline</item>
|
||||
<item name="android:textColor">?android:textColorPrimary</item>
|
||||
@@ -116,6 +121,10 @@
|
||||
<item name="android:textColor">@color/bg_cards</item>
|
||||
</style>
|
||||
|
||||
<style name="MwmTextAppearance.Toolbar.Title.Button">
|
||||
<item name="android:textSize">@dimen/text_size_body_3</item>
|
||||
</style>
|
||||
|
||||
<style name="MwmTextAppearance.NavMenu">
|
||||
<item name="android:textStyle">bold</item>
|
||||
</style>
|
||||
|
||||
@@ -148,6 +148,11 @@
|
||||
<item name="buttonGravity">center_vertical</item>
|
||||
</style>
|
||||
|
||||
<style name="MwmWidget.ToolbarStyle.Light">
|
||||
<item name="android:titleTextAppearance">@style/MwmTextAppearance.Toolbar.Title.Light</item>
|
||||
<item name="titleTextAppearance">@style/MwmTextAppearance.Toolbar.Title.Light</item>
|
||||
</style>
|
||||
|
||||
<style name="MwmWidget.ToolbarStyle.NoElevation">
|
||||
<item name="android:elevation">0dp</item>
|
||||
</style>
|
||||
@@ -159,6 +164,29 @@
|
||||
<item name="iconTint">@color/white_primary</item>
|
||||
</style>
|
||||
|
||||
<style name="MwmWidget.ToolbarTheme.Light" parent="MwmWidget.ToolbarTheme">
|
||||
<item name="android:gravity">center_vertical</item>
|
||||
<item name="colorAccent">@android:color/white</item>
|
||||
<item name="colorSecondary">#FF32363A</item>
|
||||
</style>
|
||||
|
||||
<style name="MwmWidget.ToolbarTheme.Transparent" parent="ThemeOverlay.Material3.Dark.ActionBar">
|
||||
<item name="android:gravity">center_vertical</item>
|
||||
<item name="colorAccent">@android:color/white</item>
|
||||
<item name="colorSecondary">@android:color/white</item>
|
||||
<item name="android:windowActionBarOverlay">true</item>
|
||||
<item name="windowActionBarOverlay">true</item>
|
||||
</style>
|
||||
|
||||
<style
|
||||
name="MwmWidget.ToolbarTheme.DownButton"
|
||||
parent="ThemeOverlay.Material3.Dark.ActionBar">
|
||||
<item name="android:gravity">center_vertical</item>
|
||||
<item name="colorAccent">@android:color/white</item>
|
||||
<item name="colorSecondary">@android:color/white</item>
|
||||
<item name="android:homeAsUpIndicator">@drawable/ic_expand_more</item>
|
||||
</style>
|
||||
|
||||
<style name="MwmWidget.ListView" parent="android:Widget.Material.ListView">
|
||||
<item name="android:fadingEdge">none</item>
|
||||
<item name="android:divider">@color/divider</item>
|
||||
@@ -259,6 +287,13 @@
|
||||
<item name="android:textColor">@color/text_light</item>
|
||||
</style>
|
||||
|
||||
<style name="MwmWidget.Tab">
|
||||
<item name="android:layout_width">wrap_content</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:textAppearance">@style/MwmTextAppearance.Body3</item>
|
||||
<item name="android:gravity">center</item>
|
||||
</style>
|
||||
|
||||
<style name="MwmWidget.TabLayout" parent="Widget.Design.TabLayout">
|
||||
<item name="tabMaxWidth">0dp</item>
|
||||
<item name="tabTextAppearance">@style/MwmTextAppearance.Tab</item>
|
||||
@@ -270,6 +305,16 @@
|
||||
<item name="tabSelectedTextColor">@color/white_primary</item>
|
||||
</style>
|
||||
|
||||
<style name="MwmWidget.Downloader.ToolbarButton">
|
||||
<item name="android:layout_width">wrap_content</item>
|
||||
<item name="android:layout_height">match_parent</item>
|
||||
<item name="android:gravity">center</item>
|
||||
<item name="android:layout_gravity">end|center_vertical</item>
|
||||
<item name="android:background">?selectableItemBackgroundBorderless</item>
|
||||
<item name="android:padding">@dimen/margin_half</item>
|
||||
<item name="android:textAppearance">@style/MwmTextAppearance.Toolbar.Title.Button</item>
|
||||
</style>
|
||||
|
||||
<style name="MwmWidget.MaterialCalendar.Theme.FullScreen.Dark"
|
||||
parent="ThemeOverlay.Material3.MaterialCalendar.Fullscreen">
|
||||
<item name="colorSurface">@color/material_calendar_surface_dark</item>
|
||||
@@ -280,6 +325,26 @@
|
||||
<item name="colorSurface">@color/material_calendar_surface_dark</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance" parent="MwmTextAppearance.Body3"/>
|
||||
|
||||
<style name="TextAppearance.Small" parent="MwmTextAppearance.Body4"/>
|
||||
|
||||
<style name="TextAppearance.Medium" parent="MwmTextAppearance.Body2"/>
|
||||
|
||||
<style name="TextAppearance.Large" parent="MwmTextAppearance.Body1">
|
||||
<item name="android:textSize">@dimen/text_size_toolbar</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.Inverse" parent="MwmTextAppearance.Body3.Light"/>
|
||||
|
||||
<style name="TextAppearance.Small.Inverse" parent="MwmTextAppearance.Body4.Light"/>
|
||||
|
||||
<style name="TextAppearance.Medium.Inverse" parent="MwmTextAppearance.Body2.Light"/>
|
||||
|
||||
<style name="TextAppearance.Large.Inverse" parent="MwmTextAppearance.Body1.Light">
|
||||
<item name="android:textSize">@dimen/text_size_toolbar</item>
|
||||
</style>
|
||||
|
||||
<style
|
||||
name="MwmTheme.BottomSheetDialog"
|
||||
parent="@style/ThemeOverlay.Material3.BottomSheetDialog">
|
||||
@@ -312,6 +377,9 @@
|
||||
<style name="MwmWidget.M3.Button" parent="Widget.Material3.Button">
|
||||
<item name="android:layout_width">wrap_content</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:textColor">?accentButtonTextColor</item>
|
||||
<item name="backgroundTint">@null</item>
|
||||
<item name="cornerRadius">20dp</item>
|
||||
<item name="android:textSize">16sp</item>
|
||||
</style>
|
||||
|
||||
@@ -321,11 +389,13 @@
|
||||
|
||||
<style name="MwmWidget.M3.Button.Secondary" parent="@style/Widget.Material3.Button.OutlinedButton">
|
||||
<item name="android:textSize">16sp</item>
|
||||
<item name="strokeColor">?colorSecondary</item>
|
||||
<item name="android:textColor">?colorSecondary</item>
|
||||
</style>
|
||||
|
||||
<style name="MwmWidget.M3.FAB.Primary" parent="@style/Widget.Material3.FloatingActionButton.Primary">
|
||||
<item name="shapeAppearance">@style/ShapeAppearanceOverlay.Material3.FloatingActionButton</item>
|
||||
<item name="rippleColor">@null</item>
|
||||
<item name="backgroundTint">?colorSecondary</item>
|
||||
<item name="tint">?android:textColorPrimaryInverse</item>
|
||||
</style>
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
<attr name="textDialogTheme" format="reference" />
|
||||
<attr name="windowBackgroundForced" format="reference|color" />
|
||||
<attr name="cardBackground" format="reference" />
|
||||
<attr name="appBackground" format="reference|color" />
|
||||
<attr name="clickableBackground" format="reference" />
|
||||
<attr name="statusBar" format="color" />
|
||||
<attr name="secondary" format="color" />
|
||||
|
||||
@@ -85,14 +85,14 @@
|
||||
<item name="transitRulerBackground">@color/black_4</item>
|
||||
<item name="transitStepDivider">@drawable/dot_divider</item>
|
||||
<item name="accentColorSelector">@color/accent_color_selector</item>
|
||||
<item name="android:textAppearance">@style/MwmTextAppearance.Body3</item>
|
||||
<item name="android:textAppearanceSmall">@style/MwmTextAppearance.Body4</item>
|
||||
<item name="android:textAppearanceMedium">@style/MwmTextAppearance.Body2</item>
|
||||
<item name="android:textAppearanceLarge">@style/MwmTextAppearance.Body1</item>
|
||||
<item name="android:textAppearanceInverse">@style/MwmTextAppearance.Body3.Light</item>
|
||||
<item name="android:textAppearanceSmallInverse">@style/MwmTextAppearance.Body4.Light</item>
|
||||
<item name="android:textAppearanceMediumInverse">@style/MwmTextAppearance.Body2.Light</item>
|
||||
<item name="android:textAppearanceLargeInverse">@style/MwmTextAppearance.Body1.Light</item>
|
||||
<item name="android:textAppearance">@style/TextAppearance</item>
|
||||
<item name="android:textAppearanceSmall">@style/TextAppearance.Small</item>
|
||||
<item name="android:textAppearanceMedium">@style/TextAppearance.Medium</item>
|
||||
<item name="android:textAppearanceLarge">@style/TextAppearance.Large</item>
|
||||
<item name="android:textAppearanceInverse">@style/TextAppearance.Inverse</item>
|
||||
<item name="android:textAppearanceSmallInverse">@style/TextAppearance.Small.Inverse</item>
|
||||
<item name="android:textAppearanceMediumInverse">@style/TextAppearance.Medium.Inverse</item>
|
||||
<item name="android:textAppearanceLargeInverse">@style/TextAppearance.Large.Inverse</item>
|
||||
<item name="drivingOptionsViewBg">@color/bg_primary_dark</item>
|
||||
<item name="elevationProfilePropertyBg">@drawable/bg_rounded_rect</item>
|
||||
<item name="elevationProfilePropIconTint">@color/black_secondary</item>
|
||||
@@ -158,8 +158,6 @@
|
||||
<item name="colorSurfaceContainerHigh">@color/md_theme_surfaceContainerHigh</item>
|
||||
<item name="colorSurfaceContainerHighest">@color/md_theme_surfaceContainerHighest</item>
|
||||
|
||||
<item name="appBackground">@color/bg_app</item>
|
||||
|
||||
</style>
|
||||
|
||||
<style name="MwmTheme" parent="MwmTheme.Base"/>
|
||||
|
||||
@@ -193,6 +193,36 @@
|
||||
android:order="5"/>
|
||||
</PreferenceCategory>
|
||||
|
||||
<androidx.preference.PreferenceCategory
|
||||
android:key="@string/pref_traffic"
|
||||
android:title="@string/prefs_group_traffic"
|
||||
android:order="4">
|
||||
<SwitchPreferenceCompat
|
||||
android:key="@string/pref_traffic_http_enabled"
|
||||
android:title="@string/traffic_http_enabled"
|
||||
app:singleLineTitle="false"
|
||||
android:summary="@string/traffic_http_enabled_description"
|
||||
android:defaultValue="true"
|
||||
android:order="1"/>
|
||||
<EditTextPreference
|
||||
android:key="@string/pref_traffic_http_url"
|
||||
android:title="@string/traffic_http_url"
|
||||
app:singleLineTitle="false"
|
||||
android:order="2"/>
|
||||
<MultiSelectListPreference
|
||||
android:key="@string/pref_traffic_apps"
|
||||
android:title="@string/traffic_apps"
|
||||
app:singleLineTitle="false"
|
||||
android:order="3"/>
|
||||
<SwitchPreferenceCompat
|
||||
android:key="@string/pref_traffic_legacy_enabled"
|
||||
android:title="@string/traffic_legacy_enabled"
|
||||
app:singleLineTitle="false"
|
||||
android:summary="@string/traffic_legacy_enabled_description"
|
||||
android:defaultValue="true"
|
||||
android:order="4"/>
|
||||
</androidx.preference.PreferenceCategory>
|
||||
|
||||
<androidx.preference.PreferenceCategory
|
||||
android:key="@string/pref_privacy"
|
||||
android:title="@string/privacy"
|
||||
|
||||
@@ -146,7 +146,7 @@ project.afterEvaluate {
|
||||
|
||||
final taskName = gradle.startParameter.taskNames
|
||||
|
||||
if (['assemble', 'bundle', 'compile', 'install', 'run', 'publish'].any{taskName.any{task->task.startsWith(it)}}) {
|
||||
if (['assemble', 'bundle', 'compile', 'install', 'run'].any{taskName.any{task->task.startsWith(it)}}) {
|
||||
exec {
|
||||
workingDir '../..'
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../data/mapcss-mapping.csv
|
||||
|
@@ -17,6 +17,7 @@ set(SRC
|
||||
app/organicmaps/sdk/opengl/gl3stub.h
|
||||
app/organicmaps/sdk/platform/GuiThread.hpp
|
||||
app/organicmaps/sdk/platform/AndroidPlatform.hpp
|
||||
app/organicmaps/sdk/traffxml/AndroidTraffSource.hpp
|
||||
app/organicmaps/sdk/util/Distance.hpp
|
||||
app/organicmaps/sdk/util/FeatureIdBuilder.hpp
|
||||
app/organicmaps/sdk/vulkan/android_vulkan_context_factory.hpp
|
||||
@@ -76,6 +77,8 @@ set(SRC
|
||||
app/organicmaps/sdk/platform/PThreadImpl.cpp
|
||||
app/organicmaps/sdk/platform/SecureStorage.cpp
|
||||
app/organicmaps/sdk/platform/SocketImpl.cpp
|
||||
app/organicmaps/sdk/traffxml/AndroidTraffSource.cpp
|
||||
app/organicmaps/sdk/traffxml/SourceImpl.cpp
|
||||
app/organicmaps/sdk/util/Config.cpp
|
||||
app/organicmaps/sdk/util/GeoUtils.cpp
|
||||
app/organicmaps/sdk/util/HttpClient.cpp
|
||||
@@ -127,6 +130,7 @@ target_link_libraries(${PROJECT_NAME}
|
||||
# icu
|
||||
# agg
|
||||
# vulkan_wrapper
|
||||
traffxml
|
||||
|
||||
# Android libs
|
||||
log
|
||||
|
||||
@@ -182,6 +182,8 @@ public:
|
||||
void Set3dMode(bool allow3d, bool allow3dBuildings);
|
||||
void Get3dMode(bool & allow3d, bool & allow3dBuildings);
|
||||
|
||||
TrafficManager & GetTrafficManager() { return m_work.GetTrafficManager(); }
|
||||
|
||||
void SetMapLanguageCode(std::string const & languageCode);
|
||||
std::string GetMapLanguageCode();
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "app/organicmaps/sdk/Framework.hpp"
|
||||
|
||||
#include "app/organicmaps/sdk/platform/AndroidPlatform.hpp"
|
||||
#include "app/organicmaps/sdk/traffxml/AndroidTraffSource.hpp"
|
||||
|
||||
#include "app/organicmaps/sdk/core/jni_helper.hpp"
|
||||
|
||||
@@ -34,6 +35,26 @@ JNIEXPORT void JNICALL Java_app_organicmaps_sdk_OrganicMaps_nativeInitFramework(
|
||||
JNIEnv * env = jni::GetEnv();
|
||||
jmethodID const methodId = jni::GetMethodID(env, *onComplete, "run", "()V");
|
||||
env->CallVoidMethod(*onComplete, methodId);
|
||||
|
||||
ASSERT(g_framework, ("g_framework must be non-null"));
|
||||
|
||||
/*
|
||||
* Add traffic sources for Android.
|
||||
*/
|
||||
jclass configClass = env->FindClass("app/organicmaps/sdk/util/Config");
|
||||
jmethodID const getTrafficLegacyEnabledId = jni::GetStaticMethodID(env, configClass,
|
||||
"getTrafficLegacyEnabled", "()Z");
|
||||
jmethodID const applyTrafficLegacyEnabledId = jni::GetStaticMethodID(env, configClass,
|
||||
"applyTrafficLegacyEnabled", "(Z)V");
|
||||
jmethodID const getTrafficAppsId = jni::GetStaticMethodID(env, configClass,
|
||||
"getTrafficApps", "()[Ljava/lang/String;");
|
||||
jmethodID const applyTrafficAppsId = jni::GetStaticMethodID(env, configClass,
|
||||
"applyTrafficApps", "([Ljava/lang/String;)V");
|
||||
|
||||
env->CallStaticVoidMethod(configClass, applyTrafficLegacyEnabledId,
|
||||
env->CallStaticBooleanMethod(configClass, getTrafficLegacyEnabledId));
|
||||
env->CallStaticVoidMethod(configClass, applyTrafficAppsId,
|
||||
(jobjectArray)env->CallStaticObjectMethod(configClass, getTrafficAppsId));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -580,10 +580,10 @@ JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetMapObject
|
||||
return static_cast<jint>(osm::Editor::Instance().GetFeatureStatus(g_editableMapObject.GetID()));
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeAreSomeFeatureChangesUploaded(JNIEnv * env, jclass clazz)
|
||||
JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeIsMapObjectUploaded(JNIEnv * env, jclass clazz)
|
||||
{
|
||||
return osm::Editor::Instance().AreSomeFeatureChangesUploaded(g_editableMapObject.GetID().m_mwmId,
|
||||
g_editableMapObject.GetID().m_index);
|
||||
return osm::Editor::Instance().IsFeatureUploaded(g_editableMapObject.GetID().m_mwmId,
|
||||
g_editableMapObject.GetID().m_index);
|
||||
}
|
||||
|
||||
// static nativeMakeLocalizedName(String langCode, String name);
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
#include "AndroidTraffSource.hpp"
|
||||
|
||||
#include "app/organicmaps/sdk/core/jni_helper.hpp"
|
||||
|
||||
namespace traffxml {
|
||||
void AndroidTraffSourceV0_7::Create(TraffSourceManager & manager)
|
||||
{
|
||||
std::unique_ptr<AndroidTraffSourceV0_7> source = std::unique_ptr<AndroidTraffSourceV0_7>(new AndroidTraffSourceV0_7(manager));
|
||||
manager.RegisterSource(std::move(source));
|
||||
}
|
||||
|
||||
AndroidTraffSourceV0_7::AndroidTraffSourceV0_7(TraffSourceManager & manager)
|
||||
: TraffSource(manager)
|
||||
{
|
||||
JNIEnv * env = jni::GetEnv();
|
||||
|
||||
static jclass const implClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/traffxml/SourceImplV0_7");
|
||||
|
||||
static jmethodID const implConstructor = jni::GetConstructorID(env, implClass, "(Landroid/content/Context;J)V");
|
||||
|
||||
jlong nativeManager = reinterpret_cast<jlong>(&manager);
|
||||
|
||||
jobject implObject = env->NewObject(
|
||||
implClass, implConstructor, android::Platform::Instance().GetContext(), nativeManager);
|
||||
|
||||
m_implObject = env->NewGlobalRef(implObject);
|
||||
|
||||
m_subscribeImpl = jni::GetMethodID(env, m_implObject, "subscribe", "(Ljava/lang/String;)V");
|
||||
m_unsubscribeImpl = jni::GetMethodID(env, m_implObject, "unsubscribe", "()V");
|
||||
}
|
||||
|
||||
AndroidTraffSourceV0_7::~AndroidTraffSourceV0_7()
|
||||
{
|
||||
jni::GetEnv()->DeleteGlobalRef(m_implObject);
|
||||
}
|
||||
|
||||
void AndroidTraffSourceV0_7::Close()
|
||||
{
|
||||
Unsubscribe();
|
||||
}
|
||||
|
||||
void AndroidTraffSourceV0_7::Subscribe(std::set<MwmSet::MwmId> & mwms)
|
||||
{
|
||||
jni::GetEnv()->CallVoidMethod(m_implObject, m_subscribeImpl, nullptr);
|
||||
}
|
||||
|
||||
void AndroidTraffSourceV0_7::Unsubscribe()
|
||||
{
|
||||
jni::GetEnv()->CallVoidMethod(m_implObject, m_unsubscribeImpl);
|
||||
}
|
||||
|
||||
void AndroidTraffSourceV0_8::Create(TraffSourceManager & manager, std::string const & packageId)
|
||||
{
|
||||
std::unique_ptr<AndroidTraffSourceV0_8> source = std::unique_ptr<AndroidTraffSourceV0_8>(new AndroidTraffSourceV0_8(manager, packageId));
|
||||
manager.RegisterSource(std::move(source));
|
||||
}
|
||||
|
||||
AndroidTraffSourceV0_8::AndroidTraffSourceV0_8(TraffSourceManager & manager, std::string const & packageId)
|
||||
: TraffSource(manager)
|
||||
{
|
||||
JNIEnv * env = jni::GetEnv();
|
||||
|
||||
static jclass const implClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/traffxml/SourceImplV0_8");
|
||||
|
||||
static jmethodID const implConstructor = jni::GetConstructorID(env, implClass, "(Landroid/content/Context;JLjava/lang/String;)V");
|
||||
|
||||
jlong nativeManager = reinterpret_cast<jlong>(&manager);
|
||||
|
||||
jobject implObject = env->NewObject(
|
||||
implClass, implConstructor, android::Platform::Instance().GetContext(), nativeManager, jni::ToJavaString(env, packageId));
|
||||
|
||||
m_implObject = env->NewGlobalRef(implObject);
|
||||
|
||||
m_subscribeImpl = jni::GetMethodID(env, m_implObject, "subscribe", "(Ljava/lang/String;)V");
|
||||
m_changeSubscriptionImpl = jni::GetMethodID(env, m_implObject, "changeSubscription", "(Ljava/lang/String;)V");
|
||||
m_unsubscribeImpl = jni::GetMethodID(env, m_implObject, "unsubscribe", "()V");
|
||||
|
||||
// TODO packageId (if we need that at all here)
|
||||
}
|
||||
|
||||
AndroidTraffSourceV0_8::~AndroidTraffSourceV0_8()
|
||||
{
|
||||
jni::GetEnv()->DeleteGlobalRef(m_implObject);
|
||||
}
|
||||
|
||||
void AndroidTraffSourceV0_8::Close()
|
||||
{
|
||||
Unsubscribe();
|
||||
}
|
||||
|
||||
void AndroidTraffSourceV0_8::Subscribe(std::set<MwmSet::MwmId> & mwms)
|
||||
{
|
||||
JNIEnv * env = jni::GetEnv();
|
||||
std::string data = "<filter_list>\n"
|
||||
+ GetMwmFilters(mwms)
|
||||
+ "</filter_list>";
|
||||
|
||||
env->CallVoidMethod(m_implObject, m_subscribeImpl, jni::ToJavaString(env, data));
|
||||
}
|
||||
|
||||
void AndroidTraffSourceV0_8::ChangeSubscription(std::set<MwmSet::MwmId> & mwms)
|
||||
{
|
||||
JNIEnv * env = jni::GetEnv();
|
||||
std::string data = "<filter_list>\n"
|
||||
+ GetMwmFilters(mwms)
|
||||
+ "</filter_list>";
|
||||
|
||||
env->CallVoidMethod(m_implObject, m_changeSubscriptionImpl, jni::ToJavaString(env, data));
|
||||
}
|
||||
|
||||
void AndroidTraffSourceV0_8::Unsubscribe()
|
||||
{
|
||||
jni::GetEnv()->CallVoidMethod(m_implObject, m_unsubscribeImpl);
|
||||
}
|
||||
} // namespace traffxml
|
||||
@@ -0,0 +1,199 @@
|
||||
#pragma once
|
||||
|
||||
#include "traffxml/traff_source.hpp"
|
||||
|
||||
namespace traffxml
|
||||
{
|
||||
/**
|
||||
* @brief A TraFF source which relies on Android Binder for message delivery, using version 0.7 of the TraFF protocol.
|
||||
*
|
||||
* TraFF 0.7 does not support subscriptions. Messages are broadcast as the payload to a `FEED` intent.
|
||||
*/
|
||||
class AndroidTraffSourceV0_7 : public TraffSource
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* @brief Creates a new `AndroidTraffSourceV0_7` instance and registers it with the traffic manager.
|
||||
*
|
||||
* @param manager The traffic manager to register the new instance with
|
||||
*/
|
||||
static void Create(TraffSourceManager & manager);
|
||||
|
||||
virtual ~AndroidTraffSourceV0_7() override;
|
||||
|
||||
/**
|
||||
* @brief Prepares the traffic source for unloading.
|
||||
*/
|
||||
// TODO do we need a close operation here?
|
||||
// TODO move this to the parent class and override it here?
|
||||
void Close();
|
||||
|
||||
/**
|
||||
* @brief Subscribes to a traffic service.
|
||||
*
|
||||
* TraFF 0.7 does not support subscriptions. This implementation registers a broadcast receiver.
|
||||
*
|
||||
* @param mwms The MWMs for which data is needed (not used by this implementation).
|
||||
*/
|
||||
virtual void Subscribe(std::set<MwmSet::MwmId> & mwms) override;
|
||||
|
||||
/**
|
||||
* @brief Changes an existing traffic subscription.
|
||||
*
|
||||
* This implementation does nothing, as TraFF 0.7 does not support subscriptions.
|
||||
*
|
||||
* @param mwms The new set of MWMs for which data is needed.
|
||||
*/
|
||||
virtual void ChangeSubscription(std::set<MwmSet::MwmId> & mwms) override {};
|
||||
|
||||
/**
|
||||
* @brief Unsubscribes from a traffic service we are subscribed to.
|
||||
*
|
||||
* TraFF 0.7 does not support subscriptions. This implementation unregisters the broadcast
|
||||
* receiver which was registered by `Subscribe()`.
|
||||
*/
|
||||
virtual void Unsubscribe() override;
|
||||
|
||||
/**
|
||||
* @brief Whether this source should be polled.
|
||||
*
|
||||
* Prior to calling `Poll()` on a source, the caller should always first call `IsPollNeeded()` and
|
||||
* poll the source only if the result is true.
|
||||
*
|
||||
* This implementation always returns false, as message delivery on Android uses `FEED` (push).
|
||||
*
|
||||
* @return true if the source should be polled, false if not.
|
||||
*/
|
||||
virtual bool IsPollNeeded() override { return false; };
|
||||
|
||||
/**
|
||||
* @brief Polls the traffic service for updates.
|
||||
*
|
||||
* This implementation does nothing, as message delivery on Android uses `FEED` (push).
|
||||
*/
|
||||
virtual void Poll() override {};
|
||||
|
||||
protected:
|
||||
/**
|
||||
* @brief Constructs a new `AndroidTraffSourceV0_7`.
|
||||
* @param manager The `TrafficSourceManager` instance to register the source with.
|
||||
*/
|
||||
AndroidTraffSourceV0_7(TraffSourceManager & manager);
|
||||
|
||||
private:
|
||||
// TODO “subscription” (i.e. broadcast receiver) state
|
||||
|
||||
/**
|
||||
* @brief The Java implementation class instance.
|
||||
*/
|
||||
jobject m_implObject;
|
||||
|
||||
/**
|
||||
* @brief The Java subscribe method.
|
||||
*/
|
||||
jmethodID m_subscribeImpl;
|
||||
|
||||
/**
|
||||
* @brief The Java unsubscribe method.
|
||||
*/
|
||||
jmethodID m_unsubscribeImpl;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief A TraFF source which relies on Android Binder for message delivery, using version 0.8 of the TraFF protocol.
|
||||
*
|
||||
* TraFF 0.8 supports subscriptions. Messages are announced through a `FEED` intent, whereupon the
|
||||
* consumer can retrieve them from a content provider.
|
||||
*/
|
||||
class AndroidTraffSourceV0_8 : public TraffSource
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* @brief Creates a new `AndroidTraffSourceV0_8` instance and registers it with the traffic manager.
|
||||
*
|
||||
* @param manager The traffic manager to register the new instance with
|
||||
* @param packageId The package ID of the app providing the TraFF source.
|
||||
*/
|
||||
static void Create(TraffSourceManager & manager, std::string const & packageId);
|
||||
|
||||
virtual ~AndroidTraffSourceV0_8() override;
|
||||
|
||||
/**
|
||||
* @brief Prepares the traffic source for unloading.
|
||||
*
|
||||
* If there is still an active subscription, it unsubscribes, but without processing the result
|
||||
* received from the service. Otherwise, teardown is a no-op.
|
||||
*/
|
||||
// TODO move this to the parent class and override it here?
|
||||
void Close();
|
||||
|
||||
/**
|
||||
* @brief Subscribes to a traffic service.
|
||||
*
|
||||
* @param mwms The MWMs for which data is needed.
|
||||
*/
|
||||
virtual void Subscribe(std::set<MwmSet::MwmId> & mwms) override;
|
||||
|
||||
/**
|
||||
* @brief Changes an existing traffic subscription.
|
||||
*
|
||||
* @param mwms The new set of MWMs for which data is needed.
|
||||
*/
|
||||
virtual void ChangeSubscription(std::set<MwmSet::MwmId> & mwms) override;
|
||||
|
||||
/**
|
||||
* @brief Unsubscribes from a traffic service we are subscribed to.
|
||||
*/
|
||||
virtual void Unsubscribe() override;
|
||||
|
||||
/**
|
||||
* @brief Whether this source should be polled.
|
||||
*
|
||||
* Prior to calling `Poll()` on a source, the caller should always first call `IsPollNeeded()` and
|
||||
* poll the source only if the result is true.
|
||||
*
|
||||
* This implementation always returns false, as message delivery on Android uses `FEED` (push).
|
||||
*
|
||||
* @return true if the source should be polled, false if not.
|
||||
*/
|
||||
virtual bool IsPollNeeded() override { return false; };
|
||||
|
||||
/**
|
||||
* @brief Polls the traffic service for updates.
|
||||
*
|
||||
* This implementation does nothing, as message delivery on Android uses `FEED` (push).
|
||||
*/
|
||||
virtual void Poll() override {};
|
||||
|
||||
protected:
|
||||
/**
|
||||
* @brief Constructs a new `AndroidTraffSourceV0_8`.
|
||||
* @param manager The `TrafficSourceManager` instance to register the source with.
|
||||
* @param packageId The package ID of the app providing the TraFF source.
|
||||
*/
|
||||
AndroidTraffSourceV0_8(TraffSourceManager & manager, std::string const & packageId);
|
||||
|
||||
private:
|
||||
// TODO subscription state
|
||||
|
||||
/**
|
||||
* @brief The Java implementation class instance.
|
||||
*/
|
||||
jobject m_implObject;
|
||||
|
||||
/**
|
||||
* @brief The Java subscribe method.
|
||||
*/
|
||||
jmethodID m_subscribeImpl;
|
||||
|
||||
/**
|
||||
* @brief The Java changeSubscription method.
|
||||
*/
|
||||
jmethodID m_changeSubscriptionImpl;
|
||||
|
||||
/**
|
||||
* @brief The Java unsubscribe method.
|
||||
*/
|
||||
jmethodID m_unsubscribeImpl;
|
||||
};
|
||||
} // namespace traffxml
|
||||
@@ -0,0 +1,34 @@
|
||||
// TODO which of the two do we need? (jni_helper includes jni)
|
||||
//#include <jni>
|
||||
#include "app/organicmaps/sdk/core/jni_helper.hpp"
|
||||
|
||||
#include "traffxml/traff_source.hpp"
|
||||
#include "traffxml/traff_model_xml.hpp"
|
||||
|
||||
#include <optional>
|
||||
|
||||
extern "C"
|
||||
{
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_sdk_traffxml_SourceImpl_onFeedReceivedImpl(JNIEnv * env, jclass thiz, jlong nativeManager, jstring feed)
|
||||
{
|
||||
std::string feedStd = jni::ToNativeString(env, feed);
|
||||
pugi::xml_document document;
|
||||
traffxml::TraffFeed parsedFeed;
|
||||
|
||||
if (!document.load_string(feedStd.c_str()))
|
||||
{
|
||||
LOG(LWARNING, ("Feed is not a well-formed XML document"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!traffxml::ParseTraff(document, std::nullopt, parsedFeed))
|
||||
{
|
||||
LOG(LWARNING, ("Feed is not a valid TraFF feed"));
|
||||
return;
|
||||
}
|
||||
|
||||
traffxml::TraffSourceManager & manager = *reinterpret_cast<traffxml::TraffSourceManager*>(nativeManager);
|
||||
manager.ReceiveFeed(parsedFeed);
|
||||
}
|
||||
}
|
||||
@@ -119,4 +119,74 @@ JNIEXPORT void JNICALL Java_app_organicmaps_sdk_util_Config_nativeSetTranslitera
|
||||
frm()->SaveTransliteration(value);
|
||||
frm()->AllowTransliteration(value);
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean JNICALL
|
||||
Java_app_organicmaps_sdk_util_Config_nativeGetTrafficHttpEnabled(JNIEnv * env, jclass thiz)
|
||||
{
|
||||
return frm()->LoadTrafficHttpEnabled();
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_sdk_util_Config_nativeSetTrafficHttpEnabled(JNIEnv * env, jclass thiz,
|
||||
jboolean value)
|
||||
{
|
||||
frm()->SaveTrafficHttpEnabled(value);
|
||||
frm()->SetTrafficHttpEnabled(value);
|
||||
}
|
||||
|
||||
JNIEXPORT jstring JNICALL
|
||||
Java_app_organicmaps_sdk_util_Config_nativeGetTrafficHttpUrl(JNIEnv * env, jclass thiz)
|
||||
{
|
||||
std::string value = frm()->LoadTrafficHttpUrl();
|
||||
return jni::ToJavaString(env, value);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_sdk_util_Config_nativeSetTrafficHttpUrl(JNIEnv * env, jclass thiz,
|
||||
jstring value)
|
||||
{
|
||||
frm()->SaveTrafficHttpUrl(jni::ToNativeString(env, value));
|
||||
frm()->SetTrafficHttpUrl(jni::ToNativeString(env, value));
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_sdk_util_Config_applyTrafficLegacyEnabled(JNIEnv * env, jclass thiz,
|
||||
jboolean value)
|
||||
{
|
||||
TrafficManager & tm = g_framework->GetTrafficManager();
|
||||
tm.RemoveTraffSourceIf([](traffxml::TraffSource* source) {
|
||||
if (traffxml::AndroidTraffSourceV0_7* traffSource = dynamic_cast<traffxml::AndroidTraffSourceV0_7*>(source))
|
||||
{
|
||||
traffSource->Close();
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
});
|
||||
if (value)
|
||||
traffxml::AndroidTraffSourceV0_7::Create(tm);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_sdk_util_Config_applyTrafficApps(JNIEnv * env, jclass thiz, jobjectArray value)
|
||||
{
|
||||
jsize valueLen = env->GetArrayLength(value);
|
||||
TrafficManager & tm = g_framework->GetTrafficManager();
|
||||
tm.RemoveTraffSourceIf([](traffxml::TraffSource* source) {
|
||||
if (traffxml::AndroidTraffSourceV0_8* traffSource = dynamic_cast<traffxml::AndroidTraffSourceV0_8*>(source))
|
||||
{
|
||||
traffSource->Close();
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
});
|
||||
for (jsize i = 0; i < valueLen; i++)
|
||||
{
|
||||
jstring jAppId = (jstring)env->GetObjectArrayElement(value, i);
|
||||
std::string appId = jni::ToNativeString(env, jAppId);
|
||||
traffxml::AndroidTraffSourceV0_8::Create(tm, appId);
|
||||
env->DeleteLocalRef(jAppId);
|
||||
}
|
||||
}
|
||||
} // extern "C"
|
||||
|
||||
@@ -190,5 +190,5 @@ public final class Editor
|
||||
|
||||
@FeatureStatus
|
||||
public static native int nativeGetMapObjectStatus();
|
||||
public static native boolean nativeAreSomeFeatureChangesUploaded();
|
||||
public static native boolean nativeIsMapObjectUploaded();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
/*
|
||||
* Copyright © 2017–2020 traffxml.org.
|
||||
*
|
||||
* Relicensed to CoMaps by the original author.
|
||||
*/
|
||||
|
||||
package app.organicmaps.sdk.traffxml;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import app.organicmaps.sdk.traffxml.Version;
|
||||
import app.organicmaps.sdk.traffxml.AndroidTransport;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.IntentFilter.MalformedMimeTypeException;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
|
||||
public class AndroidConsumer {
|
||||
/**
|
||||
* Creates an Intent filter which matches the Intents a TraFF consumer needs to receive.
|
||||
*
|
||||
* <p>Different filters are available for consumers implementing different versions of the TraFF
|
||||
* specification.
|
||||
*
|
||||
* @param version The version of the TraFF specification (one of the constants in {@link org.traffxml.traff.Version})
|
||||
*
|
||||
* @return An intent filter matching the necessary Intents
|
||||
*/
|
||||
public static IntentFilter createIntentFilter(int version) {
|
||||
IntentFilter res = new IntentFilter();
|
||||
switch (version) {
|
||||
case Version.V0_7:
|
||||
res.addAction(AndroidTransport.ACTION_TRAFF_PUSH);
|
||||
break;
|
||||
case Version.V0_8:
|
||||
res.addAction(AndroidTransport.ACTION_TRAFF_PUSH);
|
||||
res.addDataScheme(AndroidTransport.CONTENT_SCHEMA);
|
||||
try {
|
||||
res.addDataType(AndroidTransport.MIME_TYPE_TRAFF);
|
||||
} catch (MalformedMimeTypeException e) {
|
||||
// as long as the constant is a well-formed MIME type, this exception never gets thrown
|
||||
e.printStackTrace();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("Invalid version code: " + version);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a TraFF intent to a source.
|
||||
*
|
||||
* <p>This encapsulates most of the low-level Android handling.
|
||||
*
|
||||
* <p>If the recipient specified in {@code packageName} declares multiple receivers for the intent in its
|
||||
* manifest, a separate intent will be delivered to each of them. The intent will not be delivered to
|
||||
* receivers registered at runtime.
|
||||
*
|
||||
* <p>All intents are sent as explicit ordered broadcasts. This means two things:
|
||||
*
|
||||
* <p>Any app which declares a matching receiver in its manifest will be woken up to process the intent.
|
||||
* This works even with certain Android 7 builds which restrict intent delivery to apps which are not
|
||||
* currently running.
|
||||
*
|
||||
* <p>It is safe for the recipient to unconditionally set result data. If the recipient does not set
|
||||
* result data, the result will have a result code of
|
||||
* {@link org.traffxml.transport.android.AndroidTransport#RESULT_INTERNAL_ERROR}, no data and no extras.
|
||||
*
|
||||
* @param context The context
|
||||
* @param action The intent action.
|
||||
* @param data The intent data (for TraFF, this is the content provider URI), or null
|
||||
* @param extras The extras for the intent
|
||||
* @param packageName The package name for the intent recipient, or null to deliver the intent to all matching receivers
|
||||
* @param receiverPermission A permission which the recipient must hold, or null if not required
|
||||
* @param resultReceiver A BroadcastReceiver which will receive the result for the intent
|
||||
*/
|
||||
public static void sendTraffIntent(Context context, String action, Uri data, Bundle extras, String packageName,
|
||||
String receiverPermission, BroadcastReceiver resultReceiver) {
|
||||
Intent outIntent = new Intent(action);
|
||||
PackageManager pm = context.getPackageManager();
|
||||
List<ResolveInfo> receivers = pm.queryBroadcastReceivers(outIntent, 0);
|
||||
if (receivers != null)
|
||||
for (ResolveInfo receiver : receivers) {
|
||||
if ((packageName != null) && !packageName.equals(receiver.activityInfo.applicationInfo.packageName))
|
||||
continue;
|
||||
ComponentName cn = new ComponentName(receiver.activityInfo.applicationInfo.packageName,
|
||||
receiver.activityInfo.name);
|
||||
outIntent = new Intent(action);
|
||||
if (data != null)
|
||||
outIntent.setData(data);
|
||||
if (extras != null)
|
||||
outIntent.putExtras(extras);
|
||||
outIntent.setComponent(cn);
|
||||
context.sendOrderedBroadcast (outIntent,
|
||||
receiverPermission,
|
||||
resultReceiver,
|
||||
null, // scheduler,
|
||||
AndroidTransport.RESULT_INTERNAL_ERROR, // initialCode,
|
||||
null, // initialData,
|
||||
null);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,222 @@
|
||||
/*
|
||||
* Copyright © 2019–2020 traffxml.org.
|
||||
*
|
||||
* Relicensed to CoMaps by the original author.
|
||||
*/
|
||||
|
||||
package app.organicmaps.sdk.traffxml;
|
||||
|
||||
public class AndroidTransport {
|
||||
/**
|
||||
* Intent to poll a peer for its capabilities.
|
||||
*
|
||||
* <p>This is a broadcast intent and must be sent as an explicit broadcast.
|
||||
*/
|
||||
public static final String ACTION_TRAFF_GET_CAPABILITIES = "org.traffxml.traff.GET_CAPABILITIES";
|
||||
|
||||
/**
|
||||
* Intent to send a heartbeat to a peer.
|
||||
*
|
||||
* <p>This is a broadcast intent and must be sent as an explicit broadcast.
|
||||
*/
|
||||
public static final String ACTION_TRAFF_HEARTBEAT = "org.traffxml.traff.GET_HEARTBEAT";
|
||||
|
||||
/**
|
||||
* Intent to poll a source for information.
|
||||
*
|
||||
* <p>This is a broadcast intent and must be sent as an explicit broadcast.
|
||||
*
|
||||
* <p>Polling is a legacy feature on Android and deprecated in TraFF 0.8 (rather than polling, TraFF 0.8
|
||||
* applications query the content provider). Therefore, poll operations are subscriptionless, and the
|
||||
* source should either reply with all messages it currently holds, or ignore the request.
|
||||
*/
|
||||
@Deprecated
|
||||
public static final String ACTION_TRAFF_POLL = "org.traffxml.traff.POLL";
|
||||
|
||||
/**
|
||||
* Intent for a push feed.
|
||||
*
|
||||
* <p>This is a broadcast intent. It can be used in different forms:
|
||||
*
|
||||
* <p>As of TraFF 0.8, it must be sent as an explicit broadcast and include the
|
||||
* {@link #EXTRA_SUBSCRIPTION_ID} extra. The intent data must be a URI to the content provider from which
|
||||
* the messages can be retrieved. The {@link #EXTRA_FEED} extra is not supported. The feed is part of a
|
||||
* subscription and will contain only changes over feeds sent previously as part of the same
|
||||
* subscription.
|
||||
*
|
||||
* <p>Legacy applications omit the {@link #EXTRA_SUBSCRIPTION_ID} extra and may send it as an implicit
|
||||
* broadcast. If an application supports both legacy transport and TraFF 0.8 or later, it must include
|
||||
* the {@link #EXTRA_PACKAGE} extra. The feed is sent in the {@link #EXTRA_FEED} extra, as legacy
|
||||
* applications may not support content providers. If sent as a response to a subscriptionless poll, the
|
||||
* source should include all messages it holds, else the set of messages included is at the discretion of
|
||||
* the source.
|
||||
*
|
||||
* <p>Future applications may reintroduce unsolicited push operations for certain scenarios.
|
||||
*/
|
||||
public static final String ACTION_TRAFF_PUSH = "org.traffxml.traff.FEED";
|
||||
|
||||
/**
|
||||
* Intent for a subscription request.
|
||||
*
|
||||
* <p>This is a broadcast intent and must be sent as an explicit broadcast.
|
||||
*
|
||||
* <p>The filter list must be specified in the {@link #EXTRA_FILTER_LIST} extra.
|
||||
*
|
||||
* <p>The sender must indicate its package name in the {@link #EXTRA_PACKAGE} extra.
|
||||
*/
|
||||
public static final String ACTION_TRAFF_SUBSCRIBE = "org.traffxml.traff.SUBSCRIBE";
|
||||
|
||||
/**
|
||||
* Intent for a subscription change request,
|
||||
*
|
||||
* <p>This is a broadcast intent and must be sent as an explicit broadcast.
|
||||
*
|
||||
* <p>This intent must have {@link #EXTRA_SUBSCRIPTION_ID} set to the ID of an existing subscription between
|
||||
* the calling consumer and the source which receives the broadcast.
|
||||
*
|
||||
* <p>The new filter list must be specified in the {@link #EXTRA_FILTER_LIST} extra.
|
||||
*/
|
||||
public static final String ACTION_TRAFF_SUBSCRIPTION_CHANGE = "org.traffxml.traff.SUBSCRIPTION_CHANGE";
|
||||
|
||||
/**
|
||||
* Intent for an unsubscribe request,
|
||||
*
|
||||
* <p>This is a broadcast intent and must be sent as an explicit broadcast.
|
||||
*
|
||||
* <p>This intent must have {@link #EXTRA_SUBSCRIPTION_ID} set to the ID of an existing subscription between
|
||||
* the calling consumer and the source which receives the broadcast. It signals that the consumer is no
|
||||
* longer interested in receiving messages related to that subscription, and that the source should stop
|
||||
* sending updates. Unsubscribing from a nonexistent subscription is a no-op.
|
||||
*/
|
||||
public static final String ACTION_TRAFF_UNSUBSCRIBE = "org.traffxml.traff.UNSUBSCRIBE";
|
||||
|
||||
/**
|
||||
* Name for the column which holds the message data.
|
||||
*/
|
||||
public static final String COLUMN_DATA = "data";
|
||||
|
||||
/**
|
||||
* Schema for TraFF content URIs.
|
||||
*/
|
||||
public static final String CONTENT_SCHEMA = "content";
|
||||
|
||||
/**
|
||||
* String representations of TraFF result codes
|
||||
*/
|
||||
public static final String[] ERROR_STRINGS = {
|
||||
"unknown (0)",
|
||||
"invalid request (1)",
|
||||
"subscription rejected by the source (2)",
|
||||
"requested area not covered (3)",
|
||||
"requested area partially covered (4)",
|
||||
"subscription ID not recognized by the source (5)",
|
||||
"unknown (6)",
|
||||
"source reported an internal error (7)"
|
||||
};
|
||||
|
||||
/**
|
||||
* Extra which contains the capabilities of the peer.
|
||||
*
|
||||
* <p>This is a String extra. It contains a {@code capabilities} XML element.
|
||||
*/
|
||||
public static final String EXTRA_CAPABILITIES = "capabilities";
|
||||
|
||||
/**
|
||||
* Extra which contains a TraFF feed.
|
||||
*
|
||||
* <p>This is a String extra. It contains a {@code feed} XML element.
|
||||
*
|
||||
* <p>The sender should be careful to keep the size of this extra low, as Android has a 1 MByte limit on all
|
||||
* pending Binder transactions. However, there is no feedback to the sender about the capacity still
|
||||
* available, or whether a request exceeds that limit. Therefore, senders should keep the size if each
|
||||
* feed significantly below that limit. If necessary, they should split up a feed into multiple smaller
|
||||
* ones and send them with a delay in between.
|
||||
*
|
||||
* <p>This mechanism is deprecated since TraFF 0.8 and peers are no longer required to support it. Peers
|
||||
* which support TraFF 0.8 must rely on content providers for message transport.
|
||||
*/
|
||||
@Deprecated
|
||||
public static final String EXTRA_FEED = "feed";
|
||||
|
||||
/**
|
||||
* Extra which contains a filter list.
|
||||
*
|
||||
* <p>This is a String extra. It contains a {@code filter_list} XML element.
|
||||
*/
|
||||
public static final String EXTRA_FILTER_LIST = "filter_list";
|
||||
|
||||
/**
|
||||
* Extra which contains the package name of the app sending it.
|
||||
*
|
||||
* <p>This is a String extra.
|
||||
*/
|
||||
public static final String EXTRA_PACKAGE = "package";
|
||||
|
||||
/**
|
||||
* Extra which contains a subscription ID.
|
||||
*
|
||||
* <p>This is a String extra.
|
||||
*/
|
||||
public static final String EXTRA_SUBSCRIPTION_ID = "subscription_id";
|
||||
|
||||
/**
|
||||
* Extra which contains the timeout duration for a subscription.
|
||||
*
|
||||
* <p>This is an integer extra.
|
||||
*/
|
||||
public static final String EXTRA_TIMEOUT = "timeout";
|
||||
|
||||
/**
|
||||
* The MIME type for TraFF content providers.
|
||||
*/
|
||||
public static final String MIME_TYPE_TRAFF = "vnd.android.cursor.dir/org.traffxml.message";
|
||||
|
||||
/**
|
||||
* The operation completed successfully.
|
||||
*/
|
||||
public static final int RESULT_OK = -1;
|
||||
|
||||
/**
|
||||
* An internal error prevented the recipient from fulfilling the request.
|
||||
*/
|
||||
public static final int RESULT_INTERNAL_ERROR = 7;
|
||||
|
||||
/**
|
||||
* A nonexistent operation was attempted, or an operation was attempted with incomplete or otherwise
|
||||
* invalid data.
|
||||
*/
|
||||
public static final int RESULT_INVALID = 1;
|
||||
|
||||
/**
|
||||
* The subscription was rejected, and no messages will be sent.
|
||||
*/
|
||||
public static final int RESULT_SUBSCRIPTION_REJECTED = 2;
|
||||
|
||||
/**
|
||||
* The subscription was rejected because the source will never provide messages matching the selection.
|
||||
*/
|
||||
public static final int RESULT_NOT_COVERED = 3;
|
||||
|
||||
/**
|
||||
* The subscription was accepted but the source can only provide messages for parts of the selection.
|
||||
*/
|
||||
public static final int RESULT_PARTIALLY_COVERED = 4;
|
||||
|
||||
/**
|
||||
* The request failed because it refers to a subscription which does not exist between the source and
|
||||
* consumer involved.
|
||||
*/
|
||||
public static final int RESULT_SUBSCRIPTION_UNKNOWN = 5;
|
||||
|
||||
/**
|
||||
* The request failed because the aggregator does not accept unsolicited push requests from the sensor.
|
||||
*/
|
||||
public static final int RESULT_PUSH_REJECTED = 6;
|
||||
|
||||
public static String formatTraffError(int code) {
|
||||
if ((code < 0) || (code >= ERROR_STRINGS.length))
|
||||
return String.format("unknown (%d)", code);
|
||||
else
|
||||
return ERROR_STRINGS[code];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
package app.organicmaps.sdk.traffxml;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
|
||||
/**
|
||||
* Abstract superclass for TraFF source implementations.
|
||||
*/
|
||||
public abstract class SourceImpl extends BroadcastReceiver
|
||||
{
|
||||
/**
|
||||
* Creates a new instance.
|
||||
*
|
||||
* @param context The application context
|
||||
*/
|
||||
public SourceImpl(Context context, long nativeManager)
|
||||
{
|
||||
super();
|
||||
this.context = context;
|
||||
this.nativeManager = nativeManager;
|
||||
}
|
||||
|
||||
protected Context context;
|
||||
|
||||
/**
|
||||
* The native `TraffSourceManager` instance.
|
||||
*/
|
||||
protected long nativeManager;
|
||||
|
||||
/**
|
||||
* Subscribes to a traffic source.
|
||||
*
|
||||
* @param filterList The filter list in XML format
|
||||
*/
|
||||
public abstract void subscribe(String filterList);
|
||||
|
||||
/**
|
||||
* Changes an existing traffic subscription.
|
||||
*
|
||||
* @param filterList The filter list in XML format
|
||||
*/
|
||||
public abstract void changeSubscription(String filterList);
|
||||
|
||||
/**
|
||||
* Unsubscribes from a traffic source we are subscribed to.
|
||||
*/
|
||||
public abstract void unsubscribe();
|
||||
|
||||
/**
|
||||
* Forwards a newly received TraFF feed to the traffic module for processing.
|
||||
*
|
||||
* Called when a TraFF feed is received. This is a wrapper around {@link #onFeedReceivedImpl(long, String)}.
|
||||
*
|
||||
* @param feed The TraFF feed
|
||||
*/
|
||||
protected void onFeedReceived(String feed)
|
||||
{
|
||||
onFeedReceivedImpl(nativeManager, feed);
|
||||
}
|
||||
|
||||
/**
|
||||
* Forwards a newly received TraFF feed to the traffic module for processing.
|
||||
*
|
||||
* Called when a TraFF feed is received.
|
||||
*
|
||||
* @param nativeManager The native `TraffSourceManager` instance
|
||||
* @param feed The TraFF feed
|
||||
*/
|
||||
protected static native void onFeedReceivedImpl(long nativeManager, String feed);
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
package app.organicmaps.sdk.traffxml;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import android.Manifest;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
|
||||
/**
|
||||
* Implementation for a TraFF 0.7 source.
|
||||
*/
|
||||
public class SourceImplV0_7 extends SourceImpl
|
||||
{
|
||||
private PackageManager pm;
|
||||
|
||||
/**
|
||||
* Creates a new instance.
|
||||
*
|
||||
* @param context The application context
|
||||
*/
|
||||
public SourceImplV0_7(Context context, long nativeManager)
|
||||
{
|
||||
super(context, nativeManager);
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
/**
|
||||
* Subscribes to a traffic source.
|
||||
*
|
||||
* @param filterList The filter list in XML format
|
||||
*/
|
||||
@Override
|
||||
public void subscribe(String filterList)
|
||||
{
|
||||
IntentFilter traffFilter07 = new IntentFilter();
|
||||
traffFilter07.addAction(AndroidTransport.ACTION_TRAFF_PUSH);
|
||||
|
||||
this.context.registerReceiver(this, traffFilter07);
|
||||
|
||||
// Broadcast a poll intent to all TraFF 0.7-only receivers
|
||||
Intent outIntent = new Intent(AndroidTransport.ACTION_TRAFF_POLL);
|
||||
pm = this.context.getPackageManager();
|
||||
List<ResolveInfo> receivers07 = pm.queryBroadcastReceivers(outIntent, 0);
|
||||
List<ResolveInfo> receivers08 = pm.queryBroadcastReceivers(new Intent(AndroidTransport.ACTION_TRAFF_GET_CAPABILITIES), 0);
|
||||
if (receivers07 != null)
|
||||
{
|
||||
/*
|
||||
* Get receivers which support only TraFF 0.7 and poll them.
|
||||
* If there are no TraFF 0.7 sources at the moment, we register the receiver nonetheless.
|
||||
* That way, if any new sources are added during the session, we get any messages they send.
|
||||
*/
|
||||
if (receivers08 != null)
|
||||
receivers07.removeAll(receivers08);
|
||||
for (ResolveInfo receiver : receivers07)
|
||||
{
|
||||
ComponentName cn = new ComponentName(receiver.activityInfo.applicationInfo.packageName,
|
||||
receiver.activityInfo.name);
|
||||
outIntent = new Intent(AndroidTransport.ACTION_TRAFF_POLL);
|
||||
outIntent.setComponent(cn);
|
||||
this.context.sendBroadcast(outIntent, Manifest.permission.ACCESS_COARSE_LOCATION);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes an existing traffic subscription.
|
||||
*
|
||||
* This implementation does nothing, as TraFF 0.7 does not support subscriptions.
|
||||
*
|
||||
* @param filterList The filter list in XML format
|
||||
*/
|
||||
@Override
|
||||
public void changeSubscription(String filterList)
|
||||
{
|
||||
// NOP
|
||||
}
|
||||
|
||||
/**
|
||||
* Unsubscribes from a traffic source we are subscribed to.
|
||||
*/
|
||||
@Override
|
||||
public void unsubscribe()
|
||||
{
|
||||
this.context.unregisterReceiver(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent)
|
||||
{
|
||||
if (intent == null)
|
||||
return;
|
||||
|
||||
if (intent.getAction().equals(AndroidTransport.ACTION_TRAFF_PUSH))
|
||||
{
|
||||
/* 0.7 feed */
|
||||
String packageName = intent.getStringExtra(AndroidTransport.EXTRA_PACKAGE);
|
||||
/*
|
||||
* If the feed comes from a TraFF 0.8+ source, skip it (this may happen with “bilingual”
|
||||
* TraFF 0.7/0.8 sources). That ensures the only way to get information from such sources is
|
||||
* through a TraFF 0.8 subscription. Fetching the list from scratch each time ensures that
|
||||
* apps installed during runtime get considered.)
|
||||
*/
|
||||
if (packageName != null)
|
||||
{
|
||||
for (ResolveInfo info : pm.queryBroadcastReceivers(new Intent(AndroidTransport.ACTION_TRAFF_GET_CAPABILITIES), 0))
|
||||
if (packageName.equals(info.resolvePackageName))
|
||||
return;
|
||||
}
|
||||
String feed = intent.getStringExtra(AndroidTransport.EXTRA_FEED);
|
||||
if (feed == null)
|
||||
{
|
||||
Logger.w(this.getClass().getSimpleName(), "empty feed, ignoring");
|
||||
}
|
||||
else
|
||||
{
|
||||
onFeedReceived(feed);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,240 @@
|
||||
package app.organicmaps.sdk.traffxml;
|
||||
|
||||
import android.Manifest;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.IntentFilter.MalformedMimeTypeException;
|
||||
import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
|
||||
/**
|
||||
* Implementation for a TraFF 0.8 source.
|
||||
*/
|
||||
public class SourceImplV0_8 extends SourceImpl
|
||||
{
|
||||
|
||||
private String packageName;
|
||||
private String subscriptionId = null;
|
||||
|
||||
/**
|
||||
* Creates a new instance.
|
||||
*
|
||||
* @param context The application context
|
||||
* @param packageName The package name for the source
|
||||
*/
|
||||
public SourceImplV0_8(Context context, long nativeManager, String packageName)
|
||||
{
|
||||
super(context, nativeManager);
|
||||
this.packageName = packageName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Subscribes to a traffic source.
|
||||
*
|
||||
* @param filterList The filter list in XML format
|
||||
*/
|
||||
@Override
|
||||
public void subscribe(String filterList)
|
||||
{
|
||||
IntentFilter filter = new IntentFilter();
|
||||
filter.addAction(AndroidTransport.ACTION_TRAFF_PUSH);
|
||||
filter.addDataScheme(AndroidTransport.CONTENT_SCHEMA);
|
||||
try
|
||||
{
|
||||
filter.addDataType(AndroidTransport.MIME_TYPE_TRAFF);
|
||||
}
|
||||
catch (MalformedMimeTypeException e)
|
||||
{
|
||||
// as long as the constant is a well-formed MIME type, this exception never gets thrown
|
||||
// TODO revisit logging
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
context.registerReceiver(this, filter);
|
||||
|
||||
Bundle extras = new Bundle();
|
||||
extras.putString(AndroidTransport.EXTRA_PACKAGE, context.getPackageName());
|
||||
extras.putString(AndroidTransport.EXTRA_FILTER_LIST, filterList);
|
||||
AndroidConsumer.sendTraffIntent(context, AndroidTransport.ACTION_TRAFF_SUBSCRIBE, null,
|
||||
extras, packageName, Manifest.permission.ACCESS_COARSE_LOCATION, this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes an existing traffic subscription.
|
||||
*
|
||||
* @param filterList The filter list in XML format
|
||||
*/
|
||||
@Override
|
||||
public void changeSubscription(String filterList)
|
||||
{
|
||||
Bundle extras = new Bundle();
|
||||
extras.putString(AndroidTransport.EXTRA_SUBSCRIPTION_ID, subscriptionId);
|
||||
extras.putString(AndroidTransport.EXTRA_FILTER_LIST, filterList);
|
||||
AndroidConsumer.sendTraffIntent(context, AndroidTransport.ACTION_TRAFF_SUBSCRIPTION_CHANGE, null,
|
||||
extras, packageName, Manifest.permission.ACCESS_COARSE_LOCATION, this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unsubscribes from a traffic source we are subscribed to.
|
||||
*/
|
||||
@Override
|
||||
public void unsubscribe()
|
||||
{
|
||||
Bundle extras = new Bundle();
|
||||
extras.putString(AndroidTransport.EXTRA_SUBSCRIPTION_ID, subscriptionId);
|
||||
AndroidConsumer.sendTraffIntent(this.context, AndroidTransport.ACTION_TRAFF_UNSUBSCRIBE, null,
|
||||
extras, packageName, Manifest.permission.ACCESS_COARSE_LOCATION, this);
|
||||
|
||||
this.context.unregisterReceiver(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent)
|
||||
{
|
||||
if (intent == null)
|
||||
return;
|
||||
|
||||
if (intent.getAction().equals(AndroidTransport.ACTION_TRAFF_PUSH))
|
||||
{
|
||||
Uri uri = intent.getData();
|
||||
if (uri != null)
|
||||
{
|
||||
/* 0.8 feed */
|
||||
String subscriptionId = intent.getStringExtra(AndroidTransport.EXTRA_SUBSCRIPTION_ID);
|
||||
if (subscriptionId.equals(this.subscriptionId))
|
||||
fetchMessages(context, uri);
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.w(this.getClass().getSimpleName(), "no URI in feed, ignoring");
|
||||
} // uri != null
|
||||
} else if (intent.getAction().equals(AndroidTransport.ACTION_TRAFF_SUBSCRIBE)) {
|
||||
if (this.getResultCode() != AndroidTransport.RESULT_OK) {
|
||||
Bundle extras = this.getResultExtras(true);
|
||||
if (extras != null)
|
||||
Logger.e(this.getClass().getSimpleName(), String.format("subscription to %s failed, %s",
|
||||
extras.getString(AndroidTransport.EXTRA_PACKAGE), AndroidTransport.formatTraffError(this.getResultCode())));
|
||||
else
|
||||
Logger.e(this.getClass().getSimpleName(), String.format("subscription failed, %s",
|
||||
AndroidTransport.formatTraffError(this.getResultCode())));
|
||||
if (this.getResultCode() == AndroidTransport.RESULT_INTERNAL_ERROR)
|
||||
Logger.e(this.getClass().getSimpleName(), "Make sure the TraFF source app has at least coarse location permission, even when running in background");
|
||||
return;
|
||||
}
|
||||
Bundle extras = this.getResultExtras(true);
|
||||
String data = this.getResultData();
|
||||
String packageName = extras.getString(AndroidTransport.EXTRA_PACKAGE);
|
||||
if (!this.packageName.equals(packageName))
|
||||
return;
|
||||
String subscriptionId = extras.getString(AndroidTransport.EXTRA_SUBSCRIPTION_ID);
|
||||
if (subscriptionId == null) {
|
||||
Logger.e(this.getClass().getSimpleName(),
|
||||
String.format("subscription to %s failed: no subscription ID returned", packageName));
|
||||
return;
|
||||
} else if (packageName == null) {
|
||||
Logger.e(this.getClass().getSimpleName(), "subscription failed: no package name");
|
||||
return;
|
||||
} else if (data == null) {
|
||||
Logger.w(this.getClass().getSimpleName(),
|
||||
String.format("subscription to %s successful (ID: %s) but no content URI was supplied. "
|
||||
+ "This is an issue with the source and may result in delayed message retrieval.",
|
||||
packageName, subscriptionId));
|
||||
this.subscriptionId = subscriptionId;
|
||||
return;
|
||||
}
|
||||
Logger.d(this.getClass().getSimpleName(),
|
||||
"subscription to " + packageName + " successful, ID: " + subscriptionId);
|
||||
this.subscriptionId = subscriptionId;
|
||||
fetchMessages(context, Uri.parse(data));
|
||||
} else if (intent.getAction().equals(AndroidTransport.ACTION_TRAFF_SUBSCRIPTION_CHANGE)) {
|
||||
if (this.getResultCode() != AndroidTransport.RESULT_OK) {
|
||||
Bundle extras = this.getResultExtras(true);
|
||||
if (extras != null)
|
||||
Logger.e(this.getClass().getSimpleName(),
|
||||
String.format("subscription change for %s failed: %s",
|
||||
extras.getString(AndroidTransport.EXTRA_SUBSCRIPTION_ID),
|
||||
AndroidTransport.formatTraffError(this.getResultCode())));
|
||||
else
|
||||
Logger.e(this.getClass().getSimpleName(),
|
||||
String.format("subscription change failed: %s",
|
||||
AndroidTransport.formatTraffError(this.getResultCode())));
|
||||
return;
|
||||
}
|
||||
Bundle extras = intent.getExtras();
|
||||
String data = this.getResultData();
|
||||
String subscriptionId = extras.getString(AndroidTransport.EXTRA_SUBSCRIPTION_ID);
|
||||
if (subscriptionId == null) {
|
||||
Logger.w(this.getClass().getSimpleName(),
|
||||
"subscription change successful but the source did not specify the subscription ID. "
|
||||
+ "This is an issue with the source and may result in delayed message retrieval. "
|
||||
+ "URI: " + data);
|
||||
return;
|
||||
} else if (!subscriptionId.equals(this.subscriptionId)) {
|
||||
return;
|
||||
} else if (data == null) {
|
||||
Logger.w(this.getClass().getSimpleName(),
|
||||
String.format("subscription change for %s successful but no content URI was supplied. "
|
||||
+ "This is an issue with the source and may result in delayed message retrieval.",
|
||||
subscriptionId));
|
||||
return;
|
||||
}
|
||||
Logger.d(this.getClass().getSimpleName(),
|
||||
"subscription change for " + subscriptionId + " successful");
|
||||
fetchMessages(context, Uri.parse(data));
|
||||
} else if (intent.getAction().equals(AndroidTransport.ACTION_TRAFF_UNSUBSCRIBE)) {
|
||||
String subscriptionId = intent.getStringExtra(AndroidTransport.EXTRA_SUBSCRIPTION_ID);
|
||||
if (subscriptionId.equals(this.subscriptionId))
|
||||
this.subscriptionId = null;
|
||||
// TODO is there anything to do here? (Comment below is from Navit)
|
||||
/*
|
||||
* If we ever unsubscribe for reasons other than that we are shutting down or got a feed for
|
||||
* a subscription we don’t recognize, or if we start keeping a persistent list of
|
||||
* subscriptions, we need to delete the subscription from our list. Until then, there is
|
||||
* nothing to do here: either the subscription isn’t in the list, or we are about to shut
|
||||
* down and the whole list is about to get discarded.
|
||||
*/
|
||||
} else if (intent.getAction().equals(AndroidTransport.ACTION_TRAFF_HEARTBEAT)) {
|
||||
String subscriptionId = intent.getStringExtra(AndroidTransport.EXTRA_SUBSCRIPTION_ID);
|
||||
if (subscriptionId.equals(this.subscriptionId)) {
|
||||
Logger.d(this.getClass().getSimpleName(),
|
||||
String.format("got a heartbeat from %s for subscription %s; sending result",
|
||||
intent.getStringExtra(AndroidTransport.EXTRA_PACKAGE), subscriptionId));
|
||||
this.setResult(AndroidTransport.RESULT_OK, null, null);
|
||||
}
|
||||
} // intent.getAction()
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches TraFF messages from a content provider.
|
||||
*
|
||||
* @param context The context to use for the content resolver
|
||||
* @param uri The content provider URI
|
||||
*/
|
||||
private void fetchMessages(Context context, Uri uri) {
|
||||
try {
|
||||
Cursor cursor = context.getContentResolver().query(uri, new String[] {AndroidTransport.COLUMN_DATA}, null, null, null);
|
||||
if (cursor == null)
|
||||
return;
|
||||
if (cursor.getCount() < 1) {
|
||||
cursor.close();
|
||||
return;
|
||||
}
|
||||
StringBuilder builder = new StringBuilder("<feed>\n");
|
||||
while (cursor.moveToNext())
|
||||
builder.append(cursor.getString(cursor.getColumnIndex(AndroidTransport.COLUMN_DATA))).append("\n");
|
||||
builder.append("</feed>");
|
||||
cursor.close();
|
||||
onFeedReceived(builder.toString());
|
||||
} catch (Exception e) {
|
||||
Logger.w(this.getClass().getSimpleName(),
|
||||
String.format("Unable to fetch messages from %s", uri.toString()), e);
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* Copyright © 2019–2020 traffxml.org.
|
||||
*
|
||||
* Relicensed to CoMaps by the original author.
|
||||
*/
|
||||
|
||||
package app.organicmaps.sdk.traffxml;
|
||||
|
||||
/**
|
||||
* Constants for versions.
|
||||
*/
|
||||
public class Version {
|
||||
/** Version 0.7: introduced transport on Android. */
|
||||
public static final int V0_7 = 7;
|
||||
|
||||
/** Version 0.8: introduced subscriptions and HTTP transport. */
|
||||
public static final int V0_8 = 8;
|
||||
}
|
||||
@@ -70,6 +70,16 @@ public final class Config
|
||||
* True if the first start animation has been seen.
|
||||
*/
|
||||
private static final String KEY_MISC_FIRST_START_DIALOG_SEEN = "FirstStartDialogSeen";
|
||||
|
||||
/**
|
||||
* Whether feeds from legacy TraFF applications (TraFF 0.7, Android transport) are enabled.
|
||||
*/
|
||||
private static final String KEY_TRAFFIC_LEGACY_ENABLED = "TrafficLegacyEnabled";
|
||||
|
||||
/**
|
||||
* TraFF (0.8+) applications from which to request traffic data.
|
||||
*/
|
||||
private static final String KEY_TRAFFIC_APPS = "TrafficApps";
|
||||
|
||||
private Config() {}
|
||||
|
||||
@@ -393,6 +403,63 @@ public final class Config
|
||||
nativeSetTransliteration(value);
|
||||
}
|
||||
|
||||
public static boolean getTrafficHttpEnabled()
|
||||
{
|
||||
return nativeGetTrafficHttpEnabled();
|
||||
}
|
||||
|
||||
public static void setTrafficHttpEnabled(boolean value)
|
||||
{
|
||||
nativeSetTrafficHttpEnabled(value);
|
||||
}
|
||||
|
||||
public static String getTrafficHttpUrl()
|
||||
{
|
||||
return nativeGetTrafficHttpUrl();
|
||||
}
|
||||
|
||||
public static void setTrafficHttpUrl(String value)
|
||||
{
|
||||
nativeSetTrafficHttpUrl(value);
|
||||
}
|
||||
|
||||
public static String[] getTrafficApps()
|
||||
{
|
||||
String appString = getString(KEY_TRAFFIC_APPS, "");
|
||||
if (appString.length() == 0)
|
||||
return new String[0];
|
||||
return appString.split(",");
|
||||
}
|
||||
|
||||
public static void setTrafficApps(String[] value)
|
||||
{
|
||||
String valueString = "";
|
||||
for (int i = 0; i < value.length; i++)
|
||||
{
|
||||
valueString = valueString + value[i];
|
||||
if ((i + 1) < value.length)
|
||||
valueString = valueString + ",";
|
||||
}
|
||||
setString(KEY_TRAFFIC_APPS, valueString);
|
||||
applyTrafficApps(value);
|
||||
}
|
||||
|
||||
public static boolean getTrafficLegacyEnabled()
|
||||
{
|
||||
return getBool(KEY_TRAFFIC_LEGACY_ENABLED, false);
|
||||
}
|
||||
|
||||
public static void setTrafficLegacyEnabled(boolean value)
|
||||
{
|
||||
setBool(KEY_TRAFFIC_LEGACY_ENABLED, value);
|
||||
applyTrafficLegacyEnabled(value);
|
||||
}
|
||||
|
||||
public static boolean isNY()
|
||||
{
|
||||
return getBool("NY");
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static String getDonateUrl()
|
||||
{
|
||||
@@ -536,4 +603,10 @@ public final class Config
|
||||
private static native void nativeSetLargeFontsSize(boolean value);
|
||||
private static native boolean nativeGetTransliteration();
|
||||
private static native void nativeSetTransliteration(boolean value);
|
||||
private static native boolean nativeGetTrafficHttpEnabled();
|
||||
private static native void nativeSetTrafficHttpEnabled(boolean value);
|
||||
private static native String nativeGetTrafficHttpUrl();
|
||||
private static native void nativeSetTrafficHttpUrl(String value);
|
||||
private static native void applyTrafficApps(String[] value);
|
||||
private static native void applyTrafficLegacyEnabled(boolean value);
|
||||
}
|
||||
|
||||
@@ -34,53 +34,4 @@
|
||||
<string name="type.amenity.parking.street_side.private">ব্যক্তিগত সড়ক-পার্শ্ববর্তী পার্কিং</string>
|
||||
<string name="type.amenity.parking.lane">লেন পার্কিং</string>
|
||||
<string name="type.amenity.parking.underground.private">ব্যক্তিগত আন্ডারগ্রাউন্ড পার্কিং</string>
|
||||
<string name="type.aeroway.aerodrome">বিমানবন্দর</string>
|
||||
<string name="type.aeroway.aerodrome.international">আন্তর্জাতিক বিমানবন্দর</string>
|
||||
<string name="type.amenity.drinking_water">পানীয় জল</string>
|
||||
<string name="type.office.diplomatic">দূতাবাস</string>
|
||||
<string name="type.natural.water.river">নদী</string>
|
||||
<string name="type.natural.tree">গাছ</string>
|
||||
<string name="type.natural.water.pond">পুকুর</string>
|
||||
<string name="type.natural.volcano">আগ্নেয়গিরি</string>
|
||||
<string name="type.natural.desert">মরুভূমি</string>
|
||||
<string name="type.natural.coastline">উপকূলরেখা</string>
|
||||
<string name="type.amenity.college">কলেজ</string>
|
||||
<string name="type.amenity.music_school">গানের স্কুল</string>
|
||||
<string name="type.amenity.place_of_worship.muslim">মসজিদ</string>
|
||||
<string name="type.amenity.place_of_worship.hindu">হিন্দু মন্দির</string>
|
||||
<string name="type.amenity.prison">কারাগার</string>
|
||||
<string name="type.barrier.fence">বেড়া</string>
|
||||
<string name="type.waterway.waterfall">ঝর্ণা</string>
|
||||
<string name="type.waterway.river">নদী</string>
|
||||
<string name="type.waterway.dam">বাঁধ</string>
|
||||
<string name="type.attraction.historic">ঐতিহাসিক আকর্ষণ</string>
|
||||
<string name="type.area_highway.steps">সিঁড়ি</string>
|
||||
<string name="type.area_highway.path">পথ</string>
|
||||
<string name="type.amenity.theatre">থিয়েটার</string>
|
||||
<string name="type.sport.soccer">ফুটবল</string>
|
||||
<string name="type.sport.swimming">সাঁতার</string>
|
||||
<string name="type.sport.table_tennis">টেবিল টেনিস</string>
|
||||
<string name="type.sport.yoga">যোগ</string>
|
||||
<string name="type.tourism">পর্যটন</string>
|
||||
<string name="type.tourism.artwork.statue">মূর্তি</string>
|
||||
<string name="type.tourism.attraction">আকর্ষণ</string>
|
||||
<string name="type.tourism.artwork.sculpture">ভাস্কর্য</string>
|
||||
<string name="type.tourism.hostel">হোস্টেল</string>
|
||||
<string name="type.tourism.hotel">হোটেল</string>
|
||||
<string name="type.tourism.zoo">চিড়িয়াখানা</string>
|
||||
<string name="type.tourism.museum">জাদুঘর</string>
|
||||
<string name="type.sport.volleyball">ভলিবল</string>
|
||||
<string name="type.sport.golf">গল্ফ</string>
|
||||
<string name="type.sport.cricket">ক্রিকেট</string>
|
||||
<string name="type.sport.chess">দাবা</string>
|
||||
<string name="type.sport.basketball">বাস্কেটবল</string>
|
||||
<string name="type.sport.badminton">ব্যাডমিন্টন</string>
|
||||
<string name="type.sport">ক্রীড়া</string>
|
||||
<string name="type.sport.multi">বিভিন্ন ক্রীড়া</string>
|
||||
<string name="type.amenity.toilets">শৌচালয়</string>
|
||||
<string name="type.shop.watches">ঘড়ির দোকান</string>
|
||||
<string name="type.shop.paint">রঙের দোকান</string>
|
||||
<string name="type.shop.lottery">লটারি টিকিট</string>
|
||||
<string name="type.shop.boutique">বুটিক</string>
|
||||
<string name="type.shop.bag">ব্যাগের দোকান</string>
|
||||
</resources>
|
||||
|
||||
@@ -145,7 +145,7 @@
|
||||
<string name="type.amenity.vending_machine.cigarettes">Automat na cigarety</string>
|
||||
<string name="type.amenity.vending_machine.drinks">Automat na nápoje</string>
|
||||
<string name="type.amenity.vending_machine.parking_tickets">Parkovací automat</string>
|
||||
<string name="type.amenity.vending_machine.public_transport_tickets">Automat na jízdenky MHD</string>
|
||||
<string name="type.amenity.vending_machine.public_transport_tickets">Automat na jízdenky</string>
|
||||
<string name="type.amenity.vehicle_inspection">Kontrola vozidla</string>
|
||||
<string name="type.amenity.veterinary">Veterinář</string>
|
||||
<string name="type.amenity.waste_basket">Odpadkový koš</string>
|
||||
@@ -1260,7 +1260,7 @@
|
||||
<string name="type.recycling.cardboard">Lepenka</string>
|
||||
<string name="type.recycling.shoes">Boty</string>
|
||||
<string name="type.building.warehouse">Sklad</string>
|
||||
<string name="type.amenity.shelter.lean_to">Otevřený spací přístřešek</string>
|
||||
<string name="type.amenity.shelter.lean_to">Otevřený přístřešek</string>
|
||||
<string name="type.amenity.vending_machine.coffee">Automat na kávu</string>
|
||||
<string name="type.amenity.taxi">Stanoviště taxislužby</string>
|
||||
<string name="type.amenity.vending_machine">Prodejní automat</string>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<!-- Removable external storage type in Maps Storage settings, e.g. an SD card -->
|
||||
<string name="maps_storage_removable">SD-Karte</string>
|
||||
<!-- Generic external storage type in Maps Storage settings -->
|
||||
<string name="maps_storage_external">Externer geteilter Speicher</string>
|
||||
<string name="maps_storage_external">Externer gemeinsamer Speicher</string>
|
||||
<!-- Search category for WiFi access; any changes should be duplicated in categories.txt @category_wifi! -->
|
||||
<string name="category_wifi">WLAN</string>
|
||||
<string name="postal_code">Postleitzahl</string>
|
||||
|
||||
@@ -154,7 +154,7 @@
|
||||
<!-- Compared to wilderness_hut its smaller and simpler, without a fireplace. -->
|
||||
<string name="type.amenity.shelter.basic_hut">Biwakschachtel</string>
|
||||
<!-- A traditional 3-walled shelter (one side open), suitable for overnight camping. -->
|
||||
<string name="type.amenity.shelter.lean_to">Lean-to Schlafunterstand</string>
|
||||
<string name="type.amenity.shelter.lean_to">Lean-to Wetterschutz</string>
|
||||
<string name="type.amenity.public_bath">Öffentliches Bad</string>
|
||||
<string name="type.amenity.shower">Dusche</string>
|
||||
<string name="type.amenity.stripclub">Stripclub</string>
|
||||
@@ -374,10 +374,10 @@
|
||||
<string name="type.spherical_buoy.special_purpose">Kugelförmige Spezialboje</string>
|
||||
<string name="type.lateral.port">Backbord</string>
|
||||
<string name="type.lateral.starboard">Steuerbord</string>
|
||||
<string name="type.cardinal.east">Osten</string>
|
||||
<string name="type.cardinal.north">Norden</string>
|
||||
<string name="type.cardinal.south">Süden</string>
|
||||
<string name="type.cardinal.west">Westen</string>
|
||||
<string name="type.cardinal.east">Ost</string>
|
||||
<string name="type.cardinal.north">Nord</string>
|
||||
<string name="type.cardinal.south">Süd</string>
|
||||
<string name="type.cardinal.west">West</string>
|
||||
<!-- A mountain rescue base for search and rescue activities. -->
|
||||
<string name="type.emergency.mountain_rescue">Bergrettungsstation</string>
|
||||
<!-- This is for secondary entrances, for main entrances see type.entrance.main -->
|
||||
@@ -1502,5 +1502,4 @@
|
||||
<string name="type.amenity.mobile_money_agent">Mobile Money Vertretung</string>
|
||||
<string name="type.amenity.food_sharing">Food Sharing</string>
|
||||
<string name="type.natural.sand">Sand</string>
|
||||
<string name="type.amenity.hydrant">Beregnungshydrant</string>
|
||||
</resources>
|
||||
|
||||
@@ -35,12 +35,4 @@
|
||||
<string name="mb">MB</string>
|
||||
<string name="mi">μι</string>
|
||||
<string name="today">Σήμερα</string>
|
||||
<string name="yesterday">Χθες</string>
|
||||
<string name="days_ago">%s μέρες πριν</string>
|
||||
<string name="week_ago">%s εβδομάδα πριν</string>
|
||||
<string name="weeks_ago">%s εβδομάδες πριν</string>
|
||||
<string name="month_ago">%s μήνα πριν</string>
|
||||
<string name="months_ago">%s μήνες πριν</string>
|
||||
<string name="year_ago">%s χρόνο πριν</string>
|
||||
<string name="years_ago">%s χρόνια πριν</string>
|
||||
</resources>
|
||||
|
||||
@@ -37,11 +37,11 @@
|
||||
<string name="gb">GB</string>
|
||||
<string name="today">Hoy</string>
|
||||
<string name="yesterday">Ayer</string>
|
||||
<string name="days_ago">hace %s días</string>
|
||||
<string name="week_ago">hace %s semana</string>
|
||||
<string name="weeks_ago">hace %s semanas</string>
|
||||
<string name="month_ago">hace %s mes</string>
|
||||
<string name="months_ago">hace %s meses</string>
|
||||
<string name="year_ago">hace %s año</string>
|
||||
<string name="years_ago">hace %s años</string>
|
||||
<string name="days_ago">Hace %s días</string>
|
||||
<string name="week_ago">Hace %s semana</string>
|
||||
<string name="weeks_ago">Hace %s semanas</string>
|
||||
<string name="month_ago">Hace %s mes</string>
|
||||
<string name="months_ago">Hace %s meses</string>
|
||||
<string name="year_ago">Hace %s año</string>
|
||||
<string name="years_ago">Hace %s años</string>
|
||||
</resources>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user