Compare commits
464 Commits
v2025.10.0
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8683853f46 | ||
|
|
d7e34c2685 | ||
|
|
0028306b26 | ||
|
|
b5354fd1e3 | ||
|
|
964f82510a | ||
|
|
faf49fc574 | ||
|
|
60b1ad232a | ||
|
|
1bac0fd4fc | ||
|
|
ed6dcc5cb2 | ||
|
|
33b440dd71 | ||
|
|
6a20269819 | ||
|
|
8cd1b41cd2 | ||
|
|
2b630964d0 | ||
|
|
76ecd8209e | ||
|
|
82d2932ba0 | ||
|
|
85540133b3 | ||
|
|
6ded75de9c | ||
|
|
08e8ebd434 | ||
|
|
6c92264fb0 | ||
|
|
4ba0fc51a5 | ||
|
|
29c363a581 | ||
|
|
4973f4fed2 | ||
|
|
8cffa508f3 | ||
|
|
3511dbb692 | ||
|
|
e238a317f1 | ||
|
|
2e85899fcb | ||
|
|
ce978d8ede | ||
|
|
d56f9700f5 | ||
|
|
cc042c3d1c | ||
|
|
4f739d98b0 | ||
|
|
4691de7a66 | ||
|
|
3c082b0629 | ||
|
|
a468bd3fab | ||
|
|
fc87316184 | ||
|
|
298518ae72 | ||
|
|
3bad6d25f0 | ||
|
|
d36361d669 | ||
|
|
688e20b1a6 | ||
|
|
85462161b2 | ||
|
|
b929823f6b | ||
|
|
22dd799585 | ||
|
|
6864d101e2 | ||
|
|
4bfb62b373 | ||
|
|
f1cf844986 | ||
|
|
f20c3bf50c | ||
|
|
e7cc602904 | ||
|
|
d473361e54 | ||
|
|
76d58e4a05 | ||
|
|
7b5878b010 | ||
|
|
3fabbae3f7 | ||
|
|
0add23fcf2 | ||
|
|
08bcb574fa | ||
|
|
db888f33c5 | ||
|
|
4a96d219f0 | ||
|
|
c2bc6c27aa | ||
|
|
1095e5dbc3 | ||
|
|
a1cbcc5885 | ||
|
|
641f2308c6 | ||
|
|
f858ebcce0 | ||
|
|
eb376f5afc | ||
|
|
71b47719af | ||
|
|
4f7230fcbe | ||
|
|
2dafdd4338 | ||
|
|
0237751afe | ||
|
|
e7fb3a2f2c | ||
|
|
e08d60bb40 | ||
|
|
de4252f86c | ||
|
|
9d87d77055 | ||
|
|
c88f59eb75 | ||
|
|
9b5c700ad8 | ||
|
|
7d5e6fabcd | ||
|
|
ebe0364030 | ||
|
|
43e7e1eb2e | ||
|
|
ce9af79a68 | ||
|
|
b54b77bce6 | ||
|
|
038dca9c6f | ||
|
|
47db332f09 | ||
|
|
fdb665317f | ||
|
|
2ac80f7a90 | ||
|
|
c759b4f4a7 | ||
|
|
38802011f8 | ||
|
|
ea887c3209 | ||
|
|
7f075d9bef | ||
|
|
5e576177ea | ||
|
|
2efc001001 | ||
|
|
afa968c7d3 | ||
|
|
22d7cf3969 | ||
|
|
acdcfe62a4 | ||
|
|
67d8249e5a | ||
|
|
a5174623c2 | ||
|
|
c6ac2919fa | ||
|
|
7174d697d4 | ||
|
|
07fb3c0055 | ||
|
|
3b0b4520a1 | ||
|
|
eaa56e5127 | ||
|
|
3f7dc91b5b | ||
|
|
48e1c1f3a5 | ||
|
|
e862da648e | ||
|
|
6d0111b434 | ||
|
|
610737d295 | ||
|
|
26cb42651c | ||
|
|
a702989b09 | ||
|
|
bf6f57d336 | ||
|
|
6b76e9826b | ||
|
|
e19e63930d | ||
|
|
92c2945897 | ||
|
|
2f343d3fba | ||
|
|
955d3702ac | ||
|
|
1d087ca854 | ||
|
|
2c37e22f5c | ||
|
|
2954b3b871 | ||
|
|
c22bc75fb0 | ||
|
|
45094b0c38 | ||
|
|
f4a775a2f9 | ||
|
|
25d84b4428 | ||
|
|
f98a0efa46 | ||
|
|
e53532ab0b | ||
|
|
df1d4bf67e | ||
|
|
6d89a4346d | ||
|
|
971c19a88d | ||
|
|
ff5ae33f2a | ||
|
|
d5f640c6d0 | ||
|
|
72920bb930 | ||
|
|
3b4ab0da89 | ||
|
|
90ee9e3c0f | ||
|
|
54c1aeba1e | ||
|
|
399908b97c | ||
|
|
1df7848888 | ||
|
|
84f7687b98 | ||
|
|
a6057af12d | ||
|
|
4b66d56978 | ||
|
|
6adf01f8de | ||
|
|
2c526d34e9 | ||
|
|
e58fe72250 | ||
|
|
698afc4880 | ||
|
|
20a688505a | ||
|
|
b8e77a0404 | ||
|
|
07cd1ec4f5 | ||
|
|
9b42b08673 | ||
|
|
47efaa77d3 | ||
|
|
ec14b3bb85 | ||
|
|
1612e6045f | ||
|
|
d20144d4f6 | ||
|
|
06ecf4e54a | ||
|
|
0bf9dad343 | ||
|
|
12bd86d26d | ||
|
|
5564c449b3 | ||
|
|
96782ad5b1 | ||
|
|
67938cdf31 | ||
|
|
0e5fa5c501 | ||
|
|
101faeb2aa | ||
|
|
6f9ea8a758 | ||
|
|
176b11003f | ||
|
|
ed0728a332 | ||
|
|
f3b105ee33 | ||
|
|
dd106df592 | ||
|
|
c25552ce03 | ||
|
|
40b0023046 | ||
|
|
efe4570adf | ||
|
|
b72d747a5e | ||
|
|
1a95097fbb | ||
|
|
0243b1e86b | ||
|
|
8f3978e391 | ||
|
|
680d97bc4f | ||
|
|
5683606c31 | ||
|
|
3c7eb92b17 | ||
|
|
226b0f03c8 | ||
|
|
0a3a4ebd9a | ||
|
|
a62f6c0ef6 | ||
|
|
ef280c7f89 | ||
|
|
c49c414ec4 | ||
|
|
e62196798f | ||
|
|
c687c850b8 | ||
|
|
f549358f28 | ||
|
|
e3c8e422d5 | ||
|
|
f664138a42 | ||
|
|
6ae28a0ccf | ||
|
|
6cef8e3594 | ||
|
|
ec76982895 | ||
|
|
17fb4dd855 | ||
|
|
8c880f00b2 | ||
|
|
6c02e1d53a | ||
|
|
a1944435ae | ||
|
|
5beed2672f | ||
|
|
64eb8af3c1 | ||
|
|
316e259ebb | ||
|
|
dce50b2ca6 | ||
|
|
8db1dd55b5 | ||
|
|
14c4d08e32 | ||
|
|
2ae482de76 | ||
|
|
5c2e0b5b43 | ||
|
|
b2077ecf0b | ||
|
|
68ee3f4cda | ||
|
|
07ba709939 | ||
|
|
9bfebc2046 | ||
|
|
24b498e386 | ||
|
|
0a0bb61942 | ||
|
|
d78fe108ad | ||
|
|
4aa441101c | ||
|
|
2d275d9148 | ||
|
|
0814b574a9 | ||
|
|
b4abce822e | ||
|
|
2e0443097a | ||
|
|
f6426fe689 | ||
|
|
6296de6ce9 | ||
|
|
4f63c5fdcf | ||
|
|
e4648fbc1f | ||
|
|
1de35bb5f8 | ||
|
|
7b7df6ff2e | ||
|
|
33e2f4854e | ||
|
|
5b4fa55e83 | ||
|
|
83256c4895 | ||
|
|
94542456a2 | ||
|
|
dd620c3f0c | ||
|
|
a42db17858 | ||
|
|
738d0641ca | ||
|
|
4f5f8782fe | ||
|
|
a886270dda | ||
|
|
66609ff08b | ||
|
|
c8bfeb8e96 | ||
|
|
7fc5ed494b | ||
|
|
d9850f506a | ||
|
|
f16d14e07f | ||
|
|
7852cdb5a5 | ||
|
|
9a96096066 | ||
|
|
f72c4a28d9 | ||
|
|
68bb78b00d | ||
|
|
b9d4f082de | ||
|
|
7e40a0e642 | ||
|
|
0d3d1823d8 | ||
|
|
09e08c4c8f | ||
|
|
a0a5459b15 | ||
|
|
6e57f9a2ba | ||
|
|
d971c51fd1 | ||
|
|
ac23642462 | ||
|
|
cfe1ce2c67 | ||
|
|
e07b2e52b3 | ||
|
|
24f59a1344 | ||
|
|
85f4c1c3eb | ||
|
|
3a9faecc3d | ||
|
|
f0e078701e | ||
|
|
7e27971605 | ||
|
|
9267622494 | ||
|
|
82a4843431 | ||
|
|
5bd7a284fa | ||
|
|
84ecbaa63c | ||
|
|
91ba38df56 | ||
|
|
31dcb954b1 | ||
|
|
8b4eab3444 | ||
|
|
90c12003bd | ||
|
|
a4909a0554 | ||
|
|
1b9e9f5091 | ||
|
|
bd78355263 | ||
|
|
b3c188564e | ||
|
|
e891ffa5d1 | ||
|
|
8799c5613e | ||
|
|
4a91c55ece | ||
|
|
268ad19089 | ||
|
|
325f62d8cb | ||
|
|
443d24b8d0 | ||
|
|
c0e492247e | ||
|
|
e71550e78b | ||
|
|
b3991555b5 | ||
|
|
c21afb27bd | ||
|
|
dea24b5681 | ||
|
|
51859424ea | ||
|
|
b5404cc2c6 | ||
|
|
b8e0ad3b3e | ||
|
|
23b5d92d4f | ||
|
|
99f3639b9c | ||
|
|
e0f8e043bb | ||
|
|
7f4ff8b606 | ||
|
|
7132ff2ed8 | ||
|
|
7312560f48 | ||
|
|
39332db8fc | ||
|
|
8865dac083 | ||
|
|
e25e7dd583 | ||
|
|
9fa21f464c | ||
|
|
e79854a15a | ||
|
|
a3fc38952e | ||
|
|
b74d9b104b | ||
|
|
4567079c65 | ||
|
|
fd5c2e6cd1 | ||
|
|
ab4cae961f | ||
|
|
1f0c202f62 | ||
|
|
d9354e0bd1 | ||
|
|
f443d3a207 | ||
|
|
98fe26f4ab | ||
|
|
f6be1b0ebf | ||
|
|
0e3b6264b8 | ||
|
|
f5edbb33f8 | ||
|
|
81c59fe2c9 | ||
|
|
25d004f7b3 | ||
|
|
210b4df8b2 | ||
|
|
12b9504daa | ||
|
|
ae9dc62b54 | ||
|
|
42f059f8f7 | ||
|
|
936e05283c | ||
|
|
6cee8ee389 | ||
|
|
d92a26739b | ||
|
|
be906c7973 | ||
|
|
d1ff4f8c60 | ||
|
|
9b29191e63 | ||
|
|
73accecfd4 | ||
|
|
495d3e91fd | ||
|
|
7c92cdafa6 | ||
|
|
310287e918 | ||
|
|
bab74782f8 | ||
|
|
647b66cbd0 | ||
|
|
7bd8f8064a | ||
|
|
2b5930dff8 | ||
|
|
d4ac51cc02 | ||
|
|
09ab8322be | ||
|
|
5886d15e88 | ||
|
|
da7c3d6710 | ||
|
|
b806ab7443 | ||
|
|
da68f01ff9 | ||
|
|
44dc71066c | ||
|
|
c0396e96c6 | ||
|
|
1b66a9ac73 | ||
|
|
22a28d75cc | ||
|
|
a730fccf76 | ||
|
|
ae14c05559 | ||
|
|
9d908b5e3d | ||
|
|
3e67c82517 | ||
|
|
5962d60e42 | ||
|
|
e0ee0d9f57 | ||
|
|
1d80478eac | ||
|
|
2daf40479a | ||
|
|
5e7a30df8f | ||
|
|
35d4e8af8b | ||
|
|
20bfa0a1ad | ||
|
|
363f892752 | ||
|
|
d01ed97e34 | ||
|
|
6e12ede1d9 | ||
|
|
90dbfd6311 | ||
|
|
45cf6130f0 | ||
|
|
8a6ce5a561 | ||
|
|
5bf4a8296c | ||
|
|
a6314cc53a | ||
|
|
2820fbac46 | ||
|
|
7afb1df917 | ||
|
|
042d497a5e | ||
|
|
6dcf4b039e | ||
|
|
44f0db083f | ||
|
|
1c4b2ea991 | ||
|
|
658c3c0af8 | ||
|
|
f6e7580aff | ||
|
|
8e5c1a4d17 | ||
|
|
239332edb4 | ||
|
|
564c6203eb | ||
|
|
c727fd7f20 | ||
|
|
5cd9f1274b | ||
|
|
c8a965c855 | ||
|
|
0d4099b555 | ||
|
|
08bdf41bae | ||
|
|
6d28928f58 | ||
|
|
d748e4f4f2 | ||
|
|
a373a3151d | ||
|
|
7b1ed86a5f | ||
|
|
0eaa770b21 | ||
|
|
be3205a82d | ||
|
|
dc20e576f7 | ||
|
|
7915b85f58 | ||
|
|
6fe73a2e5c | ||
|
|
9dc3ccae4f | ||
|
|
448f21bb44 | ||
|
|
b5d65a0f78 | ||
|
|
6d774667c5 | ||
|
|
053f35b519 | ||
|
|
96d51dfcf9 | ||
|
|
cf1432cbf7 | ||
|
|
9ae005ac56 | ||
|
|
bdf9a335ae | ||
|
|
422b14d31a | ||
|
|
ee30622940 | ||
|
|
1e931c81d2 | ||
|
|
517cfb656a | ||
|
|
7b1a4ed7ac | ||
|
|
8926a9fe16 | ||
|
|
bdadd2689c | ||
|
|
c399d5e415 | ||
|
|
7feeb6eca6 | ||
|
|
547ff5795e | ||
|
|
de5b61fde0 | ||
|
|
59bbea44a5 | ||
|
|
9ca9704bd9 | ||
|
|
d283fd41ae | ||
|
|
f81eff2e33 | ||
|
|
1d7cf5ae39 | ||
|
|
0efe782325 | ||
|
|
a1e45b5837 | ||
|
|
7a03dd7cf6 | ||
|
|
2601ec854a | ||
|
|
3fbecd00d5 | ||
|
|
26cdde144a | ||
|
|
f9a0dd1cb2 | ||
|
|
bdde42ce4e | ||
|
|
633896854d | ||
|
|
37a518cb9b | ||
|
|
dd3b6faa42 | ||
|
|
fceb6e0b8a | ||
|
|
ad07875b88 | ||
|
|
db1e5131b7 | ||
|
|
ba7addc504 | ||
|
|
d168855ef5 | ||
|
|
509ff4de72 | ||
|
|
340b5ae3f9 | ||
|
|
f5afe7f363 | ||
|
|
51bfa3d372 | ||
|
|
91d523a6fa | ||
|
|
1c8eeeeee2 | ||
|
|
034098f5ef | ||
|
|
3fcf653deb | ||
|
|
5035aa3f79 | ||
|
|
c887abfd80 | ||
|
|
707415a788 | ||
|
|
832273f928 | ||
|
|
1947a32007 | ||
|
|
e73c37a5dd | ||
|
|
9912d19302 | ||
|
|
30f624a070 | ||
|
|
428ff30af7 | ||
|
|
f514606ebe | ||
|
|
e0351b26ba | ||
|
|
64f8d751cf | ||
|
|
d145f3b51b | ||
|
|
f42014cf37 | ||
|
|
66fae205c2 | ||
|
|
54ba143bbe | ||
|
|
c685b8bed3 | ||
|
|
bb94621cdc | ||
|
|
17f34d155e | ||
|
|
175e971064 | ||
|
|
533e34f390 | ||
|
|
24ec765a00 | ||
|
|
e5b6d882bf | ||
|
|
a74ae0fa3a | ||
|
|
431852f8cc | ||
|
|
a21a717bec | ||
|
|
d7221bdfc9 | ||
|
|
efc8e44350 | ||
|
|
e3c287db53 | ||
|
|
0748e4c9a4 | ||
|
|
7739329cb4 | ||
|
|
2619738882 | ||
|
|
2217db002a | ||
|
|
00be9a536d | ||
|
|
ed37b6595e | ||
|
|
e670bef0a2 | ||
|
|
ccd3f9813a | ||
|
|
db6ad05406 | ||
|
|
8520f32f2d | ||
|
|
47f16c5b89 | ||
|
|
056711f4bd | ||
|
|
2eccbba26e | ||
|
|
8101d50f50 | ||
|
|
8a0a069195 | ||
|
|
a26f4933dc | ||
|
|
aa2d35759f | ||
|
|
233f5b4c33 | ||
|
|
284972ad60 | ||
|
|
0c0e9ab5f6 | ||
|
|
e7f766084f |
@@ -1,69 +1,55 @@
|
|||||||
# All non-assigned.
|
|
||||||
* @organicmaps/mergers
|
|
||||||
# Visual design.
|
# Visual design.
|
||||||
/android/app/src/main/res/drawable*/ @organicmaps/design
|
/android/app/src/main/res/drawable*/ @comaps/design
|
||||||
/android/app/src/main/res/font/ @organicmaps/design
|
/android/app/src/main/res/font/ @comaps/design
|
||||||
/android/app/src/main/res/mipmap*/ @organicmaps/design
|
/android/app/src/main/res/mipmap*/ @comaps/design
|
||||||
/data/*.ttf @organicmaps/design
|
/data/*.ttf @comaps/design
|
||||||
/data/resources-svg/ @organicmaps/design
|
/data/resources-svg/ @comaps/design
|
||||||
/data/search-icons/ @organicmaps/design
|
/data/search-icons/ @comaps/design
|
||||||
/iphone/Maps/Images.xcassets/ @organicmaps/design
|
/iphone/Maps/Images.xcassets/ @comaps/design
|
||||||
# Android.
|
# Android.
|
||||||
/android/ @organicmaps/android
|
/android/ @comaps/android
|
||||||
/android/app/src/main/java/app/organicmaps/car/ @organicmaps/android-auto
|
/android/app/src/main/java/app/comaps/car/ @comaps/android-auto
|
||||||
/docs/ANDROID_LOCATION_TEST.md @organicmaps/android
|
/docs/ANDROID_LOCATION_TEST.md @comaps/android
|
||||||
/docs/JAVA_STYLE.md @organicmaps/android
|
/docs/JAVA_STYLE.md @comaps/android
|
||||||
# no owner for translation changes
|
# no owner for translation changes
|
||||||
/android/app/src/main/res/values*/strings.xml
|
/android/app/src/main/res/values*/strings.xml
|
||||||
# iOS.
|
# iOS.
|
||||||
/iphone/ @organicmaps/ios
|
/iphone/ @comaps/ios
|
||||||
/xcode/ @organicmaps/ios
|
/xcode/ @comaps/ios
|
||||||
/docs/OBJC_STYLE.md @organicmaps/ios
|
/docs/OBJC_STYLE.md @comaps/ios
|
||||||
# no owner for translation changes
|
# no owner for translation changes
|
||||||
/iphone/plist.txt
|
/iphone/plist.txt
|
||||||
/iphone/Maps/LocalizedStrings/
|
/iphone/Maps/LocalizedStrings/
|
||||||
# Qt
|
|
||||||
/qt/ @organicmaps/qt
|
|
||||||
# Rendering
|
|
||||||
/drape/ @organicmaps/rendering
|
|
||||||
/drape_frontend/ @organicmaps/rendering
|
|
||||||
# Map Data.
|
|
||||||
/tools/python/maps_generator/ @organicmaps/data
|
|
||||||
/generator/ @organicmaps/data
|
|
||||||
/topography_generator/ @organicmaps/data
|
|
||||||
/data/borders/ @organicmaps/data
|
|
||||||
/data/conf/isolines/ @organicmaps/data
|
|
||||||
/docs/SUBWAY_GENERATION.md @organicmaps/data
|
|
||||||
/docs/MAPS.md @organicmaps/data
|
|
||||||
/docs/EXPERIMENTAL_PUBLIC_TRANSPORT_SUPPORT.md @organicmaps/data
|
|
||||||
# no owner (changed often to add a new POI)
|
# no owner (changed often to add a new POI)
|
||||||
/generator/generator_tests/osm_type_test.cpp
|
/generator/generator_tests/osm_type_test.cpp
|
||||||
# Map Styles.
|
# Map Styles.
|
||||||
/data/styles/ @organicmaps/styles
|
/data/styles/ @comaps/styles
|
||||||
/data/types.txt @organicmaps/styles
|
/data/types.txt @comaps/styles
|
||||||
/data/visibility.txt @organicmaps/styles
|
/data/visibility.txt @comaps/styles
|
||||||
/data/mapcss-mapping.csv @organicmaps/styles
|
/data/mapcss-mapping.csv @comaps/styles
|
||||||
/data/replaced_tags.txt @organicmaps/styles
|
/data/replaced_tags.txt @comaps/styles
|
||||||
/data/classificator.txt @organicmaps/styles
|
/data/classificator.txt @comaps/styles
|
||||||
/data/drules_* @organicmaps/styles
|
/data/drules_* @comaps/styles
|
||||||
/docs/STYLES.md
|
/docs/STYLES.md
|
||||||
/tools/kothic/ @organicmaps/styles
|
/tools/kothic/ @comaps/styles
|
||||||
# DevOps.
|
# DevOps.
|
||||||
/.forgejo/workflows @organicmaps/devops
|
/.forgejo/workflows @comaps/devops
|
||||||
/android/*gradle* @organicmaps/devops
|
/android/*gradle* @comaps/devops
|
||||||
/docs/RELEASE_MANAGEMENT.md @organicmaps/devops
|
/docs/RELEASE_MANAGEMENT.md @comaps/devops
|
||||||
/xcode/fastlane/ @organicmaps/devops
|
/xcode/fastlane/ @comaps/devops
|
||||||
# Growth.
|
/tools/python/maps_generator/ @comaps/devops
|
||||||
README.md @organicmaps/growth
|
/generator/ @comaps/devops
|
||||||
/.forgejo/FUNDING.yml @organicmaps/growth
|
/topography_generator/ @comaps/devops
|
||||||
/android/app/src/fdroid/play/ @organicmaps/growth
|
/data/borders/ @comaps/devops
|
||||||
/android/app/src/google/play/ @organicmaps/growth
|
/data/conf/isolines/ @comaps/devops
|
||||||
/iphone/metadata/ @organicmaps/growth
|
/docs/SUBWAY_GENERATION.md @comaps/devops
|
||||||
|
/docs/MAPS.md @comaps/devops
|
||||||
|
/docs/EXPERIMENTAL_PUBLIC_TRANSPORT_SUPPORT.md @comaps/devops
|
||||||
# Legal.
|
# Legal.
|
||||||
LEGAL @organicmaps/legal
|
LEGAL @comaps/admins
|
||||||
LICENSE @organicmaps/legal
|
LICENSE @comaps/admins
|
||||||
NOTICE @organicmaps/legal
|
NOTICE @comaps/admins
|
||||||
CONTRIBUTORS @organicmaps/legal
|
CONTRIBUTORS @comaps/admins
|
||||||
/docs/CODE_OF_CONDUCT.md @organicmaps/legal
|
/docs/CODE_OF_CONDUCT.md @comaps/admins
|
||||||
/docs/DCO.md @organicmaps/legal
|
/docs/DCO.md @comaps/admins
|
||||||
/docs/GOVERNANCE.md @organicmaps/legal
|
/docs/GOVERNANCE.md @comaps/admins
|
||||||
|
|||||||
@@ -1 +1,3 @@
|
|||||||
open_collective: comaps
|
open_collective: comaps
|
||||||
|
liberapay: comaps
|
||||||
|
custom: ["https://comaps.app/donate/"]
|
||||||
|
|||||||
577
.forgejo/workflows/map-generator.yml
Normal file
@@ -0,0 +1,577 @@
|
|||||||
|
name: map-generator
|
||||||
|
on:
|
||||||
|
workflow_dispatch: # Manual trigger
|
||||||
|
inputs:
|
||||||
|
map-generator-test:
|
||||||
|
description: 'Test (non-prod) generation?'
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
# run-copy-coasts:
|
||||||
|
# description: 'Copy last used coastlines?'
|
||||||
|
# required: false
|
||||||
|
# default: true
|
||||||
|
# type: boolean
|
||||||
|
run-isolines:
|
||||||
|
description: 'Update altitude isolines?'
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
run-tiger:
|
||||||
|
description: 'Update TIGER address data?'
|
||||||
|
required: false
|
||||||
|
default: true
|
||||||
|
type: boolean
|
||||||
|
run-planet-pbf:
|
||||||
|
description: 'Update PBF planet (for Wiki & subways)?'
|
||||||
|
required: false
|
||||||
|
default: true
|
||||||
|
type: boolean
|
||||||
|
run-subways:
|
||||||
|
description: 'Update subways?'
|
||||||
|
required: false
|
||||||
|
default: true
|
||||||
|
type: boolean
|
||||||
|
run-wiki:
|
||||||
|
description: 'Update Wikipedia descriptions?'
|
||||||
|
required: false
|
||||||
|
default: true
|
||||||
|
type: boolean
|
||||||
|
run-planet-o5m:
|
||||||
|
description: 'Update O5M planet (for mapgen)?'
|
||||||
|
required: false
|
||||||
|
default: true
|
||||||
|
type: boolean
|
||||||
|
run-mapgen:
|
||||||
|
description: 'Run maps generation?'
|
||||||
|
required: false
|
||||||
|
default: true
|
||||||
|
type: boolean
|
||||||
|
map-generator-continue:
|
||||||
|
description: 'Continue previous map generation?'
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
# map-generator-countries:
|
||||||
|
# description: 'Generate specific MWMs? (i.e. "US_New York_*, foo")'
|
||||||
|
# required: false
|
||||||
|
# type: string
|
||||||
|
run-upload:
|
||||||
|
description: 'Upload latest maps to CDN?'
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
# reset:
|
||||||
|
# description: 'Reset part of the system?'
|
||||||
|
# required: false
|
||||||
|
# default: 'no'
|
||||||
|
# type: choice
|
||||||
|
# options:
|
||||||
|
# - 'no'
|
||||||
|
# - wiki-ratelimit
|
||||||
|
|
||||||
|
## RCLONE_CONF is multi-line text containing keys and credentials for us2,ru1,fi1,de1 servers
|
||||||
|
|
||||||
|
env:
|
||||||
|
RCLONE_CONF: ${{ secrets.RCLONE_CONF }}
|
||||||
|
WIKIMEDIA_USERNAME: ${{ secrets.WIKIMEDIA_USERNAME }}
|
||||||
|
WIKIMEDIA_PASSWORD: ${{ secrets.WIKIMEDIA_PASSWORD }}
|
||||||
|
ZULIP_BOT_EMAIL: ${{ secrets.ZULIP_BOT_EMAIL }}
|
||||||
|
ZULIP_API_KEY: ${{ secrets.ZULIP_API_KEY }}
|
||||||
|
MWMTEST: ${{ inputs.map-generator-test }}
|
||||||
|
MWMCONTINUE: ${{ inputs.map-generator-continue }}
|
||||||
|
# MWMCOUNTRIES: ${{ inputs.map-generator-countries }}
|
||||||
|
DEBIAN_FRONTEND: noninteractive
|
||||||
|
TZ: Etc/UTC
|
||||||
|
|
||||||
|
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 }}-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: 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 wikiparser repo
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
cd ~
|
||||||
|
git clone --depth 1 --single-branch https://codeberg.org/comaps/wikiparser.git
|
||||||
|
- name: Checkout subways repo
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
cd ~
|
||||||
|
git clone --depth 1 --single-branch https://codeberg.org/comaps/subways.git
|
||||||
|
|
||||||
|
copy-coasts:
|
||||||
|
# if: inputs.run-copy-coasts
|
||||||
|
name: Copy Previously Generated Coasts
|
||||||
|
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 }}-map-generator-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
steps:
|
||||||
|
- name: Copy Coasts
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "WorldCoasts available:"
|
||||||
|
ls -al /mnt/4tbexternal/osm-maps/*/intermediate_data/WorldCoasts.*
|
||||||
|
|
||||||
|
if [ -f /mnt/4tbexternal/osm-maps/*/intermediate_data/WorldCoasts.geom ]; then
|
||||||
|
|
||||||
|
echo "Before:"
|
||||||
|
ls -al /home/planet/latest_coasts*
|
||||||
|
# TODO: don't copy coasts from test generations
|
||||||
|
cp -p /mnt/4tbexternal/osm-maps/*/intermediate_data/WorldCoasts.geom /home/planet/latest_coasts.geom
|
||||||
|
cp -p /mnt/4tbexternal/osm-maps/*/intermediate_data/WorldCoasts.rawgeom /home/planet/latest_coasts.rawgeom
|
||||||
|
|
||||||
|
echo "After:"
|
||||||
|
ls -al /home/planet/latest_coasts*
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
echo "No WorldCoasts found."
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
update-isolines:
|
||||||
|
if: inputs.run-isolines
|
||||||
|
name: Update Isolines
|
||||||
|
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 }}
|
||||||
|
# TODO: we only need to update these if our SRTM or countries change
|
||||||
|
# TODO: after update, verify that sizable files exist: /home/planet/isolines/*.isolines
|
||||||
|
- name: Update Isolines
|
||||||
|
shell: bash
|
||||||
|
# TODO: preserve previous isolines version?
|
||||||
|
# TODO: cleanup the tmp-tiles dir after completion
|
||||||
|
run: |
|
||||||
|
cd ~/comaps/
|
||||||
|
./tools/unix/build_omim.sh -p ~ -R topography_generator_tool
|
||||||
|
rm -rf /home/planet/isolines/
|
||||||
|
mkdir /home/planet/isolines/
|
||||||
|
~/omim-build-relwithdebinfo/topography_generator_tool \
|
||||||
|
--profiles_path=./data/conf/isolines/isolines-profiles.json \
|
||||||
|
--countries_to_generate_path=./data/conf/isolines/countries-to-generate.json \
|
||||||
|
--tiles_isolines_out_dir=/home/planet/isolines/tmp-tiles/ \
|
||||||
|
--countries_isolines_out_dir=/home/planet/isolines/ \
|
||||||
|
--data_dir=./data/ \
|
||||||
|
--srtm_path=/home/planet/SRTM-patched-europe/ \
|
||||||
|
--threads=96
|
||||||
|
- name: Check isolines
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
NUMISO=$(ls -al /home/planet/isolines/*.isolines | wc -l)
|
||||||
|
echo "Found $NUMISO isolines"
|
||||||
|
if [ $NUMISO -lt 10 ]; then
|
||||||
|
echo "ERROR: Did generation fail?"
|
||||||
|
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=Isolines are done!'
|
||||||
|
|
||||||
|
update-tiger:
|
||||||
|
if: inputs.run-tiger
|
||||||
|
name: Update TIGER
|
||||||
|
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: Build address_parser
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
cd ~/comaps
|
||||||
|
#rm -rf ~/omim-build-relwithdebinfo/CMakeCache.txt
|
||||||
|
#rm -rf ~/omim-build-relwithdebinfo/CMakeFiles
|
||||||
|
./tools/unix/build_omim.sh -p ~ -R address_parser_tool
|
||||||
|
- name: Update TIGER from Nominatim
|
||||||
|
shell: bash
|
||||||
|
# TODO: use curl instead of wget2
|
||||||
|
run: |
|
||||||
|
# TODO: maybe remove old osm-planet/tiger first?
|
||||||
|
cd /home/planet/
|
||||||
|
mkdir -p tiger
|
||||||
|
wget2 https://nominatim.org/data/tiger-nominatim-preprocessed-latest.csv.tar.gz
|
||||||
|
cd ~/comaps
|
||||||
|
tar -xOzf /home/planet/tiger-nominatim-preprocessed-latest.csv.tar.gz | ~/omim-build-relwithdebinfo/address_parser_tool --output_path=/home/planet/tiger
|
||||||
|
|
||||||
|
update-planet-pbf:
|
||||||
|
if: inputs.run-planet-pbf
|
||||||
|
name: Update PBF 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 }}-map-generator-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
steps:
|
||||||
|
- name: Download Planet File if Absent
|
||||||
|
shell: bash
|
||||||
|
# TODO: replace wget2 with curl -Z
|
||||||
|
run: |
|
||||||
|
if [ ! -d /home/planet/planet/ ]; then
|
||||||
|
mkdir -p /home/planet/planet/
|
||||||
|
fi
|
||||||
|
if [ ! -f /home/planet/planet/planet-latest.osm.pbf ]; then
|
||||||
|
cd /home/planet/planet/
|
||||||
|
wget2 --verbose --progress=bar --continue https://ftpmirror.your.org/pub/openstreetmap/pbf/planet-latest.osm.pbf
|
||||||
|
else
|
||||||
|
echo "planet-latest.osm.pbf was found, raw download not required."
|
||||||
|
fi
|
||||||
|
- name: Update PBF Planet
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
cd /home/planet/planet/
|
||||||
|
rm -f planet-latest-new.osm.pbf
|
||||||
|
pyosmium-up-to-date planet-latest.osm.pbf -o planet-latest-new.osm.pbf -v --size 16384
|
||||||
|
mv planet-latest-new.osm.pbf planet-latest.osm.pbf
|
||||||
|
- 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=PBF 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: 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!'
|
||||||
|
|
||||||
|
wiki-update:
|
||||||
|
if: inputs.run-wiki
|
||||||
|
name: Update Wikipedia
|
||||||
|
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: Check for planet file
|
||||||
|
shell: bash
|
||||||
|
# TODO: remove debug output
|
||||||
|
run: |
|
||||||
|
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
|
||||||
|
- name: Only get new dumps once per 30 days
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
if [[ '${{ inputs.reset }}' == 'wiki-ratelimit' ]]; then
|
||||||
|
echo "Bypassing wiki rate limit upon request."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
datediff() {
|
||||||
|
d1=$(date -d "$1" +%s)
|
||||||
|
d2=$(date -d "$2" +%s)
|
||||||
|
echo $(( (d1 - d2) / 86400 ))
|
||||||
|
}
|
||||||
|
RECENTDUMPDATE=$(find /home/planet/wikipedia/dumps/ -mindepth 1 -maxdepth 1 -iname "2*" -type d | sort -n -r | head -1 | cut -d/ -f6)
|
||||||
|
TODAY=$(date +%Y%m%d)
|
||||||
|
DATEDIFF=$(datediff $TODAY $RECENTDUMPDATE)
|
||||||
|
if [ $DATEDIFF -lt 30 ]; then
|
||||||
|
echo "ERROR: The most recent wiki dump is from $RECENTDUMPDATE, $DATEDIFF days ago. Wikimedia limits users to 15 snapshot requests per month."
|
||||||
|
echo "Set the 'reset' option to 'wiki-ratelimit' to bypass this."
|
||||||
|
ls -al /home/planet/wikipedia/dumps/
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
- name: Update Wikipedia from Enterprise API
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
#todo: curl in download.sh can fail when rate limited and even save error messages to the output. need to validate.
|
||||||
|
#downloading all languages can also trigger rate limits or fail as well. needs work.
|
||||||
|
#also: a failure to download means a failure to build, and could result in no wiki descriptions etc.
|
||||||
|
#also-also: do we want to remove old wiki data in planet between builds? pastk: no need, its being updated / augmented
|
||||||
|
mkdir -p /home/planet/wikipedia/dumps
|
||||||
|
mkdir -p /home/planet/wikipedia/build
|
||||||
|
cd ~/wikiparser
|
||||||
|
ls -al
|
||||||
|
echo "Downloading ..."
|
||||||
|
./download.sh /home/planet/wikipedia/dumps
|
||||||
|
ls -al /home/planet/wikipedia/dumps/*
|
||||||
|
echo "Running ..."
|
||||||
|
./run.sh /home/planet/wikipedia/build \
|
||||||
|
/home/planet/planet/planet-latest.osm.pbf \
|
||||||
|
/home/planet/wikipedia/dumps/latest/*.tar.gz
|
||||||
|
echo "DONE"
|
||||||
|
- name: Check that the latest dumps are present, recent, and not super tiny
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
FAILCHECK=0
|
||||||
|
|
||||||
|
# Check all .tar.gz files in /home/planet/wikipedia/dumps/latest/
|
||||||
|
for file in /home/planet/wikipedia/dumps/latest/*.tar.gz; do
|
||||||
|
# Check if file exists (handles case where glob doesn't match)
|
||||||
|
[ -e "$file" ] || continue
|
||||||
|
|
||||||
|
# Get file size in MB and modification time in days
|
||||||
|
size_mb=$(stat -f%z "$file" 2>/dev/null | awk '{print int($1/1024/1024)}' || stat -c%s "$file" | awk
|
||||||
|
'{print int($1/1024/1024)}')
|
||||||
|
days_old=$(find "$file" -mtime -7 | wc -l)
|
||||||
|
|
||||||
|
# Verify conditions
|
||||||
|
if [ "$size_mb" -lt 100 ]; then
|
||||||
|
echo "FAIL: $file is only ${size_mb}MB (< 100MB)"
|
||||||
|
FAILCHECK=1
|
||||||
|
elif [ "$days_old" -eq 0 ]; then
|
||||||
|
echo "FAIL: $file is older than 7 days"
|
||||||
|
ls -al $file
|
||||||
|
FAILCHECK=1
|
||||||
|
else
|
||||||
|
echo "PASS: $file (${size_mb}MB, modified within 7 days)"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
exit $FAILCHECK
|
||||||
|
- 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=Wiki update is done!'
|
||||||
|
|
||||||
|
update-planet-o5m:
|
||||||
|
if: inputs.run-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 }}-map-generator-${{ 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!'
|
||||||
|
|
||||||
|
generate-maps:
|
||||||
|
if: inputs.run-mapgen
|
||||||
|
name: Generate Maps
|
||||||
|
runs-on: mapfilemaker
|
||||||
|
needs:
|
||||||
|
- clone-repos
|
||||||
|
timeout-minutes: 40320
|
||||||
|
container:
|
||||||
|
image: codeberg.org/comaps/maps_generator:f6d53d54f794
|
||||||
|
volumes:
|
||||||
|
- /mnt/4tbexternal/:/mnt/4tbexternal/
|
||||||
|
- /mnt/4tbexternal/osm-planet:/home/planet
|
||||||
|
options: --ulimit nofile=262144:262144
|
||||||
|
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: Make output folders if necessary
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
if [ ! -d /mnt/4tbexternal/osm-maps ]; then
|
||||||
|
mkdir -p /mnt/4tbexternal/osm-maps
|
||||||
|
fi
|
||||||
|
- name: Get SRTM if necessary
|
||||||
|
# TODO: it should be a separate step like Wiki or isolines
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
if [ ! -d /home/planet/SRTM-patched-europe/ ]; then
|
||||||
|
echo "ERROR: NO SRTM"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
- name: Run docker_maps_generator.sh
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
cd ~/comaps
|
||||||
|
bash ./tools/unix/maps/docker_maps_generator.sh
|
||||||
|
- 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=Generator is done!'
|
||||||
|
|
||||||
|
upload-maps:
|
||||||
|
if: inputs.run-upload
|
||||||
|
name: Upload Maps
|
||||||
|
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 }}-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: Write config file
|
||||||
|
run: |
|
||||||
|
mkdir -p ~/.config/rclone/
|
||||||
|
echo "${{ secrets.RCLONE_CONF }}" > ~/.config/rclone/rclone.conf
|
||||||
|
- name: Upload map files to CDNs
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
shopt -s nullglob
|
||||||
|
buildfolder=$(find /mnt/4tbexternal/osm-maps/ -mindepth 1 -maxdepth 1 -iname "2*" -type d | sort -n -r | head -1 | cut -d/ -f5)
|
||||||
|
builddate=$(find /mnt/4tbexternal/osm-maps/*/ -mindepth 1 -maxdepth 1 -iname "2*" -type d | sort -n -r | head -1 | cut -d/ -f6)
|
||||||
|
mwmfiles=( /mnt/4tbexternal/osm-maps/$buildfolder/$builddate/*.mwm )
|
||||||
|
|
||||||
|
if (( ${#mwmfiles[@]} )); then
|
||||||
|
echo "<$(date +%T)> Uploading maps from $buildfolder/$builddate..."
|
||||||
|
cd ~/comaps/tools/unix/maps
|
||||||
|
./upload_to_cdn.sh /mnt/4tbexternal/osm-maps/$buildfolder/$builddate
|
||||||
|
echo "<$(date +%T)> Finished uploading maps from $buildfolder/$builddate."
|
||||||
|
else
|
||||||
|
echo "<$(date +%T)> No MWM files in /mnt/4tbexternal/osm-maps/$buildfolder/$builddate/*.mwm, not uploading maps."
|
||||||
|
echo "<$(date +%T)> Found top level: $(ls -alt /mnt/4tbexternal/osm-maps/*)"
|
||||||
|
echo "<$(date +%T)> Found second level: $(ls -alt /mnt/4tbexternal/osm-maps/$buildfolder/*)"
|
||||||
|
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=Upload is done!'
|
||||||
|
|
||||||
3
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
open_collective: comaps
|
||||||
|
liberapay: comaps
|
||||||
|
custom: ["https://comaps.app/donate/"]
|
||||||
11
.github/workflows/ios-check.yaml
vendored
@@ -8,14 +8,14 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
ios-check:
|
ios-check:
|
||||||
name: Build iOS
|
name: Build iOS
|
||||||
runs-on: macos-15
|
runs-on: macos-26
|
||||||
env:
|
env:
|
||||||
DEVELOPER_DIR: /Applications/Xcode_26.app/Contents/Developer
|
DEVELOPER_DIR: /Applications/Xcode_26.1.app/Contents/Developer
|
||||||
LANG: en_US.UTF-8 # Fastlane complains that the terminal is using ASCII.
|
LANG: en_US.UTF-8 # Fastlane complains that the terminal is using ASCII.
|
||||||
LANGUAGE: en_US.UTF-8
|
LANGUAGE: en_US.UTF-8
|
||||||
LC_ALL: en_US.UTF-8
|
LC_ALL: en_US.UTF-8
|
||||||
TEST_RESULTS_BUNDLE_NAME: CoMaps-Test-Results
|
TEST_RESULTS_BUNDLE_NAME: CoMaps-Test-Results
|
||||||
SIMULATOR_DEVICE: 'iPhone 16 Pro Max'
|
SIMULATOR_DEVICE: 'iPhone 17 Pro Max'
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@@ -31,6 +31,9 @@ jobs:
|
|||||||
brew install qt \
|
brew install qt \
|
||||||
optipng
|
optipng
|
||||||
pip3 install "protobuf<3.21" --break-system-packages
|
pip3 install "protobuf<3.21" --break-system-packages
|
||||||
|
xcodebuild -downloadComponent metalToolchain
|
||||||
|
xcodebuild -downloadPlatform iOS
|
||||||
|
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
@@ -42,7 +45,7 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: ./configure.sh
|
run: ./configure.sh
|
||||||
|
|
||||||
- name: Configure XCode cache
|
- name: Configure Xcode cache
|
||||||
uses: irgaly/xcode-cache@v1
|
uses: irgaly/xcode-cache@v1
|
||||||
with:
|
with:
|
||||||
key: xcode-cache-deriveddata-${{ github.workflow }}-${{ matrix.buildType }}-${{ github.sha }}
|
key: xcode-cache-deriveddata-${{ github.workflow }}-${{ matrix.buildType }}-${{ github.sha }}
|
||||||
|
|||||||
7
.gitignore
vendored
@@ -9,6 +9,7 @@ Makefile.Release
|
|||||||
object_script.*.Debug
|
object_script.*.Debug
|
||||||
object_script.*.Release
|
object_script.*.Release
|
||||||
compile_commands.json
|
compile_commands.json
|
||||||
|
*.local.*
|
||||||
|
|
||||||
stxxl.errlog
|
stxxl.errlog
|
||||||
stxxl.log
|
stxxl.log
|
||||||
@@ -154,6 +155,8 @@ android/huawei-appgallery.json
|
|||||||
android/res/xml/network_security_config.xml
|
android/res/xml/network_security_config.xml
|
||||||
./server/
|
./server/
|
||||||
iphone/Maps/app.omaps/
|
iphone/Maps/app.omaps/
|
||||||
|
# Generated file
|
||||||
|
libs/indexer/localized_types_map.cpp
|
||||||
|
|
||||||
*.li
|
*.li
|
||||||
|
|
||||||
@@ -187,10 +190,6 @@ tools/python/maps_generator/var/etc/map_generator.ini
|
|||||||
tools/python/routing/etc/*.ini
|
tools/python/routing/etc/*.ini
|
||||||
tools/unix/maps/settings.sh
|
tools/unix/maps/settings.sh
|
||||||
|
|
||||||
# Helpers
|
|
||||||
/node_modules/
|
|
||||||
/package-lock.json
|
|
||||||
|
|
||||||
# Visual Studio
|
# Visual Studio
|
||||||
.vs
|
.vs
|
||||||
|
|
||||||
|
|||||||
@@ -114,19 +114,6 @@ if (${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo")
|
|||||||
add_compile_options(-fno-omit-frame-pointer)
|
add_compile_options(-fno-omit-frame-pointer)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Linux GCC LTO plugin fix.
|
|
||||||
if (PLATFORM_LINUX AND (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND (CMAKE_BUILD_TYPE MATCHES "^Rel"))
|
|
||||||
# To force errors if LTO was not enabled.
|
|
||||||
add_compile_options(-fno-fat-lto-objects)
|
|
||||||
# To fix ar and ranlib "plugin needed to handle lto object".
|
|
||||||
string(REGEX MATCH "[0-9]+" GCC_MAJOR_VERSION ${CMAKE_CXX_COMPILER_VERSION})
|
|
||||||
file(GLOB_RECURSE plugin /usr/lib/gcc/*/${GCC_MAJOR_VERSION}*/liblto_plugin.so)
|
|
||||||
set(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> --plugin ${plugin} qcs <TARGET> <OBJECTS>")
|
|
||||||
set(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> --plugin ${plugin} <TARGET>")
|
|
||||||
set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> --plugin ${plugin} qcs <TARGET> <OBJECTS>")
|
|
||||||
set(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> --plugin ${plugin} <TARGET>")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
message(STATUS "Build type: " ${CMAKE_BUILD_TYPE})
|
message(STATUS "Build type: " ${CMAKE_BUILD_TYPE})
|
||||||
|
|
||||||
if (PLATFORM_LINUX OR PLATFORM_ANDROID)
|
if (PLATFORM_LINUX OR PLATFORM_ANDROID)
|
||||||
@@ -175,10 +162,10 @@ if (NOT PLATFORM_IPHONE AND NOT PLATFORM_ANDROID)
|
|||||||
find_package(Qt6 COMPONENTS REQUIRED ${qt_components} PATHS $ENV{QT_PATH} /opt/homebrew/opt/qt@6 /usr/local/opt/qt@6 /usr/lib/x86_64-linux-gnu/qt6)
|
find_package(Qt6 COMPONENTS REQUIRED ${qt_components} PATHS $ENV{QT_PATH} /opt/homebrew/opt/qt@6 /usr/local/opt/qt@6 /usr/lib/x86_64-linux-gnu/qt6)
|
||||||
|
|
||||||
set(MINIMUM_REQUIRED_QT_VERSION 6.4.0)
|
set(MINIMUM_REQUIRED_QT_VERSION 6.4.0)
|
||||||
if (Qt6Widgets_VERSION VERSION_LESS ${MINIMUM_REQUIRED_QT_VERSION})
|
if (Qt6_VERSION VERSION_LESS ${MINIMUM_REQUIRED_QT_VERSION})
|
||||||
message(FATAL_ERROR "Unsupported Qt version: ${Qt6Widgets_VERSION}, the minimum required is ${MINIMUM_REQUIRED_QT_VERSION}")
|
message(FATAL_ERROR "Unsupported Qt version: ${Qt6_VERSION}, the minimum required is ${MINIMUM_REQUIRED_QT_VERSION}")
|
||||||
else()
|
else()
|
||||||
message(STATUS "Found Qt version: ${Qt6Widgets_VERSION}")
|
message(STATUS "Found Qt version: ${Qt6_VERSION}")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -222,6 +209,9 @@ if (PLATFORM_DESKTOP AND NOT WITH_SYSTEM_PROVIDED_3PARTY)
|
|||||||
include_directories("${PROJECT_BINARY_DIR}/3party/gflags/include")
|
include_directories("${PROJECT_BINARY_DIR}/3party/gflags/include")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Fix for #include <boost/regex.hpp>
|
||||||
|
include_directories("${OMIM_ROOT}/3party/boost")
|
||||||
|
|
||||||
# Used in qt/ and shaders/
|
# Used in qt/ and shaders/
|
||||||
find_package(Python3 REQUIRED COMPONENTS Interpreter)
|
find_package(Python3 REQUIRED COMPONENTS Interpreter)
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,17 @@
|
|||||||
This file contains a list of people who have contributed to this project.
|
This file contains a list of people who have contributed to this project.
|
||||||
Its not neccesarily comprehensive.
|
It is not necessarily comprehensive as contributors must manually add themselves.
|
||||||
Feel free to add yourself here along with your first contribution!
|
Feel free to add yourself here along with your first contribution!
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
CoMaps contributors:
|
CoMaps contributors:
|
||||||
(in alphabetic order)
|
(in alphabetical order)
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
Bastian Greshake Tzovaras
|
Bastian Greshake Tzovaras
|
||||||
clover sage
|
clover sage
|
||||||
Harry Bond <me@hbond.xyz>
|
Harry Bond <me@hbond.xyz>
|
||||||
|
NoelClick
|
||||||
|
thesupertechie
|
||||||
vikiawv
|
vikiawv
|
||||||
Yannik Bloscheck
|
Yannik Bloscheck
|
||||||
|
|
||||||
|
|||||||
@@ -23,10 +23,10 @@
|
|||||||
<img src="https://img.shields.io/github/license/comaps/comaps?style=for-the-badge&logo=opensourceinitiative&logoColor=white&color=588157" alt="License"/>
|
<img src="https://img.shields.io/github/license/comaps/comaps?style=for-the-badge&logo=opensourceinitiative&logoColor=white&color=588157" alt="License"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/comaps/comaps/actions/workflows/android-check.yaml">
|
<a href="https://github.com/comaps/comaps/actions/workflows/android-check.yaml">
|
||||||
<img src="https://img.shields.io/github/actions/workflow/status/comaps/comaps/.github/workflows/android-check.yaml?label=Android%20Build&logo=android&logoColor=white&style=for-the-badge&color=588157" alt="Android Build Status"/>
|
<img src="https://img.shields.io/github/actions/workflow/status/comaps/comaps/.github/workflows/android-check.yaml?label=Android%20Build&logo=android&logoColor=white&style=for-the-badge" alt="Android Build Status"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/comaps/comaps/actions/workflows/ios-check.yaml">
|
<a href="https://github.com/comaps/comaps/actions/workflows/ios-check.yaml">
|
||||||
<img src="https://img.shields.io/github/actions/workflow/status/comaps/comaps/.github/workflows/ios-check.yaml?label=iOS%20Build&logo=apple&logoColor=white&style=for-the-badge&color=588157" alt="iOS Build Status"/>
|
<img src="https://img.shields.io/github/actions/workflow/status/comaps/comaps/.github/workflows/ios-check.yaml?label=iOS%20Build&logo=apple&logoColor=white&style=for-the-badge" alt="iOS Build Status"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://opencollective.com/comaps">
|
<a href="https://opencollective.com/comaps">
|
||||||
<img src="https://img.shields.io/opencollective/all/comaps?label=Open%20Collective%20Donors&logo=opencollective&logoColor=white&style=for-the-badge&color=588157" alt="Open Collective Donors"/>
|
<img src="https://img.shields.io/opencollective/all/comaps?label=Open%20Collective%20Donors&logo=opencollective&logoColor=white&style=for-the-badge&color=588157" alt="Open Collective Donors"/>
|
||||||
|
|||||||
@@ -377,6 +377,7 @@ play {
|
|||||||
track.set('production')
|
track.set('production')
|
||||||
defaultToAppBundles.set(true)
|
defaultToAppBundles.set(true)
|
||||||
releaseStatus.set(ReleaseStatus.IN_PROGRESS)
|
releaseStatus.set(ReleaseStatus.IN_PROGRESS)
|
||||||
|
userFraction.set(0.2d) // Rollout to 20% of users
|
||||||
serviceAccountCredentials.set(file('google-play.json'))
|
serviceAccountCredentials.set(file('google-play.json'))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
1
android/app/src/fdroid/play/listings/ast/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps - Mapas ensin conexón con privacidá
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Лесна навигация - Открийте повече от вашето пътуване - Подкрепен от общността
|
||||||
1
android/app/src/fdroid/play/listings/bg/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps - Хайкинг, Велосипед, Пътуване без Интернет
|
||||||
32
android/app/src/fdroid/play/listings/ca/full-description.txt
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
Una aplicació de mapes gratuïta i de codi obert dirigida per la comunitat basada en dades d'OpenStreetMap i reforçada amb el compromís amb la transparència, la privadesa i la no ànim de lucre. CoMaps és una derivació/fork d'Organic Maps, que al seu torn és una derivació de Maps.ME.
|
||||||
|
|
||||||
|
Llegiu sobre els motius del projecte i la seva direcció a <b><i>codeberg.org/comaps</i></b>.
|
||||||
|
Uneix-te a la comunitat i ajuda a crear la millor aplicació de mapes
|
||||||
|
• Utilitza l'aplicació i difon-la
|
||||||
|
• Dona comentaris i informa de problemes
|
||||||
|
• Actualitza les dades del mapa a l'aplicació o al lloc web d'OpenStreetMap
|
||||||
|
|
||||||
|
‣ <b>Enfocat fora de línia</b>: Planifica i navega pel teu viatge a l'estranger sense necessitat de servei mòbil, cerca punts de referència mentre fas una excursió llunyana, etc. Totes les funcions de l'aplicació estan dissenyades per funcionar fora de línia.
|
||||||
|
‣ <b>Respecte a la privadesa</b>: L'aplicació està dissenyada tenint en compte la privadesa: no identifica persones, no fa seguiment i no recopila informació personal. Sense anuncis.
|
||||||
|
‣ <b>Senzill i polit</b>: funcions essencials fàcils d'utilitzar que simplement funcionen.
|
||||||
|
‣ <b>Estalvia bateria i espai</b>: No consumeix bateria com altres aplicacions de navegació. Els mapes compactes estalvien espai preciós al telèfon.
|
||||||
|
‣ <b>Gratuït i creat per la comunitat</b>: Gent com tu ha ajudat a crear l'aplicació afegint llocs a OpenStreetMap, provant i donant comentaris sobre les funcions i aportant les seves habilitats de desenvolupament i diners.
|
||||||
|
‣ <b>Presa de decisions i finances obertes i transparents, sense ànim de lucre i de codi obert.</b>
|
||||||
|
|
||||||
|
<b>Característiques principals</b>:
|
||||||
|
• Mapes detallats descarregables amb llocs que no estan disponibles amb Google Maps
|
||||||
|
• Mode exterior amb rutes de senderisme destacades, càmpings, fonts d'aigua, pics, corbes de nivell, etc.
|
||||||
|
• Senders per caminar i carrils bici
|
||||||
|
• Punts d'interès com restaurants, gasolineres, hotels, botigues, llocs d'interès i molts més
|
||||||
|
• Cerca per nom, adreça o categoria de punt d'interès
|
||||||
|
• Navegació amb anuncis de veu per caminar, anar amb bicicleta o conduir
|
||||||
|
• Marca els teus llocs preferits amb un sol toc
|
||||||
|
• Articles de la Viquipèdia fora de línia
|
||||||
|
• Capa i indicacions de trànsit de metro
|
||||||
|
• Enregistrament de rutes
|
||||||
|
• Exporta i importa marcadors i rutes en formats KML, KMZ i GPX
|
||||||
|
• Un mode fosc per utilitzar durant la nit
|
||||||
|
• Millora les dades del mapa per a tothom mitjançant un editor bàsic integrat
|
||||||
|
|
||||||
|
<b>La llibertat és aquí</b>
|
||||||
|
Descobreix el teu viatge, navega pel món amb la privadesa i la comunitat al capdavant!
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
En fællesskabdrevet og åben source kortapp, baseret på kortdata fra OpenStreetMap og styrket i forpligtelsen til værdierne gennemsigtighed, privatlivets fred, og non-profit. CoMaps udspringer af Organic Maps, som selv udsprang af Maps.ME.
|
||||||
|
|
||||||
|
Læs mere om grundlaget for projektet og dets udviklingsretnign på <b><i>codeberg.org/comaps</i></b>.
|
||||||
|
Slut dig til fælleskabet og hjælp til med at bygge den bedste kortapp i verden.
|
||||||
|
• Brug appen og fortæl andre om den
|
||||||
|
• Giv feedback anmeld fejl
|
||||||
|
• Opdater kortdata i appen eller på OpenStreetMap-hjemmesiden.
|
||||||
|
|
||||||
|
‣ <b>Offlinefokuseret</b>: Planlæg din rute og find vej i udlandet uden brug af mobildata, søg og find afsidesliggende mål på en afsidesliggende vandretur, mm. Alle funktioner er designet til at fungere uden internetforbindelse.
|
||||||
|
‣ <b>Respekt for privatlivets fred</b>: Appen er designet med henblik på at respektere dit privatliv – den identificerer dig ikke, indeholder ingen sporingsmekanismer, og insamler ingen personlig information. Appen er reklamefri.
|
||||||
|
‣ <b>Enkel og elegant</b>: de essentielle funktioner er nemme at bruge, og de virker bare.
|
||||||
|
‣ <b>Sparer på batteriet og på lagerpladsen</b>: Dræner ikke dit batteri hurtigt, som andre kortapps. De kompakte kortfiler minimerer varigt lagerpladsforbrug.
|
||||||
|
‣ <b>Gratis og bygget i fællesskab</b>: Folk som dig har hjulpet med denne app ved at tilføje steder til OpenStreetMap, ved at teste appens funktioner og give feedback på dem og ved at bidrage til udviklingen af appen med deres tid og penge.
|
||||||
|
‣ <b>Åben og gennemsigtig beslutningstagningsproces og finanser, non-profit, og fuldt ud åben source.</b>
|
||||||
|
|
||||||
|
<b>Hovedfunktioner</b>
|
||||||
|
• Hent detaljerede kort, der indeholder steder som ikke findes i mange kommericelle kort.
|
||||||
|
• En frilufts-tilstand med markede vandrestier, teltpladser, kilder, bjerg- og bakketoppe, højdekonturlinjer, mm.
|
||||||
|
• Gangstier og cykelstier
|
||||||
|
• Steder, der kan besøges, som f.eks. restauranter, tankstationer, hoteller, butikker, seværdigheder og mange andre.
|
||||||
|
• Søg efter stednavn, adresse, eller type af sted.
|
||||||
|
• Gem dine yndlingssteder som bogmærker med et enkelt tryk.
|
||||||
|
• iCloud synkronisering af bogmærker og optagede spor.
|
||||||
|
• Offline artikler fra Wikipedia.
|
||||||
|
• Metro-lag med navigation.
|
||||||
|
• Optagelse af spor.
|
||||||
|
• Eksport og import af bogmærker og spor i formaterne KML, KMZ og GPX.
|
||||||
|
• Mørk tilstand til brug om natten.
|
||||||
|
• Mulighed for at forbedre kortet vha. en indbygget editor.
|
||||||
|
• CarPlay understøttes.
|
||||||
|
|
||||||
|
<b>Friheden er ankommet</b>
|
||||||
|
Opdag din rejse, find vej i verden med privatliv og fællesskab i førersædet!
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
• Karten-Daten vom 6. September
|
• OpenStreetMap-Daten vom 9. Dezember
|
||||||
• Zeitstrafen für Radrouting
|
• Material 3 Design
|
||||||
• Farbige POI-Beschriftungen in Autonavigation
|
• Im OSM-Editor können nun Ladestationen hinzugefügt werden
|
||||||
• POI-Suche nach Filialnamen
|
• Schuko und Typ E Ladestationen hinzugefügt
|
||||||
• Abspannportale, Sicherheitskabinen & Büros hinzugefügt
|
• Verbesserte Suchvorschläge
|
||||||
• Aktualisierte Symbole für Türme, Nachtclubs, Apotheken und Fahnenmasten
|
• Litauische und lettische Sprachankündigungen
|
||||||
• Lesezeichen-Farbe in GPX-Exporten
|
• Die Fahranweisungen wurden vergrößert
|
||||||
• Farbfüllung von Fußgängerbereiche auf Plätzen
|
• Der Zoomlevel passt sich an die Distanz zur nächsten Abbiegung an
|
||||||
• Android Auto: Anzeige Ausfahrtsnummern in Kreisverkehren
|
• Neue Anordnung der Einstellungen
|
||||||
Weitere Änderungen in Codeberg-Versionshinweisen!
|
Weitere Einzelheiten auf codeberg.org/comaps/comaps/releases
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 628 KiB After Width: | Height: | Size: 636 KiB |
|
Before Width: | Height: | Size: 532 KiB After Width: | Height: | Size: 407 KiB |
|
Before Width: | Height: | Size: 391 KiB After Width: | Height: | Size: 155 KiB |
|
Before Width: | Height: | Size: 1.0 MiB After Width: | Height: | Size: 454 KiB |
|
Before Width: | Height: | Size: 268 KiB After Width: | Height: | Size: 451 KiB |
|
Before Width: | Height: | Size: 263 KiB After Width: | Height: | Size: 357 KiB |
@@ -1,10 +1,10 @@
|
|||||||
• OpenStreetMap data as of September 6
|
• OpenStreetMap data as of December 9
|
||||||
• Turn penalties for bicycle routing
|
• Use Material 3 themes
|
||||||
• Colored POI labels for car navigation map style
|
• Support charging sockets in OSM Editor
|
||||||
• Search POIs by branch name
|
• Added schuko/type-E charge sockets
|
||||||
• Added power portals, security booths and offices
|
• Improved search results ranking
|
||||||
• Update icons for towers, nightclubs, chemists, flagpoles
|
• Enabled Lithuanian and Latvian in voice announcements
|
||||||
• Save bookmark color to GPX exports
|
• Improved size of driving indications
|
||||||
• Color fill pedestrian parts of squares
|
• Base zoom level on distance to next turn
|
||||||
• Android Auto: display roundabout exit numbers
|
• Reordered settings
|
||||||
Check our Codeberg release notes for more changes!
|
More details on codeberg.org/comaps/comaps/releases
|
||||||
|
|||||||
32
android/app/src/fdroid/play/listings/eo/full-description.txt
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
Komunum-gvidata senpaga kaj malfermkoda mapapliko bazita sur OpenStreetMap-datumoj kaj fortigita per komitado al transparencio, privateco kaj ne-lucro. CoMaps estas forko/spin-off de Organic Maps, kiu turne estas forko de Maps.ME.
|
||||||
|
|
||||||
|
Legu plu pri la kialoj por la projekto kaj ĝia direkto ĉe <b><i>codeberg.org/comaps</i></b>.
|
||||||
|
Aliĝu al la komunumo tie kaj helpu fari la plej bonan mapaplikon
|
||||||
|
• Uzu la aplikon kaj disvastigu la vorton pri ĝi
|
||||||
|
• Donu rimarkojn kaj raportu problemojn
|
||||||
|
• Ĝisdatigu mapajn datumojn en la apliko aŭ sur la OpenStreetMap-retejo
|
||||||
|
|
||||||
|
‣ <b>Senkonekta-fokusa</b>: Planu kaj navigu vian vojaĝon eksterlande sen bezono de ĉelulara servico, serĉu vojpunktojn dum malproksima promenado, ktp. Ĉiuj funkcioj de la apliko estas dezajnitaj por funkcii senkonekte.
|
||||||
|
‣ <b>Rispektante Privatecon</b>: La apliko estas dezajnita kun privateco en menso — ne identigas homojn, ne sekvas, kaj ne kolektas personajn informojn. Sen reklamoj.
|
||||||
|
‣ <b>Simpla kaj Perfekta</b>: esencaj, facile uzeblaj funkcioj kiuj simple funkcias.
|
||||||
|
‣ <b>Konservas Vian Baterion kaj Spacon</b>: Ne elĉerpas vian baterion kiel aliaj navigaj aplikaĵoj. Kompaktaj mapoj konservas precian spacon sur via telefono.
|
||||||
|
‣ <b>Sena kaj Konstruita de la Komunumo</b>: Homoj kiel vi helpis konstrui la aplikon per aldonado de lokoj al OpenStreetMap, testado kaj donado de rimarkoj pri funkcioj kaj kontribuado de siaj programadaj kapabloj kaj mono.
|
||||||
|
‣ <b>Malferma kaj Transparenta Decidado kaj Financoj, Ne-lucra kaj Tute Malfermkoda.</b>
|
||||||
|
|
||||||
|
<b>Ĉefaj Funkcioj</b>:
|
||||||
|
• Elŝuteblaj detalegaj mapoj kun lokoj kiuj ne estas disponeblaj per Google Maps
|
||||||
|
• Eksteraj modo kun elstarigitaj promenaj vojoj, kampoj, akvofontoj, pintoj, konturlinioj, ktp
|
||||||
|
• Promenaj vojoj kaj biciklaj vojoj
|
||||||
|
• Interesaj punktoj kiel restoracioj, benzinstacioj, hoteloj, vendejoj, vidindaĵoj kaj multaj aliaj
|
||||||
|
• Serĉo laŭ nomo aŭ adreso aŭ laŭ kategorio de interesaj punktoj
|
||||||
|
• Navigado kun voĉaj anoncoj por promenado, biciklado aŭ veturado
|
||||||
|
• Marku viajn favorajn lokojn per unu tuŝo
|
||||||
|
• Senkonektaj Vikipedio-artikoloj
|
||||||
|
• Metroa transporta tavolo kaj indikoj
|
||||||
|
• Enregistraĵo de vojoj
|
||||||
|
• Eksporto kaj importo de markiloj kaj vojoj en KML, KMZ, GPX formatoj
|
||||||
|
• Malhela modo por uzi nokte
|
||||||
|
• Plibonigu mapajn datumojn por ĉiuj uzante bazan enkonstruitan redaktilon
|
||||||
|
|
||||||
|
<b>Libereco Estas Ĉi Tie</b>
|
||||||
|
Malkovru vian vojaĝon, navigu la mondon kun privateco kaj komunumo en la antaŭa plano!
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Facila mapnaviĝado - Malkovru pli de via vojaĝo - Subtenata de la komunumo
|
||||||
1
android/app/src/fdroid/play/listings/eo/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps - Migru, Biciklu, Veturigu Eksterrete
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
• Datos a 6 de septiembre
|
• Datos de OpenStreetMap a fecha 9/12.
|
||||||
• Penalizaciones de giros en rutas de bici
|
• Uso de temas Material 3.
|
||||||
• Etiquetas de puntos de interés en color en navegación
|
• Compatibilidad con enchufes de recarga en Editor.
|
||||||
• Buscar por nombre de sucursal
|
• Se añaden enchufes de recarga schuko/tipo E.
|
||||||
• Añadir portales de energía, cabinas de seguridad y oficinas
|
• Se mejora la búsqueda.
|
||||||
• Nuevos iconos: torres, discotecas, parafarmacias y mástiles
|
• Se habilitan el lituano y el letón en las indicaciones de voz.
|
||||||
• Guardar color en exportaciones GPX
|
• Se aumenta el tamaño de las indicaciones de conducción.
|
||||||
• Colorear áreas peatonales de plazas
|
• Nivel de zoom base según la distancia al siguiente giro.
|
||||||
• Android Auto: mostrar números de salida de rotondas
|
• Se han reordenado los ajustes.
|
||||||
Más detalles en Codeberg
|
|
||||||
|
Más detalles en codeberg.org/comaps/comaps/releases
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 655 KiB After Width: | Height: | Size: 605 KiB |
|
Before Width: | Height: | Size: 532 KiB After Width: | Height: | Size: 407 KiB |
|
Before Width: | Height: | Size: 391 KiB After Width: | Height: | Size: 164 KiB |
|
Before Width: | Height: | Size: 1.0 MiB After Width: | Height: | Size: 452 KiB |
|
Before Width: | Height: | Size: 254 KiB After Width: | Height: | Size: 460 KiB |
|
Before Width: | Height: | Size: 263 KiB After Width: | Height: | Size: 355 KiB |
@@ -1,9 +1,10 @@
|
|||||||
• Données OSM du 06 septembre
|
• Données OpenStreetMap du 9 Décembre
|
||||||
• Pénalités dans les calculs d'itinéraires vélos
|
• Utilisation de Material 3
|
||||||
• Ajout de labels colorés en mode navigation
|
• Support de l'édition des bornes de recharge dans l'éditeur OSM
|
||||||
• Support du tag branch dans la recherche
|
• Ajout du type de prise schuko/type-E
|
||||||
• Ajout des portiques électriques, postes de sécurité
|
• Amélioration de l'ordre des résultats de recherche
|
||||||
• Mise à jour des icônes de tours, boîtes de nuits, chimiste et mat
|
• Ajout du lituanien et du letton dans le guidage vocal
|
||||||
• Enregistrement de la couleur des signets dans les exports GPX
|
• Amélioration de la taille des instructions dans la navigation
|
||||||
• Android Auto: Affichage du numéro de sortie des ronds-points
|
• Niveau de zoom basé sur la distance jusqu’au prochain virage
|
||||||
Plus d'informations sur notre Codeberg
|
• Réorganisation des paramètres
|
||||||
|
Plus de détails sur codeberg.org/comaps/comaps/releases
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
CoMaps - Rando, vélo, conduite hors ligne & privée
|
CoMaps - Randonnée, Vélo, Conduite hors ligne
|
||||||
|
|||||||
10
android/app/src/fdroid/play/listings/hr/release-notes.txt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
• Podaci OpenStreetMap karte od 9. prosinca
|
||||||
|
• Korištenje Material 3 tema
|
||||||
|
• Podrška za utičnice za punjenje u OSM Editoru
|
||||||
|
• Dodane šuko/tip-E utičnice
|
||||||
|
• Poboljšano rangiranje rezultata pretraživanja
|
||||||
|
• Omogućeni litvanski i latvijski jezici u glasovnim najavama
|
||||||
|
• Povećana veličina indikatora vožnje
|
||||||
|
• Razina zumiranja se mijenja ovisno o udaljenosti do sljedećeg skretanja
|
||||||
|
• Promijenjen redoslijed postavki
|
||||||
|
Više detalja na codeberg.org/comaps/comaps/releases
|
||||||
32
android/app/src/fdroid/play/listings/id/full-description.txt
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
Aplikasi peta gratis & sumber terbuka yang dipimpin komunitas, berbasis data OpenStreetMap dan diperkuat dengan komitmen terhadap transparansi, privasi, serta non-profit. CoMaps adalah turunan dari Organic Maps, yang merupakan turunan dari Maps.ME.
|
||||||
|
|
||||||
|
Baca lebih lanjut tentang alasan proyek ini dan arahnya di <b><i>codeberg.org/comaps</i></b>.
|
||||||
|
Bergabunglah dengan komunitas dan bantu menjadikan aplikasi peta terbaik
|
||||||
|
• Gunakan aplikasi ini dan sebarkan
|
||||||
|
• Beri masukan dan laporkan masalah
|
||||||
|
• Perbarui data peta di aplikasi atau di situs OpenStreetMap
|
||||||
|
|
||||||
|
‣ <b>Fokus Offline</b>: Rencanakan dan navigasikan perjalananmu di luar negeri tanpa perlu layanan seluler, cari titik saat hiking jauh, dll. Semua fungsi aplikasi dirancang untuk bekerja offline.
|
||||||
|
‣ <b>Menghormati Privasi</b>: Aplikasi ini dirancang dengan privasi sebagai prioritas – tidak mengidentifikasi orang, tidak melacak, dan tidak mengumpulkan informasi pribadi. Bebas iklan.
|
||||||
|
‣ <b>Sederhana dan Rapi</b>: fitur penting yang mudah digunakan dan langsung berfungsi.
|
||||||
|
‣ <b>Hemat Baterai dan Ruang</b>: Tidak menguras baterai seperti aplikasi navigasi lain. Peta ringkas menghemat ruang berharga di ponselmu.
|
||||||
|
‣ <b>Gratis dan Dibangun oleh Komunitas</b>: Orang seperti kamu membantu membangun aplikasi ini dengan menambahkan tempat ke OpenStreetMap, menguji serta memberi masukan fitur, dan menyumbangkan keterampilan pengembangan maupun dana.
|
||||||
|
‣ <b>Terbuka dan Transparan</b>: Pengambilan keputusan dan keuangan transparan, non-profit, dan sepenuhnya sumber terbuka.
|
||||||
|
|
||||||
|
<b>Fitur Utama</b>:
|
||||||
|
• Peta detail yang bisa diunduh, dengan tempat yang tidak ada di Google Maps
|
||||||
|
• Mode outdoor dengan sorotan jalur hiking, area berkemah, sumber air, puncak, garis kontur, dll
|
||||||
|
• Jalur pejalan kaki dan jalur sepeda
|
||||||
|
• Titik menarik seperti restoran, SPBU, hotel, toko, tempat wisata, dan banyak lagi
|
||||||
|
• Pencarian berdasarkan nama, alamat, atau kategori titik menarik
|
||||||
|
• Navigasi dengan suara untuk berjalan, bersepeda, atau berkendara
|
||||||
|
• Tandai tempat favoritmu dengan sekali tap
|
||||||
|
• Artikel Wikipedia offline
|
||||||
|
• Layer dan rute transportasi subway
|
||||||
|
• Rekaman jejak
|
||||||
|
• Ekspor dan impor bookmark serta jejak dalam format KML, KMZ, GPX
|
||||||
|
• Mode gelap untuk digunakan saat malam
|
||||||
|
• Tingkatkan data peta untuk semua orang dengan editor bawaan sederhana
|
||||||
|
|
||||||
|
<b>Kebebasan Ada di Sini</b>
|
||||||
|
Temukan perjalananmu, jelajahi dunia dengan privasi dan komunitas di garis depan!
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Navigasi peta mudah – Temukan lebih banyak – Didukung oleh komunitas
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
• OpenStreetMap aggiornato al 6 Settembre
|
|
||||||
• Bici: miglior stima del tempo di percorrenza
|
|
||||||
• Auto: punti d'interesse colorati
|
|
||||||
• Cerca i punti d'interesse tramite filiale
|
|
||||||
• Aggiunte strutture alta tensione, cabine di sicurezza e uffici
|
|
||||||
• Aggiornate le icone per torri, discoteche, farmacie e aste per bandiere
|
|
||||||
• Salva il colore dei Preferiti nel GPX
|
|
||||||
• Evidenziate le aree pedonali nelle piazze
|
|
||||||
• AndroidAuto: aggiunto il numero dell'uscita nelle rotonde
|
|
||||||
Visita Codeberg per ulteriori dettagli
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Paprasta ir patogi navigacija – Turiningesnės kelionės – Vystoma bendruomenės
|
||||||
1
android/app/src/fdroid/play/listings/lt/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps – keliaukite atsijungę ir privačiai
|
||||||
@@ -1 +1 @@
|
|||||||
Lett kart navigasjon - Opplev mere på din reise - Drevet av felleskapet
|
Enkel kartnavigering - Opplev mere på din reise - Drevet av felleskapet
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
CoMaps - Gå tur, sykkel, kjør - med personvern
|
CoMaps - Gå, sykle, kjøre offline med personvern
|
||||||
|
|||||||
10
android/app/src/fdroid/play/listings/pl-PL/release-notes.txt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
• Dane OpenStreetMap z 9 grudnia
|
||||||
|
• Użycie motywów Material 3
|
||||||
|
• Obsługa gniazd ładowania w Edytorze OSM
|
||||||
|
• Dodane gniazda ładowania schuko/type-E
|
||||||
|
• Poprawiony ranking wyników wyszukiwania
|
||||||
|
• Dodane litewskie i łotewskie komunikaty głosowe
|
||||||
|
• Poprawiony rozmiar znaków drogowych
|
||||||
|
• Poziom powiększenia oparty na odległości do następnego manewru
|
||||||
|
• Zmieniona kolejność ustawień
|
||||||
|
Więcej szczegółów na codeberg.org/comaps/comaps/releases
|
||||||
@@ -1 +1 @@
|
|||||||
Łatwa nawigacja – Odkryj więcej ze swojej podróży – Wspierane przez społeczność
|
Łatwa nawigacja po mapie - Odkryj więcej z podróży - Wspierane przez społeczność
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
• Dados OSM de 6/09
|
• Dados OpenStreetMap atualizados em 9 de dezembro
|
||||||
• Penalidades de conversão para bicicleta
|
• Uso do estilo Material 3
|
||||||
• Etiquetas de POI coloridas para o estilo do mapa de navegação de carros
|
• Suporte para tomadas de carregamento no Editor OSM
|
||||||
• Busca de POIs por nome de filial
|
• Adição de tomadas de carregamento Schuko/Tipo E
|
||||||
• Adição de portais de energia, guaritas e escritórios
|
• Melhoria na classificação dos resultados de busca
|
||||||
• Atualização de ícones para torres, discotecas, farmácias e mastros
|
• Adição dos idiomas letão e lituano nas orientações por voz
|
||||||
• Salva a cor dos favoritos nas exportações GPX
|
• Melhoria no tamanho das indicações de direção
|
||||||
• Preenchimento de praças pavimentadas
|
• Nível de zoom baseado em distância até a próxima curva
|
||||||
• Android Auto: exibe números de saída de rotatória
|
• Configurações reordenadas
|
||||||
Confira nossas notas de lançamento do Codeberg para mais mudanças
|
Mais detalhes em codeberg.org/comaps/comaps/releases
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
Uma aplicação pela comunidade, grátis e ‘open-source’, de mapas baseada em dados do OpenStreetMap e reforçada com compromisso para transparência, privacidade e sem fins lucrativos. CoMaps é um fork/spin-off de Organic Maps, que, por sua vez, é um fork de Maps.ME
|
||||||
|
|
||||||
|
Leia sobre as razões deste projeto e a sua direção em <b><i>codeberg.org/comaps</i></b>.
|
||||||
|
Junte-se à comunidade e ajude a fazer a melhor aplicação de mapas
|
||||||
|
• Use a aplicação e partilhe-a com outros
|
||||||
|
• Dê ‘feedback’ e reporte problemas
|
||||||
|
• Atualize os dados de mapa na aplicação ou no site do OpenStreetMap
|
||||||
|
|
||||||
|
‣ <b>Simples e Polida</b>: funcionalidades essenciais fáceis que “somente funcionam”.
|
||||||
|
‣ <b>Foco Offline</b>: Planeie e navegue as suas viagens no estrangeiro sem dados móveis, procure locais numa caminhada distante, etc. Todas as funções da aplicação foram criadas com intenção de serem usadas sem internet.
|
||||||
|
‣ <b>Respeita a privacidade</b>: A aplicação foi criada com privacidade em mente — não identifica o utilizador, não rastreia, e não usa a sua informação pessoal. Sem anúncios.
|
||||||
|
‣ <b>Saves Your Battery and Space</b>: Não esgota a sua bateria ao contrário de outras aplicações. Mapas compactos salvam espaço no seu telemóvel.
|
||||||
|
‣ <b>Gratuita e Feita pela Comunidade</b>: Pessoas como si ajudam a criar a aplicação ao adicionar locais ao OpenStreetMap, testando e dando opiniões em funcionalidades e contribuindo com dotes de desenvolvimento e dinheiro.
|
||||||
|
‣ <b>Decisões e Finanças Abertas e Transparentes, Sem fins lucrativos e ‘Open-Source’.</b>
|
||||||
|
|
||||||
|
<b>Funcionalidades principais</b>:
|
||||||
|
• Mapas detalhados descarregáveis com locais que não estão disponíveis com o Google Maps
|
||||||
|
• Modo ao Ar Livre com trilhos de caminhada destacados, acampamentos, fontes de água, cumes, curvas de nível, etc
|
||||||
|
• Caminhos pedestres e ciclovias
|
||||||
|
• Pontos de interesse como restaurantes, estações de serviço, hotéis, lojas, atrações e muitos mais
|
||||||
|
• Pesquise por nome, endereço, ou por categoria de ponto de interesse
|
||||||
|
• Navegação com anúncios de voz ao caminhar, pedalar ou conduzir
|
||||||
|
• Marque os seus locais favoritos com um único clique
|
||||||
|
• Artigos da Wikipédia Offline
|
||||||
|
• Camada de metro e direções
|
||||||
|
• Gravação de Percursos
|
||||||
|
• Exportar e importar marcadores e percursos em formatos KML, KMZ, GPX
|
||||||
|
• Um modo escuro para usar durante a noite
|
||||||
|
• Melhore a informação do mapa para todos com um editor básico embebido
|
||||||
|
|
||||||
|
<b>A liberdade chegou</b>
|
||||||
|
Descubra a sua jornada, navegue o mundo com privacidade e a comunidade à frente!
|
||||||
32
android/app/src/fdroid/play/listings/pt/full-description.txt
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
Uma aplicação pela comunidade, grátis e ‘open-source’, de mapas baseada em dados do OpenStreetMap e reforçada com compromisso para transparência, privacidade e sem fins lucrativos. CoMaps é um fork/spin-off de Organic Maps, que, por sua vez, é um fork de Maps.ME
|
||||||
|
|
||||||
|
Leia sobre as razões deste projeto e a sua direção em <b><i>codeberg.org/comaps</i></b>.
|
||||||
|
Junte-se à comunidade e ajude a fazer a melhor aplicação de mapas
|
||||||
|
• Use a aplicação e partilhe-a com outros
|
||||||
|
• Dê ‘feedback’ e reporte problemas
|
||||||
|
• Atualize os dados de mapa na aplicação ou no site do OpenStreetMap
|
||||||
|
|
||||||
|
‣ <b>Simples e Polida</b>: funcionalidades essenciais fáceis que “somente funcionam”.
|
||||||
|
‣ <b>Foco Offline</b>: Planeie e navegue as suas viagens no estrangeiro sem dados móveis, procure locais numa caminhada distante, etc. Todas as funções da aplicação foram criadas com intenção de serem usadas sem internet.
|
||||||
|
‣ <b>Respeita a privacidade</b>: A aplicação foi criada com privacidade em mente — não identifica o utilizador, não rastreia, e não usa a sua informação pessoal. Sem anúncios.
|
||||||
|
‣ <b>Saves Your Battery and Space</b>: Não esgota a sua bateria ao contrário de outras aplicações. Mapas compactos salvam espaço no seu telemóvel.
|
||||||
|
‣ <b>Gratuita e Feita pela Comunidade</b>: Pessoas como si ajudam a criar a aplicação ao adicionar locais ao OpenStreetMap, testando e dando opiniões em funcionalidades e contribuindo com dotes de desenvolvimento e dinheiro.
|
||||||
|
‣ <b>Decisões e Finanças Abertas e Transparentes, Sem fins lucrativos e ‘Open-Source’.</b>
|
||||||
|
|
||||||
|
<b>Funcionalidades principais</b>:
|
||||||
|
• Mapas detalhados descarregáveis com locais que não estão disponíveis com o Google Maps
|
||||||
|
• Modo ao Ar Livre com trilhos de caminhada destacados, acampamentos, fontes de água, cumes, curvas de nível, etc
|
||||||
|
• Caminhos pedestres e ciclovias
|
||||||
|
• Pontos de interesse como restaurantes, estações de serviço, hotéis, lojas, atrações e muitos mais
|
||||||
|
• Pesquise por nome, endereço, ou por categoria de ponto de interesse
|
||||||
|
• Navegação com anúncios de voz ao caminhar, pedalar ou conduzir
|
||||||
|
• Marque os seus locais favoritos com um único clique
|
||||||
|
• Artigos da Wikipédia Offline
|
||||||
|
• Camada de metro e direções
|
||||||
|
• Gravação de Percursos
|
||||||
|
• Exportar e importar marcadores e percursos em formatos KML, KMZ, GPX
|
||||||
|
• Um modo escuro para usar durante a noite
|
||||||
|
• Melhore a informação do mapa para todos com um editor básico embebido
|
||||||
|
|
||||||
|
<b>A liberdade chegou</b>
|
||||||
|
Descubra a sua jornada, navegue o mundo com privacidade e a comunidade à frente!
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Navegação fácil nos mapas - Descubra mais sobre o seu percurso - Feito por todos
|
||||||
1
android/app/src/fdroid/play/listings/pt/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps - Mapas e Navegação - Offline e Privada
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
• Данные на 6 сентября
|
|
||||||
• Предупреждения на веломаршруте
|
|
||||||
• Цветные метки POI при автонавигации
|
|
||||||
• Поиск POI по названию ветки
|
|
||||||
• Добавлены высоковольтные опоры, помещения охраны и офисы
|
|
||||||
• Обновлены значки башен,вышек,мачт,ночных клубов,аптек
|
|
||||||
• Сохранение цвета закладок при экспорте в GPX (через OM)
|
|
||||||
• Отображение цветом пешеходных зон
|
|
||||||
• Android Auto: отображение номеров съездов на кольцевых развязках
|
|
||||||
Посмотрите примечания к выпуску Codeberg, чтобы узнать о других изменениях!
|
|
||||||
31
android/app/src/fdroid/play/listings/sl/full-description.txt
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
Brezplačno in odprtokodno zemljevidno orodje, ki ga vodi skupnost, temelji na podatkih OpenStreetMap in je okrepljena s predanostjo transparentnosti, zasebnosti in nepridobitnosti. CoMaps je izpeljanka OrganicMaps, ta pa je izpeljanka Maps.ME.
|
||||||
|
|
||||||
|
Preberite si o razlogih za ta projekt in njegovi usmerjenosti na <b><i>codeberg.org/comaps</i></b>.
|
||||||
|
Pridružite se skupnosti in pomagajte narediti najboljše zemljevidno orodje
|
||||||
|
• Uporabljajte orodje in širite glas o njem
|
||||||
|
• Dajajte povratne informacije in poročajte o napakah
|
||||||
|
• Posodabljajte podatke zemljevida v tem orodju ali na spletni strani OpenStreetMap
|
||||||
|
|
||||||
|
‣ <b>Osredotočeno na uporabo brez povezave</b>: Načrtujte in se usmerjajte na vašem potovanju v tujini vrez potrebe po mobilnih podatkih, iščite vmesne točke potovanja ko ste na daljšem pohodu ipd. Vse zmogljivosti orodja so zasnovane za delo brez povezave.
|
||||||
|
‣ <b>Spoštovanje zasebnosti</b>: orodje je zasnovano z mislijo na zasebnost – ne prepoznava oseb, ne sledi in ne zbira osebnih podatkov. Brez oglasov.
|
||||||
|
‣ <b>Preprosto in dodelano</b>: nujne zmogljivosti, enostavne za uporabo, ki preprosto delujejo.
|
||||||
|
‣ <b>Prihrani vašo baterijo in prostor.</b>: ne izčrpava vaše baterije kakor druga usmerjevalna orodja. Strnjeni zemljevidi prihranijo dragocen prostor na vašem telefonu.
|
||||||
|
‣ <b>Brezplačno in ustvarjeno v skupnosti</b>: ljudje kot ste vi pomagajo ustvarjati to orodje, tako da dodajajo kraje na OpenStreetMap, preizkušajo in dajejo povratne informacije o zmogljivostih in prispevajo svoje razvijalske sposobnosti in sredstva.
|
||||||
|
‣ <b>Odprto in transparentno odločanje in finance, nepridobitno in popolnoma odprtokodno.</b>
|
||||||
|
|
||||||
|
<b>Glavne zmogljivosti</b>:
|
||||||
|
• Prenosljivi podrobni zemljevidi s kraji, ki na Googlovih zemljevidih niso na voljo.
|
||||||
|
• Prikaz za dejavnosti na prostem s poudarjenimi pohodniškimi potmi, tabornimi prostori, vodnimi viri, vrhovi, plastnicami itd.
|
||||||
|
• 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 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š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 @@
|
|||||||
Enostavna navigacija – Odkrij več o svojem potovanju – Podprto v skupnosti
|
Enostavno usmerjanje – Odkrij več o svojem potovanju – Podprto v skupnosti
|
||||||
|
|||||||
1
android/app/src/fdroid/play/listings/sv-SE/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Comaps- Vandra, Cykla, Kör Offline, Privat
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
OpenStreetMap தரவை அடிப்படையாகக் கொண்ட சமூகம் தலைமையிலான இலவச மற்றும் திறந்த மூல வரைபட பயன்பாடு மற்றும் வெளிப்படைத்தன்மை, தனியுரிமை மற்றும் இலாப நோக்கற்றது ஆகியவற்றுக்கான அர்ப்பணிப்புடன் வலுவூட்டப்பட்டது. CoMaps என்பது ஆர்கானிக் மேப்சின் ஃபோர்க்/ச்பின்-ஆஃப் ஆகும், இது Maps.ME இன் ஃபோர்க் ஆகும்.
|
||||||
|
|
||||||
|
திட்டத்திற்கான காரணங்கள் மற்றும் அதன் திசையை <b><i>codeberg.org/comaps</i></b> இல் படிக்கவும்.
|
||||||
|
அங்குள்ள சமூகத்தில் சேர்ந்து சிறந்த வரைபட பயன்பாட்டை உருவாக்க உதவுங்கள்
|
||||||
|
• பயன்பாட்டைப் பயன்படுத்தி, அதைப் பற்றிய தகவலைப் பரப்புங்கள்
|
||||||
|
• கருத்துக்களை வழங்கவும் மற்றும் சிக்கல்களைப் புகாரளிக்கவும்
|
||||||
|
• பயன்பாட்டில் அல்லது OpenStreetMap இணையதளத்தில் வரைபடத் தரவைப் புதுப்பிக்கவும்
|
||||||
|
|
||||||
|
‣ <b>ஆஃப்லைனில் கவனம் செலுத்தப்பட்டது</b>: செல்லுலார் சேவையின் தேவையின்றி உங்களின் வெளிநாட்டுப் பயணத்தைத் திட்டமிட்டு வழிநடத்துங்கள், தொலைதூர பயணத்தில் இருக்கும் போது வழிப் புள்ளிகளைத் தேடுங்கள்.
|
||||||
|
‣ <b>தனியுரிமைக்கு மதிப்பளித்தல்</b>: பயன்பாடு தனியுரிமையை மனதில் கொண்டு வடிவமைக்கப்பட்டுள்ளது - நபர்களை அடையாளம் காணாது, கண்காணிக்காது மற்றும் தனிப்பட்ட தகவல்களைச் சேகரிக்காது. விளம்பரங்கள் இல்லாதது.
|
||||||
|
‣ <b>எளிமையான மற்றும் மெருகூட்டப்பட்டது</b>: செயல்படும் நற்பொருத்தங்கள் பயன்படுத்த எளிதானது.
|
||||||
|
‣ <b>உங்கள் பேட்டரி மற்றும் இடத்தைச் சேமிக்கிறது</b>: மற்ற வழிசெலுத்தல் பயன்பாடுகளைப் போல உங்கள் பேட்டரியை வெளியேற்றாது. சிறிய வரைபடங்கள் உங்கள் தொலைபேசியில் விலைமதிப்பற்ற இடத்தை சேமிக்கின்றன.
|
||||||
|
‣ <b>இலவசம் மற்றும் சமூகத்தால் உருவாக்கப்பட்டது</b>: OpenStreetMap இல் இடங்களைச் சேர்ப்பதன் மூலமும், சோதனை செய்து, அம்சங்களைப் பற்றிய கருத்துக்களை வழங்குவதன் மூலமும், அவர்களின் மேம்பாட்டுத் திறன்களையும் பணத்தையும் பங்களிப்பதன் மூலமும் உங்களைப் போன்றவர்கள் பயன்பாட்டை உருவாக்க உதவியுள்ளனர்.
|
||||||
|
‣ <b>திறந்த மற்றும் வெளிப்படையான முடிவெடுக்கும் மற்றும் நிதியியல், இலாப நோக்கற்ற மற்றும் முழு திறந்த மூல.</b>
|
||||||
|
|
||||||
|
<b>முக்கிய அம்சங்கள்</b>:
|
||||||
|
• கூகுள் மேப்சில் இல்லாத இடங்களுடன் தரவிறக்கம் செய்யக்கூடிய விரிவான வரைபடங்கள்
|
||||||
|
• ஐகிங் பாதைகள், முகாம்கள், நீர் ஆதாரங்கள், சிகரங்கள், விளிம்பு கோடுகள் போன்றவற்றைக் கொண்ட வெளிப்புறப் பயன்முறை
|
||||||
|
• நடைபாதைகள் மற்றும் சைக்கிள் பாதைகள்
|
||||||
|
• உணவகங்கள், எரிவாயு நிலையங்கள், ஓட்டல்கள், கடைகள், சுற்றிப்பார்க்கும் இடங்கள் மற்றும் பல போன்ற ஆர்வமுள்ள இடங்கள்
|
||||||
|
• பெயர் அல்லது முகவரி அல்லது ஆர்வமுள்ள வகை மூலம் தேடவும்
|
||||||
|
• நடைபயிற்சி, சைக்கிள் ஓட்டுதல் அல்லது வண்டி ஓட்டுவதற்கான குரல் அறிவிப்புகளுடன் வழிசெலுத்தல்
|
||||||
|
• ஒரே தட்டினால் உங்களுக்குப் பிடித்த இடங்களை புத்தகக்குறி செய்யவும்
|
||||||
|
• இணைப்பில்லாத விக்கிபீடியா கட்டுரைகள்
|
||||||
|
• சுரங்கப்பாதை போக்குவரத்து அடுக்கு மற்றும் திசைகள்
|
||||||
|
• ட்ராக் ரெக்கார்டிங்
|
||||||
|
• KML, KMZ, GPX வடிவங்களில் புக்மார்க்குகள் மற்றும் டிராக்குகளை ஏற்றுமதி மற்றும் இறக்குமதி செய்யுங்கள்
|
||||||
|
• இரவில் பயன்படுத்த ஒரு இருண்ட பயன்முறை
|
||||||
|
• அடிப்படை உள்ளமைக்கப்பட்ட எடிட்டரைப் பயன்படுத்தி அனைவருக்கும் வரைபடத் தரவை மேம்படுத்தவும்
|
||||||
|
|
||||||
|
<b>சுதந்திரம் இங்கே உள்ளது</b>
|
||||||
|
உங்கள் பயணத்தைக் கண்டறியவும், தனியுரிமை மற்றும் சமூகத்தை முன்னணியில் கொண்டு உலகிற்கு செல்லவும்!
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
எளிய வழிகாட்டி - பயணத்தை மேலும் கண்டறி - சமூகத்தால் இயக்கப்படுகிறது
|
||||||
1
android/app/src/fdroid/play/listings/ta-IN/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
இணைவரைபடங்கள் - மலையேறு, வண்டி, தனிமையில் இயக்கு
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
这是一个由社区主导、以 OpenStreetMap 数据为基础的免费开源地图应用,建立在我们对运营透明、隐私安全和非营利性的承诺之上。CoMaps 是 Organic Maps 的分叉/衍生产品,而 Organic Maps 则是 Maps.ME 的分叉。
|
这是一个由社区主导、以 OpenStreetMap 数据为基础的自由开源地图应用,建立在我们对运营透明、隐私安全和非营利性的承诺之上。CoMaps 是 Organic Maps 的分叉/衍生产品,而 Organic Maps 则是 Maps.ME 的分叉。
|
||||||
|
|
||||||
如需了解此项目诞生的原因及未来方向,请访问 <b><i>codeberg.org/comaps</i></b>。
|
如需了解此项目诞生的原因及未来方向,请访问 <b><i>codeberg.org/comaps</i></b>。
|
||||||
加入以上社区,和大家一起打造最优质的地图应用
|
加入以上社区,和大家一起打造最优质的地图应用
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
‣ <b>尊重隐私</b>:开发者们在设计 CoMaps 时,优先考虑的是保护用户隐私。CoMaps 无法识别用户身份、无法跟踪用户活动,也无法收集个人信息。此外,CoMaps 不会也不能显示任何广告。
|
‣ <b>尊重隐私</b>:开发者们在设计 CoMaps 时,优先考虑的是保护用户隐私。CoMaps 无法识别用户身份、无法跟踪用户活动,也无法收集个人信息。此外,CoMaps 不会也不能显示任何广告。
|
||||||
‣ <b>简洁精致</b>:轻便易用、不出差错的基本功能。
|
‣ <b>简洁精致</b>:轻便易用、不出差错的基本功能。
|
||||||
‣ <b>节省电池电量和空间</b>:不会像其他导航应用那样耗电。精简的地图可以节省宝贵的手机空间。
|
‣ <b>节省电池电量和空间</b>:不会像其他导航应用那样耗电。精简的地图可以节省宝贵的手机空间。
|
||||||
‣ <b>由社区合作创建的免费应用</b>:如同您一样的用户通过向 OpenStreetMap 添加地点、测试功能并提供反馈、无私地贡献自己的编程技能和资金,协力开发了 CoMaps。
|
‣ <b>自由且社区共建</b>:如同您一样的用户通过向 OpenStreetMap 添加地点、测试功能并提供反馈、无私地贡献自己的编程技能和资金,协力开发了 CoMaps。
|
||||||
‣ <b>决策问责、财务透明、非营利性、完全开源。</b>
|
‣ <b>决策问责、财务透明、非营利性、完全开源。</b>
|
||||||
|
|
||||||
<b>主要功能</b>:
|
<b>主要功能</b>:
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
• 地铁交通图层和路线指示
|
• 地铁交通图层和路线指示
|
||||||
• 轨迹记录
|
• 轨迹记录
|
||||||
• 以 KML、KMZ 和 GPX 格式导出和导入书签和轨迹
|
• 以 KML、KMZ 和 GPX 格式导出和导入书签和轨迹
|
||||||
• 选择天暗后自动开启的黑暗模式
|
• 深色模式,适配夜间使用场景
|
||||||
• 使用基本的内置编辑器来编辑 OpenStreetMap 地点,帮助大家改进地图数据
|
• 使用基本的内置编辑器来编辑 OpenStreetMap 地点,帮助大家改进地图数据
|
||||||
|
|
||||||
<b>自由在此</b>
|
<b>自由在此</b>
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Лесна навигация - Открийте повече от вашето пътуване - Подкрепен от общността
|
||||||
1
android/app/src/google/play/listings/bg/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps - Пътуване с Приватност
|
||||||
@@ -68,4 +68,4 @@ Por favor, informa de errores, sugiere ideas y únete a nuestra comunidad en el
|
|||||||
|
|
||||||
<b>La Libertad Está Aquí</b>
|
<b>La Libertad Está Aquí</b>
|
||||||
|
|
||||||
Descubre tu camino, navega el mundo con privacidad y con la comunidad como prioridad.
|
¡Descubre tu camino, navega el mundo con privacidad y con la comunidad como prioridad!
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Navigasi peta mudah – Temukan lebih banyak – Didukung oleh komunitas
|
||||||
1
android/app/src/google/play/listings/id/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps - Jelajah dengan Privat
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Paprasta ir patogi navigacija – Turiningesnės kelionės – Vystoma bendruomenės
|
||||||
1
android/app/src/google/play/listings/lt/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps – naviguokite privačiai
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Enkel kartnavigering - Opplev mere på din reise - Drevet av felleskapet
|
||||||
1
android/app/src/google/play/listings/no-NO/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps -Naviger med personvern
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
Aplikacja mapowa tworzona przez społeczność, darmowa i open source, oparta na danych OpenStreetMap, z pełnym naciskiem na transparentność, prywatność i działanie non-profit.
|
||||||
|
|
||||||
|
Dołącz do społeczności i pomóż tworzyć najlepszą aplikację mapową
|
||||||
|
• Korzystaj z aplikacji i polecaj ją innym
|
||||||
|
• Przekazuj opinie i zgłaszaj problemy
|
||||||
|
• Aktualizuj dane mapy w aplikacji lub na stronie OpenStreetMap
|
||||||
|
|
||||||
|
<i>Twoje opinie i oceny na 5 gwiazdek są dla nas najlepszym wsparciem!</i>
|
||||||
|
|
||||||
|
‣ <b>Prosta i dopracowana</b>: najważniejsze, łatwe w użyciu funkcje, które po prostu działają.
|
||||||
|
‣ <b>Skoncentrowana na trybie offline</b>: planuj i nawiguj za granicą bez sieci komórkowej, wyszukuj punkty na odległych szlakach – wszystkie funkcje działają offline.
|
||||||
|
‣ <b>Z poszanowaniem prywatności</b>: aplikacja nie identyfikuje użytkowników, nie śledzi i nie zbiera danych osobowych. Bez reklam.
|
||||||
|
‣ <b>Oszczędza baterię i miejsce</b>: nie zużywa baterii jak inne aplikacje nawigacyjne, a kompaktowe mapy oszczędzają miejsce w telefonie.
|
||||||
|
‣ <b>Darmowa i tworzona przez społeczność</b>: ludzie tacy jak Ty dodają miejsca do OpenStreetMap, testują funkcje, zgłaszają opinie i wspierają projekt.
|
||||||
|
‣ <b>Otwarte i przejrzyste decyzje i finanse, działanie non-profit, pełne open source.</b>
|
||||||
|
|
||||||
|
<b>Główne funkcje</b>:
|
||||||
|
• Pobierane szczegółowe mapy z miejscami, których nie ma w Google Maps
|
||||||
|
• Tryb outdoor ze szlakami, biwakami, źródłami wody, szczytami, warstwicami itp.
|
||||||
|
• Ścieżki piesze i rowerowe
|
||||||
|
• Punkty zainteresowania: restauracje, stacje paliw, hotele, sklepy, atrakcje i wiele innych
|
||||||
|
• Wyszukiwanie po nazwie, adresie lub kategorii
|
||||||
|
• Nawigacja z komunikatami głosowymi dla pieszych, rowerzystów i kierowców
|
||||||
|
• Dodawanie ulubionych miejsc jednym tapnięciem
|
||||||
|
• Artykuły Wikipedii dostępne offline
|
||||||
|
• Warstwa metra i wskazówki dojazdu
|
||||||
|
• Nagrywanie śladu trasy
|
||||||
|
• Eksport i import ulubionych miejsc i tras w formatach KML, KMZ, GPX
|
||||||
|
• Tryb ciemny do używania nocą
|
||||||
|
• Poprawianie danych mapy za pomocą prostego wbudowanego edytora
|
||||||
|
• Obsługa Android Auto
|
||||||
|
|
||||||
|
Zgłaszaj problemy, proponuj pomysły i dołącz do społeczności na stronie <b><i>comaps.app</i></b>.
|
||||||
|
|
||||||
|
<b>Wolność jest tutaj</b>
|
||||||
|
Odkrywaj swoją drogę i nawiguj po świecie z prywatnością i społecznością na pierwszym miejscu!
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Łatwa nawigacja po mapie - Odkryj więcej z podróży - Wspierane przez społeczność
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
Uma aplicação pela comunidade, grátis e ‘open-source’, de mapas baseada em dados do OpenStreetMap e reforçada com compromisso para transparência, privacidade e sem fins lucrativos.
|
||||||
|
|
||||||
|
Junte-se à comunidade e ajude a fazer a melhor aplicação de mapas
|
||||||
|
• Use a aplicação e partilhe-a com outros
|
||||||
|
• Dê ‘feedback’ e reporte problemas
|
||||||
|
• Atualize os dados de mapa na aplicação ou no site do OpenStreetMap
|
||||||
|
|
||||||
|
<i>O seu ‘feedback’ e ‘reviews’ de 5 estrelas são a melhor maneira de nos ajudar!</i>
|
||||||
|
|
||||||
|
‣ <b>Simples e Polida</b>: funcionalidades essenciais fáceis que “somente funcionam”.
|
||||||
|
‣ <b>Foco Offline</b>: Planeie e navegue as suas viagens no estrangeiro sem dados móveis, procure locais numa caminhada distante, etc. Todas as funções da aplicação foram criadas com intenção de serem usadas sem internet.
|
||||||
|
‣ <b>Respeita a privacidade</b>: A aplicação foi criada com privacidade em mente — não identifica o utilizador, não rastreia, e não usa a sua informação pessoal. Sem anúncios.
|
||||||
|
‣ <b>Saves Your Battery and Space</b>: Não esgota a sua bateria ao contrário de outras aplicações. Mapas compactos salvam espaço no seu telemóvel.
|
||||||
|
‣ <b>Gratuita e Feita pela Comunidade</b>: Pessoas como si ajudam a criar a aplicação ao adicionar locais ao OpenStreetMap, testando e dando opiniões em funcionalidades e contribuindo com dotes de desenvolvimento e dinheiro.
|
||||||
|
‣ <b>Decisões e Finanças Abertas e Transparentes, Sem fins lucrativos e ‘Open-Source’.</b>
|
||||||
|
|
||||||
|
<b>Funcionalidades principais</b>:
|
||||||
|
• Mapas detalhados descarregáveis com locais que não estão disponíveis com o Google Maps
|
||||||
|
• Modo ao Ar Livre com trilhos de caminhada destacados, acampamentos, fontes de água, cumes, curvas de nível, etc
|
||||||
|
• Caminhos pedestres e ciclovias
|
||||||
|
• Pontos de interesse como restaurantes, estações de serviço, hotéis, lojas, atrações e muitos mais
|
||||||
|
• Pesquise por nome, endereço, ou por categoria de ponto de interesse
|
||||||
|
• Navegação com anúncios de voz ao caminhar, pedalar ou conduzir
|
||||||
|
• Marque os seus locais favoritos com um único clique
|
||||||
|
• Artigos da Wikipédia Offline
|
||||||
|
• Camada de metro e direções
|
||||||
|
• Gravação de Percursos
|
||||||
|
• Exportar e importar marcadores e percursos em formatos KML, KMZ, GPX
|
||||||
|
• Um modo escuro para usar durante a noite
|
||||||
|
• Melhore a informação do mapa para todos com um editor básico embebido
|
||||||
|
• Suporte para ‘Android Auto’
|
||||||
|
|
||||||
|
Por favor, reporte problemas da aplicação, sugira ideias e junte-se à nossa comunidade no website <b><i>comaps.app</i></b>.
|
||||||
|
|
||||||
|
<b>A liberdade chegou</b>
|
||||||
|
Descubra a sua jornada, navegue o mundo com privacidade e a comunidade à frente!
|
||||||
36
android/app/src/google/play/listings/sl/full-description.txt
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
Skupnostno vodena brezplačna in odprtokodna aplikacija za zemljevide, ki temelji na podatkih OpenStreetMap, ter je okrepljena z zavezanostjo k transparentnosti, zasebnosti, in ostajanju neprofitne organizacije.
|
||||||
|
|
||||||
|
Pridružite se skupnosti in pomagajte ustvariti najboljšo aplikacijo za zemljevide.
|
||||||
|
• Uporabljajte aplikacijo in jo priporočajte drugim.
|
||||||
|
• Podajte povratne informacije in poročajte o težavah.
|
||||||
|
• Posodobite podatke zemljevida v aplikaciji ali na spletni strani OpenStreetMap.
|
||||||
|
|
||||||
|
<i>Vaše povratne informacije in 5-zvezdične ocene so najboljša podpora za nas!</i>
|
||||||
|
|
||||||
|
‣ <b>Preprostost in izpopolnjenost</b>: bistvene, enostavne za uporabo funkcije, ki preprosto delujejo.
|
||||||
|
‣ <b>Osredotočena na delovanje brez internetne povezave</b>: načrtujte in navigirajte svoje potovanje v tujini brez potrebe po mobilni povezavi, iščite točke na poti med daljšo pohodniško turo, itd. Vse funkcije aplikacije so zasnovane za delovanje brez internetne povezave.
|
||||||
|
‣ <b>Spoštovanje zasebnosti</b>: aplikacija je zasnovana z mislijo na zasebnost – ne identificira ljudi, ne sledi in ne zbira osebnih podatkov. Brez oglasov.
|
||||||
|
‣ <b>Varčuje z baterijo in prostorom</b>: ne izčrpava baterije kot druge navigacijske aplikacije. Kompaktni zemljevidi varčujejo dragoceni prostor na vašem telefonu.
|
||||||
|
‣ <b>Brezplačna in ustvarjena s pomočjo skupnosti</b>: ljudje, kot ste vi, so pomagali ustvariti aplikacijo z dodajanjem krajev v OpenStreetMap, testiranjem in dajanjem povratnih informacij o funkcijah ter prispevanjem svojih razvojnih veščin in denarja.
|
||||||
|
‣ <b>Odprto in pregledno odločanje in finance, neprofitna in popolnoma odprtokodna aplikacija.
|
||||||
|
|
||||||
|
<b>Glavne značilnosti</b>:
|
||||||
|
• Podrobni zemljevidi z mesti, ki niso na voljo v Google Maps, ki jih lahko prenesete
|
||||||
|
• Način za uporabo na prostem z označenimi pohodniškimi potmi, kampi, vodnimi viri, vrhovi, višinskimi krivuljami itd.
|
||||||
|
• Pešpoti in kolesarske poti
|
||||||
|
• Zanimivosti, kot so restavracije, bencinske črpalke, hoteli, trgovine, znamenitosti in še veliko več
|
||||||
|
• Iskanje po imenu, naslovu ali kategoriji zanimivih točk
|
||||||
|
• Navigacija z glasovnimi napovedmi za hojo, kolesarjenje ali vožnjo
|
||||||
|
• Z enim dotikom dodajte svoje priljubljene kraje v zaznamke
|
||||||
|
• Članki iz Wikipedije za uporabo brez internetne povezave
|
||||||
|
• Plast podzemne železnice in navodila za pot
|
||||||
|
• Sledenje poti
|
||||||
|
• Izvoz in uvoz zaznamkov in poti v formatih KML, KMZ, GPX
|
||||||
|
• Temni način za uporabo ponoči
|
||||||
|
• Izboljšajte zemljevidne podatke za vse z uporabo vgrajenega osnovnega urejevalnika.
|
||||||
|
• Podpora za Android Auto.
|
||||||
|
|
||||||
|
Prijavite težave z aplikacijo, predlagajte ideje in se pridružite naši skupnosti na spletni strani <b><i>comaps.app</i></b>.
|
||||||
|
|
||||||
|
<b>Svoboda je tu</b>
|
||||||
|
Odkrijte svojo pot, raziskujte svet z zasebnostjo in skupnostjo v ospredju!
|
||||||
@@ -1 +1 @@
|
|||||||
Enostavna navigacija – Odkrij več o svojem potovanju – Podprto v skupnosti
|
Enostavno usmerjanje – Odkrij več o svojem potovanju – Podprto v skupnosti
|
||||||
|
|||||||
1
android/app/src/google/play/listings/sl/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps - Usmerjajte se zasebno
|
||||||
1
android/app/src/google/play/listings/sv-SE/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Comaps- Navigera Privat
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
திறந்ததெருவரைபடம் தரவை அடிப்படையாகக் கொண்ட சமூகத்தால் வழிநடத்தப்படும் இலவச & திறந்த மூல வரைபடப் பயன்பாடு, வெளிப்படைத்தன்மை, தனியுரிமை மற்றும் இலாப நோக்கற்ற தன்மை ஆகியவற்றிற்கான அர்ப்பணிப்புடன் வலுப்படுத்தப்பட்டுள்ளது.
|
||||||
|
|
||||||
|
சமூகத்தில் சேர்ந்து சிறந்த வரைபடப் பயன்பாட்டை உருவாக்க உதவுங்கள்
|
||||||
|
• பயன்பாட்டைப் பயன்படுத்தி அதைப் பற்றிய செய்தியைப் பரப்புங்கள்
|
||||||
|
• கருத்துத் தெரிவிக்கவும் சிக்கல்களைப் புகாரளிக்கவும்
|
||||||
|
• பயன்பாட்டில் அல்லது OpenStreetMap வலைத்தளத்தில் வரைபடத் தரவைப் புதுப்பிக்கவும்
|
||||||
|
|
||||||
|
<i>உங்கள் கருத்து மற்றும் 5-நட்சத்திர மதிப்புரைகள் எங்களுக்குச் சிறந்த ஆதரவாகும்!</i>
|
||||||
|
|
||||||
|
‣ <b>எளிமையான மற்றும் மெருகூட்டப்பட்ட</b>: அத்தியாவசியமான பயன்படுத்த எளிதான அம்சங்கள் வேலை செய்கின்றன.
|
||||||
|
‣ <b>ஆஃப்லைனில் கவனம் செலுத்துகிறது</b>: செல்லுலார் சேவை தேவை இல்லாமல் உங்கள் வெளிநாட்டு பயணத்தைத் திட்டமிட்டு வழிநடத்துங்கள், தொலைதூர நடைபயணத்தின்போது வழிப்புள்ளிகளைத் தேடுங்கள் போன்றவை. அனைத்து பயன்பாட்டு செயல்பாடுகளும் ஆஃப்லைனில் வேலை செய்ய வடிவமைக்கப்பட்டுள்ளன.
|
||||||
|
‣ <b>தனியுரிமையை மதித்தல்</b>: பயன்பாடு தனியுரிமையை மனதில் கொண்டு வடிவமைக்கப்பட்டுள்ளது - மக்களை அடையாளம் காணாது, கண்காணிக்காது மற்றும் தனிப்பட்ட தகவல்களைச் சேகரிக்காது. விளம்பரங்கள் இல்லாதது.
|
||||||
|
‣ <b>உங்கள் பேட்டரி மற்றும் இடத்தைச் சேமிக்கிறது</b>: பிற வழிசெலுத்தல் பயன்பாடுகளைப் போல உங்கள் பேட்டரியை வெளியேற்றாது. சிறிய வரைபடங்கள் உங்கள் தொலைபேசியில் விலைமதிப்பற்ற இடத்தைச் சேமிக்கின்றன.
|
||||||
|
‣ <b>இலவசம் மற்றும் சமூகத்தால் உருவாக்கப்பட்டது</b>: உங்களைப் போன்றவர்கள் OpenStreetMap இல் இடங்களைச் சேர்ப்பதன் மூலமும், அம்சங்கள்குறித்து சோதித்துப் பார்த்துக் கருத்து தெரிவிப்பதன் மூலமும், அவர்களின் மேம்பாட்டுத் திறன்கள் மற்றும் பணத்தை பங்களிப்பதன் மூலமும் பயன்பாட்டை உருவாக்க உதவினார்கள்.
|
||||||
|
‣ <b>திறந்த மற்றும் வெளிப்படையான முடிவெடுக்கும் மற்றும் நிதி, இலாப நோக்கற்ற மற்றும் முழுமையாகத் திறந்த மூல.</b>
|
||||||
|
|
||||||
|
<b>முக்கிய பண்புகள்</b>:
|
||||||
|
• கூகிள் வரைபடத்தில் கிடைக்காத இடங்களுடன் பதிவிறக்கம் செய்யக்கூடிய விரிவான வரைபடங்கள்
|
||||||
|
• ஹைகிங் பாதைகள், முகாம் தளங்கள், நீர் ஆதாரங்கள், சிகரங்கள், விளிம்புக் கோடுகள் போன்றவற்றுடன் வெளிப்புற பயன்முறை
|
||||||
|
• நடைபாதைகள் மற்றும் சைக்கிள் பாதைகள்
|
||||||
|
• உணவகங்கள், எரிவாயு நிலையங்கள், ஹோட்டல்கள், கடைகள், பார்வையிடல்கள் மற்றும் பல போன்ற ஆர்வமுள்ள இடங்கள்
|
||||||
|
• பெயர் அல்லது முகவரி அல்லது ஆர்வமுள்ள இட வகைமூலம் தேடுங்கள்
|
||||||
|
• நடைபயிற்சி, சைக்கிள் ஓட்டுதல் அல்லது வாகனம் ஓட்டுவதற்கான குரல் அறிவிப்புகளுடன் வழிசெலுத்தல்
|
||||||
|
• உங்களுக்குப் பிடித்த இடங்களை ஒரே தட்டலில் புக்மார்க் செய்யவும்
|
||||||
|
• ஆஃப்லைன் விக்கிபீடியா கட்டுரைகள்
|
||||||
|
• சுரங்கப்பாதை போக்குவரத்து அடுக்கு மற்றும் திசைகள்
|
||||||
|
• பதிவுசெய்தலைக் கண்காணிக்கவும்
|
||||||
|
• KML, KMZ, GPX வடிவங்களில் புக்மார்க்குகள் மற்றும் தடங்களை ஏற்றுமதி செய்து இறக்குமதி செய்யவும்
|
||||||
|
• இரவில் பயன்படுத்த ஒரு இருண்ட பயன்முறை
|
||||||
|
• அடிப்படை உள்ளமைக்கப்பட்ட எடிட்டரைப் பயன்படுத்தி அனைவருக்கும் வரைபடத் தரவை மேம்படுத்தவும்
|
||||||
|
• ஆண்டாய்டு தானி ஆதரவு
|
||||||
|
|
||||||
|
பயன்பாட்டு சிக்கல்களைப் புகாரளிக்கவும், யோசனைகளைப் பரிந்துரைக்கவும் மற்றும் எங்கள் சமூகத்தில் சேரவும் <b><i>comaps.app</i></b> வலைத்தளம்.
|
||||||
|
|
||||||
|
<b>சுதந்திரம் இங்கே உள்ளது</b>
|
||||||
|
உங்கள் பயணத்தைக் கண்டறியவும், தனியுரிமை மற்றும் சமூகத்தை முன்னணியில் வைத்து உலகை வழிநடத்தவும்!
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
எளிய வழிகாட்டி - பயணத்தை மேலும் கண்டறி - சமூகத்தால் இயக்கப்படுகிறது
|
||||||
1
android/app/src/google/play/listings/ta-IN/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
இணைவரைபடங்கள் - தனியுரிமை
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
这是一个由社区主导、以 OpenStreetMap 数据为基础的免费开源地图应用,建立在我们对运营透明、隐私安全和非营利性的承诺之上。
|
这是一个由社区主导、以 OpenStreetMap 数据为基础的自由开源地图应用,建立在我们对运营透明、隐私安全和非营利性的承诺之上。
|
||||||
|
|
||||||
加入社区,和大家一起打造最优质的地图应用
|
加入社区,和大家一起打造最优质的地图应用
|
||||||
• 使用 CoMaps 的同时也分享推荐给周围的人
|
• 使用 CoMaps 的同时也分享推荐给周围的人
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
‣ <b>以提供离线服务为核心</b>:无需移动网络即可规划和导航您的海外旅行,郊外远足时仍可搜索航点等等。所有功能均可离线使用。
|
‣ <b>以提供离线服务为核心</b>:无需移动网络即可规划和导航您的海外旅行,郊外远足时仍可搜索航点等等。所有功能均可离线使用。
|
||||||
‣ <b>尊重隐私</b>:开发者们在设计 CoMaps 时,优先考虑的是保护用户隐私。CoMaps 无法识别用户身份、无法跟踪用户活动,也无法收集个人信息。此外,CoMaps 不会也不能显示任何广告。
|
‣ <b>尊重隐私</b>:开发者们在设计 CoMaps 时,优先考虑的是保护用户隐私。CoMaps 无法识别用户身份、无法跟踪用户活动,也无法收集个人信息。此外,CoMaps 不会也不能显示任何广告。
|
||||||
‣ <b>节省电池电量和空间</b>:不会像其他导航应用那样耗电。精简的地图可以节省宝贵的手机空间。
|
‣ <b>节省电池电量和空间</b>:不会像其他导航应用那样耗电。精简的地图可以节省宝贵的手机空间。
|
||||||
‣ <b>由社区合作创建的免费应用</b>:如同您一样的用户通过向 OpenStreetMap 添加地点、测试功能并提供反馈、无私地贡献自己的编程技能和资金,协力开发了 CoMaps。
|
‣ <b>自由且社区共建</b>:如同您一样的用户通过向 OpenStreetMap 添加地点、测试功能并提供反馈、无私地贡献自己的编程技能和资金,协力开发了 CoMaps。
|
||||||
‣ <b>决策问责、财务透明、非营利性、完全开源。</b>
|
‣ <b>决策问责、财务透明、非营利性、完全开源。</b>
|
||||||
|
|
||||||
<b>主要功能</b>:
|
<b>主要功能</b>:
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
• 地铁交通图层和路线指示
|
• 地铁交通图层和路线指示
|
||||||
• 轨迹记录
|
• 轨迹记录
|
||||||
• 以 KML、KMZ 和 GPX 格式导出和导入书签和轨迹
|
• 以 KML、KMZ 和 GPX 格式导出和导入书签和轨迹
|
||||||
• 选择天暗后自动开启的黑暗模式
|
• 深色模式,适配夜间使用场景
|
||||||
• 使用基本的内置编辑器来编辑 OpenStreetMap 地点,帮助大家改进地图数据
|
• 使用基本的内置编辑器来编辑 OpenStreetMap 地点,帮助大家改进地图数据
|
||||||
• 支持 Android Auto
|
• 支持 Android Auto
|
||||||
|
|
||||||
|
|||||||
@@ -89,6 +89,7 @@
|
|||||||
<!-- Allows for config and orientation change without killing/restarting main activity -->
|
<!-- Allows for config and orientation change without killing/restarting main activity -->
|
||||||
<activity
|
<activity
|
||||||
android:name="app.organicmaps.SplashActivity"
|
android:name="app.organicmaps.SplashActivity"
|
||||||
|
android:theme="@style/MwmTheme.Splash"
|
||||||
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation"
|
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation"
|
||||||
android:screenOrientation="fullUser"
|
android:screenOrientation="fullUser"
|
||||||
android:exported="true">
|
android:exported="true">
|
||||||
@@ -349,6 +350,7 @@
|
|||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="app.organicmaps.DownloadResourcesLegacyActivity"
|
android:name="app.organicmaps.DownloadResourcesLegacyActivity"
|
||||||
|
android:theme="@style/MwmTheme.DownloadResourcesLegacy"
|
||||||
android:configChanges="orientation|screenLayout|screenSize"
|
android:configChanges="orientation|screenLayout|screenSize"
|
||||||
android:screenOrientation="fullUser"/>
|
android:screenOrientation="fullUser"/>
|
||||||
|
|
||||||
@@ -365,6 +367,7 @@
|
|||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="app.organicmaps.MwmActivity"
|
android:name="app.organicmaps.MwmActivity"
|
||||||
|
android:theme="@style/MwmTheme.MainActivity"
|
||||||
android:launchMode="singleTask"
|
android:launchMode="singleTask"
|
||||||
android:configChanges="uiMode"
|
android:configChanges="uiMode"
|
||||||
android:screenOrientation="fullUser"
|
android:screenOrientation="fullUser"
|
||||||
@@ -386,6 +389,7 @@
|
|||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="app.organicmaps.search.SearchActivity"
|
android:name="app.organicmaps.search.SearchActivity"
|
||||||
|
android:theme="@style/MwmTheme.CardBg"
|
||||||
android:configChanges="orientation|screenLayout|screenSize"
|
android:configChanges="orientation|screenLayout|screenSize"
|
||||||
android:screenOrientation="fullUser"
|
android:screenOrientation="fullUser"
|
||||||
android:label="@string/search_map"
|
android:label="@string/search_map"
|
||||||
@@ -412,6 +416,7 @@
|
|||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="app.organicmaps.bookmarks.BookmarkCategoriesActivity"
|
android:name="app.organicmaps.bookmarks.BookmarkCategoriesActivity"
|
||||||
|
android:theme="@style/MwmTheme.WindowBg"
|
||||||
android:configChanges="orientation|screenLayout|screenSize"
|
android:configChanges="orientation|screenLayout|screenSize"
|
||||||
android:screenOrientation="fullUser"
|
android:screenOrientation="fullUser"
|
||||||
android:label="@string/bookmarks_and_tracks"
|
android:label="@string/bookmarks_and_tracks"
|
||||||
@@ -420,6 +425,7 @@
|
|||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="app.organicmaps.bookmarks.BookmarkListActivity"
|
android:name="app.organicmaps.bookmarks.BookmarkListActivity"
|
||||||
|
android:theme="@style/MwmTheme.CardBg"
|
||||||
android:configChanges="orientation|screenLayout|screenSize"
|
android:configChanges="orientation|screenLayout|screenSize"
|
||||||
android:screenOrientation="fullUser"
|
android:screenOrientation="fullUser"
|
||||||
android:label="@string/bookmarks"
|
android:label="@string/bookmarks"
|
||||||
|
|||||||
@@ -18,15 +18,23 @@ import android.location.Location;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
import androidx.activity.result.ActivityResultLauncher;
|
import androidx.activity.result.ActivityResultLauncher;
|
||||||
import androidx.activity.result.contract.ActivityResultContracts;
|
import androidx.activity.result.contract.ActivityResultContracts;
|
||||||
import androidx.annotation.CallSuper;
|
import androidx.annotation.CallSuper;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.StringRes;
|
import androidx.annotation.StringRes;
|
||||||
import androidx.annotation.StyleRes;
|
|
||||||
import androidx.core.view.ViewCompat;
|
import androidx.core.view.ViewCompat;
|
||||||
|
|
||||||
|
import com.google.android.material.button.MaterialButton;
|
||||||
|
import com.google.android.material.checkbox.MaterialCheckBox;
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
import com.google.android.material.progressindicator.LinearProgressIndicator;
|
||||||
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
|
|
||||||
import app.organicmaps.base.BaseMwmFragmentActivity;
|
import app.organicmaps.base.BaseMwmFragmentActivity;
|
||||||
|
import app.organicmaps.dialog.CustomMapServerDialog;
|
||||||
import app.organicmaps.downloader.MapManagerHelper;
|
import app.organicmaps.downloader.MapManagerHelper;
|
||||||
import app.organicmaps.intent.Factory;
|
import app.organicmaps.intent.Factory;
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
@@ -39,11 +47,7 @@ import app.organicmaps.sdk.util.StringUtils;
|
|||||||
import app.organicmaps.util.UiUtils;
|
import app.organicmaps.util.UiUtils;
|
||||||
import app.organicmaps.util.Utils;
|
import app.organicmaps.util.Utils;
|
||||||
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
||||||
import com.google.android.material.button.MaterialButton;
|
|
||||||
import com.google.android.material.checkbox.MaterialCheckBox;
|
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
|
||||||
import com.google.android.material.progressindicator.LinearProgressIndicator;
|
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
@@ -55,6 +59,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
|||||||
private MaterialTextView mTvMessage;
|
private MaterialTextView mTvMessage;
|
||||||
private LinearProgressIndicator mProgress;
|
private LinearProgressIndicator mProgress;
|
||||||
private MaterialButton mBtnDownload;
|
private MaterialButton mBtnDownload;
|
||||||
|
private MaterialButton mBtnAdvanced;
|
||||||
private MaterialCheckBox mChbDownloadCountry;
|
private MaterialCheckBox mChbDownloadCountry;
|
||||||
|
|
||||||
private String mCurrentCountry;
|
private String mCurrentCountry;
|
||||||
@@ -268,6 +273,14 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
|||||||
mProgress = findViewById(R.id.progressbar);
|
mProgress = findViewById(R.id.progressbar);
|
||||||
mBtnDownload = findViewById(R.id.btn_download_resources);
|
mBtnDownload = findViewById(R.id.btn_download_resources);
|
||||||
mChbDownloadCountry = findViewById(R.id.chb_download_country);
|
mChbDownloadCountry = findViewById(R.id.chb_download_country);
|
||||||
|
mBtnAdvanced = findViewById(R.id.btn_advanced);
|
||||||
|
|
||||||
|
mBtnAdvanced.setOnClickListener(v -> {
|
||||||
|
CustomMapServerDialog.show(this, url -> {
|
||||||
|
prepareFilesDownload(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
mBtnAdvanced.setEnabled(true);
|
||||||
|
|
||||||
mBtnListeners = new View.OnClickListener[BTN_COUNT];
|
mBtnListeners = new View.OnClickListener[BTN_COUNT];
|
||||||
mBtnNames = new String[BTN_COUNT];
|
mBtnNames = new String[BTN_COUNT];
|
||||||
@@ -292,6 +305,11 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
|||||||
{
|
{
|
||||||
mBtnDownload.setOnClickListener(mBtnListeners[action]);
|
mBtnDownload.setOnClickListener(mBtnListeners[action]);
|
||||||
mBtnDownload.setText(mBtnNames[action]);
|
mBtnDownload.setText(mBtnNames[action]);
|
||||||
|
|
||||||
|
// Allow changing server only when idle or after an error.
|
||||||
|
boolean advancedEnabled = (action == DOWNLOAD || action == TRY_AGAIN || action == RESUME);
|
||||||
|
mBtnAdvanced.setEnabled(advancedEnabled);
|
||||||
|
mBtnAdvanced.setAlpha(advancedEnabled ? 1f : 0.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void doDownload()
|
private void doDownload()
|
||||||
@@ -360,6 +378,9 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
|||||||
|
|
||||||
private void finishFilesDownload(int result)
|
private void finishFilesDownload(int result)
|
||||||
{
|
{
|
||||||
|
mBtnAdvanced.setEnabled(true);
|
||||||
|
mBtnAdvanced.setAlpha(1f);
|
||||||
|
|
||||||
if (result == ERR_NO_MORE_FILES)
|
if (result == ERR_NO_MORE_FILES)
|
||||||
{
|
{
|
||||||
// World and WorldCoasts has been downloaded, we should register maps again to correctly add them to the model.
|
// World and WorldCoasts has been downloaded, we should register maps again to correctly add them to the model.
|
||||||
@@ -429,20 +450,17 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
|||||||
.setTitle(titleId)
|
.setTitle(titleId)
|
||||||
.setMessage(messageId)
|
.setMessage(messageId)
|
||||||
.setCancelable(true)
|
.setCancelable(true)
|
||||||
.setOnCancelListener((dialog) -> setAction(PAUSE))
|
.setOnCancelListener((dialog) -> setAction(RESUME))
|
||||||
.setPositiveButton(R.string.try_again,
|
.setPositiveButton(R.string.try_again,
|
||||||
(dialog, which) -> {
|
(dialog, which) -> {
|
||||||
setAction(TRY_AGAIN);
|
setAction(TRY_AGAIN);
|
||||||
onTryAgainClicked();
|
onTryAgainClicked();
|
||||||
})
|
})
|
||||||
|
.setNegativeButton(R.string.cancel,
|
||||||
|
(dialog, which) -> {
|
||||||
|
setAction(RESUME);
|
||||||
|
})
|
||||||
.setOnDismissListener(dialog -> mAlertDialog = null)
|
.setOnDismissListener(dialog -> mAlertDialog = null)
|
||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
@StyleRes
|
|
||||||
public int getThemeResourceId(@NonNull String theme)
|
|
||||||
{
|
|
||||||
return R.style.MwmTheme_DownloadResourcesLegacy;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,210 +0,0 @@
|
|||||||
package app.organicmaps;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.util.DisplayMetrics;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.MotionEvent;
|
|
||||||
import android.view.SurfaceHolder;
|
|
||||||
import android.view.SurfaceView;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.core.content.res.ConfigurationHelper;
|
|
||||||
import app.organicmaps.base.BaseMwmFragment;
|
|
||||||
import app.organicmaps.sdk.Map;
|
|
||||||
import app.organicmaps.sdk.MapRenderingListener;
|
|
||||||
import app.organicmaps.sdk.display.DisplayType;
|
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
|
||||||
|
|
||||||
public class MapFragment extends BaseMwmFragment implements View.OnTouchListener, SurfaceHolder.Callback
|
|
||||||
{
|
|
||||||
private static final String TAG = MapFragment.class.getSimpleName();
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
private final Map mMap = new Map(DisplayType.Device);
|
|
||||||
|
|
||||||
public void updateCompassOffset(int offsetX, int offsetY)
|
|
||||||
{
|
|
||||||
mMap.updateCompassOffset(requireContext(), offsetX, offsetY, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateBottomWidgetsOffset(int offsetX, int offsetY)
|
|
||||||
{
|
|
||||||
mMap.updateBottomWidgetsOffset(requireContext(), offsetX, offsetY);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateMyPositionRoutingOffset(int offsetY)
|
|
||||||
{
|
|
||||||
mMap.updateMyPositionRoutingOffset(offsetY);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void destroySurface(boolean activityIsChangingConfigurations)
|
|
||||||
{
|
|
||||||
mMap.onSurfaceDestroyed(activityIsChangingConfigurations, isAdded());
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isContextCreated()
|
|
||||||
{
|
|
||||||
return mMap.isContextCreated();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void surfaceCreated(@NonNull SurfaceHolder surfaceHolder)
|
|
||||||
{
|
|
||||||
Logger.d(TAG);
|
|
||||||
int densityDpi;
|
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
|
|
||||||
densityDpi = ConfigurationHelper.getDensityDpi(requireContext().getResources());
|
|
||||||
else
|
|
||||||
densityDpi = getDensityDpiOld();
|
|
||||||
|
|
||||||
mMap.onSurfaceCreated(requireContext(), surfaceHolder.getSurface(), surfaceHolder.getSurfaceFrame(), densityDpi);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height)
|
|
||||||
{
|
|
||||||
Logger.d(TAG);
|
|
||||||
mMap.onSurfaceChanged(requireContext(), surfaceHolder.getSurface(), surfaceHolder.getSurfaceFrame(),
|
|
||||||
surfaceHolder.isCreating());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void surfaceDestroyed(@NonNull SurfaceHolder surfaceHolder)
|
|
||||||
{
|
|
||||||
Logger.d(TAG);
|
|
||||||
mMap.onSurfaceDestroyed(requireActivity().isChangingConfigurations(), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onAttach(Context context)
|
|
||||||
{
|
|
||||||
Logger.d(TAG);
|
|
||||||
super.onAttach(context);
|
|
||||||
|
|
||||||
mMap.setLocationHelper(MwmApplication.from(requireContext()).getLocationHelper());
|
|
||||||
mMap.setMapRenderingListener((MapRenderingListener) context);
|
|
||||||
mMap.setCallbackUnsupported(this::reportUnsupported);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDetach()
|
|
||||||
{
|
|
||||||
Logger.d(TAG);
|
|
||||||
super.onDetach();
|
|
||||||
mMap.setMapRenderingListener(null);
|
|
||||||
mMap.setCallbackUnsupported(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle b)
|
|
||||||
{
|
|
||||||
Logger.d(TAG);
|
|
||||||
super.onCreate(b);
|
|
||||||
setRetainInstance(true);
|
|
||||||
boolean launchByDeepLink = false;
|
|
||||||
Bundle args = getArguments();
|
|
||||||
if (args != null)
|
|
||||||
launchByDeepLink = args.getBoolean(Map.ARG_LAUNCH_BY_DEEP_LINK);
|
|
||||||
mMap.onCreate(launchByDeepLink);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStart()
|
|
||||||
{
|
|
||||||
Logger.d(TAG);
|
|
||||||
super.onStart();
|
|
||||||
mMap.onStart();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStop()
|
|
||||||
{
|
|
||||||
Logger.d(TAG);
|
|
||||||
super.onStop();
|
|
||||||
mMap.onStop();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPause()
|
|
||||||
{
|
|
||||||
Logger.d(TAG);
|
|
||||||
super.onPause();
|
|
||||||
mMap.onPause(requireContext());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResume()
|
|
||||||
{
|
|
||||||
Logger.d(TAG);
|
|
||||||
super.onResume();
|
|
||||||
mMap.onResume();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
|
|
||||||
{
|
|
||||||
Logger.d(TAG);
|
|
||||||
final View view = inflater.inflate(R.layout.fragment_map, container, false);
|
|
||||||
final SurfaceView mSurfaceView = view.findViewById(R.id.map_surfaceview);
|
|
||||||
mSurfaceView.getHolder().addCallback(this);
|
|
||||||
return view;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onTouch(View view, MotionEvent event)
|
|
||||||
{
|
|
||||||
int action = event.getActionMasked();
|
|
||||||
int pointerIndex = event.getActionIndex();
|
|
||||||
switch (action)
|
|
||||||
{
|
|
||||||
case MotionEvent.ACTION_POINTER_UP -> action = Map.NATIVE_ACTION_UP;
|
|
||||||
case MotionEvent.ACTION_UP ->
|
|
||||||
{
|
|
||||||
action = Map.NATIVE_ACTION_UP;
|
|
||||||
pointerIndex = 0;
|
|
||||||
}
|
|
||||||
case MotionEvent.ACTION_POINTER_DOWN -> action = Map.NATIVE_ACTION_DOWN;
|
|
||||||
case MotionEvent.ACTION_DOWN ->
|
|
||||||
{
|
|
||||||
action = Map.NATIVE_ACTION_DOWN;
|
|
||||||
pointerIndex = 0;
|
|
||||||
}
|
|
||||||
case MotionEvent.ACTION_MOVE ->
|
|
||||||
{
|
|
||||||
action = Map.NATIVE_ACTION_MOVE;
|
|
||||||
pointerIndex = Map.INVALID_POINTER_MASK;
|
|
||||||
}
|
|
||||||
case MotionEvent.ACTION_CANCEL -> action = Map.NATIVE_ACTION_CANCEL;
|
|
||||||
}
|
|
||||||
Map.onTouch(action, event, pointerIndex);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void notifyOnSurfaceDestroyed(@NonNull Runnable task)
|
|
||||||
{
|
|
||||||
mMap.onSurfaceDestroyed(false, true);
|
|
||||||
task.run();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void reportUnsupported()
|
|
||||||
{
|
|
||||||
new MaterialAlertDialogBuilder(requireContext(), R.style.MwmTheme_AlertDialog)
|
|
||||||
.setMessage(R.string.unsupported_phone)
|
|
||||||
.setCancelable(false)
|
|
||||||
.setPositiveButton(R.string.close, (dlg, which) -> requireActivity().moveTaskToBack(true))
|
|
||||||
.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getDensityDpiOld()
|
|
||||||
{
|
|
||||||
final DisplayMetrics metrics = new DisplayMetrics();
|
|
||||||
requireActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
|
|
||||||
return metrics.densityDpi;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -42,14 +42,12 @@ import androidx.annotation.CallSuper;
|
|||||||
import androidx.annotation.Keep;
|
import androidx.annotation.Keep;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.StyleRes;
|
|
||||||
import androidx.annotation.UiThread;
|
import androidx.annotation.UiThread;
|
||||||
import androidx.core.app.ActivityCompat;
|
import androidx.core.app.ActivityCompat;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
import androidx.core.view.ViewCompat;
|
import androidx.core.view.ViewCompat;
|
||||||
import androidx.core.view.WindowInsetsCompat;
|
import androidx.core.view.WindowInsetsCompat;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.fragment.app.FragmentFactory;
|
|
||||||
import androidx.fragment.app.FragmentManager;
|
import androidx.fragment.app.FragmentManager;
|
||||||
import androidx.fragment.app.FragmentTransaction;
|
import androidx.fragment.app.FragmentTransaction;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
@@ -85,6 +83,7 @@ import app.organicmaps.routing.RoutingPlanInplaceController;
|
|||||||
import app.organicmaps.sdk.ChoosePositionMode;
|
import app.organicmaps.sdk.ChoosePositionMode;
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.Map;
|
import app.organicmaps.sdk.Map;
|
||||||
|
import app.organicmaps.sdk.MapController;
|
||||||
import app.organicmaps.sdk.MapRenderingListener;
|
import app.organicmaps.sdk.MapRenderingListener;
|
||||||
import app.organicmaps.sdk.PlacePageActivationListener;
|
import app.organicmaps.sdk.PlacePageActivationListener;
|
||||||
import app.organicmaps.sdk.Router;
|
import app.organicmaps.sdk.Router;
|
||||||
@@ -108,6 +107,7 @@ import app.organicmaps.sdk.routing.RoutingOptions;
|
|||||||
import app.organicmaps.sdk.search.SearchEngine;
|
import app.organicmaps.sdk.search.SearchEngine;
|
||||||
import app.organicmaps.sdk.settings.RoadType;
|
import app.organicmaps.sdk.settings.RoadType;
|
||||||
import app.organicmaps.sdk.settings.UnitLocale;
|
import app.organicmaps.sdk.settings.UnitLocale;
|
||||||
|
import app.organicmaps.sdk.sound.TtsPlayer;
|
||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import app.organicmaps.sdk.util.LocationUtils;
|
import app.organicmaps.sdk.util.LocationUtils;
|
||||||
import app.organicmaps.sdk.util.PowerManagment;
|
import app.organicmaps.sdk.util.PowerManagment;
|
||||||
@@ -133,15 +133,14 @@ import com.google.android.material.appbar.MaterialToolbar;
|
|||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
public class MwmActivity extends BaseMwmFragmentActivity
|
public class MwmActivity extends BaseMwmFragmentActivity
|
||||||
implements PlacePageActivationListener, View.OnTouchListener, MapRenderingListener, RoutingController.Container,
|
implements PlacePageActivationListener, MapRenderingListener, RoutingController.Container, LocationListener,
|
||||||
LocationListener, SensorListener, LocationState.ModeChangeListener,
|
SensorListener, LocationState.ModeChangeListener, RoutingPlanInplaceController.RoutingPlanListener,
|
||||||
RoutingPlanInplaceController.RoutingPlanListener, RoutingBottomMenuListener,
|
RoutingBottomMenuListener, BookmarkManager.BookmarksLoadingListener,
|
||||||
BookmarkManager.BookmarksLoadingListener, FloatingSearchToolbarController.SearchToolbarListener,
|
FloatingSearchToolbarController.SearchToolbarListener,
|
||||||
MenuBottomSheetFragment.MenuBottomSheetInterfaceWithHeader,
|
MenuBottomSheetFragment.MenuBottomSheetInterfaceWithHeader,
|
||||||
PlacePageController.PlacePageRouteSettingsListener, MapButtonsController.MapButtonClickListener,
|
PlacePageController.PlacePageRouteSettingsListener, MapButtonsController.MapButtonClickListener,
|
||||||
DisplayChangedListener
|
DisplayChangedListener
|
||||||
@@ -171,8 +170,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
|
|
||||||
private static final String POWER_SAVE_DISCLAIMER_SHOWN = "POWER_SAVE_DISCLAIMER_SHOWN";
|
private static final String POWER_SAVE_DISCLAIMER_SHOWN = "POWER_SAVE_DISCLAIMER_SHOWN";
|
||||||
|
|
||||||
@Nullable
|
@SuppressWarnings("NotNullFieldNotInitialized")
|
||||||
private MapFragment mMapFragment;
|
@NonNull
|
||||||
|
private MapController mMapController;
|
||||||
|
|
||||||
private View mPointChooser;
|
private View mPointChooser;
|
||||||
private MaterialToolbar mPointChooserToolbar;
|
private MaterialToolbar mPointChooserToolbar;
|
||||||
@@ -245,7 +245,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
ManageRouteBottomSheet mManageRouteBottomSheet;
|
ManageRouteBottomSheet mManageRouteBottomSheet;
|
||||||
|
|
||||||
private boolean mRemoveDisplayListener = true;
|
private boolean mRemoveDisplayListener = true;
|
||||||
private int mLastUiMode = Configuration.UI_MODE_TYPE_UNDEFINED;
|
private static int mLastUiMode = Configuration.UI_MODE_TYPE_UNDEFINED;
|
||||||
|
|
||||||
public interface LeftAnimationTrackListener
|
public interface LeftAnimationTrackListener
|
||||||
{
|
{
|
||||||
@@ -455,25 +455,12 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
@StyleRes
|
|
||||||
protected int getThemeResourceId(@NonNull String theme)
|
|
||||||
{
|
|
||||||
if (Config.UiTheme.isDefault(theme))
|
|
||||||
return R.style.MwmTheme_MainActivity;
|
|
||||||
|
|
||||||
if (Config.UiTheme.isNight(theme))
|
|
||||||
return R.style.MwmTheme_Night_MainActivity;
|
|
||||||
|
|
||||||
return super.getThemeResourceId(theme);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDisplayChangedToCar(@NonNull Runnable onTaskFinishedCallback)
|
public void onDisplayChangedToCar(@NonNull Runnable onTaskFinishedCallback)
|
||||||
{
|
{
|
||||||
mRemoveDisplayListener = false;
|
mRemoveDisplayListener = false;
|
||||||
startActivity(new Intent(this, MapPlaceholderActivity.class));
|
startActivity(new Intent(this, MapPlaceholderActivity.class));
|
||||||
Objects.requireNonNull(mMapFragment).notifyOnSurfaceDestroyed(onTaskFinishedCallback);
|
mMapController.setOnDestroyListener(onTaskFinishedCallback);
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -482,13 +469,15 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
{
|
{
|
||||||
super.onConfigurationChanged(newConfig);
|
super.onConfigurationChanged(newConfig);
|
||||||
|
|
||||||
final int newUiMode = newConfig.uiMode & Configuration.UI_MODE_TYPE_MASK;
|
final int newType = newConfig.uiMode & Configuration.UI_MODE_TYPE_MASK;
|
||||||
final boolean newUiModeIsCarConnected = newUiMode == Configuration.UI_MODE_TYPE_CAR;
|
final int oldType = mLastUiMode & Configuration.UI_MODE_TYPE_MASK;
|
||||||
final boolean newUiModeIsCarDisconnected =
|
|
||||||
mLastUiMode == Configuration.UI_MODE_TYPE_CAR && newUiMode == Configuration.UI_MODE_TYPE_NORMAL;
|
|
||||||
mLastUiMode = newUiMode;
|
|
||||||
|
|
||||||
if (newUiModeIsCarConnected || newUiModeIsCarDisconnected)
|
mLastUiMode = newConfig.uiMode;
|
||||||
|
|
||||||
|
final boolean carModeChanged =
|
||||||
|
newType != oldType && (newType == Configuration.UI_MODE_TYPE_CAR || oldType == Configuration.UI_MODE_TYPE_CAR);
|
||||||
|
|
||||||
|
if (carModeChanged)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
makeNavigationBarTransparentInLightMode();
|
makeNavigationBarTransparentInLightMode();
|
||||||
@@ -550,7 +539,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
updateViewsInsets();
|
updateViewsInsets();
|
||||||
|
|
||||||
if (getIntent().getBooleanExtra(EXTRA_UPDATE_THEME, false))
|
if (getIntent().getBooleanExtra(EXTRA_UPDATE_THEME, false))
|
||||||
ThemeSwitcher.INSTANCE.restart(isMapRendererActive());
|
ThemeSwitcher.INSTANCE.restart(mMapController.isRenderingActive());
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* onRenderingInitializationFinished() hook is not called when MwmActivity is recreated with the already
|
* onRenderingInitializationFinished() hook is not called when MwmActivity is recreated with the already
|
||||||
@@ -618,7 +607,10 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
|
|
||||||
private void initViews(boolean isLaunchByDeeplink)
|
private void initViews(boolean isLaunchByDeeplink)
|
||||||
{
|
{
|
||||||
initMap(isLaunchByDeeplink);
|
mMapController = new MapController(findViewById(R.id.map), MwmApplication.from(this).getLocationHelper(), this,
|
||||||
|
this::reportUnsupported, isLaunchByDeeplink);
|
||||||
|
getLifecycle().addObserver(mMapController);
|
||||||
|
|
||||||
initNavigationButtons();
|
initNavigationButtons();
|
||||||
|
|
||||||
if (!mIsTabletLayout)
|
if (!mIsTabletLayout)
|
||||||
@@ -732,16 +724,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
private void showPositionChooser(ChoosePositionMode mode, boolean isBusiness, boolean applyPosition)
|
private void showPositionChooser(ChoosePositionMode mode, boolean isBusiness, boolean applyPosition)
|
||||||
{
|
{
|
||||||
closeFloatingToolbarsAndPanels(false);
|
closeFloatingToolbarsAndPanels(false);
|
||||||
if (mMapFragment != null)
|
|
||||||
{
|
|
||||||
final View mapView = mMapFragment.getView();
|
|
||||||
if (mapView != null)
|
|
||||||
{
|
|
||||||
int width = mapView.getWidth();
|
|
||||||
int height = mapView.getHeight();
|
|
||||||
Framework.nativeSetVisibleRect(0, 0, width, height);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
UiUtils.show(mPointChooser);
|
UiUtils.show(mPointChooser);
|
||||||
mMapButtonsViewModel.setButtonsHidden(true);
|
mMapButtonsViewModel.setButtonsHidden(true);
|
||||||
ChoosePositionMode.set(mode, isBusiness, applyPosition);
|
ChoosePositionMode.set(mode, isBusiness, applyPosition);
|
||||||
@@ -760,29 +743,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initMap(boolean isLaunchByDeepLink)
|
|
||||||
{
|
|
||||||
final FragmentManager manager = getSupportFragmentManager();
|
|
||||||
mMapFragment = (MapFragment) manager.findFragmentByTag(MapFragment.class.getName());
|
|
||||||
if (mMapFragment == null)
|
|
||||||
{
|
|
||||||
Bundle args = new Bundle();
|
|
||||||
args.putBoolean(Map.ARG_LAUNCH_BY_DEEP_LINK, isLaunchByDeepLink);
|
|
||||||
final FragmentFactory factory = manager.getFragmentFactory();
|
|
||||||
mMapFragment = (MapFragment) factory.instantiate(getClassLoader(), MapFragment.class.getName());
|
|
||||||
mMapFragment.setArguments(args);
|
|
||||||
manager.beginTransaction()
|
|
||||||
.replace(R.id.map_fragment_container, mMapFragment, MapFragment.class.getName())
|
|
||||||
.commit();
|
|
||||||
}
|
|
||||||
|
|
||||||
View container = findViewById(R.id.map_fragment_container);
|
|
||||||
if (container != null)
|
|
||||||
{
|
|
||||||
container.setOnTouchListener(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initNavigationButtons()
|
private void initNavigationButtons()
|
||||||
{
|
{
|
||||||
prepareNavigationButtons();
|
prepareNavigationButtons();
|
||||||
@@ -1211,7 +1171,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
{
|
{
|
||||||
setIntent(intent);
|
setIntent(intent);
|
||||||
super.onNewIntent(intent);
|
super.onNewIntent(intent);
|
||||||
if (isMapRendererActive())
|
if (mMapController.isRenderingActive())
|
||||||
processIntent();
|
processIntent();
|
||||||
if (intent.getAction() != null && intent.getAction().equals(TrackRecordingService.STOP_TRACK_RECORDING))
|
if (intent.getAction() != null && intent.getAction().equals(TrackRecordingService.STOP_TRACK_RECORDING))
|
||||||
{
|
{
|
||||||
@@ -1221,17 +1181,12 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isMapRendererActive()
|
|
||||||
{
|
|
||||||
return mMapFragment != null && Map.isEngineCreated() && mMapFragment.isContextCreated();
|
|
||||||
}
|
|
||||||
|
|
||||||
@CallSuper
|
@CallSuper
|
||||||
@Override
|
@Override
|
||||||
protected void onResume()
|
protected void onResume()
|
||||||
{
|
{
|
||||||
super.onResume();
|
super.onResume();
|
||||||
ThemeSwitcher.INSTANCE.restart(isMapRendererActive());
|
ThemeSwitcher.INSTANCE.restart(mMapController.isRenderingActive());
|
||||||
refreshSearchToolbar();
|
refreshSearchToolbar();
|
||||||
setFullscreen(isFullscreen());
|
setFullscreen(isFullscreen());
|
||||||
makeNavigationBarTransparentInLightMode();
|
makeNavigationBarTransparentInLightMode();
|
||||||
@@ -1249,15 +1204,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
MwmApplication.from(this).getSensorHelper().addListener(this);
|
MwmApplication.from(this).getSensorHelper().addListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void recreate()
|
|
||||||
{
|
|
||||||
// Explicitly destroy surface before activity recreation.
|
|
||||||
if (mMapFragment != null)
|
|
||||||
mMapFragment.destroySurface(true);
|
|
||||||
super.recreate();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onResumeFragments()
|
protected void onResumeFragments()
|
||||||
{
|
{
|
||||||
@@ -1459,12 +1405,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
return super.onGenericMotionEvent(event);
|
return super.onGenericMotionEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onTouch(View view, MotionEvent event)
|
|
||||||
{
|
|
||||||
return mMapFragment != null && mMapFragment.onTouch(view, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void customOnNavigateUp()
|
public void customOnNavigateUp()
|
||||||
{
|
{
|
||||||
if (removeCurrentFragment(true))
|
if (removeCurrentFragment(true))
|
||||||
@@ -1480,10 +1420,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
|
|
||||||
void updateCompassOffset(int offsetY, int offsetX)
|
void updateCompassOffset(int offsetY, int offsetX)
|
||||||
{
|
{
|
||||||
if (mMapFragment == null || !mMapFragment.isAdded())
|
mMapController.updateCompassOffset(offsetX, offsetY);
|
||||||
return;
|
|
||||||
|
|
||||||
mMapFragment.updateCompassOffset(offsetX, offsetY);
|
|
||||||
|
|
||||||
final double north = MwmApplication.from(this).getSensorHelper().getSavedNorth();
|
final double north = MwmApplication.from(this).getSensorHelper().getSavedNorth();
|
||||||
if (!Double.isNaN(north))
|
if (!Double.isNaN(north))
|
||||||
@@ -1502,9 +1439,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
|
|
||||||
public void updateBottomWidgetsOffset(int offsetX)
|
public void updateBottomWidgetsOffset(int offsetX)
|
||||||
{
|
{
|
||||||
if (mMapFragment == null || !mMapFragment.isAdded())
|
|
||||||
return;
|
|
||||||
|
|
||||||
int offsetY = mNavBarHeight;
|
int offsetY = mNavBarHeight;
|
||||||
final Float bottomButtonHeight = mMapButtonsViewModel.getBottomButtonsHeight().getValue();
|
final Float bottomButtonHeight = mMapButtonsViewModel.getBottomButtonsHeight().getValue();
|
||||||
if (bottomButtonHeight != null)
|
if (bottomButtonHeight != null)
|
||||||
@@ -1519,8 +1453,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
|
|
||||||
if (mDisplayManager.isDeviceDisplayUsed())
|
if (mDisplayManager.isDeviceDisplayUsed())
|
||||||
{
|
{
|
||||||
mMapFragment.updateBottomWidgetsOffset(offsetX, offsetY);
|
mMapController.updateBottomWidgetsOffset(offsetX, offsetY);
|
||||||
mMapFragment.updateMyPositionRoutingOffset(offsetY);
|
mMapController.updateMyPositionRoutingOffset(offsetY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1738,7 +1672,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
public void onNavigationCancelled()
|
public void onNavigationCancelled()
|
||||||
{
|
{
|
||||||
closeFloatingToolbarsAndPanels(true);
|
closeFloatingToolbarsAndPanels(true);
|
||||||
ThemeSwitcher.INSTANCE.restart(isMapRendererActive());
|
ThemeSwitcher.INSTANCE.restart(mMapController.isRenderingActive());
|
||||||
if (mRoutingPlanInplaceController == null)
|
if (mRoutingPlanInplaceController == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -1754,7 +1688,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
public void onNavigationStarted()
|
public void onNavigationStarted()
|
||||||
{
|
{
|
||||||
closeFloatingToolbarsAndPanels(true);
|
closeFloatingToolbarsAndPanels(true);
|
||||||
ThemeSwitcher.INSTANCE.restart(isMapRendererActive());
|
ThemeSwitcher.INSTANCE.restart(mMapController.isRenderingActive());
|
||||||
mMapButtonsViewModel.setLayoutMode(MapButtonsController.LayoutMode.navigation);
|
mMapButtonsViewModel.setLayoutMode(MapButtonsController.LayoutMode.navigation);
|
||||||
refreshLightStatusBar();
|
refreshLightStatusBar();
|
||||||
|
|
||||||
@@ -1790,7 +1724,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
public void onResetToPlanningState()
|
public void onResetToPlanningState()
|
||||||
{
|
{
|
||||||
closeFloatingToolbarsAndPanels(true);
|
closeFloatingToolbarsAndPanels(true);
|
||||||
ThemeSwitcher.INSTANCE.restart(isMapRendererActive());
|
ThemeSwitcher.INSTANCE.restart(mMapController.isRenderingActive());
|
||||||
NavigationService.stopService(this);
|
NavigationService.stopService(this);
|
||||||
mMapButtonsViewModel.setSearchOption(null);
|
mMapButtonsViewModel.setSearchOption(null);
|
||||||
mMapButtonsViewModel.setLayoutMode(MapButtonsController.LayoutMode.planning);
|
mMapButtonsViewModel.setLayoutMode(MapButtonsController.LayoutMode.planning);
|
||||||
@@ -1879,6 +1813,26 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void deliverTtsMessage()
|
||||||
|
{
|
||||||
|
if (Config.isTtsMessageDelivered())
|
||||||
|
return;
|
||||||
|
|
||||||
|
String languageDisplayName = TtsPlayer.INSTANCE.getLanguageDisplayName();
|
||||||
|
|
||||||
|
if (languageDisplayName != null)
|
||||||
|
{
|
||||||
|
String navigationStartMessage = getResources().getString(R.string.navigation_start_tts_message);
|
||||||
|
navigationStartMessage += languageDisplayName;
|
||||||
|
Toast.makeText(this, navigationStartMessage, Toast.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Toast.makeText(this, getResources().getString(R.string.navigation_start_tts_disabled_message), Toast.LENGTH_LONG)
|
||||||
|
.show();
|
||||||
|
|
||||||
|
Config.setTtsMessageDelivered();
|
||||||
|
}
|
||||||
|
|
||||||
private boolean showStartPointNotice()
|
private boolean showStartPointNotice()
|
||||||
{
|
{
|
||||||
final RoutingController controller = RoutingController.get();
|
final RoutingController controller = RoutingController.get();
|
||||||
@@ -2255,6 +2209,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
if (!showRoutingDisclaimer())
|
if (!showRoutingDisclaimer())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
deliverTtsMessage();
|
||||||
|
|
||||||
closeFloatingPanels();
|
closeFloatingPanels();
|
||||||
setFullscreen(false);
|
setFullscreen(false);
|
||||||
RoutingController.get().start();
|
RoutingController.get().start();
|
||||||
@@ -2619,4 +2575,13 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
window.setNavigationBarContrastEnforced(false);
|
window.setNavigationBarContrastEnforced(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void reportUnsupported()
|
||||||
|
{
|
||||||
|
new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
||||||
|
.setMessage(R.string.unsupported_phone)
|
||||||
|
.setCancelable(false)
|
||||||
|
.setPositiveButton(R.string.close, (dlg, which) -> this.moveTaskToBack(true))
|
||||||
|
.show();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,15 +56,6 @@ public class SplashActivity extends AppCompatActivity
|
|||||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||||
{
|
{
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
final String theme = Config.UiTheme.getCurrent();
|
|
||||||
if (Config.UiTheme.isDefault(theme))
|
|
||||||
setTheme(R.style.MwmTheme_Splash);
|
|
||||||
else if (Config.UiTheme.isNight(theme))
|
|
||||||
setTheme(R.style.MwmTheme_Night_Splash);
|
|
||||||
else
|
|
||||||
throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme);
|
|
||||||
|
|
||||||
UiThread.cancelDelayedTasks(mInitCoreDelayedTask);
|
UiThread.cancelDelayedTasks(mInitCoreDelayedTask);
|
||||||
setContentView(R.layout.activity_splash);
|
setContentView(R.layout.activity_splash);
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
package app.organicmaps.background;
|
package app.organicmaps.background;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.os.Build;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.work.Constraints;
|
import androidx.work.Constraints;
|
||||||
import androidx.work.ExistingWorkPolicy;
|
import androidx.work.ExistingWorkPolicy;
|
||||||
import androidx.work.NetworkType;
|
import androidx.work.NetworkType;
|
||||||
import androidx.work.OneTimeWorkRequest;
|
import androidx.work.OneTimeWorkRequest;
|
||||||
|
import androidx.work.OutOfQuotaPolicy;
|
||||||
import androidx.work.WorkManager;
|
import androidx.work.WorkManager;
|
||||||
import androidx.work.Worker;
|
import androidx.work.Worker;
|
||||||
import androidx.work.WorkerParameters;
|
import androidx.work.WorkerParameters;
|
||||||
@@ -35,7 +37,11 @@ public class OsmUploadWork extends Worker
|
|||||||
if (Editor.nativeHasSomethingToUpload() && OsmOAuth.isAuthorized())
|
if (Editor.nativeHasSomethingToUpload() && OsmOAuth.isAuthorized())
|
||||||
{
|
{
|
||||||
final Constraints c = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
|
final Constraints c = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
|
||||||
final OneTimeWorkRequest wr = new OneTimeWorkRequest.Builder(OsmUploadWork.class).setConstraints(c).build();
|
OneTimeWorkRequest.Builder builder = new OneTimeWorkRequest.Builder(OsmUploadWork.class).setConstraints(c);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||||
|
builder.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST);
|
||||||
|
}
|
||||||
|
final OneTimeWorkRequest wr = builder.build();
|
||||||
WorkManager.getInstance(context).beginUniqueWork("UploadOsmChanges", ExistingWorkPolicy.KEEP, wr).enqueue();
|
WorkManager.getInstance(context).beginUniqueWork("UploadOsmChanges", ExistingWorkPolicy.KEEP, wr).enqueue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,23 +7,17 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.StyleRes;
|
import androidx.annotation.StyleRes;
|
||||||
import androidx.fragment.app.DialogFragment;
|
import androidx.fragment.app.DialogFragment;
|
||||||
import app.organicmaps.R;
|
|
||||||
import app.organicmaps.util.ThemeUtils;
|
|
||||||
|
|
||||||
public class BaseMwmDialogFragment extends DialogFragment
|
public class BaseMwmDialogFragment extends DialogFragment
|
||||||
{
|
{
|
||||||
@StyleRes
|
|
||||||
protected final int getFullscreenTheme()
|
|
||||||
{
|
|
||||||
return ThemeUtils.isNightTheme() ? getFullscreenDarkTheme() : getFullscreenLightTheme();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected int getStyle()
|
protected int getStyle()
|
||||||
{
|
{
|
||||||
return STYLE_NORMAL;
|
return STYLE_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected @StyleRes int getCustomTheme()
|
@StyleRes
|
||||||
|
protected int getCustomTheme()
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -40,18 +34,6 @@ public class BaseMwmDialogFragment extends DialogFragment
|
|||||||
setStyle(style, theme);
|
setStyle(style, theme);
|
||||||
}
|
}
|
||||||
|
|
||||||
@StyleRes
|
|
||||||
protected int getFullscreenLightTheme()
|
|
||||||
{
|
|
||||||
return R.style.MwmTheme_DialogFragment_Fullscreen;
|
|
||||||
}
|
|
||||||
|
|
||||||
@StyleRes
|
|
||||||
protected int getFullscreenDarkTheme()
|
|
||||||
{
|
|
||||||
return R.style.MwmTheme_DialogFragment_Fullscreen_Night;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
protected Application getAppContextOrThrow()
|
protected Application getAppContextOrThrow()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import androidx.activity.SystemBarStyle;
|
|||||||
import androidx.annotation.CallSuper;
|
import androidx.annotation.CallSuper;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.StyleRes;
|
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.fragment.app.FragmentFactory;
|
import androidx.fragment.app.FragmentFactory;
|
||||||
@@ -19,10 +18,7 @@ import androidx.fragment.app.FragmentManager;
|
|||||||
import app.organicmaps.MwmApplication;
|
import app.organicmaps.MwmApplication;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.SplashActivity;
|
import app.organicmaps.SplashActivity;
|
||||||
import app.organicmaps.sdk.util.Config;
|
|
||||||
import app.organicmaps.sdk.util.concurrency.UiThread;
|
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
import app.organicmaps.util.RtlUtils;
|
|
||||||
import com.google.android.material.appbar.MaterialToolbar;
|
import com.google.android.material.appbar.MaterialToolbar;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
@@ -32,24 +28,9 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity
|
|||||||
|
|
||||||
private boolean mSafeCreated;
|
private boolean mSafeCreated;
|
||||||
|
|
||||||
@NonNull
|
|
||||||
private String mThemeName;
|
|
||||||
|
|
||||||
@StyleRes
|
|
||||||
protected int getThemeResourceId(@NonNull String theme)
|
|
||||||
{
|
|
||||||
if (Config.UiTheme.isDefault(theme))
|
|
||||||
return R.style.MwmTheme;
|
|
||||||
|
|
||||||
if (Config.UiTheme.isNight(theme))
|
|
||||||
return R.style.MwmTheme_Night;
|
|
||||||
|
|
||||||
throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shows splash screen and initializes the core in case when it was not initialized.
|
* Shows splash screen and initializes the core in case when it was not initialized.
|
||||||
*
|
* <p>
|
||||||
* Do not override this method!
|
* Do not override this method!
|
||||||
* Use {@link #onSafeCreate(Bundle savedInstanceState)}
|
* Use {@link #onSafeCreate(Bundle savedInstanceState)}
|
||||||
*/
|
*/
|
||||||
@@ -58,10 +39,7 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity
|
|||||||
protected final void onCreate(@Nullable Bundle savedInstanceState)
|
protected final void onCreate(@Nullable Bundle savedInstanceState)
|
||||||
{
|
{
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
mThemeName = Config.UiTheme.getCurrent();
|
|
||||||
setTheme(getThemeResourceId(mThemeName));
|
|
||||||
EdgeToEdge.enable(this, SystemBarStyle.dark(Color.TRANSPARENT));
|
EdgeToEdge.enable(this, SystemBarStyle.dark(Color.TRANSPARENT));
|
||||||
RtlUtils.manageRtl(this);
|
|
||||||
if (!MwmApplication.from(this).getOrganicMaps().arePlatformAndCoreInitialized())
|
if (!MwmApplication.from(this).getOrganicMaps().arePlatformAndCoreInitialized())
|
||||||
{
|
{
|
||||||
final Intent intent = Objects.requireNonNull(getIntent());
|
final Intent intent = Objects.requireNonNull(getIntent());
|
||||||
@@ -113,18 +91,6 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity
|
|||||||
mSafeCreated = false;
|
mSafeCreated = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@CallSuper
|
|
||||||
@Override
|
|
||||||
public void onPostResume()
|
|
||||||
{
|
|
||||||
super.onPostResume();
|
|
||||||
if (!mThemeName.equals(Config.UiTheme.getCurrent()))
|
|
||||||
{
|
|
||||||
// Workaround described in https://code.google.com/p/android/issues/detail?id=93731
|
|
||||||
UiThread.runLater(this::recreate);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(MenuItem item)
|
public boolean onOptionsItemSelected(MenuItem item)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -6,13 +6,11 @@ import android.os.Bundle;
|
|||||||
import androidx.annotation.CallSuper;
|
import androidx.annotation.CallSuper;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.StyleRes;
|
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.base.BaseToolbarActivity;
|
import app.organicmaps.base.BaseToolbarActivity;
|
||||||
import app.organicmaps.sdk.bookmarks.data.BookmarkCategory;
|
import app.organicmaps.sdk.bookmarks.data.BookmarkCategory;
|
||||||
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
||||||
import app.organicmaps.util.ThemeUtils;
|
|
||||||
|
|
||||||
public class BookmarkCategoriesActivity extends BaseToolbarActivity
|
public class BookmarkCategoriesActivity extends BaseToolbarActivity
|
||||||
{
|
{
|
||||||
@@ -38,13 +36,6 @@ public class BookmarkCategoriesActivity extends BaseToolbarActivity
|
|||||||
super.onPause();
|
super.onPause();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
@StyleRes
|
|
||||||
public int getThemeResourceId(@NonNull String theme)
|
|
||||||
{
|
|
||||||
return ThemeUtils.getWindowBgThemeResourceId(theme);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Class<? extends Fragment> getFragmentClass()
|
protected Class<? extends Fragment> getFragmentClass()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -188,7 +188,7 @@ public class BookmarkCategoriesFragment extends BaseMwmRecyclerFragment<Bookmark
|
|||||||
ArrayList<MenuBottomSheetItem> items = new ArrayList<>();
|
ArrayList<MenuBottomSheetItem> items = new ArrayList<>();
|
||||||
if (mSelectedCategory != null)
|
if (mSelectedCategory != null)
|
||||||
{
|
{
|
||||||
items.add(new MenuBottomSheetItem(R.string.edit, R.drawable.ic_settings,
|
items.add(new MenuBottomSheetItem(R.string.edit, R.drawable.ic_edit,
|
||||||
() -> onSettingsActionSelected(mSelectedCategory)));
|
() -> onSettingsActionSelected(mSelectedCategory)));
|
||||||
items.add(new MenuBottomSheetItem(mSelectedCategory.isVisible() ? R.string.hide : R.string.show,
|
items.add(new MenuBottomSheetItem(mSelectedCategory.isVisible() ? R.string.hide : R.string.show,
|
||||||
mSelectedCategory.isVisible() ? R.drawable.ic_hide : R.drawable.ic_show,
|
mSelectedCategory.isVisible() ? R.drawable.ic_hide : R.drawable.ic_show,
|
||||||
|
|||||||
@@ -54,7 +54,6 @@ public class BookmarkCategorySettingsFragment extends BaseMwmToolbarFragment
|
|||||||
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
|
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
|
||||||
{
|
{
|
||||||
View root = inflater.inflate(R.layout.fragment_bookmark_category_settings, container, false);
|
View root = inflater.inflate(R.layout.fragment_bookmark_category_settings, container, false);
|
||||||
setHasOptionsMenu(true);
|
|
||||||
initViews(root);
|
initViews(root);
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
@@ -85,7 +84,7 @@ public class BookmarkCategorySettingsFragment extends BaseMwmToolbarFragment
|
|||||||
});
|
});
|
||||||
mEditDescView = root.findViewById(R.id.edit_description);
|
mEditDescView = root.findViewById(R.id.edit_description);
|
||||||
mEditDescView.setText(mCategory.getDescription());
|
mEditDescView.setText(mCategory.getDescription());
|
||||||
mSaveView = root.findViewById(R.id.done);
|
mSaveView = root.findViewById(R.id.save);
|
||||||
mSaveView.setOnClickListener(v -> onEditDoneClicked());
|
mSaveView.setOnClickListener(v -> onEditDoneClicked());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,13 +5,11 @@ import android.os.Bundle;
|
|||||||
import androidx.activity.result.ActivityResultLauncher;
|
import androidx.activity.result.ActivityResultLauncher;
|
||||||
import androidx.annotation.CallSuper;
|
import androidx.annotation.CallSuper;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.StyleRes;
|
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.base.BaseToolbarActivity;
|
import app.organicmaps.base.BaseToolbarActivity;
|
||||||
import app.organicmaps.sdk.bookmarks.data.BookmarkCategory;
|
import app.organicmaps.sdk.bookmarks.data.BookmarkCategory;
|
||||||
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
||||||
import app.organicmaps.util.ThemeUtils;
|
|
||||||
|
|
||||||
public class BookmarkListActivity extends BaseToolbarActivity
|
public class BookmarkListActivity extends BaseToolbarActivity
|
||||||
{
|
{
|
||||||
@@ -37,13 +35,6 @@ public class BookmarkListActivity extends BaseToolbarActivity
|
|||||||
super.onPause();
|
super.onPause();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
@StyleRes
|
|
||||||
public int getThemeResourceId(@NonNull String theme)
|
|
||||||
{
|
|
||||||
return ThemeUtils.getCardBgThemeResourceId(theme);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Class<? extends Fragment> getFragmentClass()
|
protected Class<? extends Fragment> getFragmentClass()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -466,12 +466,10 @@ public class BookmarkListAdapter extends RecyclerView.Adapter<Holders.BaseBookma
|
|||||||
View desc = inflater.inflate(R.layout.item_category_description, parent, false);
|
View desc = inflater.inflate(R.layout.item_category_description, parent, false);
|
||||||
MaterialTextView moreBtn = desc.findViewById(R.id.more_btn);
|
MaterialTextView moreBtn = desc.findViewById(R.id.more_btn);
|
||||||
MaterialTextView text = desc.findViewById(R.id.text);
|
MaterialTextView text = desc.findViewById(R.id.text);
|
||||||
MaterialTextView title = desc.findViewById(R.id.title);
|
|
||||||
setMoreButtonVisibility(text, moreBtn);
|
setMoreButtonVisibility(text, moreBtn);
|
||||||
holder = new Holders.DescriptionViewHolder(desc, mSectionsDataSource.getCategory());
|
holder = new Holders.DescriptionViewHolder(desc, mSectionsDataSource.getCategory());
|
||||||
text.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn));
|
text.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn));
|
||||||
moreBtn.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn));
|
moreBtn.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn));
|
||||||
title.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -282,11 +282,11 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
|
|||||||
{
|
{
|
||||||
if (isEmptySearchResults())
|
if (isEmptySearchResults())
|
||||||
{
|
{
|
||||||
requirePlaceholder().setContent(R.string.search_not_found, R.string.search_not_found_query);
|
requirePlaceholder().setContent(R.string.search_not_found, R.string.search_not_found_query, R.drawable.ic_search_fail);
|
||||||
}
|
}
|
||||||
else if (isEmpty())
|
else if (isEmpty())
|
||||||
{
|
{
|
||||||
requirePlaceholder().setContent(R.string.bookmarks_empty_list_title, R.string.bookmarks_empty_list_message);
|
requirePlaceholder().setContent(R.string.bookmarks_empty_list_title, R.string.bookmarks_empty_list_message, R.drawable.ic_bookmarks);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isEmptyRecycler = isEmpty() || isEmptySearchResults();
|
boolean isEmptyRecycler = isEmpty() || isEmptySearchResults();
|
||||||
@@ -771,7 +771,7 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
|
|||||||
items.add(new MenuBottomSheetItem(R.string.export_file_gpx, R.drawable.ic_file_gpx,
|
items.add(new MenuBottomSheetItem(R.string.export_file_gpx, R.drawable.ic_file_gpx,
|
||||||
() -> onShareOptionSelected(KmlFileType.Gpx)));
|
() -> onShareOptionSelected(KmlFileType.Gpx)));
|
||||||
}
|
}
|
||||||
items.add(new MenuBottomSheetItem(R.string.edit, R.drawable.ic_settings, this::onSettingsOptionSelected));
|
items.add(new MenuBottomSheetItem(R.string.edit, R.drawable.ic_edit, this::onSettingsOptionSelected));
|
||||||
if (!isLastOwnedCategory())
|
if (!isLastOwnedCategory())
|
||||||
items.add(new MenuBottomSheetItem(R.string.delete_list, R.drawable.ic_delete, this::onDeleteOptionSelected));
|
items.add(new MenuBottomSheetItem(R.string.delete_list, R.drawable.ic_delete, this::onDeleteOptionSelected));
|
||||||
return items;
|
return items;
|
||||||
|
|||||||
@@ -438,21 +438,17 @@ public class Holders
|
|||||||
static final float SPACING_MULTIPLE = 1.0f;
|
static final float SPACING_MULTIPLE = 1.0f;
|
||||||
static final float SPACING_ADD = 0.0f;
|
static final float SPACING_ADD = 0.0f;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final MaterialTextView mTitle;
|
|
||||||
@NonNull
|
|
||||||
private final MaterialTextView mDescText;
|
private final MaterialTextView mDescText;
|
||||||
|
|
||||||
DescriptionViewHolder(@NonNull View itemView, @NonNull BookmarkCategory category)
|
DescriptionViewHolder(@NonNull View itemView, @NonNull BookmarkCategory category)
|
||||||
{
|
{
|
||||||
super(itemView);
|
super(itemView);
|
||||||
mDescText = itemView.findViewById(R.id.text);
|
mDescText = itemView.findViewById(R.id.text);
|
||||||
mTitle = itemView.findViewById(R.id.title);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
void bind(@NonNull SectionPosition position, @NonNull BookmarkListAdapter.SectionsDataSource sectionsDataSource)
|
void bind(@NonNull SectionPosition position, @NonNull BookmarkListAdapter.SectionsDataSource sectionsDataSource)
|
||||||
{
|
{
|
||||||
mTitle.setText(sectionsDataSource.getCategory().getName());
|
|
||||||
bindDescription(sectionsDataSource.getCategory());
|
bindDescription(sectionsDataSource.getCategory());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -462,9 +458,12 @@ public class Holders
|
|||||||
|
|
||||||
String formattedDesc = desc.replace("\n", "<br>");
|
String formattedDesc = desc.replace("\n", "<br>");
|
||||||
Spanned spannedDesc = Utils.fromHtml(formattedDesc);
|
Spanned spannedDesc = Utils.fromHtml(formattedDesc);
|
||||||
|
if (!TextUtils.isEmpty(spannedDesc)) {
|
||||||
mDescText.setText(spannedDesc);
|
mDescText.setText(spannedDesc);
|
||||||
|
}
|
||||||
UiUtils.showIf(!TextUtils.isEmpty(spannedDesc), mDescText);
|
else {
|
||||||
|
mDescText.setText(R.string.list_description_empty);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,9 +12,12 @@ import androidx.lifecycle.DefaultLifecycleObserver;
|
|||||||
import androidx.lifecycle.LifecycleOwner;
|
import androidx.lifecycle.LifecycleOwner;
|
||||||
import app.organicmaps.MwmApplication;
|
import app.organicmaps.MwmApplication;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
|
import app.organicmaps.car.renderer.Renderer;
|
||||||
|
import app.organicmaps.car.renderer.RendererFactory;
|
||||||
import app.organicmaps.car.screens.ErrorScreen;
|
import app.organicmaps.car.screens.ErrorScreen;
|
||||||
import app.organicmaps.car.screens.MapPlaceholderScreen;
|
import app.organicmaps.car.screens.MapPlaceholderScreen;
|
||||||
import app.organicmaps.car.screens.MapScreen;
|
import app.organicmaps.car.screens.MapScreen;
|
||||||
|
import app.organicmaps.car.screens.NavigationScreen;
|
||||||
import app.organicmaps.car.screens.PlaceScreen;
|
import app.organicmaps.car.screens.PlaceScreen;
|
||||||
import app.organicmaps.car.screens.base.BaseMapScreen;
|
import app.organicmaps.car.screens.base.BaseMapScreen;
|
||||||
import app.organicmaps.car.screens.download.DownloadMapsScreen;
|
import app.organicmaps.car.screens.download.DownloadMapsScreen;
|
||||||
@@ -49,8 +52,9 @@ public final class CarAppSession extends Session implements DefaultLifecycleObse
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private final SessionInfo mSessionInfo;
|
private final SessionInfo mSessionInfo;
|
||||||
|
@SuppressWarnings("NotNullFieldNotInitialized")
|
||||||
@NonNull
|
@NonNull
|
||||||
private final SurfaceRenderer mSurfaceRenderer;
|
private Renderer mSurfaceRenderer;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final ScreenManager mScreenManager;
|
private final ScreenManager mScreenManager;
|
||||||
@SuppressWarnings("NotNullFieldNotInitialized")
|
@SuppressWarnings("NotNullFieldNotInitialized")
|
||||||
@@ -67,7 +71,6 @@ public final class CarAppSession extends Session implements DefaultLifecycleObse
|
|||||||
{
|
{
|
||||||
getLifecycle().addObserver(this);
|
getLifecycle().addObserver(this);
|
||||||
mSessionInfo = sessionInfo;
|
mSessionInfo = sessionInfo;
|
||||||
mSurfaceRenderer = new SurfaceRenderer(getCarContext(), getLifecycle());
|
|
||||||
mScreenManager = getCarContext().getCarService(ScreenManager.class);
|
mScreenManager = getCarContext().getCarService(ScreenManager.class);
|
||||||
mCurrentCountryChangedListener = new CurrentCountryChangedListener();
|
mCurrentCountryChangedListener = new CurrentCountryChangedListener();
|
||||||
}
|
}
|
||||||
@@ -114,6 +117,8 @@ public final class CarAppSession extends Session implements DefaultLifecycleObse
|
|||||||
mSensorsManager = new CarSensorsManager(getCarContext());
|
mSensorsManager = new CarSensorsManager(getCarContext());
|
||||||
mDisplayManager = MwmApplication.from(getCarContext()).getDisplayManager();
|
mDisplayManager = MwmApplication.from(getCarContext()).getDisplayManager();
|
||||||
mDisplayManager.addListener(DisplayType.Car, this);
|
mDisplayManager.addListener(DisplayType.Car, this);
|
||||||
|
mSurfaceRenderer = RendererFactory.create(getCarContext(), mDisplayManager,
|
||||||
|
MwmApplication.from(getCarContext()).getLocationHelper(), this);
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -281,7 +286,19 @@ public final class CarAppSession extends Session implements DefaultLifecycleObse
|
|||||||
private void restoreRoute()
|
private void restoreRoute()
|
||||||
{
|
{
|
||||||
final RoutingController routingController = RoutingController.get();
|
final RoutingController routingController = RoutingController.get();
|
||||||
if (routingController.isPlanning() || routingController.isNavigating() || routingController.hasSavedRoute())
|
final boolean isNavigating = routingController.isNavigating();
|
||||||
|
final boolean hasNavigatingScreen = hasNavigationScreenInStack();
|
||||||
|
|
||||||
|
if (!isNavigating && hasNavigatingScreen)
|
||||||
|
mScreenManager.popToRoot();
|
||||||
|
|
||||||
|
if (isNavigating && routingController.getLastRouterType() == PlaceScreen.ROUTER && hasNavigatingScreen)
|
||||||
|
{
|
||||||
|
mScreenManager.popTo(NavigationScreen.MARKER);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (routingController.isPlanning() || isNavigating || routingController.hasSavedRoute())
|
||||||
{
|
{
|
||||||
final PlaceScreen placeScreen = new PlaceScreen.Builder(getCarContext(), mSurfaceRenderer)
|
final PlaceScreen placeScreen = new PlaceScreen.Builder(getCarContext(), mSurfaceRenderer)
|
||||||
.setMapObject(routingController.getEndPoint())
|
.setMapObject(routingController.getEndPoint())
|
||||||
@@ -290,4 +307,14 @@ public final class CarAppSession extends Session implements DefaultLifecycleObse
|
|||||||
mScreenManager.push(placeScreen);
|
mScreenManager.push(placeScreen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean hasNavigationScreenInStack()
|
||||||
|
{
|
||||||
|
for (final Screen screen : mScreenManager.getScreenStack())
|
||||||
|
{
|
||||||
|
if (NavigationScreen.MARKER.equals(screen.getMarker()))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,244 +0,0 @@
|
|||||||
package app.organicmaps.car;
|
|
||||||
|
|
||||||
import static app.organicmaps.sdk.display.DisplayType.Car;
|
|
||||||
|
|
||||||
import android.graphics.Rect;
|
|
||||||
import android.view.Surface;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.car.app.AppManager;
|
|
||||||
import androidx.car.app.CarContext;
|
|
||||||
import androidx.car.app.CarToast;
|
|
||||||
import androidx.car.app.SurfaceCallback;
|
|
||||||
import androidx.car.app.SurfaceContainer;
|
|
||||||
import androidx.lifecycle.DefaultLifecycleObserver;
|
|
||||||
import androidx.lifecycle.Lifecycle;
|
|
||||||
import androidx.lifecycle.LifecycleOwner;
|
|
||||||
import app.organicmaps.MwmApplication;
|
|
||||||
import app.organicmaps.R;
|
|
||||||
import app.organicmaps.sdk.Framework;
|
|
||||||
import app.organicmaps.sdk.Map;
|
|
||||||
import app.organicmaps.sdk.MapRenderingListener;
|
|
||||||
import app.organicmaps.sdk.settings.UnitLocale;
|
|
||||||
import app.organicmaps.sdk.util.concurrency.UiThread;
|
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
|
||||||
|
|
||||||
public class SurfaceRenderer implements DefaultLifecycleObserver, SurfaceCallback, MapRenderingListener
|
|
||||||
{
|
|
||||||
private static final String TAG = SurfaceRenderer.class.getSimpleName();
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
private final CarContext mCarContext;
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
private final Map mMap = new Map(Car);
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
private Rect mVisibleArea = new Rect();
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private Surface mSurface = null;
|
|
||||||
|
|
||||||
private boolean mIsRunning;
|
|
||||||
|
|
||||||
public SurfaceRenderer(@NonNull CarContext carContext, @NonNull Lifecycle lifecycle)
|
|
||||||
{
|
|
||||||
Logger.d(TAG, "SurfaceRenderer()");
|
|
||||||
mCarContext = carContext;
|
|
||||||
mIsRunning = true;
|
|
||||||
lifecycle.addObserver(this);
|
|
||||||
mMap.setMapRenderingListener(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSurfaceAvailable(@NonNull SurfaceContainer surfaceContainer)
|
|
||||||
{
|
|
||||||
Logger.d(TAG, "Surface available " + surfaceContainer);
|
|
||||||
|
|
||||||
if (mSurface != null)
|
|
||||||
mSurface.release();
|
|
||||||
mSurface = surfaceContainer.getSurface();
|
|
||||||
|
|
||||||
mMap.setLocationHelper(MwmApplication.from(mCarContext).getLocationHelper());
|
|
||||||
mMap.onSurfaceCreated(mCarContext, mSurface,
|
|
||||||
new Rect(0, 0, surfaceContainer.getWidth(), surfaceContainer.getHeight()),
|
|
||||||
surfaceContainer.getDpi());
|
|
||||||
mMap.updateBottomWidgetsOffset(mCarContext, -1, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onVisibleAreaChanged(@NonNull Rect visibleArea)
|
|
||||||
{
|
|
||||||
Logger.d(TAG, "Visible area changed. visibleArea: " + visibleArea);
|
|
||||||
mVisibleArea = visibleArea;
|
|
||||||
|
|
||||||
if (!mVisibleArea.isEmpty())
|
|
||||||
Framework.nativeSetVisibleRect(mVisibleArea.left, mVisibleArea.top, mVisibleArea.right, mVisibleArea.bottom);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStableAreaChanged(@NonNull Rect stableArea)
|
|
||||||
{
|
|
||||||
Logger.d(TAG, "Stable area changed. stableArea: " + stableArea);
|
|
||||||
|
|
||||||
if (!stableArea.isEmpty())
|
|
||||||
Framework.nativeSetVisibleRect(stableArea.left, stableArea.top, stableArea.right, stableArea.bottom);
|
|
||||||
else if (!mVisibleArea.isEmpty())
|
|
||||||
Framework.nativeSetVisibleRect(mVisibleArea.left, mVisibleArea.top, mVisibleArea.right, mVisibleArea.bottom);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSurfaceDestroyed(@NonNull SurfaceContainer surfaceContainer)
|
|
||||||
{
|
|
||||||
Logger.d(TAG, "Surface destroyed");
|
|
||||||
if (mSurface != null)
|
|
||||||
{
|
|
||||||
mSurface.release();
|
|
||||||
mSurface = null;
|
|
||||||
}
|
|
||||||
mMap.onSurfaceDestroyed(false, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(@NonNull LifecycleOwner owner)
|
|
||||||
{
|
|
||||||
Logger.d(TAG);
|
|
||||||
mCarContext.getCarService(AppManager.class).setSurfaceCallback(this);
|
|
||||||
mMap.onCreate(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStart(@NonNull LifecycleOwner owner)
|
|
||||||
{
|
|
||||||
Logger.d(TAG);
|
|
||||||
mMap.onStart();
|
|
||||||
mMap.setCallbackUnsupported(this::reportUnsupported);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResume(@NonNull LifecycleOwner owner)
|
|
||||||
{
|
|
||||||
Logger.d(TAG);
|
|
||||||
mMap.onResume();
|
|
||||||
if (MwmApplication.from(mCarContext).getDisplayManager().isCarDisplayUsed())
|
|
||||||
UiThread.runLater(() -> mMap.updateMyPositionRoutingOffset(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPause(@NonNull LifecycleOwner owner)
|
|
||||||
{
|
|
||||||
Logger.d(TAG);
|
|
||||||
mMap.onPause(mCarContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStop(@NonNull LifecycleOwner owner)
|
|
||||||
{
|
|
||||||
Logger.d(TAG);
|
|
||||||
mMap.onStop();
|
|
||||||
mMap.setCallbackUnsupported(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onScroll(float distanceX, float distanceY)
|
|
||||||
{
|
|
||||||
Logger.d(TAG, "distanceX: " + distanceX + ", distanceY: " + distanceY);
|
|
||||||
mMap.onScroll(distanceX, distanceY);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onFling(float velocityX, float velocityY)
|
|
||||||
{
|
|
||||||
Logger.d(TAG, "velocityX: " + velocityX + ", velocityY: " + velocityY);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onZoomIn()
|
|
||||||
{
|
|
||||||
Map.zoomIn();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onZoomOut()
|
|
||||||
{
|
|
||||||
Map.zoomOut();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onScale(float focusX, float focusY, float scaleFactor)
|
|
||||||
{
|
|
||||||
Logger.d(TAG, "focusX: " + focusX + ", focusY: " + focusY + ", scaleFactor: " + scaleFactor);
|
|
||||||
float x = focusX;
|
|
||||||
float y = focusY;
|
|
||||||
|
|
||||||
if (!mVisibleArea.isEmpty())
|
|
||||||
{
|
|
||||||
// If a focal point value is negative, use the center point of the visible area.
|
|
||||||
if (x < 0)
|
|
||||||
x = mVisibleArea.centerX();
|
|
||||||
if (y < 0)
|
|
||||||
y = mVisibleArea.centerY();
|
|
||||||
}
|
|
||||||
|
|
||||||
final boolean animated = Float.compare(scaleFactor, 2f) == 0;
|
|
||||||
|
|
||||||
Map.onScale(scaleFactor, x, y, animated);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onClick(float x, float y)
|
|
||||||
{
|
|
||||||
Logger.d(TAG, "x: " + x + ", y: " + y);
|
|
||||||
Map.onClick(x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void disable()
|
|
||||||
{
|
|
||||||
if (!mIsRunning)
|
|
||||||
{
|
|
||||||
Logger.d(TAG, "Already disabled");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mCarContext.getCarService(AppManager.class).setSurfaceCallback(null);
|
|
||||||
mMap.onSurfaceDestroyed(false, true);
|
|
||||||
mMap.onStop();
|
|
||||||
mMap.setCallbackUnsupported(null);
|
|
||||||
mMap.setMapRenderingListener(null);
|
|
||||||
|
|
||||||
mIsRunning = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void enable()
|
|
||||||
{
|
|
||||||
if (mIsRunning)
|
|
||||||
{
|
|
||||||
Logger.d(TAG, "Already enabled");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mCarContext.getCarService(AppManager.class).setSurfaceCallback(this);
|
|
||||||
mMap.onStart();
|
|
||||||
mMap.setCallbackUnsupported(this::reportUnsupported);
|
|
||||||
mMap.setMapRenderingListener(this);
|
|
||||||
UiThread.runLater(() -> mMap.updateMyPositionRoutingOffset(0));
|
|
||||||
|
|
||||||
mIsRunning = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isRenderingActive()
|
|
||||||
{
|
|
||||||
return mIsRunning;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void reportUnsupported()
|
|
||||||
{
|
|
||||||
String message = mCarContext.getString(R.string.unsupported_phone);
|
|
||||||
Logger.e(TAG, message);
|
|
||||||
CarToast.makeText(mCarContext, message, CarToast.LENGTH_LONG).show();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onRenderingCreated()
|
|
||||||
{
|
|
||||||
UnitLocale.initializeCurrentUnits();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
package app.organicmaps.car.renderer;
|
||||||
|
|
||||||
|
import androidx.annotation.CallSuper;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.car.app.AppManager;
|
||||||
|
import androidx.car.app.CarContext;
|
||||||
|
import androidx.car.app.SurfaceCallback;
|
||||||
|
import androidx.lifecycle.DefaultLifecycleObserver;
|
||||||
|
import androidx.lifecycle.LifecycleOwner;
|
||||||
|
import app.organicmaps.sdk.Map;
|
||||||
|
import app.organicmaps.sdk.MapRenderingListener;
|
||||||
|
import app.organicmaps.sdk.display.DisplayManager;
|
||||||
|
import app.organicmaps.sdk.location.LocationHelper;
|
||||||
|
import app.organicmaps.sdk.settings.UnitLocale;
|
||||||
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
|
|
||||||
|
public abstract class Renderer implements DefaultLifecycleObserver
|
||||||
|
{
|
||||||
|
@NonNull
|
||||||
|
private final String TAG;
|
||||||
|
|
||||||
|
private SurfaceCallback mSurfaceCallback;
|
||||||
|
|
||||||
|
private boolean mIsRunning;
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
protected final CarContext mCarContext;
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
protected final DisplayManager mDisplayManager;
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
protected final LocationHelper mLocationHelper;
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
protected final LifecycleOwner mLifecycleOwner;
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
private final MapRenderingListener mMapRenderingListener = new MapRenderingListener() {
|
||||||
|
@Override
|
||||||
|
public void onRenderingCreated()
|
||||||
|
{
|
||||||
|
UnitLocale.initializeCurrentUnits();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public Renderer(@NonNull CarContext carContext, @NonNull DisplayManager displayManager,
|
||||||
|
@NonNull LocationHelper locationHelper, @NonNull LifecycleOwner lifecycleOwner)
|
||||||
|
{
|
||||||
|
TAG = getClass().getSimpleName();
|
||||||
|
Logger.d(TAG, "SurfaceRenderer()");
|
||||||
|
mIsRunning = true;
|
||||||
|
mCarContext = carContext;
|
||||||
|
mDisplayManager = displayManager;
|
||||||
|
mLocationHelper = locationHelper;
|
||||||
|
mLifecycleOwner = lifecycleOwner;
|
||||||
|
mLifecycleOwner.getLifecycle().addObserver(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setSurfaceCallback(@NonNull SurfaceCallback surfaceCallback)
|
||||||
|
{
|
||||||
|
mSurfaceCallback = surfaceCallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isRenderingActive()
|
||||||
|
{
|
||||||
|
return mIsRunning;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected MapRenderingListener getMapRenderingListener()
|
||||||
|
{
|
||||||
|
return mMapRenderingListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
@CallSuper
|
||||||
|
@Override
|
||||||
|
public void onCreate(@NonNull LifecycleOwner owner)
|
||||||
|
{
|
||||||
|
Logger.d(TAG);
|
||||||
|
if (mSurfaceCallback == null)
|
||||||
|
throw new IllegalStateException("SurfaceCallback must be set before onCreate()");
|
||||||
|
mCarContext.getCarService(AppManager.class).setSurfaceCallback(mSurfaceCallback);
|
||||||
|
}
|
||||||
|
|
||||||
|
@CallSuper
|
||||||
|
@Override
|
||||||
|
public void onDestroy(@NonNull LifecycleOwner owner)
|
||||||
|
{
|
||||||
|
Logger.d(TAG);
|
||||||
|
mCarContext.getCarService(AppManager.class).setSurfaceCallback(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@CallSuper
|
||||||
|
public void enable()
|
||||||
|
{
|
||||||
|
if (isRenderingActive())
|
||||||
|
{
|
||||||
|
Logger.d(TAG, "Already enabled");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mSurfaceCallback == null)
|
||||||
|
throw new IllegalStateException("SurfaceCallback must be set before enable()");
|
||||||
|
mCarContext.getCarService(AppManager.class).setSurfaceCallback(mSurfaceCallback);
|
||||||
|
mIsRunning = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@CallSuper
|
||||||
|
public void disable()
|
||||||
|
{
|
||||||
|
if (!isRenderingActive())
|
||||||
|
{
|
||||||
|
Logger.d(TAG, "Already disabled");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mCarContext.getCarService(AppManager.class).setSurfaceCallback(null);
|
||||||
|
mIsRunning = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onZoomIn()
|
||||||
|
{
|
||||||
|
Map.zoomIn();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onZoomOut()
|
||||||
|
{
|
||||||
|
Map.zoomOut();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package app.organicmaps.car.renderer;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.car.app.CarContext;
|
||||||
|
import androidx.lifecycle.LifecycleOwner;
|
||||||
|
import app.organicmaps.sdk.display.DisplayManager;
|
||||||
|
import app.organicmaps.sdk.location.LocationHelper;
|
||||||
|
|
||||||
|
public final class RendererFactory
|
||||||
|
{
|
||||||
|
@NonNull
|
||||||
|
public static Renderer create(@NonNull CarContext carContext, @NonNull DisplayManager displayManager,
|
||||||
|
@NonNull LocationHelper locationHelper, @NonNull LifecycleOwner lifecycleOwner)
|
||||||
|
{
|
||||||
|
if (android.os.Build.VERSION.SDK_INT >= 23)
|
||||||
|
return new SurfaceRenderer(carContext, displayManager, locationHelper, lifecycleOwner);
|
||||||
|
else
|
||||||
|
return new SurfaceRendererLegacy(carContext, displayManager, locationHelper, lifecycleOwner);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
package app.organicmaps.car.renderer;
|
||||||
|
|
||||||
|
import android.app.Presentation;
|
||||||
|
import android.hardware.display.DisplayManager;
|
||||||
|
import android.hardware.display.VirtualDisplay;
|
||||||
|
import android.view.SurfaceHolder;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.view.ViewParent;
|
||||||
|
import android.widget.FrameLayout;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.RequiresApi;
|
||||||
|
import androidx.car.app.CarContext;
|
||||||
|
import androidx.car.app.SurfaceContainer;
|
||||||
|
import app.organicmaps.sdk.MapController;
|
||||||
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
|
|
||||||
|
@RequiresApi(23)
|
||||||
|
class SurfaceCallback extends SurfaceCallbackBase
|
||||||
|
{
|
||||||
|
private static final String TAG = SurfaceCallback.class.getSimpleName();
|
||||||
|
|
||||||
|
private static final String VIRTUAL_DISPLAY_NAME = "OM_Android_Auto_Display";
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
private final MapController mMapController;
|
||||||
|
|
||||||
|
private VirtualDisplay mVirtualDisplay;
|
||||||
|
private Presentation mPresentation;
|
||||||
|
|
||||||
|
public SurfaceCallback(@NonNull CarContext carContext, @NonNull MapController mapController)
|
||||||
|
{
|
||||||
|
super(carContext);
|
||||||
|
mMapController = mapController;
|
||||||
|
mMapController.getView().getHolder().addCallback(new SurfaceHolder.Callback() {
|
||||||
|
@Override
|
||||||
|
public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height)
|
||||||
|
{
|
||||||
|
mMapController.updateMyPositionRoutingOffset(0);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void surfaceCreated(@NonNull SurfaceHolder holder)
|
||||||
|
{
|
||||||
|
mMapController.updateMyPositionRoutingOffset(0);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void surfaceDestroyed(@NonNull SurfaceHolder holder)
|
||||||
|
{}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSurfaceAvailable(@NonNull SurfaceContainer surfaceContainer)
|
||||||
|
{
|
||||||
|
Logger.d(TAG, "Surface available " + surfaceContainer);
|
||||||
|
|
||||||
|
mVirtualDisplay =
|
||||||
|
mCarContext.getSystemService(DisplayManager.class)
|
||||||
|
.createVirtualDisplay(VIRTUAL_DISPLAY_NAME, surfaceContainer.getWidth(), surfaceContainer.getHeight(),
|
||||||
|
surfaceContainer.getDpi(), surfaceContainer.getSurface(), 0);
|
||||||
|
mPresentation = new Presentation(mCarContext, mVirtualDisplay.getDisplay());
|
||||||
|
|
||||||
|
mPresentation.setContentView(prepareViewForPresentation(mMapController.getView()));
|
||||||
|
mPresentation.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSurfaceDestroyed(@NonNull SurfaceContainer surfaceContainer)
|
||||||
|
{
|
||||||
|
Logger.d(TAG, "Surface destroyed");
|
||||||
|
mPresentation.dismiss();
|
||||||
|
mVirtualDisplay.release();
|
||||||
|
}
|
||||||
|
|
||||||
|
void stopPresenting()
|
||||||
|
{
|
||||||
|
if (mPresentation != null)
|
||||||
|
mPresentation.dismiss();
|
||||||
|
}
|
||||||
|
|
||||||
|
void startPresenting()
|
||||||
|
{
|
||||||
|
if (mPresentation != null)
|
||||||
|
mPresentation.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
private View prepareViewForPresentation(@NonNull View view)
|
||||||
|
{
|
||||||
|
final ViewParent parent = view.getParent();
|
||||||
|
if (parent instanceof ViewGroup)
|
||||||
|
((ViewGroup) parent).removeView(view);
|
||||||
|
|
||||||
|
final FrameLayout container = new FrameLayout(mCarContext);
|
||||||
|
container.addView(
|
||||||
|
view, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
|
||||||
|
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
package app.organicmaps.car.renderer;
|
||||||
|
|
||||||
|
import android.graphics.Rect;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.car.app.CarContext;
|
||||||
|
import androidx.car.app.SurfaceCallback;
|
||||||
|
import app.organicmaps.sdk.Framework;
|
||||||
|
import app.organicmaps.sdk.Map;
|
||||||
|
import app.organicmaps.sdk.util.concurrency.UiThread;
|
||||||
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
|
|
||||||
|
abstract class SurfaceCallbackBase implements SurfaceCallback
|
||||||
|
{
|
||||||
|
@NonNull
|
||||||
|
private final String TAG;
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
protected final CarContext mCarContext;
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
protected Rect mVisibleArea = new Rect();
|
||||||
|
|
||||||
|
public SurfaceCallbackBase(@NonNull CarContext carContext)
|
||||||
|
{
|
||||||
|
TAG = getClass().getSimpleName();
|
||||||
|
mCarContext = carContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onVisibleAreaChanged(@NonNull Rect visibleArea)
|
||||||
|
{
|
||||||
|
Logger.d(TAG, "Visible area changed. visibleArea: " + visibleArea);
|
||||||
|
mVisibleArea = visibleArea;
|
||||||
|
|
||||||
|
if (!mVisibleArea.isEmpty())
|
||||||
|
UiThread.runLater(()
|
||||||
|
-> Framework.nativeSetVisibleRect(mVisibleArea.left, mVisibleArea.top, mVisibleArea.right,
|
||||||
|
mVisibleArea.bottom));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStableAreaChanged(@NonNull Rect stableArea)
|
||||||
|
{
|
||||||
|
Logger.d(TAG, "Stable area changed. stableArea: " + stableArea);
|
||||||
|
|
||||||
|
if (!mVisibleArea.isEmpty())
|
||||||
|
UiThread.runLater(()
|
||||||
|
-> Framework.nativeSetVisibleRect(mVisibleArea.left, mVisibleArea.top, mVisibleArea.right,
|
||||||
|
mVisibleArea.bottom));
|
||||||
|
else if (!stableArea.isEmpty())
|
||||||
|
UiThread.runLater(
|
||||||
|
() -> Framework.nativeSetVisibleRect(stableArea.left, stableArea.top, stableArea.right, stableArea.bottom));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onScroll(float distanceX, float distanceY)
|
||||||
|
{
|
||||||
|
Logger.d(TAG, "distanceX: " + distanceX + ", distanceY: " + distanceY);
|
||||||
|
Map.onScroll(distanceX, distanceY);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFling(float velocityX, float velocityY)
|
||||||
|
{
|
||||||
|
Logger.d(TAG, "velocityX: " + velocityX + ", velocityY: " + velocityY);
|
||||||
|
// TODO: Implement fling in the native code.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onScale(float focusX, float focusY, float scaleFactor)
|
||||||
|
{
|
||||||
|
Logger.d(TAG, "focusX: " + focusX + ", focusY: " + focusY + ", scaleFactor: " + scaleFactor);
|
||||||
|
float x = focusX;
|
||||||
|
float y = focusY;
|
||||||
|
|
||||||
|
if (!mVisibleArea.isEmpty())
|
||||||
|
{
|
||||||
|
// If a focal point value is negative, use the center point of the visible area.
|
||||||
|
if (x < 0)
|
||||||
|
x = mVisibleArea.centerX();
|
||||||
|
if (y < 0)
|
||||||
|
y = mVisibleArea.centerY();
|
||||||
|
}
|
||||||
|
|
||||||
|
final boolean animated = Float.compare(scaleFactor, 2f) == 0;
|
||||||
|
|
||||||
|
Map.onScale(scaleFactor, x, y, animated);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(float x, float y)
|
||||||
|
{
|
||||||
|
Logger.d(TAG, "x: " + x + ", y: " + y);
|
||||||
|
Map.onClick(x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
package app.organicmaps.car.renderer;
|
||||||
|
|
||||||
|
import android.graphics.Rect;
|
||||||
|
import android.view.Surface;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.car.app.CarContext;
|
||||||
|
import androidx.car.app.SurfaceContainer;
|
||||||
|
import app.organicmaps.sdk.Map;
|
||||||
|
import app.organicmaps.sdk.location.LocationHelper;
|
||||||
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
|
|
||||||
|
class SurfaceCallbackLegacy extends SurfaceCallbackBase
|
||||||
|
{
|
||||||
|
private static final String TAG = SurfaceCallbackLegacy.class.getSimpleName();
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
private final Map mMap;
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
private final LocationHelper mLocationHelper;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private Surface mSurface = null;
|
||||||
|
|
||||||
|
public SurfaceCallbackLegacy(@NonNull CarContext carContext, @NonNull Map map, @NonNull LocationHelper locationHelper)
|
||||||
|
{
|
||||||
|
super(carContext);
|
||||||
|
mMap = map;
|
||||||
|
mLocationHelper = locationHelper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSurfaceAvailable(@NonNull SurfaceContainer surfaceContainer)
|
||||||
|
{
|
||||||
|
Logger.d(TAG, "Surface available " + surfaceContainer);
|
||||||
|
|
||||||
|
if (mSurface != null)
|
||||||
|
mSurface.release();
|
||||||
|
mSurface = surfaceContainer.getSurface();
|
||||||
|
|
||||||
|
mMap.setLocationHelper(mLocationHelper);
|
||||||
|
mMap.onSurfaceCreated(mCarContext, mSurface,
|
||||||
|
new Rect(0, 0, surfaceContainer.getWidth(), surfaceContainer.getHeight()),
|
||||||
|
surfaceContainer.getDpi());
|
||||||
|
mMap.updateBottomWidgetsOffset(mCarContext, -1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSurfaceDestroyed(@NonNull SurfaceContainer surfaceContainer)
|
||||||
|
{
|
||||||
|
Logger.d(TAG, "Surface destroyed");
|
||||||
|
if (mSurface != null)
|
||||||
|
{
|
||||||
|
mSurface.release();
|
||||||
|
mSurface = null;
|
||||||
|
}
|
||||||
|
mMap.onSurfaceDestroyed(false);
|
||||||
|
}
|
||||||
|
}
|
||||||