Compare commits
161 Commits
2025.06.30
...
test/2025.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e1d85f19a1 | ||
|
|
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)
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Bastian Greshake Tzovaras
|
||||
clover sage
|
||||
Harry Bond <me@hbond.xyz>
|
||||
vikiawv
|
||||
Yannik Bloscheck
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
Organic Maps (formerly OMaps) contributors:
|
||||
|
||||
165
README.md
@@ -1,62 +1,88 @@
|
||||
<!--<div align="center">
|
||||
<img src="qt/res/logo.png" height="100"/>
|
||||
</div>-->
|
||||
<!-- Navigation Bar -->
|
||||
<p align="center">
|
||||
<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 -->
|
||||
[Project Intro](https://codeberg.org/comaps#comaps)
|
||||
| [Governance](https://codeberg.org/comaps/Governance#comaps-project-governance-docs)
|
||||
| [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" >
|
||||
<img src="docs/badges/logo.svg" width="150">
|
||||
</div>
|
||||
|
||||
|
||||
<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).
|
||||
An alpha Linux / MacOS Qt desktop version, which is also suitable for Linux phones.
|
||||
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.
|
||||
|
||||
[<img src="docs/badges/apple-appstore.png" alt="App Store" width="160">](https://apps.apple.com/app/comaps/id6747180809)
|
||||
[<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)
|
||||
**Available for:** Android, iOS, ARM macOS, and alpha Linux/macOS desktop builds (also usable on Linux phones).
|
||||
|
||||
<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/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/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>
|
||||
|
||||
**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.
|
||||
|
||||
**Open and Transparent Decision-making and Financials, Not-for-profit and Fully Open Source.**
|
||||
|
||||
### Main Features
|
||||
## 🚀 Main Features
|
||||
|
||||
- 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
|
||||
|
||||
*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.
|
||||
|
||||
If you want to build the project, check [docs/INSTALL.md](docs/INSTALL.md). If you want to help the project,
|
||||
see [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md). You can help in many ways, the ability to code is not necessary.
|
||||
- Build instructions: [docs/INSTALL.md](docs/INSTALL.md)
|
||||
- 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?
|
||||
|
||||
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!
|
||||
## 💸 Funding
|
||||
|
||||
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).
|
||||
|
||||
## 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/fr/reports/app.comaps.google/latest/).
|
||||
|
||||
Licensed under the Apache License, Version 2.0. See
|
||||
[LICENSE](LICENSE),
|
||||
[NOTICE](NOTICE)
|
||||
and [data/copyright.html](data/copyright.html)
|
||||
for more information.
|
||||
To [verify](https://developer.android.com/studio/command-line/apksigner#usage-verify) the APK, use the following signing certificate fingerprints:
|
||||
```
|
||||
SHA-256: 4894e8e6963627ef660031d8593fe77297f835acb4e23810003e926135023b4c
|
||||
SHA-1: 8b7b5739f917e9f7c681671ced0c9c8562123ade
|
||||
MD5: 9cce0ffea281dc2f0e0a154d6d2e281e
|
||||
```
|
||||
---
|
||||
|
||||
## ⚖️ 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 {
|
||||
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 {
|
||||
dataBinding = 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
|
||||
• 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>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>Š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>Otevřené a transparentní rozhodování a nakládání s financemi, neziskovost a plně otevřený zdrojový kód.</b>
|
||||
‣ <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>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>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>Hlavní funkce</b>:
|
||||
• 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>.
|
||||
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
|
||||
• 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!
|
||||
|
||||
|
After Width: | Height: | Size: 249 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 24 KiB |
@@ -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,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
|
||||
@@ -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>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>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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
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.
|
||||
|
||||
• Use o aplicativo e divulgue-o.
|
||||
|
||||
• Envie feedback e relate problemas.
|
||||
|
||||
• 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>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>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>Tomada de decisões e finanças abertas e transparentes, sem fins lucrativos e totalmente de código aberto.</b>
|
||||
|
||||
<b>Principais recursos</b>:
|
||||
|
||||
• 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.
|
||||
|
||||
• Trilhas para caminhada e ciclovias
|
||||
|
||||
• 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
|
||||
|
||||
• Navegação com anúncios de voz para caminhadas, ciclismo ou direção
|
||||
|
||||
• Marque seus lugares favoritos com um único toque
|
||||
|
||||
• Artigos offline da Wikipédia
|
||||
|
||||
• Camada e direções de transporte público do metrô
|
||||
|
||||
• Gravação de trilhas
|
||||
|
||||
• Exporte e importe favoritos e trilhas nos formatos KML, KMZ e GPX
|
||||
|
||||
• Um modo escuro para usar à noite
|
||||
|
||||
• Aprimore os dados do mapa para todos usando um editor básico integrado
|
||||
|
||||
<b>A Liberdade Chegou</b>
|
||||
|
||||
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.
|
||||
|
||||
Подробнее о причинах проекта и его направлении читайте на <a href="https://codeberg.org/comaps">сайте</a>.
|
||||
|
||||
Подробнее о причинах проекта и его направлении читайте на сайте <b><i> codeberg.org/comaps </i><b>.
|
||||
Присоединяйтесь к сообществу и помогите создать лучшее приложение с картами
|
||||
• Используйте приложение и распространяйте информацию о нём
|
||||
• Оставляйте отзывы и сообщайте о проблемах
|
||||
|
||||
@@ -1 +1 @@
|
||||
Простая навигация по карте — Откройте больше за ваше путешествие. От сообщества
|
||||
Простая навигация по карте — Откройте больше за ваше путешествие — От сообщества
|
||||
|
||||
@@ -1,18 +1,17 @@
|
||||
Бесплатна апликација отвореног кода коју је обављала заједница и заснива се на ОпенСтреетМап-у подацима, усмерени транспарентност, приватност и непрофитни. ЦОМПАПС је Апликације за органске карте виљушка, које је пак форк мапс.ме.
|
||||
Бесплатна апликација отвореног кода коју је обављала заједница и заснива се на ОpenStreetMap-у подацима, усмерени транспарентност, приватност и непрофитни. CoMaps је Апликације за органске карте виљушка, које је пак форк Maps.ME.
|
||||
|
||||
Прочитајте о разлозима пројекта и његовог правца на <b><i>codeberg.org/comaps</i></b>
|
||||
Придружите се отвореној заједници и помозите да направимо најбољу апликацију за мапе
|
||||
• Користите апликацију и проширите глас о томе
|
||||
• Дајте повратне информације и пријавите проблеме
|
||||
• Ажурирајте податке на мапи у апликацији или на веб локацији OpenStreetMap
|
||||
‣<b>фокусирано на офлајн Вар </b>: Планирајте и управљајте путовањем у иностранству без потребе за мобилним услугама, тражите путне тачке док је на даљинском покрету, итд.
|
||||
|
||||
Све апликације су дизајниране за рад ван мреже.
|
||||
‣<b> Поштовање приватности </b>: Апликација је осмишљена задржавања у уму приватност - не идентификује људе, не прати или прикупља личне податке. Нема реклама.
|
||||
‣ <b> фокусирано на офлајн Вар </b>: Планирајте и управљајте путовањем у иностранству без потребе за мобилним услугама, тражите путне тачке док је на даљинском покрету, итд. Све апликације су дизајниране за рад ван мреже.
|
||||
‣ <b> Поштовање приватности </b>: Апликација је осмишљена задржавања у уму приватност - не идентификује људе, не прати или прикупља личне податке. Нема реклама.
|
||||
‣ <b> Једноставно и елегантно </b>: Апликација је тривијална за употребу и једноставно функционише.
|
||||
‣ <b> Чува вашу батерију и простор </b>: не конзумира батерију као остале навигационе апликације. Компактне картице сачувајте драгоцени простор на вашем телефону.
|
||||
‣ <b> Отворено и направио је заједницу </b>: Људи попут вас је помогли да додају апликацију додавањем локација на OpenStreetMap-у, тестирању и давање повратних информација о апликацији и доприносе вашим развојним вештинама и новцу.
|
||||
‣ <b> Отворено и транспарентно доношење одлука и употреба финансија, непрофитна и потпуно отворена извора. </ Б>
|
||||
‣ <b> Отворено и транспарентно доношење одлука и употреба финансија, непрофитна и потпуно отворена извора. </b>
|
||||
|
||||
<b> Главне карактеристике </b>:
|
||||
• Преузмите детаљне мапе са локацијама које нису доступне са Гоогле мапама
|
||||
|
||||
@@ -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 @@
|
||||
version: 2025.06.30-22-FDroid+25063022
|
||||
version: 2025.03.02-7-FDroid+25030207
|
||||
|
||||
@@ -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
|
||||
• 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>
|
||||
|
||||
‣ <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>Datenschutzfreundlich</b>: Die App wurde mit Fokus auf Privatsphäre entwickelt – keine Personenidentifikation, kein Tracking, keine Erfassung persönlicher Daten, keine Werbung.
|
||||
‣ <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>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>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>
|
||||
@@ -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>
|
||||
|
||||
<b>Freiheit beginnt hier</b>
|
||||
<b>Entdecke die Unabhängigkeit</b>
|
||||
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,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
|
||||
• Uygulamayı kullanın ve bunu herkese duyurun
|
||||
• Geri bildirimde bulunun ve sorunları bildirin
|
||||
• Harita verilerini uygulamada veya OpenStreetMap web sitesinde güncelleyin
|
||||
Topluluğa katılın ve en iyi harita uygulamasını oluşturmamıza yardım edin
|
||||
• Uygulamayı kullanın ve çevrenize yayın
|
||||
• Geri bildirim verin ve sorunları bildirin
|
||||
• 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>
|
||||
|
||||
‣ <b>Basit ve Cilalı</b>: sadece işe yarayan, kullanımı kolay temel ö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>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>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>Ü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>Açık ve Şeffaf Karar Alma ve Finansman, Kar Amacı Gütmeyen ve Tamamen Açık Kaynak.</b>
|
||||
‣ <b>Basit ve Temiz</b>: Sadece temel, kullanımı basit, işe yarayan özellikler.
|
||||
‣ <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ı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>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>Ü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 Ş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>:
|
||||
• Google Haritalar'da bulunmayan yerleri içeren indirilebilir detaylı haritalar
|
||||
• Vurgulanan yürüyüş parkurları, kamp alanları, su kaynakları, zirveler, kontur çizgileriyle açık hava modu gibi
|
||||
• Yürüyüş yolları ve bisiklet yolları
|
||||
• Restoranlar, benzin istasyonları, oteller, mağazalar, turistik yerler gibi ilgi çekici noktalar ve daha fazlası
|
||||
• İsme veya adrese göre veya ilgi noktası kategorisine göre arama yapın
|
||||
• Yürüyerek, bisikletle veya araçla seyahat edenler için sesli duyurularla navigasyon
|
||||
• Favori yerlerinizi tek bir dokunuşla yer imlerine ekleyin
|
||||
• Çevrim dışı Wikipedia makaleleri
|
||||
• Metro geçiş katmanı ve yönleri
|
||||
• Rota kaydı
|
||||
• Yer imlerini ve parkurları KML, KMZ, GPX formatlarında dışa ve içe aktarın
|
||||
• Geceleri kullanmak için karanlık mod
|
||||
• Temel bir yerleşik düzenleyici kullanarak herkes için harita verilerini iyileştirin
|
||||
<b>Ana Özellikler</b>:
|
||||
• Google Haritalar'da bulunmayan yerleri içeren, çevrimdışı detaylı haritalar
|
||||
• Yürüyüş parkurları, kamp alanları, su kaynakları, zirveler, kontur çizgileri vb. nesneleri vurgulayan açık hava modu
|
||||
• Yürüyüş ve bisiklet yolları
|
||||
• Restoran, benzin istasyonu, otel, mağaza, görülecek yerler ve çok daha fazla harita noktası
|
||||
• İsim, adres veya harita noktası kategorisine göre arama yapın
|
||||
• Sesli yönlendirmeye sahip yürüyüş, bisiklet ve araç navigasyonu
|
||||
• En sevdiğiniz mekanları tek dokunuşla yer imlerinize kaydedin
|
||||
• Çevrimdışı Vikipedi makaleleri
|
||||
• Metro ulaşım katmanı ve rotaları
|
||||
• GPS izinizi kaydedin
|
||||
• Yer imi ve GPS izlerinizi KML, KMZ ve GPX biçimlerinde dışa veya içe aktarın
|
||||
• Gece boyunca kullanmanızı sağlayacak koyu mod
|
||||
• Uygulama içi düzenleyiciyi kullanarak harita verilerini herkes için daha iyi hale getirin
|
||||
• 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>
|
||||
Yolculuğunuzu keşfedin, gizlilik ve topluluk ön planda tutularak dünyayı keşfedin!
|
||||
<b>Özgürlük Buradan Başlıyor</b>
|
||||
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
|
||||
android:name="android.hardware.location.gps"
|
||||
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_FINE_LOCATION"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
|
||||
|
||||
@@ -171,7 +171,7 @@ extern "C"
|
||||
curFile.GetRemoteSize(),
|
||||
std::bind(&DownloadFileFinished, ptr, _1),
|
||||
std::bind(&DownloadFileProgress, ptr, _1),
|
||||
512 * 1024, false));
|
||||
0, false));
|
||||
});
|
||||
|
||||
return ERR_FILE_IN_PROGRESS;
|
||||
|
||||
@@ -1804,74 +1804,4 @@ Java_app_organicmaps_Framework_nativeMemoryWarning(JNIEnv *, jclass)
|
||||
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"
|
||||
|
||||
@@ -321,4 +321,30 @@ Java_app_organicmaps_editor_OpeningHours_nativeIsTimetableStringValid(JNIEnv * e
|
||||
{
|
||||
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"
|
||||
|
||||
@@ -17,17 +17,9 @@ using namespace jni;
|
||||
|
||||
bool LoadOsmUserPreferences(std::string const & oauthToken, UserPreferences & outPrefs)
|
||||
{
|
||||
try
|
||||
{
|
||||
ServerApi06 const api(OsmOAuth::ServerAuth(oauthToken));
|
||||
outPrefs = api.GetUserPreferences();
|
||||
return true;
|
||||
}
|
||||
catch (std::exception const & ex)
|
||||
{
|
||||
LOG(LWARNING, ("Can't load user preferences from server: ", ex.what()));
|
||||
}
|
||||
return false;
|
||||
ServerApi06 const api(OsmOAuth::ServerAuth(oauthToken));
|
||||
outPrefs = api.GetUserPreferences();
|
||||
return (outPrefs.m_id != 0);
|
||||
}
|
||||
} // 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.FeatureId;
|
||||
import app.organicmaps.bookmarks.data.MapObject;
|
||||
import app.organicmaps.products.ProductsConfig;
|
||||
import app.organicmaps.sdk.routing.JunctionInfo;
|
||||
import app.organicmaps.sdk.routing.RouteMarkData;
|
||||
import app.organicmaps.sdk.routing.RouteMarkType;
|
||||
@@ -347,15 +346,5 @@ public class Framework
|
||||
public static native boolean nativeHasPlacePageInfo();
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
@@ -41,9 +41,9 @@ public class MapFragment extends BaseMwmFragment implements View.OnTouchListener
|
||||
mMap.updateMyPositionRoutingOffset(offsetY);
|
||||
}
|
||||
|
||||
public void destroySurface()
|
||||
public void destroySurface(boolean activityIsChangingConfigurations)
|
||||
{
|
||||
mMap.onSurfaceDestroyed(requireActivity().isChangingConfigurations(), isAdded());
|
||||
mMap.onSurfaceDestroyed(activityIsChangingConfigurations, isAdded());
|
||||
}
|
||||
|
||||
public boolean isContextCreated()
|
||||
|
||||
@@ -850,7 +850,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
@Override
|
||||
public void drawIcon(FloatingActionButton imageView)
|
||||
{
|
||||
imageView.setImageResource(R.drawable.ic_question_mark);
|
||||
imageView.setImageResource(R.drawable.ic_logo_monochrome);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1303,7 +1303,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
{
|
||||
// Explicitly destroy surface before activity recreation.
|
||||
if (mMapFragment != null)
|
||||
mMapFragment.destroySurface();
|
||||
mMapFragment.destroySurface(true);
|
||||
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));
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.activity.result.contract.ActivityResultContracts;
|
||||
@@ -16,6 +17,10 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
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.downloader.DownloaderActivity;
|
||||
@@ -69,6 +74,17 @@ public class SplashActivity extends AppCompatActivity
|
||||
|
||||
UiThread.cancelDelayedTasks(mInitCoreDelayedTask);
|
||||
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(),
|
||||
result -> Config.setLocationRequested());
|
||||
mApiRequest = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
|
||||
|
||||
@@ -11,7 +11,6 @@ import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -172,7 +171,7 @@ public class BookmarkCategorySettingsFragment extends BaseMwmToolbarFragment
|
||||
return !TextUtils.equals(mCategory.getDescription(), categoryDesc);
|
||||
}
|
||||
|
||||
private void clearAndFocus(TextView textView)
|
||||
private void clearAndFocus(TextInputEditText textView)
|
||||
{
|
||||
textView.getEditableText().clear();
|
||||
textView.requestFocus();
|
||||
|
||||
@@ -4,12 +4,13 @@ import android.content.res.Resources;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.bookmarks.data.BookmarkCategory;
|
||||
import app.organicmaps.bookmarks.data.BookmarkInfo;
|
||||
@@ -439,14 +440,14 @@ public class BookmarkListAdapter extends RecyclerView.Adapter<Holders.BaseBookma
|
||||
holder = bookmarkHolder;
|
||||
break;
|
||||
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);
|
||||
break;
|
||||
case TYPE_DESC:
|
||||
View desc = inflater.inflate(R.layout.item_category_description, parent, false);
|
||||
TextView moreBtn = desc.findViewById(R.id.more_btn);
|
||||
TextView text = desc.findViewById(R.id.text);
|
||||
TextView title = desc.findViewById(R.id.title);
|
||||
MaterialTextView moreBtn = desc.findViewById(R.id.more_btn);
|
||||
MaterialTextView text = desc.findViewById(R.id.text);
|
||||
MaterialTextView title = desc.findViewById(R.id.title);
|
||||
setMoreButtonVisibility(text, moreBtn);
|
||||
holder = new Holders.DescriptionViewHolder(desc, mSectionsDataSource.getCategory());
|
||||
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));
|
||||
}
|
||||
|
||||
private void onMoreButtonClicked(TextView textView, TextView moreBtn)
|
||||
private void onMoreButtonClicked(MaterialTextView textView, MaterialTextView moreBtn)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
private void setExpandedModeDescription(TextView textView, TextView moreBtn)
|
||||
private void setExpandedModeDescription(MaterialTextView textView, MaterialTextView moreBtn)
|
||||
{
|
||||
textView.setMaxLines(Integer.MAX_VALUE);
|
||||
moreBtn.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
private void setShortModeDescription(TextView textView, TextView moreBtn)
|
||||
private void setShortModeDescription(MaterialTextView textView, MaterialTextView moreBtn)
|
||||
{
|
||||
textView.setMaxLines(MAX_VISIBLE_LINES);
|
||||
|
||||
|
||||
@@ -11,7 +11,6 @@ import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
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.recycler.DividerItemDecorationWithPadding;
|
||||
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -599,7 +599,7 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
|
||||
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();
|
||||
|
||||
|
||||
@@ -4,12 +4,13 @@ import android.content.Context;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
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.bookmarks.data.BookmarkCategory;
|
||||
|
||||
@@ -101,8 +102,8 @@ public class ChooseBookmarkCategoryAdapter extends BaseBookmarkCategoryAdapter<C
|
||||
|
||||
static class SingleChoiceHolder extends RecyclerView.ViewHolder
|
||||
{
|
||||
TextView name;
|
||||
RadioButton checked;
|
||||
MaterialTextView name;
|
||||
MaterialRadioButton checked;
|
||||
|
||||
public SingleChoiceHolder(View convertView)
|
||||
{
|
||||
|
||||
@@ -6,15 +6,16 @@ import android.location.Location;
|
||||
import android.text.Spanned;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.PluralsRes;
|
||||
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.adapter.OnItemClickListener;
|
||||
import app.organicmaps.bookmarks.data.BookmarkCategory;
|
||||
@@ -34,9 +35,9 @@ public class Holders
|
||||
public static class GeneralViewHolder extends RecyclerView.ViewHolder
|
||||
{
|
||||
@NonNull
|
||||
private final TextView mText;
|
||||
private final MaterialTextView mText;
|
||||
@NonNull
|
||||
private final ImageView mImage;
|
||||
private final ShapeableImageView mImage;
|
||||
|
||||
GeneralViewHolder(@NonNull View itemView)
|
||||
{
|
||||
@@ -46,13 +47,13 @@ public class Holders
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public TextView getText()
|
||||
public MaterialTextView getText()
|
||||
{
|
||||
return mText;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public ImageView getImage()
|
||||
public ShapeableImageView getImage()
|
||||
{
|
||||
return mImage;
|
||||
}
|
||||
@@ -61,9 +62,9 @@ public class Holders
|
||||
public static class HeaderViewHolder extends RecyclerView.ViewHolder
|
||||
{
|
||||
@NonNull
|
||||
private final TextView mButton;
|
||||
private final MaterialTextView mButton;
|
||||
@NonNull
|
||||
private final TextView mText;
|
||||
private final MaterialTextView mText;
|
||||
|
||||
|
||||
HeaderViewHolder(@NonNull View itemView)
|
||||
@@ -74,13 +75,13 @@ public class Holders
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public TextView getText()
|
||||
public MaterialTextView getText()
|
||||
{
|
||||
return mText;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public TextView getButton()
|
||||
public MaterialTextView getButton()
|
||||
{
|
||||
return mButton;
|
||||
}
|
||||
@@ -168,7 +169,7 @@ public class Holders
|
||||
protected BookmarkCategory mEntity;
|
||||
|
||||
@NonNull
|
||||
protected final TextView mSize;
|
||||
protected final MaterialTextView mSize;
|
||||
|
||||
public CategoryViewHolderBase(@NonNull View root)
|
||||
{
|
||||
@@ -229,9 +230,9 @@ public class Holders
|
||||
@NonNull
|
||||
private final View mView;
|
||||
@NonNull
|
||||
private final TextView mName;
|
||||
private final MaterialTextView mName;
|
||||
@NonNull
|
||||
private final CheckBox mVisibilityMarker;
|
||||
private final MaterialCheckBox mVisibilityMarker;
|
||||
|
||||
CollectionViewHolder(@NonNull View root)
|
||||
{
|
||||
@@ -268,11 +269,11 @@ public class Holders
|
||||
static class CategoryViewHolder extends CategoryViewHolderBase
|
||||
{
|
||||
@NonNull
|
||||
private final TextView mName;
|
||||
private final MaterialTextView mName;
|
||||
@NonNull
|
||||
CheckBox mVisibilityMarker;
|
||||
MaterialCheckBox mVisibilityMarker;
|
||||
@NonNull
|
||||
ImageView mMoreButton;
|
||||
ShapeableImageView mMoreButton;
|
||||
|
||||
CategoryViewHolder(@NonNull View root)
|
||||
{
|
||||
@@ -338,11 +339,11 @@ public class Holders
|
||||
static class BookmarkViewHolder extends BaseBookmarkHolder
|
||||
{
|
||||
@NonNull
|
||||
private final ImageView mIcon;
|
||||
private final ShapeableImageView mIcon;
|
||||
@NonNull
|
||||
private final TextView mName;
|
||||
private final MaterialTextView mName;
|
||||
@NonNull
|
||||
private final TextView mDistance;
|
||||
private final MaterialTextView mDistance;
|
||||
|
||||
BookmarkViewHolder(@NonNull View itemView)
|
||||
{
|
||||
@@ -384,12 +385,12 @@ public class Holders
|
||||
static class TrackViewHolder extends BaseBookmarkHolder
|
||||
{
|
||||
@NonNull
|
||||
private final ImageView mIcon;
|
||||
private final ShapeableImageView mIcon;
|
||||
@NonNull
|
||||
private final TextView mName;
|
||||
private final MaterialTextView mName;
|
||||
@NonNull
|
||||
private final TextView mDistance;
|
||||
private final ImageView mMoreButton;
|
||||
private final MaterialTextView mDistance;
|
||||
private final ShapeableImageView mMoreButton;
|
||||
|
||||
TrackViewHolder(@NonNull View itemView)
|
||||
{
|
||||
@@ -424,16 +425,16 @@ public class Holders
|
||||
|
||||
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
|
||||
{
|
||||
@NonNull
|
||||
private final TextView mView;
|
||||
private final MaterialTextView mView;
|
||||
|
||||
SectionViewHolder(@NonNull TextView itemView)
|
||||
SectionViewHolder(@NonNull MaterialTextView itemView)
|
||||
{
|
||||
super(itemView);
|
||||
mView = itemView;
|
||||
@@ -452,9 +453,9 @@ public class Holders
|
||||
static final float SPACING_MULTIPLE = 1.0f;
|
||||
static final float SPACING_ADD = 0.0f;
|
||||
@NonNull
|
||||
private final TextView mTitle;
|
||||
private final MaterialTextView mTitle;
|
||||
@NonNull
|
||||
private final TextView mDescText;
|
||||
private final MaterialTextView mDescText;
|
||||
|
||||
DescriptionViewHolder(@NonNull View itemView, @NonNull BookmarkCategory category)
|
||||
{
|
||||
|
||||
@@ -6,7 +6,8 @@ import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.bookmarks.data.Icon;
|
||||
@@ -61,7 +62,7 @@ public class IconsAdapter extends ArrayAdapter<Icon>
|
||||
|
||||
private static class SpinnerViewHolder
|
||||
{
|
||||
final ImageView icon;
|
||||
final ShapeableImageView icon;
|
||||
|
||||
SpinnerViewHolder(View convertView)
|
||||
{
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package app.organicmaps.bookmarks.data;
|
||||
|
||||
import android.widget.ImageView;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
|
||||
public interface IconClickListener
|
||||
{
|
||||
void onItemClick(ImageView v, int position);
|
||||
void onItemClick(ShapeableImageView v, int position);
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package app.organicmaps.downloader;
|
||||
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.util.StringUtils;
|
||||
@@ -14,7 +14,7 @@ class BottomPanel
|
||||
{
|
||||
private final DownloaderFragment mFragment;
|
||||
private final FloatingActionButton mFab;
|
||||
private final Button mButton;
|
||||
private final MaterialButton mButton;
|
||||
|
||||
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)
|
||||
{
|
||||
mFragment = fragment;
|
||||
@@ -72,6 +81,12 @@ class BottomPanel
|
||||
mButton.setOnClickListener(mDownloadListener);
|
||||
}
|
||||
|
||||
private void setRetryFailedStates()
|
||||
{
|
||||
mButton.setText(R.string.downloader_retry);
|
||||
mButton.setOnClickListener(mRetryListener);
|
||||
}
|
||||
|
||||
private void setCancelState()
|
||||
{
|
||||
mButton.setText(R.string.downloader_cancel_all);
|
||||
@@ -101,7 +116,7 @@ class BottomPanel
|
||||
} // Special case for "Countries" node when no maps currently downloaded.
|
||||
case STATUS_DOWNLOADABLE, STATUS_DONE, STATUS_PARTLY -> show = false;
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -119,6 +134,7 @@ class BottomPanel
|
||||
}
|
||||
case STATUS_DONE -> show = false;
|
||||
case STATUS_PROGRESS, STATUS_APPLYING, STATUS_ENQUEUED -> setCancelState();
|
||||
case STATUS_FAILED -> setRetryFailedStates();
|
||||
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
|
||||
}
|
||||
|
||||
return downloadFromStream(new BufferedInputStream(urlConnection.getInputStream(), 65536));
|
||||
return downloadFromStream(new BufferedInputStream(urlConnection.getInputStream(), 128 * Constants.KB));
|
||||
} catch (final MalformedURLException 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),
|
||||
// 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;
|
||||
|
||||
for (int size : arrSize)
|
||||
@@ -240,7 +240,7 @@ class ChunkTask extends AsyncTask<Void, byte[], Integer>
|
||||
break;
|
||||
} 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.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
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.base.BaseMwmFragment;
|
||||
import app.organicmaps.base.BaseMwmFragmentActivity;
|
||||
@@ -30,10 +31,10 @@ public class CountrySuggestFragment extends BaseMwmFragment implements View.OnCl
|
||||
private LinearLayout mLlSelectDownload;
|
||||
private LinearLayout mLlActiveDownload;
|
||||
private WheelProgressView mWpvDownloadProgress;
|
||||
private TextView mTvCountry;
|
||||
private TextView mTvActiveCountry;
|
||||
private TextView mTvProgress;
|
||||
private Button mBtnDownloadMap;
|
||||
private MaterialTextView mTvCountry;
|
||||
private MaterialTextView mTvActiveCountry;
|
||||
private MaterialTextView mTvProgress;
|
||||
private MaterialButton mBtnDownloadMap;
|
||||
|
||||
private CountryItem mCurrentCountry;
|
||||
private CountryItem mDownloadingCountry;
|
||||
@@ -150,7 +151,7 @@ public class CountrySuggestFragment extends BaseMwmFragment implements View.OnCl
|
||||
mLlNoLocation = view.findViewById(R.id.ll__location_unknown);
|
||||
mBtnDownloadMap = view.findViewById(R.id.btn__download_map);
|
||||
mBtnDownloadMap.setOnClickListener(this);
|
||||
Button selectMap = view.findViewById(R.id.btn__select_map);
|
||||
MaterialButton selectMap = view.findViewById(R.id.btn__select_map);
|
||||
selectMap.setOnClickListener(this);
|
||||
mWpvDownloadProgress = view.findViewById(R.id.wpv__download_progress);
|
||||
mWpvDownloadProgress.setOnClickListener(this);
|
||||
|
||||
@@ -69,7 +69,7 @@ public class DownloaderNotifier
|
||||
.setAutoCancel(true)
|
||||
.setCategory(NotificationCompat.CATEGORY_ERROR)
|
||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||
.setSmallIcon(R.drawable.ic_launcher_small)
|
||||
.setSmallIcon(R.drawable.ic_logo_small)
|
||||
.setColor(ContextCompat.getColor(mContext, R.color.notification))
|
||||
.setContentTitle(title)
|
||||
.setContentText(content)
|
||||
@@ -124,7 +124,7 @@ public class DownloaderNotifier
|
||||
return new NotificationCompat.Builder(mContext, CHANNEL_ID)
|
||||
.setAutoCancel(true)
|
||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||
.setSmallIcon(R.drawable.ic_launcher)
|
||||
.setSmallIcon(R.drawable.ic_logo_small)
|
||||
.setColor(ContextCompat.getColor(mContext, R.color.notification))
|
||||
.setShowWhen(true)
|
||||
.setContentTitle(title)
|
||||
|
||||
@@ -3,6 +3,7 @@ package app.organicmaps.downloader;
|
||||
import static android.Manifest.permission.POST_NOTIFICATIONS;
|
||||
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||
|
||||
import android.app.ForegroundServiceStartNotAllowedException;
|
||||
import android.app.Service;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ServiceInfo;
|
||||
@@ -42,10 +43,24 @@ public class DownloaderService extends Service implements MapManager.StorageCall
|
||||
|
||||
var notification = mNotifier.buildProgressNotification();
|
||||
Logger.i(TAG, "Starting Downloader Foreground Service");
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
|
||||
ServiceCompat.startForeground(this, DownloaderNotifier.NOTIFICATION_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC);
|
||||
else
|
||||
ServiceCompat.startForeground(this, DownloaderNotifier.NOTIFICATION_ID, notification, 0);
|
||||
try
|
||||
{
|
||||
int type = 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;
|
||||
}
|
||||
|
||||
@@ -4,11 +4,13 @@ import android.location.Location;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
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.R;
|
||||
import app.organicmaps.location.LocationHelper;
|
||||
@@ -28,11 +30,11 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
|
||||
|
||||
private final MwmActivity mActivity;
|
||||
private final View mFrame;
|
||||
private final TextView mParent;
|
||||
private final TextView mTitle;
|
||||
private final TextView mSize;
|
||||
private final MaterialTextView mParent;
|
||||
private final MaterialTextView mTitle;
|
||||
private final MaterialTextView mSize;
|
||||
private final WheelProgressView mProgress;
|
||||
private final Button mButton;
|
||||
private final MaterialButton mButton;
|
||||
|
||||
private int mStorageSubscriptionSlot;
|
||||
|
||||
|
||||
@@ -7,8 +7,6 @@ import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.webkit.WebView;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.DrawableRes;
|
||||
import androidx.annotation.NonNull;
|
||||
@@ -20,7 +18,10 @@ import app.organicmaps.util.Constants;
|
||||
import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.util.InputUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
public class AdvancedTimetableFragment extends BaseMwmFragment
|
||||
implements View.OnClickListener, TimetableProvider
|
||||
@@ -28,8 +29,8 @@ public class AdvancedTimetableFragment extends BaseMwmFragment
|
||||
private boolean mIsExampleShown;
|
||||
private TextInputEditText mInput;
|
||||
private WebView mExample;
|
||||
private TextView mExamplesTitle;
|
||||
private static ImageView mSaveButton;
|
||||
private MaterialTextView mExamplesTitle;
|
||||
private static ShapeableImageView mSaveButton;
|
||||
@Nullable
|
||||
private String mInitTimetables;
|
||||
@Nullable
|
||||
|
||||
@@ -3,13 +3,14 @@ package app.organicmaps.editor;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.checkbox.MaterialCheckBox;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
|
||||
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
|
||||
{
|
||||
final TextView cuisine;
|
||||
final CheckBox selected;
|
||||
final MaterialTextView cuisine;
|
||||
final MaterialCheckBox selected;
|
||||
|
||||
public ViewHolder(View itemView)
|
||||
{
|
||||
|
||||
@@ -8,8 +8,6 @@ import android.text.method.LinkMovementMethod;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.CallSuper;
|
||||
import androidx.annotation.DrawableRes;
|
||||
@@ -22,8 +20,11 @@ import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
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.TextInputEditText;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.Framework;
|
||||
import app.organicmaps.R;
|
||||
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";
|
||||
|
||||
private TextView mCategory;
|
||||
private MaterialTextView mCategory;
|
||||
private View mCardName;
|
||||
private View mCardAddress;
|
||||
private View mCardDetails;
|
||||
@@ -89,20 +90,20 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
};
|
||||
|
||||
private MultilanguageAdapter mNamesAdapter;
|
||||
private TextView mNamesCaption;
|
||||
private TextView mAddLanguage;
|
||||
private TextView mMoreLanguages;
|
||||
private MaterialTextView mNamesCaption;
|
||||
private MaterialTextView mAddLanguage;
|
||||
private MaterialTextView mMoreLanguages;
|
||||
|
||||
private TextView mStreet;
|
||||
private MaterialTextView mStreet;
|
||||
private TextInputEditText mHouseNumber;
|
||||
private TextInputEditText mBuildingLevels;
|
||||
|
||||
// Define Metadata entries, that have more tricky logic, separately.
|
||||
private TextView mPhone;
|
||||
private TextView mEditPhoneLink;
|
||||
private TextView mCuisine;
|
||||
private MaterialTextView mPhone;
|
||||
private MaterialTextView mEditPhoneLink;
|
||||
private MaterialTextView mCuisine;
|
||||
private SwitchCompat mWifi;
|
||||
private TextView mSelfService;
|
||||
private MaterialTextView mSelfService;
|
||||
private SwitchCompat mOutdoorSeating;
|
||||
|
||||
// Default Metadata entries.
|
||||
@@ -132,12 +133,12 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
private TextInputLayout mInputBuildingLevels;
|
||||
|
||||
private View mEmptyOpeningHours;
|
||||
private TextView mOpeningHours;
|
||||
private MaterialTextView mOpeningHours;
|
||||
private View mEditOpeningHours;
|
||||
private TextInputEditText mDescription;
|
||||
private final Map<Metadata.MetadataType, View> mDetailsBlocks = new HashMap<>();
|
||||
private final Map<Metadata.MetadataType, View> mSocialMediaBlocks = new HashMap<>();
|
||||
private TextView mReset;
|
||||
private MaterialTextView mReset;
|
||||
|
||||
private EditorHostFragment mParent;
|
||||
|
||||
@@ -489,7 +490,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
mOpeningHours.setOnClickListener(this);
|
||||
final View cardMore = view.findViewById(R.id.cv__more);
|
||||
mDescription = findInput(cardMore);
|
||||
TextView osmInfo = view.findViewById(R.id.osm_info);
|
||||
MaterialTextView osmInfo = view.findViewById(R.id.osm_info);
|
||||
osmInfo.setMovementMethod(LinkMovementMethod.getInstance());
|
||||
mReset = view.findViewById(R.id.reset);
|
||||
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)
|
||||
{
|
||||
((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);
|
||||
input.setHint(hint);
|
||||
return input.findViewById(R.id.input);
|
||||
|
||||
@@ -4,12 +4,13 @@ import android.text.method.LinkMovementMethod;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.editor.data.FeatureCategory;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
@@ -78,7 +79,7 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
||||
protected class FeatureViewHolder extends RecyclerView.ViewHolder
|
||||
{
|
||||
@NonNull
|
||||
private final TextView mName;
|
||||
private final MaterialTextView mName;
|
||||
@NonNull
|
||||
private final View mSelected;
|
||||
|
||||
@@ -106,7 +107,7 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
||||
FooterViewHolder(@NonNull View 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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,6 @@ import android.text.format.DateFormat;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
import android.widget.TimePicker;
|
||||
|
||||
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.tabs.TabLayout;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmDialogFragment;
|
||||
import app.organicmaps.editor.data.HoursMinutes;
|
||||
@@ -134,19 +135,19 @@ public class HoursMinutesPickerFragment extends BaseMwmDialogFragment
|
||||
if (id != 0)
|
||||
{
|
||||
mPickerHoursLabel = mPicker.findViewById(id);
|
||||
if (!(mPickerHoursLabel instanceof TextView))
|
||||
if (!(mPickerHoursLabel instanceof MaterialTextView))
|
||||
mPickerHoursLabel = null;
|
||||
}
|
||||
|
||||
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));
|
||||
final ColorStateList textColor = AppCompatResources.getColorStateList(requireContext(),
|
||||
ThemeUtils.isNightTheme(requireContext()) ? R.color.accent_color_selector_night
|
||||
: R.color.accent_color_selector);
|
||||
tabView.setTextColor(textColor);
|
||||
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.setTextColor(textColor);
|
||||
mTabs.addTab(mTabs.newTab().setCustomView(tabView), true);
|
||||
|
||||
@@ -3,11 +3,12 @@ package app.organicmaps.editor;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.editor.data.Language;
|
||||
|
||||
@@ -42,12 +43,12 @@ public class LanguagesAdapter extends RecyclerView.Adapter<LanguagesAdapter.Hold
|
||||
|
||||
protected class Holder extends RecyclerView.ViewHolder
|
||||
{
|
||||
TextView name;
|
||||
MaterialTextView name;
|
||||
|
||||
public Holder(View itemView)
|
||||
{
|
||||
super(itemView);
|
||||
name = (TextView) itemView;
|
||||
name = (MaterialTextView) itemView;
|
||||
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.
|
||||
*/
|
||||
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.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
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.TextInputEditText;
|
||||
import app.organicmaps.R;
|
||||
@@ -94,7 +94,7 @@ public class PhoneListAdapter extends RecyclerView.Adapter<PhoneListAdapter.View
|
||||
{
|
||||
private int mPosition = -1;
|
||||
private final TextInputEditText mInput;
|
||||
private final ImageView deleteButton;
|
||||
private final ShapeableImageView deleteButton;
|
||||
|
||||
public ViewHolder(@NonNull View itemView)
|
||||
{
|
||||
@@ -116,7 +116,7 @@ public class PhoneListAdapter extends RecyclerView.Adapter<PhoneListAdapter.View
|
||||
deleteButton.setOnClickListener(this);
|
||||
// TODO: setting icons from code because icons defined in layout XML are white.
|
||||
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)
|
||||
|
||||
@@ -4,12 +4,13 @@ import android.content.Context;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
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.util.Utils;
|
||||
|
||||
@@ -51,8 +52,8 @@ public class SelfServiceAdapter extends RecyclerView.Adapter<SelfServiceAdapter.
|
||||
|
||||
protected class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
|
||||
{
|
||||
final TextView selfServiceDef;
|
||||
final CompoundButton selected;
|
||||
final MaterialTextView selfServiceDef;
|
||||
final MaterialRadioButton selected;
|
||||
|
||||
public ViewHolder(View itemView)
|
||||
{
|
||||
|
||||
@@ -4,11 +4,8 @@ import android.util.SparseArray;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.IdRes;
|
||||
import androidx.annotation.IntRange;
|
||||
@@ -17,6 +14,10 @@ import androidx.appcompat.widget.SwitchCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
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.editor.data.HoursMinutes;
|
||||
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.
|
||||
static final int MAX_CLOSED_SPANS = 10;
|
||||
|
||||
SparseArray<CheckBox> days = new SparseArray<>(7);
|
||||
SparseArray<MaterialCheckBox> days = new SparseArray<>(7);
|
||||
View allday;
|
||||
SwitchCompat swAllday;
|
||||
View schedule;
|
||||
View openClose;
|
||||
View open;
|
||||
View close;
|
||||
TextView tvOpen;
|
||||
TextView tvClose;
|
||||
MaterialTextView tvOpen;
|
||||
MaterialTextView tvClose;
|
||||
View[] closedHours = new View[MAX_CLOSED_SPANS];
|
||||
View addClosed;
|
||||
View deleteTimetable;
|
||||
@@ -316,7 +317,7 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
|
||||
else
|
||||
{
|
||||
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++;
|
||||
@@ -333,18 +334,18 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
|
||||
private void addDay(@IntRange(from = 1, to = 7) final int dayIndex, @IdRes int 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.
|
||||
checkBox.setTag(dayIndex);
|
||||
days.put(dayIndex, checkBox);
|
||||
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)
|
||||
{
|
||||
final CheckBox checkBox = days.get(dayIndex);
|
||||
final MaterialCheckBox checkBox = days.get(dayIndex);
|
||||
if (checkBox.isChecked())
|
||||
addWorkingDay(dayIndex, getBindingAdapterPosition());
|
||||
else
|
||||
@@ -361,7 +362,7 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
|
||||
|
||||
private class AddTimetableViewHolder extends BaseTimetableViewHolder
|
||||
{
|
||||
private final Button mAdd;
|
||||
private final MaterialButton mAdd;
|
||||
|
||||
AddTimetableViewHolder(View itemView)
|
||||
{
|
||||
|
||||
@@ -4,12 +4,13 @@ import android.content.res.Resources;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
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.R;
|
||||
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
|
||||
{
|
||||
final TextView streetDef;
|
||||
final TextView streetLoc;
|
||||
final CompoundButton selected;
|
||||
final MaterialTextView streetDef;
|
||||
final MaterialTextView streetLoc;
|
||||
final MaterialRadioButton selected;
|
||||
|
||||
public StreetViewHolder(View itemView)
|
||||
{
|
||||
|
||||
@@ -7,7 +7,6 @@ import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -19,6 +18,7 @@ import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmFragment;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
public class TimetableContainerFragment extends BaseMwmFragment implements TimetableChangedListener
|
||||
{
|
||||
@@ -71,7 +71,7 @@ public class TimetableContainerFragment extends BaseMwmFragment implements Timet
|
||||
|
||||
@SuppressWarnings("NullableProblems")
|
||||
@NonNull
|
||||
private TextView mSwitchMode;
|
||||
private MaterialTextView mSwitchMode;
|
||||
|
||||
@SuppressWarnings("NullableProblems")
|
||||
@NonNull
|
||||
|
||||
@@ -36,7 +36,7 @@ public class LocationHelper implements BaseLocationProvider.Listener
|
||||
{
|
||||
private static final long INTERVAL_FOLLOW_MS = 0;
|
||||
private static final long INTERVAL_NOT_FOLLOW_MS = 3000;
|
||||
private static final long INTERVAL_NAVIGATION_MS = 0;
|
||||
private static final long INTERVAL_NAVIGATION_MS = 1000;
|
||||
private static final long INTERVAL_TRACK_RECORDING = 0;
|
||||
|
||||
private static final long AGPS_EXPIRATION_TIME_MS = 16 * 60 * 60 * 1000; // 16 hours
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package app.organicmaps.location;
|
||||
|
||||
import android.app.ForegroundServiceStartNotAllowedException;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.app.Service;
|
||||
@@ -107,7 +108,7 @@ public class TrackRecordingService extends Service implements LocationListener
|
||||
.setOngoing(true)
|
||||
.setShowWhen(true)
|
||||
.setOnlyAlertOnce(true)
|
||||
.setSmallIcon(R.drawable.ic_launcher_small)
|
||||
.setSmallIcon(R.drawable.ic_logo_small)
|
||||
.setContentTitle(context.getString(R.string.track_recording))
|
||||
.addAction(0, context.getString(R.string.navigation_stop_button), getExitPendingIntent(context))
|
||||
.setContentIntent(getPendingIntent(context))
|
||||
@@ -160,10 +161,25 @@ public class TrackRecordingService extends Service implements LocationListener
|
||||
}
|
||||
|
||||
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);
|
||||
else
|
||||
ServiceCompat.startForeground(this, TrackRecordingService.TRACK_REC_NOTIFICATION_ID, getNotificationBuilder(this).build(), 0);
|
||||
|
||||
try
|
||||
{
|
||||
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);
|
||||
|
||||
|
||||
@@ -484,10 +484,8 @@ public class MapButtonsController extends Fragment
|
||||
.build();
|
||||
ViewCompat.setOnApplyWindowInsetsListener(mFrame, insetsListener);
|
||||
// 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)
|
||||
mFrame.postDelayed(() -> ViewCompat.requestApplyInsets(mFrame), 1250);
|
||||
else
|
||||
mFrame.post(() -> ViewCompat.requestApplyInsets(mFrame));
|
||||
if (mFrame.hasWindowFocus())
|
||||
ViewCompat.requestApplyInsets(mFrame);
|
||||
}
|
||||
|
||||
@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 android.annotation.SuppressLint;
|
||||
import android.app.ForegroundServiceStartNotAllowedException;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.app.Service;
|
||||
@@ -154,7 +155,7 @@ public class NavigationService extends Service implements LocationListener
|
||||
.setOngoing(true)
|
||||
.setShowWhen(false)
|
||||
.setOnlyAlertOnce(true)
|
||||
.setSmallIcon(R.drawable.ic_launcher_small)
|
||||
.setSmallIcon(R.drawable.ic_logo_small)
|
||||
.setContentIntent(pendingIntent)
|
||||
.addAction(0, context.getString(R.string.navigation_stop_button), exitPendingIntent)
|
||||
.setColorized(isColorizedSupported())
|
||||
@@ -226,10 +227,25 @@ public class NavigationService extends Service implements LocationListener
|
||||
}
|
||||
|
||||
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);
|
||||
else
|
||||
ServiceCompat.startForeground(this, NavigationService.NOTIFICATION_ID, getNotificationBuilder(this).build(), 0);
|
||||
|
||||
try
|
||||
{
|
||||
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);
|
||||
|
||||
|
||||
@@ -56,13 +56,5 @@ public final class Constants
|
||||
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() {}
|
||||
}
|
||||
|
||||
@@ -9,8 +9,6 @@ import android.text.TextWatcher;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -34,8 +32,10 @@ import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
||||
|
||||
import com.google.android.material.appbar.MaterialToolbar;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -54,8 +54,8 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
||||
private TextInputEditText mEtName;
|
||||
@NonNull
|
||||
private TextInputLayout clearNameBtn;
|
||||
private TextView mTvBookmarkGroup;
|
||||
private ImageView mIvColor;
|
||||
private MaterialTextView mTvBookmarkGroup;
|
||||
private ShapeableImageView mIvColor;
|
||||
private BookmarkCategory mBookmarkCategory;
|
||||
@Nullable
|
||||
private Icon mIcon;
|
||||
@@ -208,7 +208,7 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
||||
|
||||
ViewCompat.setOnApplyWindowInsetsListener(toolbar, PaddingInsetsListener.excludeBottom());
|
||||
|
||||
final ImageView imageView = toolbar.findViewById(R.id.save);
|
||||
final ShapeableImageView imageView = toolbar.findViewById(R.id.save);
|
||||
switch (mType)
|
||||
{
|
||||
case TYPE_BOOKMARK ->
|
||||
@@ -412,7 +412,7 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
||||
{
|
||||
mListener = listener;
|
||||
}
|
||||
private void clearAndFocus(TextView textView)
|
||||
private void clearAndFocus(TextInputEditText textView)
|
||||
{
|
||||
textView.getEditableText().clear();
|
||||
textView.requestFocus();
|
||||
|
||||
@@ -4,8 +4,6 @@ import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.AttrRes;
|
||||
import androidx.annotation.NonNull;
|
||||
@@ -15,6 +13,10 @@ import androidx.core.view.WindowInsetsCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.lifecycle.Observer;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
||||
@@ -109,8 +111,8 @@ public final class PlacePageButtons extends Fragment implements Observer<List<Pl
|
||||
LayoutInflater inflater = LayoutInflater.from(requireContext());
|
||||
View parent = inflater.inflate(R.layout.place_page_button, mButtonsContainer, false);
|
||||
|
||||
ImageView icon = parent.findViewById(R.id.icon);
|
||||
TextView title = parent.findViewById(R.id.title);
|
||||
ShapeableImageView icon = parent.findViewById(R.id.icon);
|
||||
MaterialTextView title = parent.findViewById(R.id.title);
|
||||
|
||||
title.setText(current.getTitle());
|
||||
parent.setContentDescription(getString(current.getTitle()));
|
||||
|
||||
@@ -13,7 +13,6 @@ import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.IdRes;
|
||||
import androidx.annotation.NonNull;
|
||||
@@ -34,11 +33,16 @@ import app.organicmaps.downloader.CountryItem;
|
||||
import app.organicmaps.downloader.DownloaderStatusIcon;
|
||||
import app.organicmaps.downloader.MapManager;
|
||||
import app.organicmaps.editor.Editor;
|
||||
import app.organicmaps.editor.OhState;
|
||||
import app.organicmaps.editor.OpeningHours;
|
||||
import app.organicmaps.editor.data.HoursMinutes;
|
||||
import app.organicmaps.editor.data.Timetable;
|
||||
import app.organicmaps.location.LocationHelper;
|
||||
import app.organicmaps.location.LocationListener;
|
||||
import app.organicmaps.location.SensorHelper;
|
||||
import app.organicmaps.location.SensorListener;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.util.DateUtils;
|
||||
import app.organicmaps.util.SharingUtils;
|
||||
import app.organicmaps.util.StringUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
@@ -49,12 +53,15 @@ import app.organicmaps.widget.placepage.sections.PlacePageBookmarkFragment;
|
||||
import app.organicmaps.widget.placepage.sections.PlacePageLinksFragment;
|
||||
import app.organicmaps.widget.placepage.sections.PlacePageOpeningHoursFragment;
|
||||
import app.organicmaps.widget.placepage.sections.PlacePagePhoneFragment;
|
||||
import app.organicmaps.widget.placepage.sections.PlacePageProductsFragment;
|
||||
import app.organicmaps.widget.placepage.sections.PlacePageWikipediaFragment;
|
||||
|
||||
import com.google.android.material.appbar.MaterialToolbar;
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
@@ -71,7 +78,6 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
{
|
||||
private static final String PREF_COORDINATES_FORMAT = "coordinates_format";
|
||||
private static final String BOOKMARK_FRAGMENT_TAG = "BOOKMARK_FRAGMENT_TAG";
|
||||
private static final String PRODUCTS_FRAGMENT_TAG = "PRODUCTS_FRAGMENT_TAG";
|
||||
private static final String WIKIPEDIA_FRAGMENT_TAG = "WIKIPEDIA_FRAGMENT_TAG";
|
||||
private static final String PHONE_FRAGMENT_TAG = "PHONE_FRAGMENT_TAG";
|
||||
private static final String OPENING_HOURS_FRAGMENT_TAG = "OPENING_HOURS_FRAGMENT_TAG";
|
||||
@@ -85,41 +91,44 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
CoordinatesFormat.MGRS,
|
||||
CoordinatesFormat.OSMLink);
|
||||
private View mFrame;
|
||||
private Context mContext;
|
||||
|
||||
// Preview.
|
||||
private ViewGroup mPreview;
|
||||
private MaterialToolbar mToolbar;
|
||||
private TextView mTvTitle;
|
||||
private TextView mTvSecondaryTitle;
|
||||
private TextView mTvSubtitle;
|
||||
private MaterialTextView mTvTitle;
|
||||
private MaterialTextView mTvSecondaryTitle;
|
||||
private MaterialTextView mTvSubtitle;
|
||||
private MaterialTextView mTvOpenState;
|
||||
private ArrowView mAvDirection;
|
||||
private TextView mTvDistance;
|
||||
private TextView mTvAddress;
|
||||
private MaterialTextView mTvDistance;
|
||||
private MaterialTextView mTvAddress;
|
||||
// Details.
|
||||
private TextView mTvLatlon;
|
||||
private MaterialTextView mTvLatlon;
|
||||
private View mWifi;
|
||||
private TextView mTvWiFi;
|
||||
private MaterialTextView mTvWiFi;
|
||||
private View mOperator;
|
||||
private TextView mTvOperator;
|
||||
private MaterialTextView mTvOperator;
|
||||
private View mNetwork;
|
||||
private TextView mTvNetwork;
|
||||
private MaterialTextView mTvNetwork;
|
||||
private View mLevel;
|
||||
private TextView mTvLevel;
|
||||
private MaterialTextView mTvLevel;
|
||||
private View mAtm;
|
||||
private TextView mTvAtm;
|
||||
private MaterialTextView mTvAtm;
|
||||
private View mCapacity;
|
||||
private TextView mTvCapacity;
|
||||
private MaterialTextView mTvCapacity;
|
||||
private View mWheelchair;
|
||||
private TextView mTvWheelchair;
|
||||
private MaterialTextView mTvWheelchair;
|
||||
private View mDriveThrough;
|
||||
private TextView mTvDriveThrough;
|
||||
private MaterialTextView mTvDriveThrough;
|
||||
private View mSelfService;
|
||||
private TextView mTvSelfService;
|
||||
private MaterialTextView mTvSelfService;
|
||||
private View mCuisine;
|
||||
private TextView mTvCuisine;
|
||||
private MaterialTextView mTvCuisine;
|
||||
private View mOutdoorSeating;
|
||||
private TextView mTvOutdoorSeating;
|
||||
private MaterialTextView mTvOutdoorSeating;
|
||||
private View mEntrance;
|
||||
private TextView mTvEntrance;
|
||||
private MaterialTextView mTvEntrance;
|
||||
private View mEditPlace;
|
||||
private View mAddOrganisation;
|
||||
private View mAddPlace;
|
||||
@@ -129,7 +138,7 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
private CoordinatesFormat mCoordsFormat = CoordinatesFormat.LatLonDecimal;
|
||||
// Downloader`s stuff
|
||||
private DownloaderStatusIcon mDownloaderIcon;
|
||||
private TextView mDownloaderInfo;
|
||||
private MaterialTextView mDownloaderInfo;
|
||||
private int mStorageCallbackSlot;
|
||||
@Nullable
|
||||
private CountryItem mCurrentCountry;
|
||||
@@ -161,7 +170,7 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
private PlacePageViewModel mViewModel;
|
||||
private MapObject mMapObject;
|
||||
|
||||
private static void refreshMetadataOrHide(@Nullable String metadata, @NonNull View metaLayout, @NonNull TextView metaTv)
|
||||
private static void refreshMetadataOrHide(@Nullable String metadata, @NonNull View metaLayout, @NonNull MaterialTextView metaTv)
|
||||
{
|
||||
if (!TextUtils.isEmpty(metadata))
|
||||
{
|
||||
@@ -203,7 +212,6 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
|
||||
mFrame = view;
|
||||
mFrame.setOnClickListener((v) -> mPlacePageViewListener.onPlacePageRequestToggleState());
|
||||
|
||||
mPreview = mFrame.findViewById(R.id.pp__preview);
|
||||
|
||||
mFrame.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
|
||||
@@ -222,6 +230,7 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
mTvSecondaryTitle.setOnClickListener(this);
|
||||
mToolbar = mFrame.findViewById(R.id.toolbar);
|
||||
mTvSubtitle = mPreview.findViewById(R.id.tv__subtitle);
|
||||
mTvOpenState = mPreview.findViewById(R.id.tv__open_state);
|
||||
|
||||
View directionFrame = mPreview.findViewById(R.id.direction_frame);
|
||||
mTvDistance = mPreview.findViewById(R.id.tv__straight_distance);
|
||||
@@ -314,6 +323,7 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
mViewModel.getMapObject().removeObserver(this);
|
||||
LocationHelper.from(requireContext()).removeListener(this);
|
||||
SensorHelper.from(requireContext()).removeListener(this);
|
||||
UiThread.cancelDelayedTasks(updateOpenState);
|
||||
detachCountry();
|
||||
}
|
||||
|
||||
@@ -392,18 +402,6 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
updateViewFragment(PlacePageWikipediaFragment.class, WIKIPEDIA_FRAGMENT_TAG, R.id.place_page_wikipedia_fragment, hasWikipediaEntry());
|
||||
}
|
||||
|
||||
// private boolean hasProductsEntry()
|
||||
// {
|
||||
// return Framework.nativeShouldShowProducts();
|
||||
// }
|
||||
|
||||
// private void updateProductsView()
|
||||
// {
|
||||
// var hasProductsEntry = hasProductsEntry();
|
||||
//
|
||||
// updateViewFragment(PlacePageProductsFragment.class, PRODUCTS_FRAGMENT_TAG, R.id.place_page_products_fragment, hasProductsEntry);
|
||||
// }
|
||||
|
||||
private void setTextAndColorizeSubtitle()
|
||||
{
|
||||
String text = mMapObject.getSubtitle();
|
||||
@@ -426,6 +424,8 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
{
|
||||
UiUtils.setTextAndHideIfEmpty(mTvTitle, mMapObject.getTitle());
|
||||
UiUtils.setTextAndHideIfEmpty(mTvSecondaryTitle, mMapObject.getSecondaryTitle());
|
||||
refreshOpenState();
|
||||
|
||||
if (mToolbar != null)
|
||||
mToolbar.setTitle(mMapObject.getTitle());
|
||||
setTextAndColorizeSubtitle();
|
||||
@@ -481,9 +481,9 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
mEditPlace.setEnabled(Editor.nativeShouldEnableEditPlace());
|
||||
mAddOrganisation.setEnabled(Editor.nativeShouldEnableAddPlace());
|
||||
mAddPlace.setEnabled(Editor.nativeShouldEnableAddPlace());
|
||||
TextView mTvEditPlace = mEditPlace.findViewById(R.id.tv__editor);
|
||||
TextView mTvAddBusiness = mAddPlace.findViewById(R.id.tv__editor);
|
||||
TextView mTvAddPlace = mAddPlace.findViewById(R.id.tv__editor);
|
||||
MaterialTextView mTvEditPlace = mEditPlace.findViewById(R.id.tv__editor);
|
||||
MaterialTextView mTvAddBusiness = mAddPlace.findViewById(R.id.tv__editor);
|
||||
MaterialTextView mTvAddPlace = mAddPlace.findViewById(R.id.tv__editor);
|
||||
final int editPlaceButtonColor = Editor.nativeShouldEnableEditPlace() ? ContextCompat.getColor(getContext(), UiUtils.getStyledResourceId(getContext(), androidx.appcompat.R.attr.colorAccent)) : getResources().getColor(R.color.button_accent_text_disabled);
|
||||
mTvEditPlace.setTextColor(editPlaceButtonColor);
|
||||
mTvAddBusiness.setTextColor(editPlaceButtonColor);
|
||||
@@ -494,7 +494,6 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
}
|
||||
updateLinksView();
|
||||
updateOpeningHoursView();
|
||||
//updateProductsView(); Disable begging message on placepage
|
||||
updateWikipediaView();
|
||||
updateBookmarkView();
|
||||
updatePhoneView();
|
||||
@@ -561,6 +560,62 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
mTvLatlon.setText(latLon);
|
||||
}
|
||||
|
||||
Runnable updateOpenState = this::refreshOpenState;
|
||||
|
||||
private void refreshOpenState()
|
||||
{
|
||||
UiThread.runLater(updateOpenState, 45000); // Refresh every 45s
|
||||
|
||||
final String ohStr = mMapObject.getMetadata(Metadata.MetadataType.FMD_OPEN_HOURS);
|
||||
final Timetable[] timetables = OpeningHours.nativeTimetablesFromString(ohStr);
|
||||
|
||||
if (timetables != null && timetables.length != 0)
|
||||
{
|
||||
final Context context = requireContext();
|
||||
final OhState poiState = OpeningHours.nativeCurrentState(timetables);
|
||||
|
||||
// Ignore unknown rule state
|
||||
if (poiState.state == OhState.State.Unknown)
|
||||
{ UiUtils.hide(mTvOpenState); return; }
|
||||
|
||||
// Get colours
|
||||
final ForegroundColorSpan colorGreen = new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_green));
|
||||
final ForegroundColorSpan colorYellow = new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_yellow));
|
||||
final ForegroundColorSpan colorRed = new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_red));
|
||||
|
||||
// Get next state info
|
||||
final SpannableStringBuilder openStateString = new SpannableStringBuilder();
|
||||
final boolean isOpen = (poiState.state == OhState.State.Open); // False == Closed due to early exit for Unknown
|
||||
final long nextStateTime = isOpen ? poiState.nextTimeClosed : poiState.nextTimeOpen; // Unix time (seconds)
|
||||
final int minsToNextState = (int) ((nextStateTime - (System.currentTimeMillis() / 1000)) / 60);
|
||||
|
||||
if (minsToNextState <= 60) // POI opens/closes in 60 mins
|
||||
{
|
||||
final String minsToChangeStr = minsToNextState + " " + getString(R.string.minute);
|
||||
final String nextChangeFormatted = getString(isOpen ? R.string.closes_in : R.string.opens_in, minsToChangeStr);
|
||||
final ForegroundColorSpan nextChangeColor = isOpen ? colorYellow : colorRed;
|
||||
//TODO: We should check closed/open time for specific feature's timezone.
|
||||
ZonedDateTime time = ZonedDateTime.ofInstant(Instant.ofEpochSecond(nextStateTime), ZoneId.systemDefault());
|
||||
String localizedTime = new HoursMinutes(time.getHour(), time.getMinute(), DateUtils.is24HourFormat(context)).toString();
|
||||
|
||||
openStateString.append(nextChangeFormatted, nextChangeColor, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||
.append(" • ") // Add spacer
|
||||
.append(getString(R.string.at, localizedTime));
|
||||
}
|
||||
else if (isOpen)
|
||||
openStateString.append(getString(R.string.open_now), colorGreen, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
//TODO: Add "Closes at 18:00" etc
|
||||
else // Closed
|
||||
openStateString.append(getString(R.string.closed_now), colorRed, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
//TODO: Add "Opens at 18:00" etc
|
||||
|
||||
UiUtils.setTextAndHideIfEmpty(mTvOpenState, openStateString);
|
||||
return;
|
||||
}
|
||||
// No valid timetable
|
||||
UiUtils.hide(mTvOpenState);
|
||||
}
|
||||
|
||||
private void addOrganisation()
|
||||
{
|
||||
((MwmActivity) requireActivity()).showPositionChooserForEditor(true, false);
|
||||
@@ -571,9 +626,6 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
((MwmActivity) requireActivity()).showPositionChooserForEditor(false, true);
|
||||
}
|
||||
|
||||
/// @todo
|
||||
/// - Why ll__place_editor and ll__place_latlon check if (mMapObject == null)
|
||||
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
|
||||
@@ -3,7 +3,6 @@ package app.organicmaps.widget.placepage.sections;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
@@ -21,6 +20,8 @@ import java.util.List;
|
||||
import static app.organicmaps.editor.data.TimeFormatUtils.formatNonBusinessTime;
|
||||
import static app.organicmaps.editor.data.TimeFormatUtils.formatWeekdaysRange;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
public class PlaceOpeningHoursAdapter extends RecyclerView.Adapter<PlaceOpeningHoursAdapter.ViewHolder>
|
||||
{
|
||||
private List<WeekScheduleData> mWeekSchedule = Collections.emptyList();
|
||||
@@ -161,9 +162,9 @@ public class PlaceOpeningHoursAdapter extends RecyclerView.Adapter<PlaceOpeningH
|
||||
|
||||
public static class ViewHolder extends RecyclerView.ViewHolder
|
||||
{
|
||||
private final TextView mWeekdays;
|
||||
private final TextView mOpenTime;
|
||||
private final TextView mNonBusinessTime;
|
||||
private final MaterialTextView mWeekdays;
|
||||
private final MaterialTextView mOpenTime;
|
||||
private final MaterialTextView mNonBusinessTime;
|
||||
|
||||
public ViewHolder(@NonNull View itemView)
|
||||
{
|
||||
|
||||
@@ -13,7 +13,6 @@ import android.view.ViewGroup;
|
||||
import android.webkit.WebSettings;
|
||||
import android.webkit.WebView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -21,6 +20,9 @@ import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.lifecycle.Observer;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.bookmarks.data.Bookmark;
|
||||
import app.organicmaps.bookmarks.data.BookmarkManager;
|
||||
@@ -37,7 +39,7 @@ public class PlacePageBookmarkFragment extends Fragment implements View.OnClickL
|
||||
EditBookmarkFragment.EditBookmarkListener
|
||||
{
|
||||
private View mFrame;
|
||||
private TextView mTvBookmarkNote;
|
||||
private MaterialTextView mTvBookmarkNote;
|
||||
@Nullable
|
||||
private WebView mWvBookmarkNote;
|
||||
|
||||
|
||||
@@ -5,7 +5,6 @@ import android.text.TextUtils;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -27,43 +26,45 @@ import java.util.List;
|
||||
import static android.view.View.GONE;
|
||||
import static android.view.View.VISIBLE;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
public class PlacePageLinksFragment extends Fragment implements Observer<MapObject>
|
||||
{
|
||||
private static final String TAG = PlacePageLinksFragment.class.getSimpleName();
|
||||
|
||||
private View mFrame;
|
||||
private View mFacebookPage;
|
||||
private TextView mTvFacebookPage;
|
||||
private MaterialTextView mTvFacebookPage;
|
||||
private View mInstagramPage;
|
||||
private TextView mTvInstagramPage;
|
||||
private MaterialTextView mTvInstagramPage;
|
||||
private View mTwitterPage;
|
||||
private TextView mTvTwitterPage;
|
||||
private MaterialTextView mTvTwitterPage;
|
||||
private View mFediversePage;
|
||||
private TextView mTvFediversePage;
|
||||
private MaterialTextView mTvFediversePage;
|
||||
private View mBlueskyPage;
|
||||
private TextView mTvBlueskyPage;
|
||||
private MaterialTextView mTvBlueskyPage;
|
||||
private View mVkPage;
|
||||
private TextView mTvVkPage;
|
||||
private MaterialTextView mTvVkPage;
|
||||
private View mLinePage;
|
||||
private TextView mTvLinePage;
|
||||
private MaterialTextView mTvLinePage;
|
||||
|
||||
private View mWebsite;
|
||||
private TextView mTvWebsite;
|
||||
private MaterialTextView mTvWebsite;
|
||||
private View mWebsiteMenu;
|
||||
private TextView mTvWebsiteMenuSubsite;
|
||||
private MaterialTextView mTvWebsiteMenuSubsite;
|
||||
private View mEmail;
|
||||
private TextView mTvEmail;
|
||||
private MaterialTextView mTvEmail;
|
||||
private View mWikimedia;
|
||||
private TextView mTvWikimedia;
|
||||
private MaterialTextView mTvWikimedia;
|
||||
|
||||
private View mPanoramax;
|
||||
private TextView mTvPanoramax;
|
||||
private MaterialTextView mTvPanoramax;
|
||||
|
||||
private PlacePageViewModel mViewModel;
|
||||
private MapObject mMapObject;
|
||||
|
||||
private static void refreshMetadataOrHide(@Nullable String metadata, @NonNull View metaLayout,
|
||||
@NonNull TextView metaTv)
|
||||
@NonNull MaterialTextView metaTv)
|
||||
{
|
||||
if (!TextUtils.isEmpty(metadata))
|
||||
{
|
||||
|
||||
@@ -5,7 +5,6 @@ import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.ColorInt;
|
||||
import androidx.annotation.NonNull;
|
||||
@@ -15,6 +14,9 @@ import androidx.fragment.app.Fragment;
|
||||
import androidx.lifecycle.Observer;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.bookmarks.data.MapObject;
|
||||
import app.organicmaps.bookmarks.data.Metadata;
|
||||
@@ -34,9 +36,9 @@ import java.util.Locale;
|
||||
public class PlacePageOpeningHoursFragment extends Fragment implements Observer<MapObject>
|
||||
{
|
||||
private View mFrame;
|
||||
private TextView mTodayLabel;
|
||||
private TextView mTodayOpenTime;
|
||||
private TextView mTodayNonBusinessTime;
|
||||
private MaterialTextView mTodayLabel;
|
||||
private MaterialTextView mTodayOpenTime;
|
||||
private MaterialTextView mTodayNonBusinessTime;
|
||||
private RecyclerView mFullWeekOpeningHours;
|
||||
private PlaceOpeningHoursAdapter mOpeningHoursAdapter;
|
||||
|
||||
|
||||
@@ -1,107 +0,0 @@
|
||||
package app.organicmaps.widget.placepage.sections;
|
||||
|
||||
import static androidx.core.util.ObjectsCompat.requireNonNull;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import app.organicmaps.Framework;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.products.Product;
|
||||
import app.organicmaps.products.ProductsConfig;
|
||||
import app.organicmaps.util.Constants;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
|
||||
public class PlacePageProductsFragment extends Fragment
|
||||
{
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
|
||||
{
|
||||
return inflater.inflate(R.layout.place_page_products_fragment, container, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
|
||||
var config = Framework.nativeGetProductsConfiguration();
|
||||
if (config != null && isValidConfig(config))
|
||||
{
|
||||
UiUtils.show(view);
|
||||
|
||||
updateView(view, config);
|
||||
} else
|
||||
{
|
||||
UiUtils.hide(view);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateView(@NonNull View view, @NonNull ProductsConfig config)
|
||||
{
|
||||
var layoutInflater = LayoutInflater.from(view.getContext());
|
||||
|
||||
TextView productsPrompt = requireNonNull(view.findViewById(R.id.products_prompt));
|
||||
LinearLayout productsButtons = requireNonNull(view.findViewById(R.id.products_buttons));
|
||||
View closeButton = requireNonNull(view.findViewById(R.id.products_close));
|
||||
View productsRemindLater = requireNonNull(view.findViewById(R.id.products_remind_later));
|
||||
View alreadyDonated = requireNonNull(view.findViewById(R.id.products_already_donated));
|
||||
|
||||
productsPrompt.setText(config.placePagePrompt);
|
||||
|
||||
productsButtons.removeAllViews();
|
||||
|
||||
for (var product : Objects.requireNonNull(config.products))
|
||||
{
|
||||
var button = (Button) layoutInflater.inflate(R.layout.item_product, productsButtons, false);
|
||||
button.setText(product.title);
|
||||
button.setOnClickListener((v) -> {
|
||||
onProductSelected(product);
|
||||
});
|
||||
|
||||
productsButtons.addView(button);
|
||||
}
|
||||
|
||||
closeButton.setOnClickListener((v) -> {
|
||||
closeWithReason(view, Constants.ProductsPopupCloseReason.CLOSE);
|
||||
});
|
||||
|
||||
productsRemindLater.setOnClickListener((v) -> {
|
||||
closeWithReason(view, Constants.ProductsPopupCloseReason.REMIND_LATER);
|
||||
});
|
||||
|
||||
alreadyDonated.setOnClickListener((v) -> {
|
||||
closeWithReason(view, Constants.ProductsPopupCloseReason.ALREADY_DONATED);
|
||||
});
|
||||
}
|
||||
|
||||
private void closeWithReason(View view, String reason)
|
||||
{
|
||||
Framework.nativeDidCloseProductsPopup(reason);
|
||||
UiUtils.hide(view);
|
||||
}
|
||||
|
||||
private void onProductSelected(Product product)
|
||||
{
|
||||
Utils.openUrl(requireActivity(), product.link);
|
||||
Framework.nativeDidSelectProduct(product.title, product.link);
|
||||
}
|
||||
|
||||
private boolean isValidConfig(@NonNull ProductsConfig config)
|
||||
{
|
||||
return config.products != null && config.products.length > 0;
|
||||
}
|
||||
}
|
||||
@@ -7,13 +7,15 @@ import android.text.TextUtils;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.lifecycle.Observer;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.bookmarks.data.MapObject;
|
||||
import app.organicmaps.bookmarks.data.Metadata;
|
||||
@@ -29,7 +31,7 @@ public class PlacePageWikipediaFragment extends Fragment implements Observer<Map
|
||||
private View mWiki;
|
||||
private View mPlaceDescriptionViewContainer;
|
||||
|
||||
private TextView mPlaceDescriptionView;
|
||||
private MaterialTextView mPlaceDescriptionView;
|
||||
|
||||
private PlacePageViewModel mViewModel;
|
||||
|
||||
|
||||
@@ -7,10 +7,12 @@ import android.text.TextUtils;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.util.Utils;
|
||||
|
||||
@@ -61,7 +63,7 @@ public class PlacePhoneAdapter extends RecyclerView.Adapter<PlacePhoneAdapter.Vi
|
||||
|
||||
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener
|
||||
{
|
||||
private final TextView mPhone;
|
||||
private final MaterialTextView mPhone;
|
||||
|
||||
public ViewHolder(@NonNull View itemView)
|
||||
{
|
||||
|
||||