Compare commits
195 Commits
2025.06.30
...
always-upd
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c7b32e240a | ||
|
|
6857ca8f90 | ||
|
|
e3b83140b6 | ||
|
|
eea5d2f17e | ||
|
|
18c11abfd2 | ||
|
|
8321817fac | ||
|
|
9a50b3b147 | ||
|
|
2cd1d9df3c | ||
|
|
e3d4549f98 | ||
|
|
ef1ea0ef96 | ||
|
|
1e8ab6d209 | ||
|
|
e7524e5725 | ||
|
|
6c3c1af787 | ||
|
|
49d5335e7e | ||
|
|
ec6a98a6fd | ||
|
|
8e28470490 | ||
|
|
a19cbbbbf7 | ||
|
|
e780ef685d | ||
|
|
33255e05af | ||
|
|
1207627257 | ||
|
|
f6105468c0 | ||
|
|
98ede09ed8 | ||
|
|
f5492262bf | ||
|
|
8b64225b80 | ||
|
|
cd00dd22a7 | ||
|
|
110648fb89 | ||
|
|
e7cdaba817 | ||
|
|
190111c04b | ||
|
|
cc199aafd8 | ||
|
|
b546dbfb26 | ||
|
|
d0b690105e | ||
|
|
43453c8705 | ||
|
|
5ae0ef626a | ||
|
|
a5bd24ccdb | ||
|
|
6cfdeadf87 | ||
|
|
cdaf34bde2 | ||
|
|
c92e1b4ab2 | ||
|
|
3f79a3bece | ||
|
|
b366a400a1 | ||
|
|
9b8593d4fb | ||
|
|
a913857949 | ||
|
|
0971c47e84 | ||
|
|
dbfb0d5e0b | ||
|
|
6218552060 | ||
|
|
9adf012ae9 | ||
|
|
57e86d72e9 | ||
|
|
24a4edd904 | ||
|
|
cbe874e467 | ||
|
|
f5aa221da0 | ||
|
|
af31d26674 | ||
|
|
5915299012 | ||
|
|
b7ca80bb11 | ||
|
|
9585038738 | ||
|
|
24b2d41ba4 | ||
|
|
559d2b3bcf | ||
|
|
ebaae75d9b | ||
|
|
4cc0912285 | ||
|
|
54681719fb | ||
|
|
8b3cdbb937 | ||
|
|
753696786d | ||
|
|
3663b86eea | ||
|
|
bc5a6cc89a | ||
|
|
93415fe952 | ||
|
|
4fd617684b | ||
|
|
48faa90b5e | ||
|
|
1883575006 | ||
|
|
26826fc63f | ||
|
|
cbb4557856 | ||
|
|
b632aa00e3 | ||
|
|
6ff4faa156 | ||
|
|
ca601a2407 | ||
|
|
c14e15ced5 | ||
|
|
47ed04fb2e | ||
|
|
c9e8a1068b | ||
|
|
23b8ad6120 | ||
|
|
1e1510897c | ||
|
|
37c67c8dc1 | ||
|
|
d8bca2f652 | ||
|
|
86dacd70ff | ||
|
|
8213a278d7 | ||
|
|
1167c82b15 | ||
|
|
1d6cb3bcf8 | ||
|
|
0fee3c3781 | ||
|
|
ab591052c3 | ||
|
|
38d5496258 | ||
|
|
edb995ceed | ||
|
|
105bb09a09 | ||
|
|
64975fc649 | ||
|
|
792f8332f5 | ||
|
|
b8b14677a7 | ||
|
|
9af30e0d47 | ||
|
|
a59d4bed55 | ||
|
|
cc948034f3 | ||
|
|
f066b44e01 | ||
|
|
b0f338273b | ||
|
|
f1ec689532 | ||
|
|
771c3d9c93 | ||
|
|
4542788bb1 | ||
|
|
5b28a13e93 | ||
|
|
73a3d1850b | ||
|
|
9c70433007 | ||
|
|
983fc290ef | ||
|
|
222dfce85e | ||
|
|
f6521ec068 | ||
|
|
bff20b523e | ||
|
|
c838e06d54 | ||
|
|
7db355dd5c | ||
|
|
527031adba | ||
|
|
d85949c716 | ||
|
|
4c3392b881 | ||
|
|
90502f7635 | ||
|
|
147022e42d | ||
|
|
f67e2efc87 | ||
|
|
9cd3db6f39 | ||
|
|
7138970ea6 | ||
|
|
cbd561ec90 | ||
|
|
048dc60be6 | ||
|
|
40018f5cc8 | ||
|
|
4314f281d1 | ||
|
|
b529a733c0 | ||
|
|
1b8172f744 | ||
|
|
c589aaa3cf | ||
|
|
13b91b36ae | ||
|
|
e523434b36 | ||
|
|
752fcaf09c | ||
|
|
7e2b05573f | ||
|
|
7e63d98cb7 | ||
|
|
304addba58 | ||
|
|
1becd3e0ba | ||
|
|
dee47e7a66 | ||
|
|
2e60bfc289 | ||
|
|
fdbb41e0fd | ||
|
|
090ed5044a | ||
|
|
54b6471400 | ||
|
|
415e2fc0c2 | ||
|
|
f0ed076858 | ||
|
|
57f28fa85b | ||
|
|
7228fe239d | ||
|
|
c294937c73 | ||
|
|
ebf84e7d5b | ||
|
|
19dd760c44 | ||
|
|
8a8ac5c660 | ||
|
|
7a8f7929fc | ||
|
|
b285ef348b | ||
|
|
87dad591ab | ||
|
|
9e49aae49e | ||
|
|
d621636549 | ||
|
|
ec1d2e6c82 | ||
|
|
6d0c52afcc | ||
|
|
3abf354099 | ||
|
|
9a759229f9 | ||
|
|
a3e1666ede | ||
|
|
15c7e71866 | ||
|
|
db1ef9b148 | ||
|
|
9951ebece7 | ||
|
|
7bfb488f1d | ||
|
|
df70ae1b01 | ||
|
|
15b3cda4d7 | ||
|
|
99bb468448 | ||
|
|
46ec844398 | ||
|
|
f8d1914037 | ||
|
|
71386ce395 | ||
|
|
8d95d2e9b7 | ||
|
|
05c4413394 | ||
|
|
29bbbb13ee | ||
|
|
e321b1c5be | ||
|
|
736e1aa07b | ||
|
|
e32b01494a | ||
|
|
4496690e0a | ||
|
|
ef9618b3d6 | ||
|
|
13ba20aa25 | ||
|
|
23c23c118d | ||
|
|
5b4d458579 | ||
|
|
1bb2b2274f | ||
|
|
aec82794ac | ||
|
|
927299f4a9 | ||
|
|
87cb0307cf | ||
|
|
de7f60ea37 | ||
|
|
f7fb0e80e5 | ||
|
|
e49a74e287 | ||
|
|
77a7255e93 | ||
|
|
25b3abadef | ||
|
|
01388ae6dd | ||
|
|
4bf61f14f8 | ||
|
|
49603aa0a1 | ||
|
|
890c927bab | ||
|
|
d564f69b58 | ||
|
|
abd15756be | ||
|
|
ea1edec3df | ||
|
|
c17135f5a6 | ||
|
|
2471ff0545 | ||
|
|
a99d1c1a38 | ||
|
|
deb663e4f9 | ||
|
|
3858b0905f | ||
|
|
8db9289b56 |
@@ -7,9 +7,11 @@ CoMaps contributors:
|
|||||||
(in alphabetic order)
|
(in alphabetic order)
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Bastian Greshake Tzovaras
|
||||||
clover sage
|
clover sage
|
||||||
Harry Bond <me@hbond.xyz>
|
Harry Bond <me@hbond.xyz>
|
||||||
vikiawv
|
vikiawv
|
||||||
|
Yannik Bloscheck
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
Organic Maps (formerly OMaps) contributors:
|
Organic Maps (formerly OMaps) contributors:
|
||||||
|
|||||||
165
README.md
@@ -1,62 +1,88 @@
|
|||||||
<!--<div align="center">
|
<!-- Navigation Bar -->
|
||||||
<img src="qt/res/logo.png" height="100"/>
|
<p align="center">
|
||||||
</div>-->
|
<a href="https://codeberg.org/comaps#comaps">Project Intro</a> |
|
||||||
|
<a href="https://codeberg.org/comaps/Governance#comaps-project-governance-docs">Governance</a> |
|
||||||
|
<a href="https://codeberg.org/comaps/Governance/src/branch/main/FAQ.md">FAQ</a> |
|
||||||
|
<a href="#contributing">Contribute</a> |
|
||||||
|
<a href="https://www.comaps.app/donate">Donate</a> |
|
||||||
|
<a href="https://codeberg.org/comaps#keep-connected">Keep Connected</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
<!-- a nav bar -->
|
<div align="center" >
|
||||||
[Project Intro](https://codeberg.org/comaps#comaps)
|
<img src="docs/badges/logo.svg" width="150">
|
||||||
| [Governance](https://codeberg.org/comaps/Governance#comaps-project-governance-docs)
|
</div>
|
||||||
| [FAQ](https://codeberg.org/comaps/Governance/src/branch/main/FAQ.md)
|
|
||||||
| [Contribute](#contributing)
|
|
||||||
| [Donate](https://www.comaps.app/donate)
|
|
||||||
| [Keep Connected](https://codeberg.org/comaps#keep-connected)
|
|
||||||
|
|
||||||
# [CoMaps](https://comaps.app) – Hike, Bike, Drive Offline – Easy Map Navigation with Privacy
|
|
||||||
|
|
||||||
[
|
|
||||||

|
|
||||||
](https://github.com/comaps/comaps/actions/workflows/android-check.yaml)
|
|
||||||
[
|
|
||||||

|
|
||||||
](https://github.com/comaps/comaps/actions/workflows/ios-check.yaml)
|
|
||||||
[
|
|
||||||

|
|
||||||
](https://opencollective.com/comaps)
|
|
||||||
[
|
|
||||||

|
|
||||||
](https://liberapay.com/CoMaps)
|
|
||||||
|
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<h1><a href="https://comaps.app/">CoMaps</a></h1>
|
||||||
|
<h2>Hike, Bike, Drive Offline - Easy Map Navigation with Privacy</h2>
|
||||||
|
</div>
|
||||||
|
<div align="center">
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://codeberg.org/comaps/comaps/releases">
|
||||||
|
<img src="https://img.shields.io/github/license/comaps/comaps?style=for-the-badge&logo=opensourceinitiative&logoColor=white&color=588157" alt="License" style="width: 90%; max-width: 150px;"/>
|
||||||
|
</a>
|
||||||
|
<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" style="width: 90%; max-width: 170px;"/>
|
||||||
|
</a>
|
||||||
|
<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" style="width: 90%; max-width: 145px;"/>
|
||||||
|
</a>
|
||||||
|
<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" style="width: 90%; max-width: 191px;"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://liberapay.com/CoMaps">
|
||||||
|
<img src="https://img.shields.io/liberapay/patrons/CoMaps.svg?label=Liberapay%20Patrons&logo=liberapay&logoColor=white&style=for-the-badge&color=588157" alt="Liberapay Patrons" style="width: 90%; max-width: 160px;"/>
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
A community-led free & open source maps app based on [OpenStreetMap](https://www.openstreetmap.org) data and reinforced with commitment to transparency, privacy and being not-for-profit. CoMaps is a fork/spin-off of Organic Maps, which in turn is a fork of Maps.ME.
|
---
|
||||||
|
|
||||||
There are apps for Android and iOS (and ARM MacOS).
|
A community-led free & open source maps app based on [OpenStreetMap](https://www.openstreetmap.org), built for transparency, privacy, and not-for-profit values. A fork of Organic Maps, originally based on Maps.ME.
|
||||||
An alpha Linux / MacOS Qt desktop version, which is also suitable for Linux phones.
|
|
||||||
|
|
||||||
[<img src="docs/badges/apple-appstore.png" alt="App Store" width="160">](https://apps.apple.com/app/comaps/id6747180809)
|
**Available for:** Android, iOS, ARM macOS, and alpha Linux/macOS desktop builds (also usable on Linux phones).
|
||||||
[<img src="docs/badges/google-play.png" alt="Google Play" width="160">](https://play.google.com/store/apps/details?id=app.comaps.google)
|
|
||||||
[<img src="docs/badges/fdroid.png" alt="F-Droid" width="160">](https://f-droid.org/en/packages/app.comaps.fdroid/)
|
|
||||||
[<img src="docs/badges/codeberg.png" alt="Codeberg" width="160">](https://codeberg.org/comaps/comaps/releases)
|
|
||||||
|
|
||||||
<p float="left">
|
<p align="center">
|
||||||
|
<a href="https://apps.apple.com/app/comaps/id6747180809">
|
||||||
|
<img src="docs/badges/apple-appstore.png" alt="App Store" width="160"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://play.google.com/store/apps/details?id=app.comaps.google">
|
||||||
|
<img src="docs/badges/google-play.png" alt="Google Play" width="160"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://f-droid.org/en/packages/app.comaps.fdroid/">
|
||||||
|
<img src="docs/badges/fdroid.png" alt="F-Droid" width="160"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://codeberg.org/comaps/comaps/releases">
|
||||||
|
<img src="docs/badges/codeberg.png" alt="Codeberg" width="160"/>
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Screenshots -->
|
||||||
|
<p align="center">
|
||||||
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/1.png" width="180" />
|
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/1.png" width="180" />
|
||||||
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/2.png" width="180" />
|
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/2.png" width="180" />
|
||||||
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/3.png" width="180" />
|
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/3.png" width="180" />
|
||||||
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/4.png" width="180" />
|
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/4.png" width="180" />
|
||||||
|
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/5.png" width="180" />
|
||||||
|
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/6.png" width="180" />
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
**Offline-focused**: Plan and navigate your trip abroad without the need for cellular service, search waypoints while on a distant hike, etc. All app functions are designed to work offline.
|
---
|
||||||
|
|
||||||
**Respecting Privacy**: The app is designed with privacy in mind - does not identify people, does not track, and does not collect personal information. Ads-free.
|
## ⚡️ Highlights
|
||||||
|
|
||||||
**Simple and Polished**: Essential, easy to use features that just work.
|
- **Offline-first**: Navigate without a connection
|
||||||
|
- **Privacy-respecting**: No tracking, Ads or data collection
|
||||||
|
- **Lightweight**: Battery- and space-efficient
|
||||||
|
- **Simple**: Polished, user-focused interface
|
||||||
|
- **Community-built**: Free, open source, and collaborative
|
||||||
|
- **Transparent**: Open finances and governance
|
||||||
|
|
||||||
**Saves Your Battery and Space**: Doesn’t drain your battery like other navigation apps. Compact maps save precious space on your phone.
|
---
|
||||||
|
|
||||||
**Free and Built by the Community**: People like you helped build the app by adding places to [OpenStreetMap](https://www.openstreetmap.org), testing and giving feedback on features and contributing their development skills and money.
|
## 🚀 Main Features
|
||||||
|
|
||||||
**Open and Transparent Decision-making and Financials, Not-for-profit and Fully Open Source.**
|
|
||||||
|
|
||||||
### Main Features
|
|
||||||
|
|
||||||
- Downloadable detailed maps with places which are not available with Google Maps
|
- Downloadable detailed maps with places which are not available with Google Maps
|
||||||
|
|
||||||
@@ -86,41 +112,52 @@ An alpha Linux / MacOS Qt desktop version, which is also suitable for Linux phon
|
|||||||
|
|
||||||
- Android Auto and CarPlay support
|
- Android Auto and CarPlay support
|
||||||
|
|
||||||
*Freedom Is Here - Discover your journey, navigate the world with privacy and community at the forefront!*
|
***Freedom Is Here – Navigate the world with privacy and community at the forefront.***
|
||||||
|
|
||||||
## Contributing
|
---
|
||||||
|
|
||||||
|
## 🤝 Contributing
|
||||||
|
|
||||||
You can help by donating, contributing code, translating, or by telling others about it. To build the best maps app there is a need for software development, design, product, community development, and other areas. Reach out to us and let us know how you want to help.
|
You can help by donating, contributing code, translating, or by telling others about it. To build the best maps app there is a need for software development, design, product, community development, and other areas. Reach out to us and let us know how you want to help.
|
||||||
|
|
||||||
If you want to build the project, check [docs/INSTALL.md](docs/INSTALL.md). If you want to help the project,
|
- Build instructions: [docs/INSTALL.md](docs/INSTALL.md)
|
||||||
see [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md). You can help in many ways, the ability to code is not necessary.
|
- Contribution guide: [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md)
|
||||||
|
> [!NOTE]
|
||||||
|
> Some docs might be outdated, contain broken links or old references to Organic Maps, etc. Its a work in progress and help is much appreciated!
|
||||||
|
|
||||||
Some docs might be outdated, contain broken links or old references to Organic Maps, etc. Its a work in progress and help is much appreciated!
|
There is a dedicated Zulip chat for active contributors: [Zulip](https://comaps.zulipchat.com)
|
||||||
|
|
||||||
There is a dedicated Zulip chat for active contributors: [comaps.zulipchat.com](https://comaps.zulipchat.com)
|
---
|
||||||
|
|
||||||
### Feedback
|
## 💬 Feedback
|
||||||
|
|
||||||
|
- Rate us on [App Store](https://apps.apple.com/app/comaps/id6747180809) and [Google Play](https://play.google.com/store/apps/details?id=app.comaps.google)
|
||||||
|
- Star our repos on Codeberg
|
||||||
|
- Report bugs or request features on the [issue tracker](https://codeberg.org/comaps/comaps/issues)
|
||||||
|
|
||||||
- **Rate us on the [App Store](https://apps.apple.com/app/comaps/id6747180809)
|
---
|
||||||
and [Google Play](https://play.google.com/store/apps/details?id=app.comaps.google)**.
|
|
||||||
- Star our repos on Codeberg
|
|
||||||
- Report bugs and discuss features at [the issue tracker](https://codeberg.org/comaps/comaps/issues)
|
|
||||||
|
|
||||||
## How is development funded?
|
## 💸 Funding
|
||||||
|
|
||||||
The app is free for everyone, so we rely on donations. Please [donate](https://opencollective.com/comaps/donate) to support the CoMaps community and see this open project thrive!
|
|
||||||
|
|
||||||
|
CoMaps is free. To stay that way, it relies on your support.
|
||||||
|
Donate via [OpenCollective](https://opencollective.com/comaps/donate) or [Liberapay](https://liberapay.com/CoMaps).
|
||||||
The project's financial information is completely open and transparent at [our Open Collective](https://opencollective.com/comaps).
|
The project's financial information is completely open and transparent at [our Open Collective](https://opencollective.com/comaps).
|
||||||
|
|
||||||
## Privacy
|
---
|
||||||
|
|
||||||
The Android application was analysed by the [Exodus platform](https://reports.exodus-privacy.eu.org/fr/reports/app.comaps.google/latest/)
|
## 🔒 Privacy
|
||||||
|
|
||||||
## License and Copyright
|
The Android app has been reviewed by [Exodus Privacy](https://reports.exodus-privacy.eu.org/en/reports/app.comaps.google/latest/).
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0. See
|
To [verify](https://developer.android.com/studio/command-line/apksigner#usage-verify) the APK, use the following signing certificate fingerprints:
|
||||||
[LICENSE](LICENSE),
|
```
|
||||||
[NOTICE](NOTICE)
|
SHA-256: 4894e8e6963627ef660031d8593fe77297f835acb4e23810003e926135023b4c
|
||||||
and [data/copyright.html](data/copyright.html)
|
SHA-1: 8b7b5739f917e9f7c681671ced0c9c8562123ade
|
||||||
for more information.
|
MD5: 9cce0ffea281dc2f0e0a154d6d2e281e
|
||||||
|
```
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚖️ License
|
||||||
|
|
||||||
|
Licensed under the Apache License 2.0.
|
||||||
|
See [LICENSE](LICENSE), [NOTICE](NOTICE), and [data/copyright.html](data/copyright.html).
|
||||||
4
android/.idea/icon.svg
generated
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="64pt" height="64pt" viewBox="0 0 835 835">
|
||||||
|
<path d="M698.5 141.1a20 20 0 0 1 30.8-1.3A416 416 0 0 1 835 417.4a416 416 0 0 1-93.3 263 20 20 0 0 1-31.3-.6l-43-56.6a20 20 0 0 1-.2-24 307 307 0 0 0 59.3-181.8c0-74.2-26.2-142.3-69.9-195.6a20 20 0 0 1-.5-24.8zM260.7 456.4a20 20 0 0 1-7.7-36.7l282-177.4a20 20 0 0 1 29.9 22.7l-97 318.9a20 20 0 0 1-37.5 2.2l-49.2-111.5z" style="fill:#ccdfca"/>
|
||||||
|
<path d="M626.3 753a20 20 0 0 1-6.2 29.6A416 416 0 0 1 417.5 835 417.7 417.7 0 0 1 0 417.4 417.7 417.7 0 0 1 603.3 43.5a20 20 0 0 1 7 30l-42.4 55.8a20 20 0 0 1-24.2 6.1 307 307 0 0 0-126.2-27 309 309 0 0 0-309 309c0 170.6 138.5 309 309 309a307 307 0 0 0 141.6-34.3 20 20 0 0 1 25.1 5.6z" style="fill:#fefdf6"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 753 B |
@@ -65,6 +65,13 @@ project.ext.appName = 'CoMaps'
|
|||||||
android {
|
android {
|
||||||
namespace 'app.organicmaps'
|
namespace 'app.organicmaps'
|
||||||
|
|
||||||
|
dependenciesInfo {
|
||||||
|
// Disables dependency metadata when building APKs (for IzzyOnDroid/F-Droid)
|
||||||
|
includeInApk = false
|
||||||
|
// Disables dependency metadata when building Android App Bundles (for Google Play)
|
||||||
|
includeInBundle = false
|
||||||
|
}
|
||||||
|
|
||||||
buildFeatures {
|
buildFeatures {
|
||||||
dataBinding = true
|
dataBinding = true
|
||||||
buildConfig = true
|
buildConfig = true
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 34 KiB |
@@ -6,12 +6,12 @@ Můžete se zde také připojit ke komunitě pomáhat s vytvářením nejlepší
|
|||||||
• Poskytujte zpětnou vazbu a nahlašujte problémy
|
• Poskytujte zpětnou vazbu a nahlašujte problémy
|
||||||
• Aktualizujte mapová data v aplikaci nebo na webu OpenStreetMap
|
• Aktualizujte mapová data v aplikaci nebo na webu OpenStreetMap
|
||||||
|
|
||||||
• <b>Zaměřené na offline použití</b>: Plánujte a navigujte své cesty do zahraničí bez nutnosti mobilních dat, hledejte body na vzdálených túrách apod. Všechny funkce aplikace jsou navrženy tak, aby fungovaly offline.
|
‣ <b>Zaměřené na offline použití</b>: Plánujte a navigujte své cesty do zahraničí bez nutnosti mobilních dat, hledejte body na vzdálených túrách apod. Všechny funkce aplikace jsou navrženy tak, aby fungovaly offline.
|
||||||
• <b>S ohledem na soukromí</b>: Aplikace je navržená s důrazem na soukromí – neidentifikuje lidi, nesleduje vás a nesbírá osobní údaje. Bez reklam.
|
‣ <b>S ohledem na soukromí</b>: Aplikace je navržená s důrazem na soukromí – neidentifikuje lidi, nesleduje vás a nesbírá osobní údaje. Bez reklam.
|
||||||
• <b>Jednoduché a vyladěné</b>: Základní, snadno použitelné funkce, které prostě fungují.
|
‣ <b>Jednoduché a vyladěné</b>: Základní, snadno použitelné funkce, které prostě fungují.
|
||||||
• <b>Šetří vaši baterii a místo</b>: Nevybíjí vaší baterii, jako ostatní navigační aplikace. Kompaktní mapy šetří cenné místo ve vašem telefonu.
|
‣ <b>Šetří vaši baterii a místo</b>: Nevybíjí vaší baterii, jako ostatní navigační aplikace. Kompaktní mapy šetří cenné místo ve vašem telefonu.
|
||||||
• <b>Bezplatné a vytvořené komunitou</b>: S vytvářením aplikace pomáhají lidé, jako jste vy, přidáváním míst do projektu OpenStreetMap, testováním a poskytováním zpětné vazby k funkcím a přispíváním svými vývojářskými schopnostmi a penězi.
|
‣ <b>Bezplatné a vytvořené komunitou</b>: S vytvářením aplikace pomáhají lidé, jako jste vy, přidáváním míst do projektu OpenStreetMap, testováním a poskytováním zpětné vazby k funkcím a přispíváním svými vývojářskými schopnostmi a penězi.
|
||||||
• <b>Otevřené a transparentní rozhodování a nakládání s financemi, neziskovost a plně otevřený zdrojový kód.</b>
|
‣ <b>Otevřené a transparentní rozhodování a nakládání s financemi, neziskovost a plně otevřený zdrojový kód.</b>
|
||||||
|
|
||||||
<b>Hlavní funkce</b>:
|
<b>Hlavní funkce</b>:
|
||||||
• Stahovatelné podrobné mapy s místy, která nenajdete ani v Mapách Google
|
• Stahovatelné podrobné mapy s místy, která nenajdete ani v Mapách Google
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
Jednoduchá navigace v mapě - Objevte více na své cestě ‐ Vyvíjeno komunitou
|
Jednoduchá navigace v mapě – Objevte více na své cestě – Vyvíjeno komunitou
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Nem kortnavigation - Oplev mere af din rejse - Drevet af fællesskabet
|
||||||
1
android/app/src/fdroid/play/listings/da-DK/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps - vandr, cykl og kør offline med privatliv
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
Eine von der Community betriebene, kostenlose Open-Source Karten-App, die auf OpenStreetMap Daten basiert. Transparent, datensparsam und nicht gewinnorientiert. CoMaps ist ein Fork/Abspaltung von Organic Maps, die wiederum ein Fork/Abspaltung von Maps.Me ist.
|
Eine von der Community betriebene, kostenlose Open-Source Karten-App, die auf OpenStreetMap Daten basiert. Transparent und nicht gewinnorientiert. CoMaps ist ein Fork/Abspaltung von Organic Maps, die wiederum ein Fork/Abspaltung von Maps.Me ist.
|
||||||
|
|
||||||
Lese mehr über die Gründe und Ziele des Projektes unter <b><i>codeberg.org/comaps</i></b>.
|
Lese mehr über die Gründe und Ziele des Projektes unter <b><i>codeberg.org/comaps</i></b>.
|
||||||
Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
|
Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
|
||||||
@@ -28,5 +28,5 @@ Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
|
|||||||
• Dunkler Modus für die Nutzung bei Nacht
|
• Dunkler Modus für die Nutzung bei Nacht
|
||||||
• Kartenbearbeitung direkt in der App mit einem einfachen Editor
|
• Kartenbearbeitung direkt in der App mit einem einfachen Editor
|
||||||
|
|
||||||
<b>Freiheit beginnt hier</b>
|
<b>Entdecke die Unabhängigkeit</b>
|
||||||
Entdecke deine Reise – navigiere in der Welt mit Datenschutz!
|
Entdecke deine Reise – navigiere in der Welt mit Datenschutz!
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
• OpenStreetMap-Daten vom 22. Juni
|
Wir stellen vor: Das neue CoMaps-Logo!
|
||||||
• Optionale automatische Backups von Lesezeichen & Tracks
|
• Verbesserte Höhenlinien in vielen Regionen (Stufen von 20/50 m)
|
||||||
• Neue 100m-Höhenlinien für Regionen die vorher gröbere/keine Isolinien hatten
|
• Links zu Panoramax-Bildern für ausgewählte POIs
|
||||||
• Vegetation & Spielplätze werden früher angezeigt, neue Farben für Campingplätze & andere Einrichtungen
|
• OpenStreetMap-Daten vom 13. Juli
|
||||||
• Pfade & Tracks werden standardmäßig bei höherem Zoom angezeigt, Outdoor-Stil für Detailübersicht
|
• Neue Farben für viele Objekte und Farben werden früher angezeigt
|
||||||
• Aktion des linken Button nichtm mehr im Hamburger-Menü, stattdessen werden "Über & Hilfe" dort angezeigt
|
• Öffnungszeiten werden beim Antippen eines POI angezeigt
|
||||||
|
• Verschiedene Arten von Feuchtgebieten
|
||||||
|
• Neue Farben für Vegetation und andere Features; einige neue Icons
|
||||||
|
• Wandern: bessere Darstellung der Höhenlinien
|
||||||
|
After Width: | Height: | Size: 249 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 24 KiB |
@@ -1,7 +1,10 @@
|
|||||||
• OpenStreetMap data as of June 22
|
Introducing CoMaps logo!
|
||||||
• a setting for automatic bookmarks and tracks backup
|
|
||||||
• added 100m-step altitude isolines to all regions that had worse or no isolines
|
• upgrade altitude contour lines for many regions to 20 or 50 meters step
|
||||||
• display vegetation and playground color fills earlier, add fills to camp sites and some amenities
|
• add Panoramax Picture links to selected POIs
|
||||||
• paths & tracks appear on the map later by default - still appear earlier in the outdoor style
|
• OpenStreetMap data as of July 13
|
||||||
• hide active custom button action from the hamburger menu, move there About & Help from the settings
|
• add color fills to many features and display fills earlier for existing features
|
||||||
• update map transport icons
|
• display opening hours state when selecting a POI
|
||||||
|
• split all wetlands into several distinct types
|
||||||
|
• update vegetation and other map colors, update some map icons
|
||||||
|
• outdoors: bolder altitude contour lines
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
• datos de OpenStreetMap a 22 de junio
|
¡Presentamos el logo de CoMaps!
|
||||||
• añadido ajuste para la copia de seguridad automática de marcadores y trazas
|
• mejora de isolíneas con más detalle para muchas regiones
|
||||||
• añadidas isolíneas de 100 m a las regiones que tenían isolíneas peores o no tenían isolíneas
|
• añade enlaces de imágenes de Panoramax a POIs seleccionados
|
||||||
• se muestra antes la vegetación y zonas de juego, añadidas áreas a campings y otros servicios
|
• datos de OpenStreetMap a 13 de julio
|
||||||
• los senderos y pistas aparecen más tarde - siguen igual en estilo de outdoors
|
• añadidos rellenos de color a muchas características
|
||||||
• se oculta botón personalizado del menú y se mueve allí Acerca de y Ayuda desde los ajustes
|
• se muestra el estado de horarios de apertura al seleccionar un POI
|
||||||
|
• se dividen los humedales en tipos distintos
|
||||||
|
• se actualiza la vegetación y otros colores del mapa, así como otros iconos
|
||||||
|
• exteriores: líneas de contorno de altitud más gruesas
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
• Données OpenStreetMap du 22 juin
|
Présentation du logo CoMaps !
|
||||||
• Sauvegarde automatique des signets et traces GPS en local
|
• Amélioration des courbes d’altitude à une précision de 20 ou 50 mètres pour de nombreuses régions
|
||||||
• Ajout des courbes d'altitude avec un précision de 100 mètres dans toutes les régions qui avaient peu de courbes ou aucune
|
• Ajout d'un lien vers les images Panoramax des POI
|
||||||
• Ajustements des styles notamment sur la végétation, les aires de jeu et les chemins
|
• Données OpenStreetMap du 13 juillet
|
||||||
• Masque l’action active du bouton personnalisé dans le menu hamburger
|
• Affichage de l’état des heures d’ouverture lors de la sélection d’un POI
|
||||||
• Correction de certains plantages et bugs
|
• Mise à jour du style(végétation et zones humides), mise à jour de certaines icônes de la carte
|
||||||
|
• Outdoors: Améliorations de la visibilité des courbes d'altitude
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
Navigation facile - Découvrez plus lors de votre voyage - Fait par la communauté
|
Navigation cartographique facile - Découvrez davantage de votre voyage - Propulsé par la communauté
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
Aplicación de mapas gratuíta, de código aberto e xestionada pola comunidade, obtén os datos desde OpenStreetMap e co compromiso reforzado coa transparencia, privacidade e non ter o beneficio económico como obxectivo. CoMaps é unha bifurcación ou derivada de Organic Maps, que pola súa parte ven sendo unha bifurcación de Maps.ME.
|
||||||
|
|
||||||
|
Vai a <b><i>codeberg.org/comaps</i></b> e coñece as razóns da necesidade deste proxecto e as decisións tomadas.
|
||||||
|
Únete alí á comunidade e axuda a que teñamos a mellor aplicación de mapas
|
||||||
|
• Usa a aplicación e dille a outras persoas que o fas
|
||||||
|
• Informa de fallos e publica túa experiencia
|
||||||
|
• Actualiza os datos do mapa na aplicación ou no sitio web OpenStreetMap
|
||||||
|
|
||||||
|
‣ <b>Sen conexión de datos</b>: planea a viaxe e sigue a ruta sen precisar unha conexión á rede móbil, busca lugares relevantes nas andainas máis longas, etc. Todas as características da aplicación están deseñadas para funcionar sen precisar conexión de datos.
|
||||||
|
‣ <b>Respecto pola privacidade</b>: a aplicación está deseñada coa privacidade en primeiro plano - non identifica ás persoas, non te segue, non recolle información sobre ti. Non ten publicidade.
|
||||||
|
‣ <b>Simple e organizada</b>: características esenciais, fáciles de usar e que funcionan.
|
||||||
|
‣ <b>Aforra batería e espazo</b>: non esgota a batería como outras aplicacións de navegación. Os mapas compactos aforran espazo na memoria do dispositivo.
|
||||||
|
‣ <b>Gratuíta e feita pola comunidade</b>: persoas coma ti que axudan a crear a aplicación engadindo lugares en OpenStreetMap, probando novas características e dando a súa opinión, colaborando ao seu desenvolvemento con código ou financiamento.
|
||||||
|
‣ <b>Proceso de toma de decisións Aberto e Transparente para os temas económicos, Sen ánimo de lucro e totalmente de Código Aberto</b>
|
||||||
|
|
||||||
|
<b>Características principais</b>:
|
||||||
|
• Mapas detallados descargables con lugares que non están dispoñibles en Google Maps
|
||||||
|
• Modo para actividades en exterior con camiños para andainas, lugares para acampar, fontes de auga, picos dos montes, curvas de nivel, etc
|
||||||
|
• Rutas a pé e en bicicleta
|
||||||
|
• Puntos de interese como restaurantes, gasoliñeiras, hoteis, tendas, miradores e moitos máis
|
||||||
|
• Busca polo nome ou polo enderezo ou por categoría do punto de interese
|
||||||
|
• Navegación con anuncios por voz para camiñar, ir en bicicleta ou conducir
|
||||||
|
• Marca os lugares favoritos cun só toque
|
||||||
|
• Artigos da Wikipedia sen conexión
|
||||||
|
• Mapas do transporte por Metro
|
||||||
|
• Gravación das rutas
|
||||||
|
• Exportación e Importación de marcadores e rutas nos formatos KML, KMZ e GPX
|
||||||
|
• Modo escuro para a noite
|
||||||
|
• Contribúe a mellorar o mapa para todas as persoas usando o editor básico incluído
|
||||||
|
|
||||||
|
<b>Aquí es Libre</b>
|
||||||
|
Atopa o teu camiño, navega polo mundo con privacidade e coa comunidade como prioridade!
|
||||||
1
android/app/src/fdroid/play/listings/hu-HU/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps - Túra, Bicikli, Vezetés offline diszkréten
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
Een door de community ontwikkelde, gratis en open source kaartenapp, gebaseerd op OpenStreetMap-gegevens, met een sterke focus op transparantie en privacy, en zonder winstoogmerk. CoMaps is een fork/spin-off van Organic Maps, welke is afgeleid van Maps.ME.
|
||||||
|
|
||||||
|
Meer informatie over de redenen voor het project en de richting ervan vindt u op <b><i>codeberg.org/comaps</i></b>.
|
||||||
|
Sluit je aan bij de community en help mee aan de ontwikkeling van de beste kaartenapp:
|
||||||
|
• Gebruik de app en deel je ervaringen met anderen
|
||||||
|
• Geef feedback en meld eventuele problemen
|
||||||
|
• Houd de kaarten up-to-date, zowel in de app als op de OpenStreetMap-website
|
||||||
|
|
||||||
|
‣ <b>Offline-georiënteerd</b>: Plan en navigeer je reis in het buitenland zonder internet, zoek waypoints tijdens een lange wandeling, enzovoort. Alle functies zijn ontworpen om offline te functioneren.
|
||||||
|
‣ <b>Respect voor privacy</b>: De app is ontworpen met privacy in gedachten - geen gegevensverzameling en advertentievrij.
|
||||||
|
‣ <b>Eenvoudig en verfijnd</b>: essentiële, gebruiksvriendelijke functies die gewoon werken.
|
||||||
|
‣ <b>Bespaar je batterij en opslag</b>: De app verbruikt minder batterij dan andere navigatie-apps. Compacte kaarten besparen ruimte op je telefoon.
|
||||||
|
‣ <b>Gratis en gebouwd door de community</b>: Mensen zoals jij helpen de app door plaatsen toe te voegen aan OpenStreetMap, functies te testen en feedback te geven, en hun programmervaardigheden bij te dragen of te doneren.
|
||||||
|
‣ <b>Open en transparant besluitvormings- en financieel beleid, geen winstoogmerk en volledig open source.</b>
|
||||||
|
|
||||||
|
<b>Hoofdfuncties</b>:
|
||||||
|
• Downloadbare gedetailleerde kaarten met plaatsen die niet beschikbaar zijn bij Google Maps
|
||||||
|
• Buitenmodus met gemarkeerde wandelpaden, campings, waterbronnen, toppen, hoogtelijnen, enz.
|
||||||
|
• Wandelpaden en fietspaden
|
||||||
|
• Bezienswaardigheden zoals restaurants, tankstations, hotels, winkels en nog veel meer
|
||||||
|
• Zoeken op naam of adres of op categorie
|
||||||
|
• Navigatie met spraakmeldingen voor wandelen, fietsen of autorijden
|
||||||
|
• Sla je favoriete plaatsen op met een enkele klik
|
||||||
|
• Offline Wikipedia-artikelen
|
||||||
|
• Metro laag en routebeschrijvingen
|
||||||
|
• Trackregistratie
|
||||||
|
• Exporteer en importeer bladwijzers en tracks in KML, KMZ, GPX-formaten
|
||||||
|
• Een donkere modus voor gebruik 's nachts
|
||||||
|
• Verbeter kaartgegevens voor iedereen met een eenvoudige ingebouwde editor
|
||||||
|
|
||||||
|
<b>Vrijheid is hier/b>
|
||||||
|
Ontdek je reis, navigeer over de wereld met privacy en community voorop!
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Eenvoudige kaartnavigatie - Ontdek meer van je reis - Gemaakt door de community
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
Wprowadzamy logo CoMaps!
|
||||||
|
• zwiększenie dokładności izolinii w wielu regionach w krokach 20 do 50 metrów
|
||||||
|
• dodanie linków do zdjęć z Panoramax do wybranych POI
|
||||||
|
• aktualizacja danych OpenStreetMap z 13 lipca
|
||||||
|
• dodanie wypełnienia kolorem dla wielu typów obiektów
|
||||||
|
• wyświetlanie stanu godzin otwarcia przy wyborze POI
|
||||||
|
• podział mokradeł na kilka typów
|
||||||
|
• aktualizacja koloru roślinności i innych kolorów, aktualizacja części ikon na mapie
|
||||||
|
• tryb outdoorowy: pogrubione warstwice wysokości
|
||||||
@@ -8,7 +8,6 @@ Junte-se à comunidade e ajude a criar o melhor aplicativo de mapas.
|
|||||||
|
|
||||||
‣ <b>Foco offline</b>: Planeje e navegue em sua viagem ao exterior sem a necessidade de sinal de celular, pesquise pontos de referência durante uma caminhada distante, etc. Todas as funções do aplicativo foram projetadas para funcionar offline.
|
‣ <b>Foco offline</b>: Planeje e navegue em sua viagem ao exterior sem a necessidade de sinal de celular, pesquise pontos de referência durante uma caminhada distante, etc. Todas as funções do aplicativo foram projetadas para funcionar offline.
|
||||||
‣ <b>Respeito à privacidade</b>: O aplicativo foi projetado com a privacidade em mente - não identifica pessoas, não rastreia e não coleta informações pessoais. Livre de anúncios.
|
‣ <b>Respeito à privacidade</b>: O aplicativo foi projetado com a privacidade em mente - não identifica pessoas, não rastreia e não coleta informações pessoais. Livre de anúncios.
|
||||||
|
|
||||||
‣ <b>Simples e sofisticado</b>: recursos essenciais e fáceis de usar que simplesmente funcionam.
|
‣ <b>Simples e sofisticado</b>: recursos essenciais e fáceis de usar que simplesmente funcionam.
|
||||||
‣ <b>Economiza bateria e espaço</b>: Não esgota a bateria como outros aplicativos de navegação. Mapas compactos economizam espaço precioso no seu celular.
|
‣ <b>Economiza bateria e espaço</b>: Não esgota a bateria como outros aplicativos de navegação. Mapas compactos economizam espaço precioso no seu celular.
|
||||||
‣ <b>Gratuito e desenvolvido pela comunidade</b>: Pessoas como você ajudaram a desenvolver o aplicativo adicionando lugares ao OpenStreetMap, testando e dando feedback sobre os recursos e contribuindo com suas habilidades de desenvolvimento e dinheiro.
|
‣ <b>Gratuito e desenvolvido pela comunidade</b>: Pessoas como você ajudaram a desenvolver o aplicativo adicionando lugares ao OpenStreetMap, testando e dando feedback sobre os recursos e contribuindo com suas habilidades de desenvolvimento e dinheiro.
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
Apresentamos o logo do CoMaps!
|
||||||
|
• Curvas de nível mais detalhadas em muitas regiões
|
||||||
|
• Adicionados links de imagens do Panoramax para pontos de interesse selecionados
|
||||||
|
• Dados OSM de 13/07
|
||||||
|
• Adicionados preenchimentos de cor a muitos elementos
|
||||||
|
• Exibição de horário de funcionamento ao selecionar um ponto de interesse
|
||||||
|
• Divididas áreas úmidas em vários tipos distintos
|
||||||
|
• Atualizada cores/ícones para vegetação e outros elementos
|
||||||
|
• Ar livre: curvas de nível de altitude mais destacadas
|
||||||
@@ -1,55 +1,32 @@
|
|||||||
Um aplicativo de mapas gratuito e de código aberto, liderado pela comunidade, baseado em dados do OpenStreetMap e reforçado pelo compromisso com a transparência, privacidade e sem fins lucrativos. O CoMaps é um fork/spin-off do Organic Maps, que por sua vez é um fork do Maps.ME.
|
Um aplicativo de mapas gratuito e de código aberto, liderado pela comunidade, baseado em dados do OpenStreetMap e reforçado pelo compromisso com a transparência, privacidade e sem fins lucrativos. O CoMaps é um fork/spin-off do Organic Maps, que por sua vez é um fork do Maps.ME.
|
||||||
|
|
||||||
Leia mais sobre os motivos do projeto e sua direção em <b><i>codeberg.org/comaps</i></b>.
|
Leia mais sobre os motivos do projeto e sua direção em <b><i>codeberg.org/comaps</i></b>.
|
||||||
|
|
||||||
Junte-se à comunidade e ajude a criar o melhor aplicativo de mapas.
|
Junte-se à comunidade e ajude a criar o melhor aplicativo de mapas.
|
||||||
|
|
||||||
• Use o aplicativo e divulgue-o.
|
• Use o aplicativo e divulgue-o.
|
||||||
|
|
||||||
• Envie feedback e relate problemas.
|
• Envie feedback e relate problemas.
|
||||||
|
|
||||||
• Atualize os dados do mapa no aplicativo ou no site do OpenStreetMap.
|
• Atualize os dados do mapa no aplicativo ou no site do OpenStreetMap.
|
||||||
|
|
||||||
‣ <b>Foco offline</b>: Planeje e navegue em sua viagem ao exterior sem a necessidade de sinal de celular, pesquise pontos de referência durante uma caminhada distante, etc. Todas as funções do aplicativo foram projetadas para funcionar offline.
|
‣ <b>Foco offline</b>: Planeje e navegue em sua viagem ao exterior sem a necessidade de sinal de celular, pesquise pontos de referência durante uma caminhada distante, etc. Todas as funções do aplicativo foram projetadas para funcionar offline.
|
||||||
|
|
||||||
‣ <b>Respeitando a privacidade</b>: O aplicativo foi projetado com a privacidade em mente - não identifica pessoas, não rastreia e não coleta informações pessoais. Sem anúncios.
|
‣ <b>Respeitando a privacidade</b>: O aplicativo foi projetado com a privacidade em mente - não identifica pessoas, não rastreia e não coleta informações pessoais. Sem anúncios.
|
||||||
|
|
||||||
‣ <b>Simples e sofisticado</b>: recursos essenciais e fáceis de usar que simplesmente funcionam.
|
‣ <b>Simples e sofisticado</b>: recursos essenciais e fáceis de usar que simplesmente funcionam.
|
||||||
|
|
||||||
‣ <b>Economiza bateria e espaço</b>: Não consome muita bateria como outros aplicativos de navegação. Mapas compactos economizam espaço precioso no seu celular.
|
‣ <b>Economiza bateria e espaço</b>: Não consome muita bateria como outros aplicativos de navegação. Mapas compactos economizam espaço precioso no seu celular.
|
||||||
|
|
||||||
‣ <b>Gratuito e desenvolvido pela comunidade</b>: Pessoas como você ajudaram a desenvolver o aplicativo adicionando lugares ao OpenStreetMap, testando e dando feedback sobre os recursos e contribuindo com suas habilidades de desenvolvimento e dinheiro.
|
‣ <b>Gratuito e desenvolvido pela comunidade</b>: Pessoas como você ajudaram a desenvolver o aplicativo adicionando lugares ao OpenStreetMap, testando e dando feedback sobre os recursos e contribuindo com suas habilidades de desenvolvimento e dinheiro.
|
||||||
|
|
||||||
‣ <b>Tomada de decisões e finanças abertas e transparentes, sem fins lucrativos e totalmente de código aberto.</b>
|
‣ <b>Tomada de decisões e finanças abertas e transparentes, sem fins lucrativos e totalmente de código aberto.</b>
|
||||||
|
|
||||||
<b>Principais recursos</b>:
|
<b>Principais recursos</b>:
|
||||||
|
|
||||||
• Mapas detalhados para download com locais não disponíveis no Google Maps
|
• Mapas detalhados para download com locais não disponíveis no Google Maps
|
||||||
|
|
||||||
• Modo ao ar livre com trilhas em destaque, acampamentos, fontes de água, picos, curvas de nível, etc.
|
• Modo ao ar livre com trilhas em destaque, acampamentos, fontes de água, picos, curvas de nível, etc.
|
||||||
|
|
||||||
• Trilhas para caminhada e ciclovias
|
• Trilhas para caminhada e ciclovias
|
||||||
|
|
||||||
• Pontos de interesse como restaurantes, postos de gasolina, hotéis, lojas, pontos turísticos e muito mais
|
• Pontos de interesse como restaurantes, postos de gasolina, hotéis, lojas, pontos turísticos e muito mais
|
||||||
|
|
||||||
• Pesquise por nome, endereço ou por categoria de ponto de interesse
|
• Pesquise por nome, endereço ou por categoria de ponto de interesse
|
||||||
|
|
||||||
• Navegação com anúncios de voz para caminhadas, ciclismo ou direção
|
• Navegação com anúncios de voz para caminhadas, ciclismo ou direção
|
||||||
|
|
||||||
• Marque seus lugares favoritos com um único toque
|
• Marque seus lugares favoritos com um único toque
|
||||||
|
|
||||||
• Artigos offline da Wikipédia
|
• Artigos offline da Wikipédia
|
||||||
|
|
||||||
• Camada e direções de transporte público do metrô
|
• Camada e direções de transporte público do metrô
|
||||||
|
|
||||||
• Gravação de trilhas
|
• Gravação de trilhas
|
||||||
|
|
||||||
• Exporte e importe favoritos e trilhas nos formatos KML, KMZ e GPX
|
• Exporte e importe favoritos e trilhas nos formatos KML, KMZ e GPX
|
||||||
|
|
||||||
• Um modo escuro para usar à noite
|
• Um modo escuro para usar à noite
|
||||||
|
|
||||||
• Aprimore os dados do mapa para todos usando um editor básico integrado
|
• Aprimore os dados do mapa para todos usando um editor básico integrado
|
||||||
|
|
||||||
<b>A Liberdade Chegou</b>
|
<b>A Liberdade Chegou</b>
|
||||||
|
|
||||||
Descubra sua jornada, navegue pelo mundo com privacidade e comunidade em primeiro lugar!
|
Descubra sua jornada, navegue pelo mundo com privacidade e comunidade em primeiro lugar!
|
||||||
|
|||||||
1
android/app/src/fdroid/play/listings/ro/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps - Drumeții, Ciclism, Condus Offline în confidențialitate
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
Бесплатное и свободное картографическое приложение, основанное на данных OpenStreetMap и подкреплённое обязательствами по прозрачности, конфиденциальности и некоммерческой направленности. CoMaps — это ответвление от Organic Maps, которое, в свою очередь, является ответвлением от Maps.ME.
|
Бесплатное и свободное картографическое приложение, основанное на данных OpenStreetMap и подкреплённое обязательствами по прозрачности, конфиденциальности и некоммерческой направленности. CoMaps — это ответвление от Organic Maps, которое, в свою очередь, является ответвлением от Maps.ME.
|
||||||
|
|
||||||
Подробнее о причинах проекта и его направлении читайте на <a href="https://codeberg.org/comaps">сайте</a>.
|
Подробнее о причинах проекта и его направлении читайте на сайте <b><i> codeberg.org/comaps </i><b>.
|
||||||
|
|
||||||
Присоединяйтесь к сообществу и помогите создать лучшее приложение с картами
|
Присоединяйтесь к сообществу и помогите создать лучшее приложение с картами
|
||||||
• Используйте приложение и распространяйте информацию о нём
|
• Используйте приложение и распространяйте информацию о нём
|
||||||
• Оставляйте отзывы и сообщайте о проблемах
|
• Оставляйте отзывы и сообщайте о проблемах
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
• карты OpenStreetMap от 22 июня
|
Представляем логотип CoMaps!
|
||||||
• автоматическое резервное копирование меток и треков
|
• Линии высот для многих регионов с шагом 20м или 50м
|
||||||
• линии высот с шагом 100м для всех регионов, где линии с этим шагом отсутствовали
|
• Ссылки на изображения Panoramax к выбранным POI
|
||||||
• цветная заливка растительности и игровых площадок отображается раньше, добавлена заливка для кемпингов и других объектов
|
• Карты OpenStreetMap от 13 июля
|
||||||
• тропы и грунтовки отображаются позже в стиле по умолчанию - используйте стиль «Активный отдых» для обзора троп
|
• Заливки цветом ко многим объектам и более ранняя заливка для существующих объектов
|
||||||
• выбранная функция настраиваемой кнопки больше не дублируется в пунктах меню
|
• Показ часов работы при выборе POI
|
||||||
|
• Разные водно-болотные угодья отличаются цветом
|
||||||
|
• Обновлены цвета растительности и другие цвета на карте, изменены некоторые иконки
|
||||||
|
• В стиле "Активный отдых" более четкие линии высот
|
||||||
@@ -1 +1 @@
|
|||||||
Простая навигация по карте — Откройте больше за ваше путешествие. От сообщества
|
Простая навигация по карте — Откройте больше за ваше путешествие — От сообщества
|
||||||
|
|||||||
@@ -1,18 +1,17 @@
|
|||||||
Бесплатна апликација отвореног кода коју је обављала заједница и заснива се на ОпенСтреетМап-у подацима, усмерени транспарентност, приватност и непрофитни. ЦОМПАПС је Апликације за органске карте виљушка, које је пак форк мапс.ме.
|
Бесплатна апликација отвореног кода коју је обављала заједница и заснива се на ОpenStreetMap-у подацима, усмерени транспарентност, приватност и непрофитни. CoMaps је Апликације за органске карте виљушка, које је пак форк Maps.ME.
|
||||||
|
|
||||||
Прочитајте о разлозима пројекта и његовог правца на <b><i>codeberg.org/comaps</i></b>
|
Прочитајте о разлозима пројекта и његовог правца на <b><i>codeberg.org/comaps</i></b>
|
||||||
Придружите се отвореној заједници и помозите да направимо најбољу апликацију за мапе
|
Придружите се отвореној заједници и помозите да направимо најбољу апликацију за мапе
|
||||||
• Користите апликацију и проширите глас о томе
|
• Користите апликацију и проширите глас о томе
|
||||||
• Дајте повратне информације и пријавите проблеме
|
• Дајте повратне информације и пријавите проблеме
|
||||||
• Ажурирајте податке на мапи у апликацији или на веб локацији OpenStreetMap
|
• Ажурирајте податке на мапи у апликацији или на веб локацији OpenStreetMap
|
||||||
‣<b>фокусирано на офлајн Вар </b>: Планирајте и управљајте путовањем у иностранству без потребе за мобилним услугама, тражите путне тачке док је на даљинском покрету, итд.
|
|
||||||
|
|
||||||
Све апликације су дизајниране за рад ван мреже.
|
‣ <b> фокусирано на офлајн Вар </b>: Планирајте и управљајте путовањем у иностранству без потребе за мобилним услугама, тражите путне тачке док је на даљинском покрету, итд. Све апликације су дизајниране за рад ван мреже.
|
||||||
‣<b> Поштовање приватности </b>: Апликација је осмишљена задржавања у уму приватност - не идентификује људе, не прати или прикупља личне податке. Нема реклама.
|
‣ <b> Поштовање приватности </b>: Апликација је осмишљена задржавања у уму приватност - не идентификује људе, не прати или прикупља личне податке. Нема реклама.
|
||||||
‣ <b> Једноставно и елегантно </b>: Апликација је тривијална за употребу и једноставно функционише.
|
‣ <b> Једноставно и елегантно </b>: Апликација је тривијална за употребу и једноставно функционише.
|
||||||
‣ <b> Чува вашу батерију и простор </b>: не конзумира батерију као остале навигационе апликације. Компактне картице сачувајте драгоцени простор на вашем телефону.
|
‣ <b> Чува вашу батерију и простор </b>: не конзумира батерију као остале навигационе апликације. Компактне картице сачувајте драгоцени простор на вашем телефону.
|
||||||
‣ <b> Отворено и направио је заједницу </b>: Људи попут вас је помогли да додају апликацију додавањем локација на OpenStreetMap-у, тестирању и давање повратних информација о апликацији и доприносе вашим развојним вештинама и новцу.
|
‣ <b> Отворено и направио је заједницу </b>: Људи попут вас је помогли да додају апликацију додавањем локација на OpenStreetMap-у, тестирању и давање повратних информација о апликацији и доприносе вашим развојним вештинама и новцу.
|
||||||
‣ <b> Отворено и транспарентно доношење одлука и употреба финансија, непрофитна и потпуно отворена извора. </ Б>
|
‣ <b> Отворено и транспарентно доношење одлука и употреба финансија, непрофитна и потпуно отворена извора. </b>
|
||||||
|
|
||||||
<b> Главне карактеристике </b>:
|
<b> Главне карактеристике </b>:
|
||||||
• Преузмите детаљне мапе са локацијама које нису доступне са Гоогле мапама
|
• Преузмите детаљне мапе са локацијама које нису доступне са Гоогле мапама
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
Представљамо CoMaps лого!
|
||||||
|
• ажуриране изохипсе за многе регионе на кораке од 20 или 50 метара
|
||||||
|
• додате везе ка Panoramax сликама за изабране тачке интересовања (POI)
|
||||||
|
• подаци са OpenStreetMap-а од 13. јула
|
||||||
|
• додате боје за многе елементе и раније приказивање постојећих површина
|
||||||
|
• приказ стања радног времена при избору POI-ја
|
||||||
|
• мочваре подељене на неколико различитих типова
|
||||||
|
• ажуриране боје вегетације и других елемената на мапи, ажуриране поједине иконе
|
||||||
|
• на отвореном: наглашеније изохипсе
|
||||||
@@ -1 +1 @@
|
|||||||
Једноставна навигација - Сазнајте више о свом путовању - Покреће је заједница
|
Једноставна навигација - Сазнајте више о свом путовању - Ради на бази заједнице
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
Kolayca gezinin - Seyahat etmenin ötesini bulun - Gönüllüler tarafından yapıldı
|
Kullanımı kolay harita - Yolculuğun ötesine geçin - topluluğun katkılarıyla
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
CoMaps - İnternetsiz Seyahat Edin
|
CoMaps - Gizlilikle Yürüyün, Sürün, Gezin
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Định vị bản đồ dễ dàng - Khám phá thế giới quanh bạn - Đồng hành cùng cộng đồng
|
||||||
@@ -1 +1 @@
|
|||||||
Jednoduchá navigace v mapě - Objevte více na své cestě ‐ Vyvíjeno komunitou
|
Jednoduchá navigace v mapě – Objevte více na své cestě – Vyvíjeno komunitou
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Nem kortnavigation - Oplev mere af din rejse - Drevet af fællesskabet
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
Eine von der Community betriebene, kostenlose Open-Source Karten App, die auf OpenStreetMap-Daten basiert. Transparent, datensparsam und nicht gewinnorientiert.
|
Eine von der Community betriebene, kostenlose Open-Source Karten App, die auf OpenStreetMap-Daten basiert. Ein Gemeinschaftsprojekt mit Fokus auf Transparenz und non-profit.
|
||||||
|
|
||||||
Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
|
Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
|
||||||
• Nutze die App und erzähle anderen davon
|
• Nutze die App und erzähle anderen davon
|
||||||
@@ -8,8 +8,8 @@ Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
|
|||||||
<i>Dein Feedback und deine 5-Sterne-Bewertung sind die beste Unterstützung für uns!</i>
|
<i>Dein Feedback und deine 5-Sterne-Bewertung sind die beste Unterstützung für uns!</i>
|
||||||
|
|
||||||
‣ <b>Einfach und ausgereift</b>: Essenzielle, leicht zu bedienende Funktionen, die einfach funktionieren.
|
‣ <b>Einfach und ausgereift</b>: Essenzielle, leicht zu bedienende Funktionen, die einfach funktionieren.
|
||||||
‣ <b>Offline-orientiert</b>: Plane und navigiere im Ausland ohne Mobilfunkverbindung, finde Wegpunkte auf abgelegenen Wanderungen usw. Alle Funktionen sind für den Offline-Einsatz konzipiert.
|
‣ <b>Offlinekarten</b>: Plane und navigiere im Ausland ohne Mobilfunkverbindung, finde Wegpunkte auf abgelegenen Wanderungen usw. Alle Funktionen sind für den Offline-Einsatz konzipiert.
|
||||||
‣ <b>Datenschutzfreundlich</b>: Die App wurde mit Fokus auf Privatsphäre entwickelt – keine Personenidentifikation, kein Tracking, keine Erfassung persönlicher Daten, keine Werbung.
|
‣ <b>Datenschutz ist uns wichtig!</b>: Die App wurde mit Fokus auf Privatsphäre entwickelt – kein Tracking, keine Erfassung persönlicher Daten, keine Werbung.
|
||||||
‣ <b>Spart Akku und Speicherplatz</b>: Verbraucht nicht unnötig Akku wie andere Navi-Apps. Kompakte Karten sparen Speicherplatz auf Deinem Gerät.
|
‣ <b>Spart Akku und Speicherplatz</b>: Verbraucht nicht unnötig Akku wie andere Navi-Apps. Kompakte Karten sparen Speicherplatz auf Deinem Gerät.
|
||||||
‣ <b>Kostenlos und von der Community entwickelt</b>: Menschen wie du haben geholfen, die App zu entwickeln – durch das Hinzufügen von Orten zu OpenStreetMap, Testen von neuen Funktionen, Softwareentwicklung oder Spenden.
|
‣ <b>Kostenlos und von der Community entwickelt</b>: Menschen wie du haben geholfen, die App zu entwickeln – durch das Hinzufügen von Orten zu OpenStreetMap, Testen von neuen Funktionen, Softwareentwicklung oder Spenden.
|
||||||
‣ <b>Offen und transparent bei Entscheidungen und Finanzen, gemeinnützig und vollständig Open Source</b>
|
‣ <b>Offen und transparent bei Entscheidungen und Finanzen, gemeinnützig und vollständig Open Source</b>
|
||||||
@@ -32,5 +32,5 @@ Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
|
|||||||
|
|
||||||
Bitte melde Probleme, schlage neue Funktionen vor und werde Teil der Community auf unserer Website: <b><i>comaps.app</i></b>
|
Bitte melde Probleme, schlage neue Funktionen vor und werde Teil der Community auf unserer Website: <b><i>comaps.app</i></b>
|
||||||
|
|
||||||
<b>Freiheit beginnt hier</b>
|
<b>Entdecke die Unabhängigkeit</b>
|
||||||
Entdecke deine Reise – navigiere in der Welt mit Datenschutz!
|
Entdecke deine Reise – navigiere in der Welt mit Datenschutz!
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Mapa nabigazio erraza - Ezagutu gehiago zure bidaiaz - Komunitatean egina
|
||||||
@@ -1 +1 @@
|
|||||||
Navigation facile - Découvrez plus lors de votre voyage - Fait par la communauté
|
Navigation cartographique facile - Propulsé par la communauté
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
Aplicación de mapas gratuíta, de código aberto e xestionada pola comunidade, obtén os datos desde OpenStreetMap e co compromiso reforzado coa transparencia, privacidade e non ter o beneficio económico como obxectivo.
|
||||||
|
|
||||||
|
Únete á comunidade e axuda a que teñamos a mellor aplicación de mapas
|
||||||
|
• Usa a aplicación e dille a outras persoas que o fas
|
||||||
|
• Informa de fallos e publica túa experiencia
|
||||||
|
• Actualiza os datos do mapa na aplicación ou no sitio web OpenStreetMap
|
||||||
|
|
||||||
|
<i>Os teus comentarios e recensións de 5 estrelas son a mellor axuda para nós!
|
||||||
|
|
||||||
|
‣ <b>Sen conexión de datos</b>: planea a viaxe e sigue a ruta sen precisar unha conexión á rede móbil, busca lugares relevantes nas andainas máis longas, etc. Todas as características da aplicación están deseñadas para funcionar sen precisar conexión de datos.
|
||||||
|
‣ <b>Respecto pola privacidade</b>: a aplicación está deseñada coa privacidade en primeiro plano - non identifica ás persoas, non te segue, non recolle información sobre ti. Non ten publicidade.
|
||||||
|
‣ <b>Simple e organizada</b>: características esenciais, fáciles de usar e que funcionan.
|
||||||
|
‣ <b>Aforra batería e espazo</b>: non esgota a batería como outras aplicacións de navegación. Os mapas compactos aforran espazo na memoria do dispositivo.
|
||||||
|
‣ <b>Gratuíta e feita pola comunidade</b>: persoas coma ti que axudan a crear a aplicación engadindo lugares en OpenStreetMap, probando novas características e dando a súa opinión, colaborando ao seu desenvolvemento con código ou financiamento.
|
||||||
|
‣ <b>Proceso de toma de decisións Aberto e Transparente para os temas económicos, Sen ánimo de lucro e totalmente de Código Aberto</b>
|
||||||
|
|
||||||
|
<b>Características principais</b>:
|
||||||
|
• Mapas detallados descargables con lugares que non están dispoñibles en Google Maps
|
||||||
|
• Modo para actividades en exterior con camiños para andainas, lugares para acampar, fontes de auga, picos dos montes, curvas de nivel, etc
|
||||||
|
• Rutas a pé e en bicicleta
|
||||||
|
• Puntos de interese como restaurantes, gasoliñeiras, hoteis, tendas, miradores e moitos máis
|
||||||
|
• Busca polo nome ou polo enderezo ou por categoría do punto de interese
|
||||||
|
• Navegación con anuncios por voz para camiñar, ir en bicicleta ou conducir
|
||||||
|
• Marca os lugares favoritos cun só toque
|
||||||
|
• Artigos da Wikipedia sen conexión
|
||||||
|
• Mapas do transporte por Metro
|
||||||
|
• Gravación das rutas
|
||||||
|
• Exportación e Importación de marcadores e rutas nos formatos KML, KMZ e GPX
|
||||||
|
• Modo escuro para a noite
|
||||||
|
• Contribúe a mellorar o mapa para todas as persoas usando o editor básico incluído
|
||||||
|
|
||||||
|
Por favor informa de calquera incidencia que xurda así como suxire novas funcións na nosa comunidade en <b><i>comaps.app</i></b>
|
||||||
|
|
||||||
|
<b>Aquí es Libre</b>
|
||||||
|
Atopa o teu camiño, navega polo mundo con privacidade e coa comunidade como prioridade!
|
||||||
1
android/app/src/google/play/listings/gl-ES/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps -Navega con Privacidade
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
Een door de community ontwikkelde, gratis en open source kaartenapp, gebaseerd op OpenStreetMap-gegevens, met een sterke focus op transparantie en privacy, en zonder winstoogmerk.
|
||||||
|
|
||||||
|
Sluit je aan bij de community en help mee aan de ontwikkeling van de beste kaartenapp:
|
||||||
|
• Gebruik de app en deel je ervaringen met anderen
|
||||||
|
• Geef feedback en meld eventuele problemen
|
||||||
|
• Houd de kaarten up-to-date, zowel in de app als op de OpenStreetMap-website
|
||||||
|
|
||||||
|
<i>Jouw feedback en 5-sterrenbeoordelingen zijn de beste steun voor ons!!</i>
|
||||||
|
|
||||||
|
‣ <b>Eenvoudig en verfijnd</b>: essentiële, gebruiksvriendelijke functies die gewoon werken.
|
||||||
|
‣ <b>Offline-georiënteerd</b>: Plan en navigeer je reis in het buitenland zonder internet, zoek waypoints tijdens een lange wandeling, enzovoort. Alle functies zijn ontworpen om offline te functioneren.
|
||||||
|
‣ <b>Respect voor privacy</b>: De app is ontworpen met privacy in gedachten - geen gegevensverzameling en advertentievrij.
|
||||||
|
‣ <b>Bespaar je batterij en opslag</b>: De app verbruikt minder batterij dan andere navigatie-apps. Compacte kaarten besparen ruimte op je telefoon.
|
||||||
|
‣ <b>Gratis en gebouwd door de community</b>: Mensen zoals jij helpen de app door plaatsen toe te voegen aan OpenStreetMap, functies te testen en feedback te geven, en hun programmervaardigheden bij te dragen of te doneren.
|
||||||
|
‣ <b>Open en transparant besluitvormings- en financieel beleid, geen winstoogmerk en volledig open source.</b>
|
||||||
|
|
||||||
|
<b>Hoofdfuncties</b>:
|
||||||
|
• Downloadbare gedetailleerde kaarten met plaatsen die niet beschikbaar zijn bij Google Maps
|
||||||
|
• Buitenmodus met gemarkeerde wandelpaden, campings, waterbronnen, toppen, hoogtelijnen, enz.
|
||||||
|
• Wandelpaden en fietspaden
|
||||||
|
• Bezienswaardigheden zoals restaurants, tankstations, hotels, winkels en nog veel meer
|
||||||
|
• Zoeken op naam of adres of op categorie
|
||||||
|
• Navigatie met spraakmeldingen voor wandelen, fietsen of autorijden
|
||||||
|
• Sla je favoriete plaatsen op met een enkele klik
|
||||||
|
• Offline Wikipedia-artikelen
|
||||||
|
• Metro laag en routebeschrijvingen
|
||||||
|
• Trackregistratie
|
||||||
|
• Exporteer en importeer bladwijzers en tracks in KML, KMZ, GPX-formaten
|
||||||
|
• Een donkere modus voor gebruik 's nachts
|
||||||
|
• Verbeter kaartgegevens voor iedereen met een eenvoudige ingebouwde editor
|
||||||
|
• Ondersteuning voor Android Auto
|
||||||
|
|
||||||
|
Meld app-problemen, stel nieuwe functies voor en sluit je aan bij onze community op de <b><i>comaps.app</i></b> website.
|
||||||
|
|
||||||
|
<b>Vrijheid is hier/b>
|
||||||
|
Ontdek je reis, navigeer over de wereld met privacy en community voorop!
|
||||||
1
android/app/src/google/play/listings/pt-PT/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps - Viaje com Privacidade
|
||||||
1
android/app/src/google/play/listings/ro/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps - Navighează liniștit
|
||||||
@@ -1 +1 @@
|
|||||||
Простая навигация по карте — Откройте больше за ваше путешествие. От сообщества
|
Простая навигация по карте — Откройте больше за ваше путешествие — От сообщества
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
Бесплатна апликација за мапе отвореног кода коју води заједница заснована на OpenStreetMap подацима и ојачана посвећеношћу транспарентности, приватности и непрофитности.
|
Бесплатна апликација за мапе отвореног кода коју води заједница заснована на OpenStreetMap подацима и ојачана посвећеношћу транспарентности, приватности и непрофитности.
|
||||||
|
|
||||||
Придружите се заједници и помозите да направимо најбољу навигацију
|
Придружите се заједници и помозите да направите најбољу навигацију
|
||||||
• Користите апликацију и ширите информације о њој
|
• Користите апликацију и ширите информације о њој
|
||||||
• Оставите повратне информације и пријавите проблеме
|
• Оставите повратне информације и пријавите проблеме
|
||||||
• Ажурирајте мапе из апликације или на сајту OpenStreetMap
|
• Ажурирајте мапе из апликације или на сајту OpenStreetMap
|
||||||
@@ -11,26 +11,26 @@
|
|||||||
‣ <b>Офлајн фокусирана</b>: Планирајте путовање у иностранство без употребе мобилне телефоније, потражите правац тачке током дугог путовања, итд . Све функције апликације су дизајниране за рад у режиму без интернета.
|
‣ <b>Офлајн фокусирана</b>: Планирајте путовање у иностранство без употребе мобилне телефоније, потражите правац тачке током дугог путовања, итд . Све функције апликације су дизајниране за рад у режиму без интернета.
|
||||||
‣ <b>Поштовање приватности</b>: Апликација је развијена с обзиром на приватност - не идентификује људе, не прати и не прикупља личне информације. Без реклама.
|
‣ <b>Поштовање приватности</b>: Апликација је развијена с обзиром на приватност - не идентификује људе, не прати и не прикупља личне информације. Без реклама.
|
||||||
‣ <b>Штеди батерију и простор</b>: Не празни батерију, као остале навигациje. Компактне mape штедe драгоценi prostor на вашем телефону..
|
‣ <b>Штеди батерију и простор</b>: Не празни батерију, као остале навигациje. Компактне mape штедe драгоценi prostor на вашем телефону..
|
||||||
‣ <b>Free and Built by the Community</b>: Такви људи, као што сте помогли да креирате апликацију, додајући места у OpenStreetMap, тестира и остављајући повратне информације о функцијама, као и стављајући своје вештине развоја и новац.
|
‣ <b>Бесплатно и изграђено од стране заједнице</b>: Људи попут вас помогли су у изради апликације додавањем места на OpenStreetMap, тестирањем и давањем повратних информација о функцијама и доприносом својим развојним вештинама и новцем.
|
||||||
‣ <b>Отворено и транспарентно доношење одлука и финансија, непрофитни и потпуно отворени кода.</b>
|
‣ <b>Отворено и транспарентно доношење одлука и финансије, непрофитне и потпуно отвореног кода.</b>
|
||||||
|
|
||||||
<b>Главне карактеристике</b>:
|
<b>Главне карактеристике</b>:
|
||||||
• Преузимање детаљне мапе са локацијама које нису доступне у Google Maps
|
<li>Преузимање детаљних мапа са локацијама које нису доступне у Google Maps</li>
|
||||||
• Истакнуте планинарске стазе, кампови, изворима воде, врхове, контуре линије итд
|
<li>Режим на отвореном са истакнутим планинарским стазама, кампови, извори воде, врхови, контурне линије, итд</li>
|
||||||
• Пешачке и бициклистичке стазе
|
<li>Пешачке и бициклистичке стазе</li>
|
||||||
• Тачке од интереса као што су ресторани, бензинске станице, хотели, атракције, шопинг и још много тога
|
<li>Тачке интереса попут ресторана, бензинских станица, хотели, продавнице, разгледање и још много тога</li>
|
||||||
• Претрага по имену или адреси или по категорији интересних места
|
<li>Претрага по имену, адреси или по ТОИ категоријама</li>
|
||||||
• Навигација са гласовним огласима за планинарење, бициклизам или вожње аутомобила
|
<li>Навигација са гласовним упутима за планинарење, бициклизам или вожњу аутомобилом</li>
|
||||||
• Означи своја омиљене места са једним додиром
|
<li>Обележите своја омиљена места једним додиром</li>
|
||||||
• Офлајн Википедиа чланци
|
<li>Википедија чланци без интернета</li>
|
||||||
• Транзитни слој метроа и упутства
|
<li>Нивои транзита у метроа и смер кретања</li>
|
||||||
• Track recording
|
<li>Снимање траса</li>
|
||||||
• Export and import bookmarks and tracks in KML, KMZ, GPX formats
|
<li>Извоз и увоз маркера и траса у форматима KML, KMZ, GPX</li>
|
||||||
• A dark mode to use during the night
|
<li>Тамни режим за употребу ноћу</li>
|
||||||
• Improve map data for everyone using a basic built-in editor
|
<li>Побољшавање картографских података за све, користећи основни едитор за уређивање</li>
|
||||||
• Подршка за Андроид Ауто
|
<li>Подршка за Андроид Ауто</li>
|
||||||
|
|
||||||
Молимо Вас да пријавите проблеме са апликацијом, предложите идеје и придружите се нашој заједници на <b><i>comaps.app</i></b> страни.
|
Молимо Вас да пријавите проблеме са апликацијом, предложите идеје и придружите се нашој заједници на <b><i>comaps.app</i></b> страни.
|
||||||
|
|
||||||
<b>Сад је слободна</b>
|
<b>Сад је слободно</b>
|
||||||
Откријте своје путовање, путујте светом с приватношћу и заједницом на челу!
|
Откријте своје путовање, путујте светом с приватношћу и заједницом на челу!
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
Једноставна навигација - Сазнајте више о свом путовању - Покреће је заједница
|
Једноставна навигација - Сазнајте више о свом путовању - Ради на бази заједнице
|
||||||
|
|||||||
@@ -1,36 +1,36 @@
|
|||||||
OpenStreetMap verilerine dayanan ve şeffaflık, gizlilik ve kar amacı gütmeyen olma taahhüdüyle güçlendirilen, topluluk tarafından yönetilen ücretsiz ve açık kaynaklı bir harita uygulaması.
|
OpenStreetMap verilerine dayanan, kâr amacı gütmeyen, gizlilik ve şeffaflık odaklı, topluluk tarafından yönetilen, özgür ve açık kaynak kodlu bir harita uygulaması.
|
||||||
|
|
||||||
Topluluğa katılın ve en iyi harita uygulamasını oluşturmaya yardımcı olun
|
Topluluğa katılın ve en iyi harita uygulamasını oluşturmamıza yardım edin
|
||||||
• Uygulamayı kullanın ve bunu herkese duyurun
|
• Uygulamayı kullanın ve çevrenize yayın
|
||||||
• Geri bildirimde bulunun ve sorunları bildirin
|
• Geri bildirim verin ve sorunları bildirin
|
||||||
• Harita verilerini uygulamada veya OpenStreetMap web sitesinde güncelleyin
|
• Harita verilerini uygulamadan veya OpenStreetMap üzerinden düzenleyin
|
||||||
|
|
||||||
<i>Geri bildirimleriniz ve 5 yıldızlı yorumlarınız bizim için en iyi destektir!</i>
|
<i>Geri bildirimleriniz ve 5 yıldızlı yorumlarınız bizim için en iyi destektir!</i>
|
||||||
|
|
||||||
‣ <b>Basit ve Cilalı</b>: sadece işe yarayan, kullanımı kolay temel özellikler.
|
‣ <b>Basit ve Temiz</b>: Sadece temel, kullanımı basit, işe yarayan özellikler.
|
||||||
‣ <b>Çevrim dışı odaklı</b>: Cep telefonu hizmetine ihtiyaç duymadan yurtdışı seyahatinizi planlayın ve gezinin, uzun bir yürüyüş sırasında rota noktalarını arayın, vb. Tüm uygulama işlevleri çevrimdışı çalışmak üzere tasarlanmıştır.
|
‣ <b>Çevrimdışı Odaklı</b>: Mobil veriye ihtiyaç duymadan yurt dışı seyahatinizi planlayın ve gezin, uzun bir yürüyüş sırasında rotanızdaki noktaları bulun ve daha fazlası . Tüm özellikler çevrimdışı çalışmak üzere tasarlanmıştır.
|
||||||
‣ <b>Gizliliğe Saygı</b>: Uygulama gizlilik düşünülerek tasarlanmıştır; kişileri tanımlamaz, takip etmez ve kişisel bilgi toplamaz. Reklamsız.
|
‣ <b>Gizliliğe Saygılı</b>: Uygulama gizliliğe saygılı olarak tasarlanmıştır. Kullanıcı profilinizi çıkarmaz, sizi takip etmez ve kişisel bilgi toplamaz. Üstelik tamamen reklamsızdır.
|
||||||
‣ <b>Pilinizden ve Alanınızdan Tasarruf Edin</b>: Diğer navigasyon uygulamaları gibi pilinizi tüketmez. Kompakt haritalar telefonunuzda değerli alan tasarrufu sağlar.
|
‣ <b>Pil ve Depolamanızdan Tasarruf Eder</b>: Diğer navigasyon uygulamaları gibi pilinizi sömürmez. Compact maps değerli depolama alanınızdan tasarruf eder.
|
||||||
‣ <b>Ücretsiz ve Topluluk Tarafından Oluşturuldu</b>: Sizin gibi insanlar, OpenStreetMap'e yerler ekleyerek, özellikleri test ederek ve geri bildirimde bulunarak ve geliştirme becerilerinizi ve paranızı katkıda bulunarak uygulamanın oluşturulmasına yardımcı oldunuz..
|
‣ <b>Ücretsizdir ve Gücünü Topluluktan Alır</b>: Sizin gibi insanlar OpenStreetMap'e yer ekleyerek, yeni özellikleri test ederek, geri bildirimde bulunarak, program geliştirme becerileri ve bağışlarla katkıda bulunarak uygulamanın oluşturulmasına yardımcı oldu.
|
||||||
‣ <b>Açık ve Şeffaf Karar Alma ve Finansman, Kar Amacı Gütmeyen ve Tamamen Açık Kaynak.</b>
|
‣ <b>Açık ve Şeffaf Şekilde Yürütülen Karar Alma ve Fonlama Süreçleri, Kâr Amacı Gütmez ve Tamamen Açık Kaynaklı.</b>
|
||||||
|
|
||||||
<b>Ana Özellikleri</b>:
|
<b>Ana Özellikler</b>:
|
||||||
• Google Haritalar'da bulunmayan yerleri içeren indirilebilir detaylı haritalar
|
• Google Haritalar'da bulunmayan yerleri içeren, çevrimdışı detaylı haritalar
|
||||||
• Vurgulanan yürüyüş parkurları, kamp alanları, su kaynakları, zirveler, kontur çizgileriyle açık hava modu gibi
|
• Yürüyüş parkurları, kamp alanları, su kaynakları, zirveler, kontur çizgileri vb. nesneleri vurgulayan açık hava modu
|
||||||
• Yürüyüş yolları ve bisiklet yolları
|
• Yürüyüş ve bisiklet yolları
|
||||||
• Restoranlar, benzin istasyonları, oteller, mağazalar, turistik yerler gibi ilgi çekici noktalar ve daha fazlası
|
• Restoran, benzin istasyonu, otel, mağaza, görülecek yerler ve çok daha fazla harita noktası
|
||||||
• İsme veya adrese göre veya ilgi noktası kategorisine göre arama yapın
|
• İsim, adres veya harita noktası kategorisine göre arama yapın
|
||||||
• Yürüyerek, bisikletle veya araçla seyahat edenler için sesli duyurularla navigasyon
|
• Sesli yönlendirmeye sahip yürüyüş, bisiklet ve araç navigasyonu
|
||||||
• Favori yerlerinizi tek bir dokunuşla yer imlerine ekleyin
|
• En sevdiğiniz mekanları tek dokunuşla yer imlerinize kaydedin
|
||||||
• Çevrim dışı Wikipedia makaleleri
|
• Çevrimdışı Vikipedi makaleleri
|
||||||
• Metro geçiş katmanı ve yönleri
|
• Metro ulaşım katmanı ve rotaları
|
||||||
• Rota kaydı
|
• GPS izinizi kaydedin
|
||||||
• Yer imlerini ve parkurları KML, KMZ, GPX formatlarında dışa ve içe aktarın
|
• Yer imi ve GPS izlerinizi KML, KMZ ve GPX biçimlerinde dışa veya içe aktarın
|
||||||
• Geceleri kullanmak için karanlık mod
|
• Gece boyunca kullanmanızı sağlayacak koyu mod
|
||||||
• Temel bir yerleşik düzenleyici kullanarak herkes için harita verilerini iyileştirin
|
• Uygulama içi düzenleyiciyi kullanarak harita verilerini herkes için daha iyi hale getirin
|
||||||
• Android Auto desteği
|
• Android Auto desteği
|
||||||
|
|
||||||
Lütfen uygulama sorunlarını bildirin, fikir önerin ve <b><i>comaps.app</i></b> web sitesinde topluluğumuza katılın.
|
Lütfen <b><i>comaps.app</i></b> adresinden uygulama sorunlarını bildirin, önerilerinizi paylaşın ve topluluğumuza katılın.
|
||||||
|
|
||||||
<b>Özgürlük Burada</b>
|
<b>Özgürlük Buradan Başlıyor</b>
|
||||||
Yolculuğunuzu keşfedin, gizlilik ve topluluk ön planda tutularak dünyayı keşfedin!
|
Yolculuğunuzun ötesine geçin, gizlilik ve topluluğu ön planda tutarak dünyada gezinin!
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
Kolayca gezinin - Seyahat etmenin ötesini bulun - Gönüllüler tarafından yapıldı
|
Kullanımı kolay harita - Yolculuğun ötesine geçin - topluluğun katkılarıyla
|
||||||
|
|||||||
36
android/app/src/google/play/listings/vi/full-description.txt
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
Một ứng dụng bản đồ miễn phí & mã nguồn mở do cộng đồng phát triển, dựa trên dữ liệu OpenStreetMap và cam kết mạnh mẽ về minh bạch, quyền riêng tư và phi lợi nhuận.
|
||||||
|
|
||||||
|
Hãy tham gia cộng đồng và cùng chúng tôi xây dựng ứng dụng bản đồ tốt nhất!
|
||||||
|
• Sử dụng ứng dụng và chia sẻ với mọi người
|
||||||
|
• Đóng góp ý kiến và báo cáo lỗi
|
||||||
|
• Cập nhật dữ liệu bản đồ trong ứng dụng hoặc trên trang web OpenStreetMap
|
||||||
|
|
||||||
|
<i>Đánh giá 5 sao và phản hồi của bạn là sự ủng hộ quý giá nhất!</i>
|
||||||
|
|
||||||
|
‣ <b>Đơn giản và tinh tế</b>: Những tính năng cần thiết, dễ sử dụng và hoạt động mượt mà.
|
||||||
|
‣ <b>Hoạt động offline</b>: Lên kế hoạch và điều hướng chuyến đi ở nước ngoài mà không cần kết nối mạng, tìm kiếm địa điểm khi đi bộ đường dài... Tất cả chức năng đều hoạt động offline.
|
||||||
|
‣ <b>Tôn trọng quyền riêng tư</b>: Ứng dụng được thiết kế để bảo vệ sự riêng tư - không định danh người dùng, không theo dõi và không thu thập thông tin cá nhân. Hoàn toàn không có quảng cáo.
|
||||||
|
‣ <b>Tiết kiệm pin và dung lượng</b>: Không ngốn pin như các ứng dụng bản đồ khác. Bản đồ nhỏ gọn giúp tiết kiệm dung lượng điện thoại.
|
||||||
|
‣ <b>Miễn phí và được xây dựng bởi cộng đồng</b>: Chính những người như bạn đã góp phần phát triển ứng dụng bằng cách thêm địa điểm vào OpenStreetMap, kiểm thử tính năng, đóng góp ý kiến, kỹ năng lập trình và tài chính.
|
||||||
|
‣ <b>Minh bạch trong quyết định & tài chính, phi lợi nhuận và mã nguồn mở hoàn toàn.</b>
|
||||||
|
|
||||||
|
<b>Tính năng chính</b>:
|
||||||
|
• Tải bản đồ chi tiết với nhiều địa điểm không có trên Google Maps
|
||||||
|
• Chế độ ngoài trời với các tuyến đi bộ, khu cắm trại, nguồn nước, đỉnh núi, đường đồng mức... được đánh dấu rõ ràng
|
||||||
|
• Đường đi bộ và đường dành cho xe đạp
|
||||||
|
• Địa điểm quan tâm như nhà hàng, trạm xăng, khách sạn, cửa hàng, điểm tham quan...
|
||||||
|
• Tìm kiếm theo tên, địa chỉ hoặc danh mục địa điểm
|
||||||
|
• Dẫn đường với thông báo bằng giọng nói cho đi bộ, đạp xe hoặc lái xe
|
||||||
|
• Đánh dấu địa điểm yêu thích chỉ với một lần chạm
|
||||||
|
• Đọc bài viết Wikipedia offline
|
||||||
|
• Lớp bản đồ tàu điện ngầm và chỉ dẫn di chuyển
|
||||||
|
• Ghi lại lộ trình
|
||||||
|
• Xuất/nhập bookmark và lộ trình dưới dạng KML, KMZ, GPX
|
||||||
|
• Chế độ tối để sử dụng ban đêm
|
||||||
|
• Chỉnh sửa bản đồ cơ bản ngay trong ứng dụng để cải thiện dữ liệu cho mọi người
|
||||||
|
• Hỗ trợ Android Auto
|
||||||
|
|
||||||
|
Hãy báo cáo lỗi, đề xuất ý tưởng và tham gia cộng đồng của chúng tôi tại trang web <i><b>comaps.app</b></i>.
|
||||||
|
|
||||||
|
<b>Tự do ngay trong tay bạn!</b>
|
||||||
|
Khám phá hành trình, điều hướng thế giới với sự riêng tư và tinh thần cộng đồng!
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Định vị bản đồ dễ dàng - Khám phá thế giới quanh bạn - Đồng hành cùng cộng đồng
|
||||||
1
android/app/src/google/play/listings/vi/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps - Định vị riêng tư
|
||||||
@@ -20,6 +20,9 @@
|
|||||||
<uses-feature
|
<uses-feature
|
||||||
android:name="android.hardware.location.gps"
|
android:name="android.hardware.location.gps"
|
||||||
android:required="false"/>
|
android:required="false"/>
|
||||||
|
<uses-permission
|
||||||
|
android:name="android.permission.READ_EXTERNAL_STORAGE"
|
||||||
|
android:maxSdkVersion="22" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
|
||||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
||||||
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
|
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ extern "C"
|
|||||||
curFile.GetRemoteSize(),
|
curFile.GetRemoteSize(),
|
||||||
std::bind(&DownloadFileFinished, ptr, _1),
|
std::bind(&DownloadFileFinished, ptr, _1),
|
||||||
std::bind(&DownloadFileProgress, ptr, _1),
|
std::bind(&DownloadFileProgress, ptr, _1),
|
||||||
512 * 1024, false));
|
0, false));
|
||||||
});
|
});
|
||||||
|
|
||||||
return ERR_FILE_IN_PROGRESS;
|
return ERR_FILE_IN_PROGRESS;
|
||||||
|
|||||||
@@ -1804,74 +1804,4 @@ Java_app_organicmaps_Framework_nativeMemoryWarning(JNIEnv *, jclass)
|
|||||||
return frm()->MemoryWarning();
|
return frm()->MemoryWarning();
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jboolean JNICALL
|
|
||||||
Java_app_organicmaps_Framework_nativeShouldShowProducts(JNIEnv * env, jclass)
|
|
||||||
{
|
|
||||||
return frm()->ShouldShowProducts();
|
|
||||||
}
|
|
||||||
|
|
||||||
JNIEXPORT jobject JNICALL
|
|
||||||
Java_app_organicmaps_Framework_nativeGetProductsConfiguration(JNIEnv * env, jclass)
|
|
||||||
{
|
|
||||||
auto config = frm()->GetProductsConfiguration();
|
|
||||||
if (!config) return nullptr;
|
|
||||||
|
|
||||||
static jclass const productClass = jni::GetGlobalClassRef(
|
|
||||||
env,
|
|
||||||
"app/organicmaps/products/Product"
|
|
||||||
);
|
|
||||||
static jmethodID const productConstructor = jni::GetConstructorID(
|
|
||||||
env,
|
|
||||||
productClass,
|
|
||||||
"(Ljava/lang/String;Ljava/lang/String;)V"
|
|
||||||
);
|
|
||||||
|
|
||||||
jobjectArray products = jni::ToJavaArray(
|
|
||||||
env,
|
|
||||||
productClass,
|
|
||||||
config->GetProducts(),
|
|
||||||
[](JNIEnv * env, products::ProductsConfig::Product const & product)
|
|
||||||
{
|
|
||||||
jni::TScopedLocalRef const title(env, jni::ToJavaString(env, product.GetTitle()));
|
|
||||||
jni::TScopedLocalRef const link(env, jni::ToJavaString(env, product.GetLink()));
|
|
||||||
|
|
||||||
return env->NewObject(
|
|
||||||
productClass,
|
|
||||||
productConstructor,
|
|
||||||
title.get(),
|
|
||||||
link.get()
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
static jclass const productsConfigClass = jni::GetGlobalClassRef(
|
|
||||||
env,
|
|
||||||
"app/organicmaps/products/ProductsConfig"
|
|
||||||
);
|
|
||||||
static jmethodID const productsConfigConstructor = jni::GetConstructorID(
|
|
||||||
env,
|
|
||||||
productsConfigClass,
|
|
||||||
"(Ljava/lang/String;[Lapp/organicmaps/products/Product;)V"
|
|
||||||
);
|
|
||||||
|
|
||||||
jni::TScopedLocalRef const placePagePrompt(env, jni::ToJavaString(env, config->GetPlacePagePrompt()));
|
|
||||||
return env->NewObject(productsConfigClass, productsConfigConstructor, placePagePrompt.get(), products);
|
|
||||||
}
|
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
|
||||||
Java_app_organicmaps_Framework_nativeDidCloseProductsPopup(JNIEnv * env, jclass, jstring reason)
|
|
||||||
{
|
|
||||||
frm()->DidCloseProductsPopup(frm()->FromString(jni::ToNativeString(env, reason)));
|
|
||||||
}
|
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
|
||||||
Java_app_organicmaps_Framework_nativeDidSelectProduct(JNIEnv * env, jclass, jstring title, jstring link)
|
|
||||||
{
|
|
||||||
products::ProductsConfig::Product product(
|
|
||||||
jni::ToNativeString(env, title),
|
|
||||||
jni::ToNativeString(env, link)
|
|
||||||
);
|
|
||||||
|
|
||||||
frm()->DidSelectProduct(product);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|||||||
@@ -321,4 +321,30 @@ Java_app_organicmaps_editor_OpeningHours_nativeIsTimetableStringValid(JNIEnv * e
|
|||||||
{
|
{
|
||||||
return OpeningHours(jni::ToNativeString(env, jSource)).IsValid();
|
return OpeningHours(jni::ToNativeString(env, jSource)).IsValid();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
JNIEXPORT jobject JNICALL
|
||||||
|
Java_app_organicmaps_editor_OpeningHours_nativeCurrentState(JNIEnv * env, jclass clazz, jobjectArray jTts)
|
||||||
|
{
|
||||||
|
TimeTableSet tts = NativeTimetableSet(env, jTts);
|
||||||
|
time_t const now = time(nullptr);
|
||||||
|
|
||||||
|
/// @todo We should check closed/open time for specific feature's timezone.
|
||||||
|
OpeningHours::InfoT ohInfo = MakeOpeningHours(tts).GetInfo(now);
|
||||||
|
jclass ohStateClass = jni::GetGlobalClassRef(env, "app/organicmaps/editor/OhState");
|
||||||
|
jclass ruleStateClass = jni::GetGlobalClassRef(env, "app/organicmaps/editor/OhState$State");
|
||||||
|
|
||||||
|
static const std::unordered_map<RuleState, const char*> ruleState = {
|
||||||
|
{RuleState::Open, "Open"},
|
||||||
|
{RuleState::Closed, "Closed"},
|
||||||
|
{RuleState::Unknown, "Unknown"}
|
||||||
|
};
|
||||||
|
|
||||||
|
jfieldID stateField = env->GetStaticFieldID(ruleStateClass, ruleState.at(ohInfo.state), "Lapp/organicmaps/editor/OhState$State;");
|
||||||
|
jobject stateObj = env->GetStaticObjectField(ruleStateClass, stateField);
|
||||||
|
jmethodID constructor = env->GetMethodID(ohStateClass, "<init>", "(Lapp/organicmaps/editor/OhState$State;JJ)V");
|
||||||
|
jobject javaOhState = env->NewObject(ohStateClass, constructor, stateObj, (jlong) ohInfo.nextTimeOpen, (jlong) ohInfo.nextTimeClosed);
|
||||||
|
|
||||||
|
return javaOhState;
|
||||||
|
}
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|||||||
@@ -17,17 +17,9 @@ using namespace jni;
|
|||||||
|
|
||||||
bool LoadOsmUserPreferences(std::string const & oauthToken, UserPreferences & outPrefs)
|
bool LoadOsmUserPreferences(std::string const & oauthToken, UserPreferences & outPrefs)
|
||||||
{
|
{
|
||||||
try
|
ServerApi06 const api(OsmOAuth::ServerAuth(oauthToken));
|
||||||
{
|
outPrefs = api.GetUserPreferences();
|
||||||
ServerApi06 const api(OsmOAuth::ServerAuth(oauthToken));
|
return (outPrefs.m_id != 0);
|
||||||
outPrefs = api.GetUserPreferences();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (std::exception const & ex)
|
|
||||||
{
|
|
||||||
LOG(LWARNING, ("Can't load user preferences from server: ", ex.what()));
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 24 KiB |
@@ -13,7 +13,6 @@ import app.organicmaps.api.RequestType;
|
|||||||
import app.organicmaps.bookmarks.data.DistanceAndAzimut;
|
import app.organicmaps.bookmarks.data.DistanceAndAzimut;
|
||||||
import app.organicmaps.bookmarks.data.FeatureId;
|
import app.organicmaps.bookmarks.data.FeatureId;
|
||||||
import app.organicmaps.bookmarks.data.MapObject;
|
import app.organicmaps.bookmarks.data.MapObject;
|
||||||
import app.organicmaps.products.ProductsConfig;
|
|
||||||
import app.organicmaps.sdk.routing.JunctionInfo;
|
import app.organicmaps.sdk.routing.JunctionInfo;
|
||||||
import app.organicmaps.sdk.routing.RouteMarkData;
|
import app.organicmaps.sdk.routing.RouteMarkData;
|
||||||
import app.organicmaps.sdk.routing.RouteMarkType;
|
import app.organicmaps.sdk.routing.RouteMarkType;
|
||||||
@@ -347,15 +346,5 @@ public class Framework
|
|||||||
public static native boolean nativeHasPlacePageInfo();
|
public static native boolean nativeHasPlacePageInfo();
|
||||||
|
|
||||||
public static native void nativeMemoryWarning();
|
public static native void nativeMemoryWarning();
|
||||||
|
|
||||||
public static native boolean nativeShouldShowProducts();
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public static native ProductsConfig nativeGetProductsConfiguration();
|
|
||||||
|
|
||||||
public static native void nativeDidCloseProductsPopup(String reason);
|
|
||||||
|
|
||||||
public static native void nativeDidSelectProduct(String title, String link);
|
|
||||||
|
|
||||||
public static native void nativeSaveRoute();
|
public static native void nativeSaveRoute();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,9 +41,9 @@ public class MapFragment extends BaseMwmFragment implements View.OnTouchListener
|
|||||||
mMap.updateMyPositionRoutingOffset(offsetY);
|
mMap.updateMyPositionRoutingOffset(offsetY);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void destroySurface()
|
public void destroySurface(boolean activityIsChangingConfigurations)
|
||||||
{
|
{
|
||||||
mMap.onSurfaceDestroyed(requireActivity().isChangingConfigurations(), isAdded());
|
mMap.onSurfaceDestroyed(activityIsChangingConfigurations, isAdded());
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isContextCreated()
|
public boolean isContextCreated()
|
||||||
|
|||||||
@@ -850,7 +850,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
@Override
|
@Override
|
||||||
public void drawIcon(FloatingActionButton imageView)
|
public void drawIcon(FloatingActionButton imageView)
|
||||||
{
|
{
|
||||||
imageView.setImageResource(R.drawable.ic_question_mark);
|
imageView.setImageResource(R.drawable.ic_logo_monochrome);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1303,7 +1303,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
{
|
{
|
||||||
// Explicitly destroy surface before activity recreation.
|
// Explicitly destroy surface before activity recreation.
|
||||||
if (mMapFragment != null)
|
if (mMapFragment != null)
|
||||||
mMapFragment.destroySurface();
|
mMapFragment.destroySurface(true);
|
||||||
super.recreate();
|
super.recreate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2615,7 +2615,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
items.add(new MenuBottomSheetItem(R.string.share_my_location, R.drawable.ic_share, this::onShareLocationOptionSelected));
|
items.add(new MenuBottomSheetItem(R.string.share_my_location, R.drawable.ic_share, this::onShareLocationOptionSelected));
|
||||||
|
|
||||||
if (!BUTTON_HELP_CODE.equals(activeLeftButton))
|
if (!BUTTON_HELP_CODE.equals(activeLeftButton))
|
||||||
items.add(new MenuBottomSheetItem(R.string.about_help, R.drawable.ic_question_mark, this::showHelp));
|
items.add(new MenuBottomSheetItem(R.string.about_help, R.drawable.ic_logo_monochrome, this::showHelp));
|
||||||
|
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
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;
|
||||||
@@ -16,6 +17,10 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.StringRes;
|
import androidx.annotation.StringRes;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import androidx.core.graphics.Insets;
|
||||||
|
import androidx.core.view.OnApplyWindowInsetsListener;
|
||||||
|
import androidx.core.view.ViewCompat;
|
||||||
|
import androidx.core.view.WindowInsetsCompat;
|
||||||
|
|
||||||
import app.organicmaps.display.DisplayManager;
|
import app.organicmaps.display.DisplayManager;
|
||||||
import app.organicmaps.downloader.DownloaderActivity;
|
import app.organicmaps.downloader.DownloaderActivity;
|
||||||
@@ -69,6 +74,17 @@ public class SplashActivity extends AppCompatActivity
|
|||||||
|
|
||||||
UiThread.cancelDelayedTasks(mInitCoreDelayedTask);
|
UiThread.cancelDelayedTasks(mInitCoreDelayedTask);
|
||||||
setContentView(R.layout.activity_splash);
|
setContentView(R.layout.activity_splash);
|
||||||
|
|
||||||
|
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.root_view), new OnApplyWindowInsetsListener() {
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public WindowInsetsCompat onApplyWindowInsets(@NonNull View v, @NonNull WindowInsetsCompat insets)
|
||||||
|
{
|
||||||
|
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
|
v.setPadding(0, 0, 0, systemBars.bottom);
|
||||||
|
return insets;
|
||||||
|
}
|
||||||
|
});
|
||||||
mPermissionRequest = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(),
|
mPermissionRequest = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(),
|
||||||
result -> Config.setLocationRequested());
|
result -> Config.setLocationRequested());
|
||||||
mApiRequest = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
|
mApiRequest = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import android.view.MenuInflater;
|
|||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
@@ -172,7 +171,7 @@ public class BookmarkCategorySettingsFragment extends BaseMwmToolbarFragment
|
|||||||
return !TextUtils.equals(mCategory.getDescription(), categoryDesc);
|
return !TextUtils.equals(mCategory.getDescription(), categoryDesc);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void clearAndFocus(TextView textView)
|
private void clearAndFocus(TextInputEditText textView)
|
||||||
{
|
{
|
||||||
textView.getEditableText().clear();
|
textView.getEditableText().clear();
|
||||||
textView.requestFocus();
|
textView.requestFocus();
|
||||||
|
|||||||
@@ -4,12 +4,13 @@ import android.content.res.Resources;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.bookmarks.data.BookmarkCategory;
|
import app.organicmaps.bookmarks.data.BookmarkCategory;
|
||||||
import app.organicmaps.bookmarks.data.BookmarkInfo;
|
import app.organicmaps.bookmarks.data.BookmarkInfo;
|
||||||
@@ -439,14 +440,14 @@ public class BookmarkListAdapter extends RecyclerView.Adapter<Holders.BaseBookma
|
|||||||
holder = bookmarkHolder;
|
holder = bookmarkHolder;
|
||||||
break;
|
break;
|
||||||
case TYPE_SECTION:
|
case TYPE_SECTION:
|
||||||
TextView tv = (TextView) inflater.inflate(R.layout.item_category_title, parent, false);
|
MaterialTextView tv = (MaterialTextView) inflater.inflate(R.layout.item_category_title, parent, false);
|
||||||
holder = new Holders.SectionViewHolder(tv);
|
holder = new Holders.SectionViewHolder(tv);
|
||||||
break;
|
break;
|
||||||
case TYPE_DESC:
|
case TYPE_DESC:
|
||||||
View desc = inflater.inflate(R.layout.item_category_description, parent, false);
|
View desc = inflater.inflate(R.layout.item_category_description, parent, false);
|
||||||
TextView moreBtn = desc.findViewById(R.id.more_btn);
|
MaterialTextView moreBtn = desc.findViewById(R.id.more_btn);
|
||||||
TextView text = desc.findViewById(R.id.text);
|
MaterialTextView text = desc.findViewById(R.id.text);
|
||||||
TextView title = desc.findViewById(R.id.title);
|
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));
|
||||||
@@ -537,12 +538,12 @@ public class BookmarkListAdapter extends RecyclerView.Adapter<Holders.BaseBookma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setMoreButtonVisibility(TextView text, TextView moreBtn)
|
private void setMoreButtonVisibility(MaterialTextView text, MaterialTextView moreBtn)
|
||||||
{
|
{
|
||||||
text.post(() -> setShortModeDescription(text, moreBtn));
|
text.post(() -> setShortModeDescription(text, moreBtn));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onMoreButtonClicked(TextView textView, TextView moreBtn)
|
private void onMoreButtonClicked(MaterialTextView textView, MaterialTextView moreBtn)
|
||||||
{
|
{
|
||||||
if (isShortModeDescription(textView))
|
if (isShortModeDescription(textView))
|
||||||
{
|
{
|
||||||
@@ -554,18 +555,18 @@ public class BookmarkListAdapter extends RecyclerView.Adapter<Holders.BaseBookma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isShortModeDescription(TextView text)
|
private boolean isShortModeDescription(MaterialTextView text)
|
||||||
{
|
{
|
||||||
return text.getMaxLines() == MAX_VISIBLE_LINES;
|
return text.getMaxLines() == MAX_VISIBLE_LINES;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setExpandedModeDescription(TextView textView, TextView moreBtn)
|
private void setExpandedModeDescription(MaterialTextView textView, MaterialTextView moreBtn)
|
||||||
{
|
{
|
||||||
textView.setMaxLines(Integer.MAX_VALUE);
|
textView.setMaxLines(Integer.MAX_VALUE);
|
||||||
moreBtn.setVisibility(View.GONE);
|
moreBtn.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setShortModeDescription(TextView textView, TextView moreBtn)
|
private void setShortModeDescription(MaterialTextView textView, MaterialTextView moreBtn)
|
||||||
{
|
{
|
||||||
textView.setMaxLines(MAX_VISIBLE_LINES);
|
textView.setMaxLines(MAX_VISIBLE_LINES);
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import android.view.MenuInflater;
|
|||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ImageView;
|
|
||||||
|
|
||||||
import androidx.activity.result.ActivityResultLauncher;
|
import androidx.activity.result.ActivityResultLauncher;
|
||||||
import androidx.activity.result.contract.ActivityResultContracts;
|
import androidx.activity.result.contract.ActivityResultContracts;
|
||||||
@@ -53,6 +52,7 @@ import app.organicmaps.widget.placepage.BookmarkColorDialogFragment;
|
|||||||
import app.organicmaps.widget.placepage.EditBookmarkFragment;
|
import app.organicmaps.widget.placepage.EditBookmarkFragment;
|
||||||
import app.organicmaps.widget.recycler.DividerItemDecorationWithPadding;
|
import app.organicmaps.widget.recycler.DividerItemDecorationWithPadding;
|
||||||
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
|
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
|
||||||
|
import com.google.android.material.imageview.ShapeableImageView;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -599,7 +599,7 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
|
|||||||
i.putExtra(MwmActivity.EXTRA_BOOKMARK_ID, bookmark.getBookmarkId());
|
i.putExtra(MwmActivity.EXTRA_BOOKMARK_ID, bookmark.getBookmarkId());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showColorDialog(ImageView v, int position)
|
private void showColorDialog(ShapeableImageView v, int position)
|
||||||
{
|
{
|
||||||
BookmarkListAdapter adapter = getBookmarkListAdapter();
|
BookmarkListAdapter adapter = getBookmarkListAdapter();
|
||||||
|
|
||||||
|
|||||||
@@ -4,12 +4,13 @@ import android.content.Context;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.RadioButton;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import com.google.android.material.radiobutton.MaterialRadioButton;
|
||||||
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.bookmarks.data.BookmarkCategory;
|
import app.organicmaps.bookmarks.data.BookmarkCategory;
|
||||||
|
|
||||||
@@ -101,8 +102,8 @@ public class ChooseBookmarkCategoryAdapter extends BaseBookmarkCategoryAdapter<C
|
|||||||
|
|
||||||
static class SingleChoiceHolder extends RecyclerView.ViewHolder
|
static class SingleChoiceHolder extends RecyclerView.ViewHolder
|
||||||
{
|
{
|
||||||
TextView name;
|
MaterialTextView name;
|
||||||
RadioButton checked;
|
MaterialRadioButton checked;
|
||||||
|
|
||||||
public SingleChoiceHolder(View convertView)
|
public SingleChoiceHolder(View convertView)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -6,15 +6,16 @@ import android.location.Location;
|
|||||||
import android.text.Spanned;
|
import android.text.Spanned;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.CheckBox;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.PluralsRes;
|
import androidx.annotation.PluralsRes;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import com.google.android.material.imageview.ShapeableImageView;
|
||||||
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
|
import com.google.android.material.checkbox.MaterialCheckBox;
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.adapter.OnItemClickListener;
|
import app.organicmaps.adapter.OnItemClickListener;
|
||||||
import app.organicmaps.bookmarks.data.BookmarkCategory;
|
import app.organicmaps.bookmarks.data.BookmarkCategory;
|
||||||
@@ -34,9 +35,9 @@ public class Holders
|
|||||||
public static class GeneralViewHolder extends RecyclerView.ViewHolder
|
public static class GeneralViewHolder extends RecyclerView.ViewHolder
|
||||||
{
|
{
|
||||||
@NonNull
|
@NonNull
|
||||||
private final TextView mText;
|
private final MaterialTextView mText;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final ImageView mImage;
|
private final ShapeableImageView mImage;
|
||||||
|
|
||||||
GeneralViewHolder(@NonNull View itemView)
|
GeneralViewHolder(@NonNull View itemView)
|
||||||
{
|
{
|
||||||
@@ -46,13 +47,13 @@ public class Holders
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public TextView getText()
|
public MaterialTextView getText()
|
||||||
{
|
{
|
||||||
return mText;
|
return mText;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public ImageView getImage()
|
public ShapeableImageView getImage()
|
||||||
{
|
{
|
||||||
return mImage;
|
return mImage;
|
||||||
}
|
}
|
||||||
@@ -61,9 +62,9 @@ public class Holders
|
|||||||
public static class HeaderViewHolder extends RecyclerView.ViewHolder
|
public static class HeaderViewHolder extends RecyclerView.ViewHolder
|
||||||
{
|
{
|
||||||
@NonNull
|
@NonNull
|
||||||
private final TextView mButton;
|
private final MaterialTextView mButton;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final TextView mText;
|
private final MaterialTextView mText;
|
||||||
|
|
||||||
|
|
||||||
HeaderViewHolder(@NonNull View itemView)
|
HeaderViewHolder(@NonNull View itemView)
|
||||||
@@ -74,13 +75,13 @@ public class Holders
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public TextView getText()
|
public MaterialTextView getText()
|
||||||
{
|
{
|
||||||
return mText;
|
return mText;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public TextView getButton()
|
public MaterialTextView getButton()
|
||||||
{
|
{
|
||||||
return mButton;
|
return mButton;
|
||||||
}
|
}
|
||||||
@@ -168,7 +169,7 @@ public class Holders
|
|||||||
protected BookmarkCategory mEntity;
|
protected BookmarkCategory mEntity;
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
protected final TextView mSize;
|
protected final MaterialTextView mSize;
|
||||||
|
|
||||||
public CategoryViewHolderBase(@NonNull View root)
|
public CategoryViewHolderBase(@NonNull View root)
|
||||||
{
|
{
|
||||||
@@ -229,9 +230,9 @@ public class Holders
|
|||||||
@NonNull
|
@NonNull
|
||||||
private final View mView;
|
private final View mView;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final TextView mName;
|
private final MaterialTextView mName;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final CheckBox mVisibilityMarker;
|
private final MaterialCheckBox mVisibilityMarker;
|
||||||
|
|
||||||
CollectionViewHolder(@NonNull View root)
|
CollectionViewHolder(@NonNull View root)
|
||||||
{
|
{
|
||||||
@@ -268,11 +269,11 @@ public class Holders
|
|||||||
static class CategoryViewHolder extends CategoryViewHolderBase
|
static class CategoryViewHolder extends CategoryViewHolderBase
|
||||||
{
|
{
|
||||||
@NonNull
|
@NonNull
|
||||||
private final TextView mName;
|
private final MaterialTextView mName;
|
||||||
@NonNull
|
@NonNull
|
||||||
CheckBox mVisibilityMarker;
|
MaterialCheckBox mVisibilityMarker;
|
||||||
@NonNull
|
@NonNull
|
||||||
ImageView mMoreButton;
|
ShapeableImageView mMoreButton;
|
||||||
|
|
||||||
CategoryViewHolder(@NonNull View root)
|
CategoryViewHolder(@NonNull View root)
|
||||||
{
|
{
|
||||||
@@ -338,11 +339,11 @@ public class Holders
|
|||||||
static class BookmarkViewHolder extends BaseBookmarkHolder
|
static class BookmarkViewHolder extends BaseBookmarkHolder
|
||||||
{
|
{
|
||||||
@NonNull
|
@NonNull
|
||||||
private final ImageView mIcon;
|
private final ShapeableImageView mIcon;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final TextView mName;
|
private final MaterialTextView mName;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final TextView mDistance;
|
private final MaterialTextView mDistance;
|
||||||
|
|
||||||
BookmarkViewHolder(@NonNull View itemView)
|
BookmarkViewHolder(@NonNull View itemView)
|
||||||
{
|
{
|
||||||
@@ -384,12 +385,12 @@ public class Holders
|
|||||||
static class TrackViewHolder extends BaseBookmarkHolder
|
static class TrackViewHolder extends BaseBookmarkHolder
|
||||||
{
|
{
|
||||||
@NonNull
|
@NonNull
|
||||||
private final ImageView mIcon;
|
private final ShapeableImageView mIcon;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final TextView mName;
|
private final MaterialTextView mName;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final TextView mDistance;
|
private final MaterialTextView mDistance;
|
||||||
private final ImageView mMoreButton;
|
private final ShapeableImageView mMoreButton;
|
||||||
|
|
||||||
TrackViewHolder(@NonNull View itemView)
|
TrackViewHolder(@NonNull View itemView)
|
||||||
{
|
{
|
||||||
@@ -424,16 +425,16 @@ public class Holders
|
|||||||
|
|
||||||
public void setTrackIconClickListener(IconClickListener listener)
|
public void setTrackIconClickListener(IconClickListener listener)
|
||||||
{
|
{
|
||||||
mIcon.setOnClickListener(v -> listener.onItemClick((ImageView) v, getBindingAdapterPosition()));
|
mIcon.setOnClickListener(v -> listener.onItemClick((ShapeableImageView) v, getBindingAdapterPosition()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class SectionViewHolder extends BaseBookmarkHolder
|
public static class SectionViewHolder extends BaseBookmarkHolder
|
||||||
{
|
{
|
||||||
@NonNull
|
@NonNull
|
||||||
private final TextView mView;
|
private final MaterialTextView mView;
|
||||||
|
|
||||||
SectionViewHolder(@NonNull TextView itemView)
|
SectionViewHolder(@NonNull MaterialTextView itemView)
|
||||||
{
|
{
|
||||||
super(itemView);
|
super(itemView);
|
||||||
mView = itemView;
|
mView = itemView;
|
||||||
@@ -452,9 +453,9 @@ 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 TextView mTitle;
|
private final MaterialTextView mTitle;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final TextView mDescText;
|
private final MaterialTextView mDescText;
|
||||||
|
|
||||||
DescriptionViewHolder(@NonNull View itemView, @NonNull BookmarkCategory category)
|
DescriptionViewHolder(@NonNull View itemView, @NonNull BookmarkCategory category)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ import android.view.LayoutInflater;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ArrayAdapter;
|
import android.widget.ArrayAdapter;
|
||||||
import android.widget.ImageView;
|
|
||||||
|
import com.google.android.material.imageview.ShapeableImageView;
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.bookmarks.data.Icon;
|
import app.organicmaps.bookmarks.data.Icon;
|
||||||
@@ -61,7 +62,7 @@ public class IconsAdapter extends ArrayAdapter<Icon>
|
|||||||
|
|
||||||
private static class SpinnerViewHolder
|
private static class SpinnerViewHolder
|
||||||
{
|
{
|
||||||
final ImageView icon;
|
final ShapeableImageView icon;
|
||||||
|
|
||||||
SpinnerViewHolder(View convertView)
|
SpinnerViewHolder(View convertView)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package app.organicmaps.bookmarks.data;
|
package app.organicmaps.bookmarks.data;
|
||||||
|
|
||||||
import android.widget.ImageView;
|
import com.google.android.material.imageview.ShapeableImageView;
|
||||||
|
|
||||||
public interface IconClickListener
|
public interface IconClickListener
|
||||||
{
|
{
|
||||||
void onItemClick(ImageView v, int position);
|
void onItemClick(ShapeableImageView v, int position);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package app.organicmaps.downloader;
|
package app.organicmaps.downloader;
|
||||||
|
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.Button;
|
|
||||||
|
|
||||||
|
import com.google.android.material.button.MaterialButton;
|
||||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.util.StringUtils;
|
import app.organicmaps.util.StringUtils;
|
||||||
@@ -14,7 +14,7 @@ class BottomPanel
|
|||||||
{
|
{
|
||||||
private final DownloaderFragment mFragment;
|
private final DownloaderFragment mFragment;
|
||||||
private final FloatingActionButton mFab;
|
private final FloatingActionButton mFab;
|
||||||
private final Button mButton;
|
private final MaterialButton mButton;
|
||||||
|
|
||||||
private final View.OnClickListener mDownloadListener = new View.OnClickListener()
|
private final View.OnClickListener mDownloadListener = new View.OnClickListener()
|
||||||
{
|
{
|
||||||
@@ -45,6 +45,15 @@ class BottomPanel
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private final View.OnClickListener mRetryListener = new View.OnClickListener()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void onClick(View v)
|
||||||
|
{
|
||||||
|
MapManager.warn3gAndRetry(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
BottomPanel(DownloaderFragment fragment, View frame)
|
BottomPanel(DownloaderFragment fragment, View frame)
|
||||||
{
|
{
|
||||||
mFragment = fragment;
|
mFragment = fragment;
|
||||||
@@ -72,6 +81,12 @@ class BottomPanel
|
|||||||
mButton.setOnClickListener(mDownloadListener);
|
mButton.setOnClickListener(mDownloadListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setRetryFailedStates()
|
||||||
|
{
|
||||||
|
mButton.setText(R.string.downloader_retry);
|
||||||
|
mButton.setOnClickListener(mRetryListener);
|
||||||
|
}
|
||||||
|
|
||||||
private void setCancelState()
|
private void setCancelState()
|
||||||
{
|
{
|
||||||
mButton.setText(R.string.downloader_cancel_all);
|
mButton.setText(R.string.downloader_cancel_all);
|
||||||
@@ -101,7 +116,7 @@ class BottomPanel
|
|||||||
} // Special case for "Countries" node when no maps currently downloaded.
|
} // Special case for "Countries" node when no maps currently downloaded.
|
||||||
case STATUS_DOWNLOADABLE, STATUS_DONE, STATUS_PARTLY -> show = false;
|
case STATUS_DOWNLOADABLE, STATUS_DONE, STATUS_PARTLY -> show = false;
|
||||||
case STATUS_PROGRESS, STATUS_APPLYING, STATUS_ENQUEUED -> setCancelState();
|
case STATUS_PROGRESS, STATUS_APPLYING, STATUS_ENQUEUED -> setCancelState();
|
||||||
case STATUS_FAILED -> setDownloadAllState();
|
case STATUS_FAILED -> setRetryFailedStates();
|
||||||
default -> throw new IllegalArgumentException("Inappropriate status for \"" + root + "\": " + status);
|
default -> throw new IllegalArgumentException("Inappropriate status for \"" + root + "\": " + status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -119,6 +134,7 @@ class BottomPanel
|
|||||||
}
|
}
|
||||||
case STATUS_DONE -> show = false;
|
case STATUS_DONE -> show = false;
|
||||||
case STATUS_PROGRESS, STATUS_APPLYING, STATUS_ENQUEUED -> setCancelState();
|
case STATUS_PROGRESS, STATUS_APPLYING, STATUS_ENQUEUED -> setCancelState();
|
||||||
|
case STATUS_FAILED -> setRetryFailedStates();
|
||||||
default -> setDownloadAllState();
|
default -> setDownloadAllState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -209,7 +209,7 @@ class ChunkTask extends AsyncTask<Void, byte[], Integer>
|
|||||||
// @TODO Else display received web page to user - router is redirecting us to some page
|
// @TODO Else display received web page to user - router is redirecting us to some page
|
||||||
}
|
}
|
||||||
|
|
||||||
return downloadFromStream(new BufferedInputStream(urlConnection.getInputStream(), 65536));
|
return downloadFromStream(new BufferedInputStream(urlConnection.getInputStream(), 128 * Constants.KB));
|
||||||
} catch (final MalformedURLException ex)
|
} catch (final MalformedURLException ex)
|
||||||
{
|
{
|
||||||
Logger.e(TAG, "Invalid url: " + mUrl, ex);
|
Logger.e(TAG, "Invalid url: " + mUrl, ex);
|
||||||
@@ -229,7 +229,7 @@ class ChunkTask extends AsyncTask<Void, byte[], Integer>
|
|||||||
{
|
{
|
||||||
// Because of timeouts in InputStream.read (for bad connection),
|
// Because of timeouts in InputStream.read (for bad connection),
|
||||||
// try to introduce dynamic buffer size to read in one query.
|
// try to introduce dynamic buffer size to read in one query.
|
||||||
final int[] arrSize = {64, 32, 1};
|
final int[] arrSize = {128, 32, 1};
|
||||||
int ret = IO_EXCEPTION;
|
int ret = IO_EXCEPTION;
|
||||||
|
|
||||||
for (int size : arrSize)
|
for (int size : arrSize)
|
||||||
@@ -240,7 +240,7 @@ class ChunkTask extends AsyncTask<Void, byte[], Integer>
|
|||||||
break;
|
break;
|
||||||
} catch (final IOException ex)
|
} catch (final IOException ex)
|
||||||
{
|
{
|
||||||
Logger.e(TAG, "IOException in downloadFromStream for chunk size: " + size, ex);
|
Logger.e(TAG, "IOException in downloadFromStream for buffer size: " + size, ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,13 +6,14 @@ import android.text.TextUtils;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.Button;
|
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
|
|
||||||
|
import com.google.android.material.button.MaterialButton;
|
||||||
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.base.BaseMwmFragment;
|
import app.organicmaps.base.BaseMwmFragment;
|
||||||
import app.organicmaps.base.BaseMwmFragmentActivity;
|
import app.organicmaps.base.BaseMwmFragmentActivity;
|
||||||
@@ -30,10 +31,10 @@ public class CountrySuggestFragment extends BaseMwmFragment implements View.OnCl
|
|||||||
private LinearLayout mLlSelectDownload;
|
private LinearLayout mLlSelectDownload;
|
||||||
private LinearLayout mLlActiveDownload;
|
private LinearLayout mLlActiveDownload;
|
||||||
private WheelProgressView mWpvDownloadProgress;
|
private WheelProgressView mWpvDownloadProgress;
|
||||||
private TextView mTvCountry;
|
private MaterialTextView mTvCountry;
|
||||||
private TextView mTvActiveCountry;
|
private MaterialTextView mTvActiveCountry;
|
||||||
private TextView mTvProgress;
|
private MaterialTextView mTvProgress;
|
||||||
private Button mBtnDownloadMap;
|
private MaterialButton mBtnDownloadMap;
|
||||||
|
|
||||||
private CountryItem mCurrentCountry;
|
private CountryItem mCurrentCountry;
|
||||||
private CountryItem mDownloadingCountry;
|
private CountryItem mDownloadingCountry;
|
||||||
@@ -150,7 +151,7 @@ public class CountrySuggestFragment extends BaseMwmFragment implements View.OnCl
|
|||||||
mLlNoLocation = view.findViewById(R.id.ll__location_unknown);
|
mLlNoLocation = view.findViewById(R.id.ll__location_unknown);
|
||||||
mBtnDownloadMap = view.findViewById(R.id.btn__download_map);
|
mBtnDownloadMap = view.findViewById(R.id.btn__download_map);
|
||||||
mBtnDownloadMap.setOnClickListener(this);
|
mBtnDownloadMap.setOnClickListener(this);
|
||||||
Button selectMap = view.findViewById(R.id.btn__select_map);
|
MaterialButton selectMap = view.findViewById(R.id.btn__select_map);
|
||||||
selectMap.setOnClickListener(this);
|
selectMap.setOnClickListener(this);
|
||||||
mWpvDownloadProgress = view.findViewById(R.id.wpv__download_progress);
|
mWpvDownloadProgress = view.findViewById(R.id.wpv__download_progress);
|
||||||
mWpvDownloadProgress.setOnClickListener(this);
|
mWpvDownloadProgress.setOnClickListener(this);
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ public class DownloaderNotifier
|
|||||||
.setAutoCancel(true)
|
.setAutoCancel(true)
|
||||||
.setCategory(NotificationCompat.CATEGORY_ERROR)
|
.setCategory(NotificationCompat.CATEGORY_ERROR)
|
||||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||||
.setSmallIcon(R.drawable.ic_launcher_small)
|
.setSmallIcon(R.drawable.ic_logo_small)
|
||||||
.setColor(ContextCompat.getColor(mContext, R.color.notification))
|
.setColor(ContextCompat.getColor(mContext, R.color.notification))
|
||||||
.setContentTitle(title)
|
.setContentTitle(title)
|
||||||
.setContentText(content)
|
.setContentText(content)
|
||||||
@@ -124,7 +124,7 @@ public class DownloaderNotifier
|
|||||||
return new NotificationCompat.Builder(mContext, CHANNEL_ID)
|
return new NotificationCompat.Builder(mContext, CHANNEL_ID)
|
||||||
.setAutoCancel(true)
|
.setAutoCancel(true)
|
||||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||||
.setSmallIcon(R.drawable.ic_launcher)
|
.setSmallIcon(R.drawable.ic_logo_small)
|
||||||
.setColor(ContextCompat.getColor(mContext, R.color.notification))
|
.setColor(ContextCompat.getColor(mContext, R.color.notification))
|
||||||
.setShowWhen(true)
|
.setShowWhen(true)
|
||||||
.setContentTitle(title)
|
.setContentTitle(title)
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package app.organicmaps.downloader;
|
|||||||
import static android.Manifest.permission.POST_NOTIFICATIONS;
|
import static android.Manifest.permission.POST_NOTIFICATIONS;
|
||||||
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||||
|
|
||||||
|
import android.app.ForegroundServiceStartNotAllowedException;
|
||||||
import android.app.Service;
|
import android.app.Service;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.ServiceInfo;
|
import android.content.pm.ServiceInfo;
|
||||||
@@ -42,10 +43,24 @@ public class DownloaderService extends Service implements MapManager.StorageCall
|
|||||||
|
|
||||||
var notification = mNotifier.buildProgressNotification();
|
var notification = mNotifier.buildProgressNotification();
|
||||||
Logger.i(TAG, "Starting Downloader Foreground Service");
|
Logger.i(TAG, "Starting Downloader Foreground Service");
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
|
try
|
||||||
ServiceCompat.startForeground(this, DownloaderNotifier.NOTIFICATION_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC);
|
{
|
||||||
else
|
int type = 0;
|
||||||
ServiceCompat.startForeground(this, DownloaderNotifier.NOTIFICATION_ID, notification, 0);
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
|
||||||
|
type = ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC;
|
||||||
|
ServiceCompat.startForeground(this, DownloaderNotifier.NOTIFICATION_ID, notification, type);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S &&
|
||||||
|
e instanceof ForegroundServiceStartNotAllowedException)
|
||||||
|
{
|
||||||
|
// App not in a valid state to start foreground service (e.g started from bg)
|
||||||
|
Logger.e(TAG, "Not in a valid state to start foreground service", e);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Logger.e(TAG, "Failed to promote the service to foreground", e);
|
||||||
|
}
|
||||||
|
|
||||||
return START_NOT_STICKY;
|
return START_NOT_STICKY;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,11 +4,13 @@ import android.location.Location;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.Button;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.core.view.ViewCompat;
|
import androidx.core.view.ViewCompat;
|
||||||
|
|
||||||
|
import com.google.android.material.button.MaterialButton;
|
||||||
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
|
|
||||||
import app.organicmaps.MwmActivity;
|
import app.organicmaps.MwmActivity;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.location.LocationHelper;
|
import app.organicmaps.location.LocationHelper;
|
||||||
@@ -28,11 +30,11 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
|
|||||||
|
|
||||||
private final MwmActivity mActivity;
|
private final MwmActivity mActivity;
|
||||||
private final View mFrame;
|
private final View mFrame;
|
||||||
private final TextView mParent;
|
private final MaterialTextView mParent;
|
||||||
private final TextView mTitle;
|
private final MaterialTextView mTitle;
|
||||||
private final TextView mSize;
|
private final MaterialTextView mSize;
|
||||||
private final WheelProgressView mProgress;
|
private final WheelProgressView mProgress;
|
||||||
private final Button mButton;
|
private final MaterialButton mButton;
|
||||||
|
|
||||||
private int mStorageSubscriptionSlot;
|
private int mStorageSubscriptionSlot;
|
||||||
|
|
||||||
|
|||||||
@@ -7,8 +7,6 @@ import android.view.LayoutInflater;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.webkit.WebView;
|
import android.webkit.WebView;
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.annotation.DrawableRes;
|
import androidx.annotation.DrawableRes;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
@@ -20,7 +18,10 @@ import app.organicmaps.util.Constants;
|
|||||||
import app.organicmaps.util.Graphics;
|
import app.organicmaps.util.Graphics;
|
||||||
import app.organicmaps.util.InputUtils;
|
import app.organicmaps.util.InputUtils;
|
||||||
import app.organicmaps.util.UiUtils;
|
import app.organicmaps.util.UiUtils;
|
||||||
|
|
||||||
|
import com.google.android.material.imageview.ShapeableImageView;
|
||||||
import com.google.android.material.textfield.TextInputEditText;
|
import com.google.android.material.textfield.TextInputEditText;
|
||||||
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
|
|
||||||
public class AdvancedTimetableFragment extends BaseMwmFragment
|
public class AdvancedTimetableFragment extends BaseMwmFragment
|
||||||
implements View.OnClickListener, TimetableProvider
|
implements View.OnClickListener, TimetableProvider
|
||||||
@@ -28,8 +29,8 @@ public class AdvancedTimetableFragment extends BaseMwmFragment
|
|||||||
private boolean mIsExampleShown;
|
private boolean mIsExampleShown;
|
||||||
private TextInputEditText mInput;
|
private TextInputEditText mInput;
|
||||||
private WebView mExample;
|
private WebView mExample;
|
||||||
private TextView mExamplesTitle;
|
private MaterialTextView mExamplesTitle;
|
||||||
private static ImageView mSaveButton;
|
private static ShapeableImageView mSaveButton;
|
||||||
@Nullable
|
@Nullable
|
||||||
private String mInitTimetables;
|
private String mInitTimetables;
|
||||||
@Nullable
|
@Nullable
|
||||||
|
|||||||
@@ -3,13 +3,14 @@ package app.organicmaps.editor;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.CheckBox;
|
|
||||||
import android.widget.CompoundButton;
|
import android.widget.CompoundButton;
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import com.google.android.material.checkbox.MaterialCheckBox;
|
||||||
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -100,8 +101,8 @@ public class CuisineAdapter extends RecyclerView.Adapter<CuisineAdapter.ViewHold
|
|||||||
|
|
||||||
protected class ViewHolder extends RecyclerView.ViewHolder implements CompoundButton.OnCheckedChangeListener
|
protected class ViewHolder extends RecyclerView.ViewHolder implements CompoundButton.OnCheckedChangeListener
|
||||||
{
|
{
|
||||||
final TextView cuisine;
|
final MaterialTextView cuisine;
|
||||||
final CheckBox selected;
|
final MaterialCheckBox selected;
|
||||||
|
|
||||||
public ViewHolder(View itemView)
|
public ViewHolder(View itemView)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,8 +8,6 @@ import android.text.method.LinkMovementMethod;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.annotation.CallSuper;
|
import androidx.annotation.CallSuper;
|
||||||
import androidx.annotation.DrawableRes;
|
import androidx.annotation.DrawableRes;
|
||||||
@@ -22,8 +20,11 @@ import androidx.recyclerview.widget.LinearLayoutManager;
|
|||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
import com.google.android.material.imageview.ShapeableImageView;
|
||||||
import com.google.android.material.textfield.TextInputLayout;
|
import com.google.android.material.textfield.TextInputLayout;
|
||||||
import com.google.android.material.textfield.TextInputEditText;
|
import com.google.android.material.textfield.TextInputEditText;
|
||||||
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
|
|
||||||
import app.organicmaps.Framework;
|
import app.organicmaps.Framework;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.base.BaseMwmFragment;
|
import app.organicmaps.base.BaseMwmFragment;
|
||||||
@@ -46,7 +47,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
|||||||
{
|
{
|
||||||
final static String LAST_INDEX_OF_NAMES_ARRAY = "LastIndexOfNamesArray";
|
final static String LAST_INDEX_OF_NAMES_ARRAY = "LastIndexOfNamesArray";
|
||||||
|
|
||||||
private TextView mCategory;
|
private MaterialTextView mCategory;
|
||||||
private View mCardName;
|
private View mCardName;
|
||||||
private View mCardAddress;
|
private View mCardAddress;
|
||||||
private View mCardDetails;
|
private View mCardDetails;
|
||||||
@@ -89,20 +90,20 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
|||||||
};
|
};
|
||||||
|
|
||||||
private MultilanguageAdapter mNamesAdapter;
|
private MultilanguageAdapter mNamesAdapter;
|
||||||
private TextView mNamesCaption;
|
private MaterialTextView mNamesCaption;
|
||||||
private TextView mAddLanguage;
|
private MaterialTextView mAddLanguage;
|
||||||
private TextView mMoreLanguages;
|
private MaterialTextView mMoreLanguages;
|
||||||
|
|
||||||
private TextView mStreet;
|
private MaterialTextView mStreet;
|
||||||
private TextInputEditText mHouseNumber;
|
private TextInputEditText mHouseNumber;
|
||||||
private TextInputEditText mBuildingLevels;
|
private TextInputEditText mBuildingLevels;
|
||||||
|
|
||||||
// Define Metadata entries, that have more tricky logic, separately.
|
// Define Metadata entries, that have more tricky logic, separately.
|
||||||
private TextView mPhone;
|
private MaterialTextView mPhone;
|
||||||
private TextView mEditPhoneLink;
|
private MaterialTextView mEditPhoneLink;
|
||||||
private TextView mCuisine;
|
private MaterialTextView mCuisine;
|
||||||
private SwitchCompat mWifi;
|
private SwitchCompat mWifi;
|
||||||
private TextView mSelfService;
|
private MaterialTextView mSelfService;
|
||||||
private SwitchCompat mOutdoorSeating;
|
private SwitchCompat mOutdoorSeating;
|
||||||
|
|
||||||
// Default Metadata entries.
|
// Default Metadata entries.
|
||||||
@@ -132,12 +133,12 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
|||||||
private TextInputLayout mInputBuildingLevels;
|
private TextInputLayout mInputBuildingLevels;
|
||||||
|
|
||||||
private View mEmptyOpeningHours;
|
private View mEmptyOpeningHours;
|
||||||
private TextView mOpeningHours;
|
private MaterialTextView mOpeningHours;
|
||||||
private View mEditOpeningHours;
|
private View mEditOpeningHours;
|
||||||
private TextInputEditText mDescription;
|
private TextInputEditText mDescription;
|
||||||
private final Map<Metadata.MetadataType, View> mDetailsBlocks = new HashMap<>();
|
private final Map<Metadata.MetadataType, View> mDetailsBlocks = new HashMap<>();
|
||||||
private final Map<Metadata.MetadataType, View> mSocialMediaBlocks = new HashMap<>();
|
private final Map<Metadata.MetadataType, View> mSocialMediaBlocks = new HashMap<>();
|
||||||
private TextView mReset;
|
private MaterialTextView mReset;
|
||||||
|
|
||||||
private EditorHostFragment mParent;
|
private EditorHostFragment mParent;
|
||||||
|
|
||||||
@@ -489,7 +490,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
|||||||
mOpeningHours.setOnClickListener(this);
|
mOpeningHours.setOnClickListener(this);
|
||||||
final View cardMore = view.findViewById(R.id.cv__more);
|
final View cardMore = view.findViewById(R.id.cv__more);
|
||||||
mDescription = findInput(cardMore);
|
mDescription = findInput(cardMore);
|
||||||
TextView osmInfo = view.findViewById(R.id.osm_info);
|
MaterialTextView osmInfo = view.findViewById(R.id.osm_info);
|
||||||
osmInfo.setMovementMethod(LinkMovementMethod.getInstance());
|
osmInfo.setMovementMethod(LinkMovementMethod.getInstance());
|
||||||
mReset = view.findViewById(R.id.reset);
|
mReset = view.findViewById(R.id.reset);
|
||||||
mReset.setOnClickListener(this);
|
mReset.setOnClickListener(this);
|
||||||
@@ -529,7 +530,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
|||||||
|
|
||||||
private static TextInputEditText findInputAndInitBlock(View blockWithInput, @DrawableRes int icon, String hint)
|
private static TextInputEditText findInputAndInitBlock(View blockWithInput, @DrawableRes int icon, String hint)
|
||||||
{
|
{
|
||||||
((ImageView) blockWithInput.findViewById(R.id.icon)).setImageResource(icon);
|
((ShapeableImageView) blockWithInput.findViewById(R.id.icon)).setImageResource(icon);
|
||||||
final TextInputLayout input = blockWithInput.findViewById(R.id.custom_input);
|
final TextInputLayout input = blockWithInput.findViewById(R.id.custom_input);
|
||||||
input.setHint(hint);
|
input.setHint(hint);
|
||||||
return input.findViewById(R.id.input);
|
return input.findViewById(R.id.input);
|
||||||
|
|||||||
@@ -4,12 +4,13 @@ import android.text.method.LinkMovementMethod;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.editor.data.FeatureCategory;
|
import app.organicmaps.editor.data.FeatureCategory;
|
||||||
import app.organicmaps.util.UiUtils;
|
import app.organicmaps.util.UiUtils;
|
||||||
@@ -78,7 +79,7 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
|||||||
protected class FeatureViewHolder extends RecyclerView.ViewHolder
|
protected class FeatureViewHolder extends RecyclerView.ViewHolder
|
||||||
{
|
{
|
||||||
@NonNull
|
@NonNull
|
||||||
private final TextView mName;
|
private final MaterialTextView mName;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final View mSelected;
|
private final View mSelected;
|
||||||
|
|
||||||
@@ -106,7 +107,7 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
|||||||
FooterViewHolder(@NonNull View itemView)
|
FooterViewHolder(@NonNull View itemView)
|
||||||
{
|
{
|
||||||
super(itemView);
|
super(itemView);
|
||||||
TextView categoryUnsuitableText = itemView.findViewById(R.id.editor_category_unsuitable_text);
|
MaterialTextView categoryUnsuitableText = itemView.findViewById(R.id.editor_category_unsuitable_text);
|
||||||
categoryUnsuitableText.setMovementMethod(LinkMovementMethod.getInstance());
|
categoryUnsuitableText.setMovementMethod(LinkMovementMethod.getInstance());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import android.text.format.DateFormat;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.TextView;
|
|
||||||
import android.widget.TimePicker;
|
import android.widget.TimePicker;
|
||||||
|
|
||||||
import androidx.annotation.IntRange;
|
import androidx.annotation.IntRange;
|
||||||
@@ -21,6 +20,8 @@ import androidx.fragment.app.FragmentManager;
|
|||||||
|
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
import com.google.android.material.tabs.TabLayout;
|
import com.google.android.material.tabs.TabLayout;
|
||||||
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.base.BaseMwmDialogFragment;
|
import app.organicmaps.base.BaseMwmDialogFragment;
|
||||||
import app.organicmaps.editor.data.HoursMinutes;
|
import app.organicmaps.editor.data.HoursMinutes;
|
||||||
@@ -134,19 +135,19 @@ public class HoursMinutesPickerFragment extends BaseMwmDialogFragment
|
|||||||
if (id != 0)
|
if (id != 0)
|
||||||
{
|
{
|
||||||
mPickerHoursLabel = mPicker.findViewById(id);
|
mPickerHoursLabel = mPicker.findViewById(id);
|
||||||
if (!(mPickerHoursLabel instanceof TextView))
|
if (!(mPickerHoursLabel instanceof MaterialTextView))
|
||||||
mPickerHoursLabel = null;
|
mPickerHoursLabel = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
mTabs = root.findViewById(R.id.tabs);
|
mTabs = root.findViewById(R.id.tabs);
|
||||||
TextView tabView = (TextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);
|
MaterialTextView tabView = (MaterialTextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);
|
||||||
tabView.setText(getResources().getString(R.string.editor_time_from));
|
tabView.setText(getResources().getString(R.string.editor_time_from));
|
||||||
final ColorStateList textColor = AppCompatResources.getColorStateList(requireContext(),
|
final ColorStateList textColor = AppCompatResources.getColorStateList(requireContext(),
|
||||||
ThemeUtils.isNightTheme(requireContext()) ? R.color.accent_color_selector_night
|
ThemeUtils.isNightTheme(requireContext()) ? R.color.accent_color_selector_night
|
||||||
: R.color.accent_color_selector);
|
: R.color.accent_color_selector);
|
||||||
tabView.setTextColor(textColor);
|
tabView.setTextColor(textColor);
|
||||||
mTabs.addTab(mTabs.newTab().setCustomView(tabView), true);
|
mTabs.addTab(mTabs.newTab().setCustomView(tabView), true);
|
||||||
tabView = (TextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);
|
tabView = (MaterialTextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);
|
||||||
tabView.setText(getResources().getString(R.string.editor_time_to));
|
tabView.setText(getResources().getString(R.string.editor_time_to));
|
||||||
tabView.setTextColor(textColor);
|
tabView.setTextColor(textColor);
|
||||||
mTabs.addTab(mTabs.newTab().setCustomView(tabView), true);
|
mTabs.addTab(mTabs.newTab().setCustomView(tabView), true);
|
||||||
|
|||||||
@@ -3,11 +3,12 @@ package app.organicmaps.editor;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.editor.data.Language;
|
import app.organicmaps.editor.data.Language;
|
||||||
|
|
||||||
@@ -42,12 +43,12 @@ public class LanguagesAdapter extends RecyclerView.Adapter<LanguagesAdapter.Hold
|
|||||||
|
|
||||||
protected class Holder extends RecyclerView.ViewHolder
|
protected class Holder extends RecyclerView.ViewHolder
|
||||||
{
|
{
|
||||||
TextView name;
|
MaterialTextView name;
|
||||||
|
|
||||||
public Holder(View itemView)
|
public Holder(View itemView)
|
||||||
{
|
{
|
||||||
super(itemView);
|
super(itemView);
|
||||||
name = (TextView) itemView;
|
name = (MaterialTextView) itemView;
|
||||||
itemView.setOnClickListener(v -> mFragment.onLanguageSelected(mLanguages[getBindingAdapterPosition()]));
|
itemView.setOnClickListener(v -> mFragment.onLanguageSelected(mLanguages[getBindingAdapterPosition()]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package app.organicmaps.editor;
|
||||||
|
|
||||||
|
import androidx.annotation.Keep;
|
||||||
|
|
||||||
|
// Used by JNI.
|
||||||
|
@Keep
|
||||||
|
public class OhState
|
||||||
|
{
|
||||||
|
public enum State
|
||||||
|
{
|
||||||
|
Open,
|
||||||
|
Closed,
|
||||||
|
Unknown
|
||||||
|
}
|
||||||
|
|
||||||
|
public State state;
|
||||||
|
/** Unix timestamp in seconds**/
|
||||||
|
public long nextTimeOpen;
|
||||||
|
/** Unix timestamp in seconds **/
|
||||||
|
public long nextTimeClosed;
|
||||||
|
|
||||||
|
// Used by JNI.
|
||||||
|
@Keep
|
||||||
|
public OhState(State state, long nextTimeOpen, long nextTimeClosed)
|
||||||
|
{
|
||||||
|
this.state = state;
|
||||||
|
this.nextTimeOpen = nextTimeOpen;
|
||||||
|
this.nextTimeClosed = nextTimeClosed;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -60,4 +60,6 @@ public final class OpeningHours
|
|||||||
* @return true if timetable string is valid OSM timetable.
|
* @return true if timetable string is valid OSM timetable.
|
||||||
*/
|
*/
|
||||||
public static native boolean nativeIsTimetableStringValid(String source);
|
public static native boolean nativeIsTimetableStringValid(String source);
|
||||||
|
|
||||||
|
public static native OhState nativeCurrentState(@NonNull Timetable[] timetables);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,11 +4,11 @@ import android.text.TextUtils;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ImageView;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import com.google.android.material.imageview.ShapeableImageView;
|
||||||
import com.google.android.material.textfield.TextInputLayout;
|
import com.google.android.material.textfield.TextInputLayout;
|
||||||
import com.google.android.material.textfield.TextInputEditText;
|
import com.google.android.material.textfield.TextInputEditText;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
@@ -94,7 +94,7 @@ public class PhoneListAdapter extends RecyclerView.Adapter<PhoneListAdapter.View
|
|||||||
{
|
{
|
||||||
private int mPosition = -1;
|
private int mPosition = -1;
|
||||||
private final TextInputEditText mInput;
|
private final TextInputEditText mInput;
|
||||||
private final ImageView deleteButton;
|
private final ShapeableImageView deleteButton;
|
||||||
|
|
||||||
public ViewHolder(@NonNull View itemView)
|
public ViewHolder(@NonNull View itemView)
|
||||||
{
|
{
|
||||||
@@ -116,7 +116,7 @@ public class PhoneListAdapter extends RecyclerView.Adapter<PhoneListAdapter.View
|
|||||||
deleteButton.setOnClickListener(this);
|
deleteButton.setOnClickListener(this);
|
||||||
// TODO: setting icons from code because icons defined in layout XML are white.
|
// TODO: setting icons from code because icons defined in layout XML are white.
|
||||||
deleteButton.setImageResource(R.drawable.ic_delete);
|
deleteButton.setImageResource(R.drawable.ic_delete);
|
||||||
((ImageView) itemView.findViewById(R.id.phone_icon)).setImageResource(R.drawable.ic_phone);
|
((ShapeableImageView) itemView.findViewById(R.id.phone_icon)).setImageResource(R.drawable.ic_phone);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPosition(int position)
|
public void setPosition(int position)
|
||||||
|
|||||||
@@ -4,12 +4,13 @@ import android.content.Context;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.CompoundButton;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import com.google.android.material.radiobutton.MaterialRadioButton;
|
||||||
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.util.Utils;
|
import app.organicmaps.util.Utils;
|
||||||
|
|
||||||
@@ -51,8 +52,8 @@ public class SelfServiceAdapter extends RecyclerView.Adapter<SelfServiceAdapter.
|
|||||||
|
|
||||||
protected class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
|
protected class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
|
||||||
{
|
{
|
||||||
final TextView selfServiceDef;
|
final MaterialTextView selfServiceDef;
|
||||||
final CompoundButton selected;
|
final MaterialRadioButton selected;
|
||||||
|
|
||||||
public ViewHolder(View itemView)
|
public ViewHolder(View itemView)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,11 +4,8 @@ import android.util.SparseArray;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.Button;
|
|
||||||
import android.widget.CheckBox;
|
|
||||||
import android.widget.CompoundButton;
|
import android.widget.CompoundButton;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.annotation.IdRes;
|
import androidx.annotation.IdRes;
|
||||||
import androidx.annotation.IntRange;
|
import androidx.annotation.IntRange;
|
||||||
@@ -17,6 +14,10 @@ import androidx.appcompat.widget.SwitchCompat;
|
|||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import com.google.android.material.button.MaterialButton;
|
||||||
|
import com.google.android.material.checkbox.MaterialCheckBox;
|
||||||
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.editor.data.HoursMinutes;
|
import app.organicmaps.editor.data.HoursMinutes;
|
||||||
import app.organicmaps.editor.data.TimeFormatUtils;
|
import app.organicmaps.editor.data.TimeFormatUtils;
|
||||||
@@ -185,15 +186,15 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
|
|||||||
// Limit closed spans to avoid dynamic inflation of views in recycler's children. Yeah, its a hack.
|
// Limit closed spans to avoid dynamic inflation of views in recycler's children. Yeah, its a hack.
|
||||||
static final int MAX_CLOSED_SPANS = 10;
|
static final int MAX_CLOSED_SPANS = 10;
|
||||||
|
|
||||||
SparseArray<CheckBox> days = new SparseArray<>(7);
|
SparseArray<MaterialCheckBox> days = new SparseArray<>(7);
|
||||||
View allday;
|
View allday;
|
||||||
SwitchCompat swAllday;
|
SwitchCompat swAllday;
|
||||||
View schedule;
|
View schedule;
|
||||||
View openClose;
|
View openClose;
|
||||||
View open;
|
View open;
|
||||||
View close;
|
View close;
|
||||||
TextView tvOpen;
|
MaterialTextView tvOpen;
|
||||||
TextView tvClose;
|
MaterialTextView tvClose;
|
||||||
View[] closedHours = new View[MAX_CLOSED_SPANS];
|
View[] closedHours = new View[MAX_CLOSED_SPANS];
|
||||||
View addClosed;
|
View addClosed;
|
||||||
View deleteTimetable;
|
View deleteTimetable;
|
||||||
@@ -316,7 +317,7 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
UiUtils.show(closedHours[i]);
|
UiUtils.show(closedHours[i]);
|
||||||
((TextView) closedHours[i].findViewById(R.id.tv__closed)).setText(timespan.toString());
|
((MaterialTextView) closedHours[i].findViewById(R.id.tv__closed)).setText(timespan.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
@@ -333,18 +334,18 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
|
|||||||
private void addDay(@IntRange(from = 1, to = 7) final int dayIndex, @IdRes int id)
|
private void addDay(@IntRange(from = 1, to = 7) final int dayIndex, @IdRes int id)
|
||||||
{
|
{
|
||||||
final View day = itemView.findViewById(id);
|
final View day = itemView.findViewById(id);
|
||||||
final CheckBox checkBox = day.findViewById(R.id.chb__day);
|
final MaterialCheckBox checkBox = day.findViewById(R.id.chb__day);
|
||||||
// Save index of the day to get it back when checkbox will be toggled.
|
// Save index of the day to get it back when checkbox will be toggled.
|
||||||
checkBox.setTag(dayIndex);
|
checkBox.setTag(dayIndex);
|
||||||
days.put(dayIndex, checkBox);
|
days.put(dayIndex, checkBox);
|
||||||
day.setOnClickListener(v -> checkBox.toggle());
|
day.setOnClickListener(v -> checkBox.toggle());
|
||||||
|
|
||||||
((TextView) day.findViewById(R.id.tv__day)).setText(TimeFormatUtils.formatShortWeekday(dayIndex));
|
((MaterialTextView) day.findViewById(R.id.tv__day)).setText(TimeFormatUtils.formatShortWeekday(dayIndex));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void switchWorkingDay(@IntRange(from = 1, to = 7) int dayIndex)
|
private void switchWorkingDay(@IntRange(from = 1, to = 7) int dayIndex)
|
||||||
{
|
{
|
||||||
final CheckBox checkBox = days.get(dayIndex);
|
final MaterialCheckBox checkBox = days.get(dayIndex);
|
||||||
if (checkBox.isChecked())
|
if (checkBox.isChecked())
|
||||||
addWorkingDay(dayIndex, getBindingAdapterPosition());
|
addWorkingDay(dayIndex, getBindingAdapterPosition());
|
||||||
else
|
else
|
||||||
@@ -361,7 +362,7 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
|
|||||||
|
|
||||||
private class AddTimetableViewHolder extends BaseTimetableViewHolder
|
private class AddTimetableViewHolder extends BaseTimetableViewHolder
|
||||||
{
|
{
|
||||||
private final Button mAdd;
|
private final MaterialButton mAdd;
|
||||||
|
|
||||||
AddTimetableViewHolder(View itemView)
|
AddTimetableViewHolder(View itemView)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,12 +4,13 @@ import android.content.res.Resources;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.CompoundButton;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import com.google.android.material.radiobutton.MaterialRadioButton;
|
||||||
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
|
|
||||||
import app.organicmaps.MwmApplication;
|
import app.organicmaps.MwmApplication;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.dialog.EditTextDialogFragment;
|
import app.organicmaps.dialog.EditTextDialogFragment;
|
||||||
@@ -86,9 +87,9 @@ public class StreetAdapter extends RecyclerView.Adapter<StreetAdapter.BaseViewHo
|
|||||||
|
|
||||||
protected class StreetViewHolder extends BaseViewHolder implements View.OnClickListener
|
protected class StreetViewHolder extends BaseViewHolder implements View.OnClickListener
|
||||||
{
|
{
|
||||||
final TextView streetDef;
|
final MaterialTextView streetDef;
|
||||||
final TextView streetLoc;
|
final MaterialTextView streetLoc;
|
||||||
final CompoundButton selected;
|
final MaterialRadioButton selected;
|
||||||
|
|
||||||
public StreetViewHolder(View itemView)
|
public StreetViewHolder(View itemView)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import android.view.LayoutInflater;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
@@ -19,6 +18,7 @@ import app.organicmaps.R;
|
|||||||
import app.organicmaps.base.BaseMwmFragment;
|
import app.organicmaps.base.BaseMwmFragment;
|
||||||
import app.organicmaps.util.UiUtils;
|
import app.organicmaps.util.UiUtils;
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
|
|
||||||
public class TimetableContainerFragment extends BaseMwmFragment implements TimetableChangedListener
|
public class TimetableContainerFragment extends BaseMwmFragment implements TimetableChangedListener
|
||||||
{
|
{
|
||||||
@@ -71,7 +71,7 @@ public class TimetableContainerFragment extends BaseMwmFragment implements Timet
|
|||||||
|
|
||||||
@SuppressWarnings("NullableProblems")
|
@SuppressWarnings("NullableProblems")
|
||||||
@NonNull
|
@NonNull
|
||||||
private TextView mSwitchMode;
|
private MaterialTextView mSwitchMode;
|
||||||
|
|
||||||
@SuppressWarnings("NullableProblems")
|
@SuppressWarnings("NullableProblems")
|
||||||
@NonNull
|
@NonNull
|
||||||
|
|||||||
@@ -34,10 +34,7 @@ import app.organicmaps.util.log.Logger;
|
|||||||
|
|
||||||
public class LocationHelper implements BaseLocationProvider.Listener
|
public class LocationHelper implements BaseLocationProvider.Listener
|
||||||
{
|
{
|
||||||
private static final long INTERVAL_FOLLOW_MS = 0;
|
private static final long INTERVAL_MS = 0;
|
||||||
private static final long INTERVAL_NOT_FOLLOW_MS = 3000;
|
|
||||||
private static final long INTERVAL_NAVIGATION_MS = 0;
|
|
||||||
private static final long INTERVAL_TRACK_RECORDING = 0;
|
|
||||||
|
|
||||||
private static final long AGPS_EXPIRATION_TIME_MS = 16 * 60 * 60 * 1000; // 16 hours
|
private static final long AGPS_EXPIRATION_TIME_MS = 16 * 60 * 60 * 1000; // 16 hours
|
||||||
private static final long LOCATION_UPDATE_TIMEOUT_MS = 30 * 1000; // 30 seconds
|
private static final long LOCATION_UPDATE_TIMEOUT_MS = 30 * 1000; // 30 seconds
|
||||||
@@ -318,18 +315,14 @@ public class LocationHelper implements BaseLocationProvider.Listener
|
|||||||
|
|
||||||
private long calcLocationUpdatesInterval()
|
private long calcLocationUpdatesInterval()
|
||||||
{
|
{
|
||||||
if (RoutingController.get().isNavigating())
|
|
||||||
return INTERVAL_NAVIGATION_MS;
|
|
||||||
|
|
||||||
if (TrackRecorder.nativeIsTrackRecordingEnabled())
|
|
||||||
return INTERVAL_TRACK_RECORDING;
|
|
||||||
|
|
||||||
final int mode = Map.isEngineCreated() ? LocationState.getMode() : LocationState.NOT_FOLLOW_NO_POSITION;
|
final int mode = Map.isEngineCreated() ? LocationState.getMode() : LocationState.NOT_FOLLOW_NO_POSITION;
|
||||||
return switch (mode)
|
return switch (mode)
|
||||||
{
|
{
|
||||||
case LocationState.PENDING_POSITION, LocationState.FOLLOW, LocationState.FOLLOW_AND_ROTATE ->
|
case LocationState.PENDING_POSITION,
|
||||||
INTERVAL_FOLLOW_MS;
|
LocationState.FOLLOW,
|
||||||
case LocationState.NOT_FOLLOW, LocationState.NOT_FOLLOW_NO_POSITION -> INTERVAL_NOT_FOLLOW_MS;
|
LocationState.FOLLOW_AND_ROTATE,
|
||||||
|
LocationState.NOT_FOLLOW,
|
||||||
|
LocationState.NOT_FOLLOW_NO_POSITION -> INTERVAL_MS;
|
||||||
default -> throw new IllegalArgumentException("Unsupported location mode: " + mode);
|
default -> throw new IllegalArgumentException("Unsupported location mode: " + mode);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package app.organicmaps.location;
|
package app.organicmaps.location;
|
||||||
|
|
||||||
|
import android.app.ForegroundServiceStartNotAllowedException;
|
||||||
import android.app.NotificationManager;
|
import android.app.NotificationManager;
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.app.Service;
|
import android.app.Service;
|
||||||
@@ -107,7 +108,7 @@ public class TrackRecordingService extends Service implements LocationListener
|
|||||||
.setOngoing(true)
|
.setOngoing(true)
|
||||||
.setShowWhen(true)
|
.setShowWhen(true)
|
||||||
.setOnlyAlertOnce(true)
|
.setOnlyAlertOnce(true)
|
||||||
.setSmallIcon(R.drawable.ic_launcher_small)
|
.setSmallIcon(R.drawable.ic_logo_small)
|
||||||
.setContentTitle(context.getString(R.string.track_recording))
|
.setContentTitle(context.getString(R.string.track_recording))
|
||||||
.addAction(0, context.getString(R.string.navigation_stop_button), getExitPendingIntent(context))
|
.addAction(0, context.getString(R.string.navigation_stop_button), getExitPendingIntent(context))
|
||||||
.setContentIntent(getPendingIntent(context))
|
.setContentIntent(getPendingIntent(context))
|
||||||
@@ -160,10 +161,25 @@ public class TrackRecordingService extends Service implements LocationListener
|
|||||||
}
|
}
|
||||||
|
|
||||||
Logger.i(TAG, "Starting Track Recording Foreground service");
|
Logger.i(TAG, "Starting Track Recording Foreground service");
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
|
|
||||||
ServiceCompat.startForeground(this, TrackRecordingService.TRACK_REC_NOTIFICATION_ID, getNotificationBuilder(this).build(), ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION);
|
try
|
||||||
else
|
{
|
||||||
ServiceCompat.startForeground(this, TrackRecordingService.TRACK_REC_NOTIFICATION_ID, getNotificationBuilder(this).build(), 0);
|
int type = 0;
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
|
||||||
|
type = ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION;
|
||||||
|
ServiceCompat.startForeground(this, TrackRecordingService.TRACK_REC_NOTIFICATION_ID, getNotificationBuilder(this).build(), type);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S &&
|
||||||
|
e instanceof ForegroundServiceStartNotAllowedException)
|
||||||
|
{
|
||||||
|
// App not in a valid state to start foreground service (e.g started from bg)
|
||||||
|
Logger.e(TAG, "Not in a valid state to start foreground service", e);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Logger.e(TAG, "Failed to promote the service to foreground", e);
|
||||||
|
}
|
||||||
|
|
||||||
final LocationHelper locationHelper = LocationHelper.from(this);
|
final LocationHelper locationHelper = LocationHelper.from(this);
|
||||||
|
|
||||||
|
|||||||
@@ -484,10 +484,8 @@ public class MapButtonsController extends Fragment
|
|||||||
.build();
|
.build();
|
||||||
ViewCompat.setOnApplyWindowInsetsListener(mFrame, insetsListener);
|
ViewCompat.setOnApplyWindowInsetsListener(mFrame, insetsListener);
|
||||||
// Fixes insets on older Androids and with a search opened via API on all Androids.
|
// Fixes insets on older Androids and with a search opened via API on all Androids.
|
||||||
if (android.os.Build.VERSION.SDK_INT <= android.os.Build.VERSION_CODES.Q)
|
if (mFrame.hasWindowFocus())
|
||||||
mFrame.postDelayed(() -> ViewCompat.requestApplyInsets(mFrame), 1250);
|
ViewCompat.requestApplyInsets(mFrame);
|
||||||
else
|
|
||||||
mFrame.post(() -> ViewCompat.requestApplyInsets(mFrame));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
package app.organicmaps.products;
|
|
||||||
|
|
||||||
import androidx.annotation.Keep;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
|
|
||||||
// Called from JNI.
|
|
||||||
@Keep
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public class Product {
|
|
||||||
@Nullable
|
|
||||||
public String title;
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public String link;
|
|
||||||
|
|
||||||
public Product(@Nullable String title, @Nullable String link) {
|
|
||||||
this.title = title;
|
|
||||||
this.link = link;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
package app.organicmaps.products;
|
|
||||||
|
|
||||||
import androidx.annotation.Keep;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
|
|
||||||
// Called from JNI.
|
|
||||||
@Keep
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public class ProductsConfig {
|
|
||||||
public ProductsConfig(@Nullable String placePagePrompt, @Nullable Product[] products) {
|
|
||||||
this.placePagePrompt = placePagePrompt;
|
|
||||||
this.products = products;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public String placePagePrompt;
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public Product[] products;
|
|
||||||
}
|
|
||||||
@@ -7,6 +7,7 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
|||||||
import static app.organicmaps.util.Constants.Vendor.XIAOMI;
|
import static app.organicmaps.util.Constants.Vendor.XIAOMI;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
|
import android.app.ForegroundServiceStartNotAllowedException;
|
||||||
import android.app.NotificationManager;
|
import android.app.NotificationManager;
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.app.Service;
|
import android.app.Service;
|
||||||
@@ -154,7 +155,7 @@ public class NavigationService extends Service implements LocationListener
|
|||||||
.setOngoing(true)
|
.setOngoing(true)
|
||||||
.setShowWhen(false)
|
.setShowWhen(false)
|
||||||
.setOnlyAlertOnce(true)
|
.setOnlyAlertOnce(true)
|
||||||
.setSmallIcon(R.drawable.ic_launcher_small)
|
.setSmallIcon(R.drawable.ic_logo_small)
|
||||||
.setContentIntent(pendingIntent)
|
.setContentIntent(pendingIntent)
|
||||||
.addAction(0, context.getString(R.string.navigation_stop_button), exitPendingIntent)
|
.addAction(0, context.getString(R.string.navigation_stop_button), exitPendingIntent)
|
||||||
.setColorized(isColorizedSupported())
|
.setColorized(isColorizedSupported())
|
||||||
@@ -226,10 +227,25 @@ public class NavigationService extends Service implements LocationListener
|
|||||||
}
|
}
|
||||||
|
|
||||||
Logger.i(TAG, "Starting Navigation Foreground service");
|
Logger.i(TAG, "Starting Navigation Foreground service");
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
|
|
||||||
ServiceCompat.startForeground(this, NavigationService.NOTIFICATION_ID, getNotificationBuilder(this).build(), ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION);
|
try
|
||||||
else
|
{
|
||||||
ServiceCompat.startForeground(this, NavigationService.NOTIFICATION_ID, getNotificationBuilder(this).build(), 0);
|
int type = 0;
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
|
||||||
|
type = ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION;
|
||||||
|
ServiceCompat.startForeground(this, NavigationService.NOTIFICATION_ID, getNotificationBuilder(this).build(), type);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S &&
|
||||||
|
e instanceof ForegroundServiceStartNotAllowedException)
|
||||||
|
{
|
||||||
|
// App not in a valid state to start foreground service (e.g started from bg)
|
||||||
|
Logger.e(TAG, "Not in a valid state to start foreground service", e);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Logger.e(TAG, "Failed to promote the service to foreground", e);
|
||||||
|
}
|
||||||
|
|
||||||
final LocationHelper locationHelper = LocationHelper.from(this);
|
final LocationHelper locationHelper = LocationHelper.from(this);
|
||||||
|
|
||||||
|
|||||||
@@ -56,13 +56,5 @@ public final class Constants
|
|||||||
public static final String XIAOMI = "XIAOMI";
|
public static final String XIAOMI = "XIAOMI";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ProductsPopupCloseReason
|
|
||||||
{
|
|
||||||
public static final String CLOSE = "close";
|
|
||||||
public static final String REMIND_LATER = "remind_later";
|
|
||||||
public static final String ALREADY_DONATED = "already_donated";
|
|
||||||
public static final String SELECT_PRODUCT = "select_product";
|
|
||||||
}
|
|
||||||
|
|
||||||
private Constants() {}
|
private Constants() {}
|
||||||
}
|
}
|
||||||
|
|||||||