Compare commits
1 Commits
pastk-andr
...
release/20
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1fe3526bf4 |
@@ -7,11 +7,9 @@ CoMaps contributors:
|
|||||||
(in alphabetic order)
|
(in alphabetic order)
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
Bastian Greshake Tzovaras
|
|
||||||
clover sage
|
clover sage
|
||||||
Harry Bond <me@hbond.xyz>
|
Harry Bond <me@hbond.xyz>
|
||||||
vikiawv
|
vikiawv
|
||||||
Yannik Bloscheck
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
Organic Maps (formerly OMaps) contributors:
|
Organic Maps (formerly OMaps) contributors:
|
||||||
|
|||||||
165
README.md
@@ -1,88 +1,62 @@
|
|||||||
<!-- Navigation Bar -->
|
<!--<div align="center">
|
||||||
<p align="center">
|
<img src="qt/res/logo.png" height="100"/>
|
||||||
<a href="https://codeberg.org/comaps#comaps">Project Intro</a> |
|
</div>-->
|
||||||
<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>
|
|
||||||
|
|
||||||
<div align="center" >
|
<!-- a nav bar -->
|
||||||
<img src="docs/badges/logo.svg" width="150">
|
[Project Intro](https://codeberg.org/comaps#comaps)
|
||||||
</div>
|
| [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">
|
|
||||||
<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.
|
||||||
|
|
||||||
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.
|
There are apps for Android and iOS (and ARM MacOS).
|
||||||
|
An alpha Linux / MacOS Qt desktop version, which is also suitable for Linux phones.
|
||||||
|
|
||||||
**Available for:** Android, iOS, ARM macOS, and alpha Linux/macOS desktop builds (also usable on Linux phones).
|
[<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)
|
||||||
|
|
||||||
<p align="center">
|
<p float="left">
|
||||||
<a href="https://apps.apple.com/app/comaps/id6747180809">
|
|
||||||
<img src="docs/badges/apple-appstore.png" alt="App Store" width="160"/>
|
|
||||||
</a>
|
|
||||||
<a href="https://play.google.com/store/apps/details?id=app.comaps.google">
|
|
||||||
<img src="docs/badges/google-play.png" alt="Google Play" width="160"/>
|
|
||||||
</a>
|
|
||||||
<a href="https://f-droid.org/en/packages/app.comaps.fdroid/">
|
|
||||||
<img src="docs/badges/fdroid.png" alt="F-Droid" width="160"/>
|
|
||||||
</a>
|
|
||||||
<a href="https://codeberg.org/comaps/comaps/releases">
|
|
||||||
<img src="docs/badges/codeberg.png" alt="Codeberg" width="160"/>
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Screenshots -->
|
|
||||||
<p align="center">
|
|
||||||
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/1.png" width="180" />
|
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/1.png" width="180" />
|
||||||
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/2.png" width="180" />
|
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/2.png" width="180" />
|
||||||
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/3.png" width="180" />
|
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/3.png" width="180" />
|
||||||
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/4.png" width="180" />
|
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/4.png" width="180" />
|
||||||
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/5.png" width="180" />
|
|
||||||
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/6.png" width="180" />
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
---
|
**Offline-focused**: Plan and navigate your trip abroad without the need for cellular service, search waypoints while on a distant hike, etc. All app functions are designed to work offline.
|
||||||
|
|
||||||
## ⚡️ Highlights
|
**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.
|
||||||
|
|
||||||
- **Offline-first**: Navigate without a connection
|
**Simple and Polished**: Essential, easy to use features that just work.
|
||||||
- **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.
|
||||||
|
|
||||||
## 🚀 Main Features
|
**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
|
||||||
|
|
||||||
- Downloadable detailed maps with places which are not available with Google Maps
|
- Downloadable detailed maps with places which are not available with Google Maps
|
||||||
|
|
||||||
@@ -112,52 +86,41 @@ A community-led free & open source maps app based on [OpenStreetMap](https://www
|
|||||||
|
|
||||||
- Android Auto and CarPlay support
|
- Android Auto and CarPlay support
|
||||||
|
|
||||||
***Freedom Is Here – Navigate the world with privacy and community at the forefront.***
|
*Freedom Is Here - Discover your journey, navigate the world with privacy and community at the forefront!*
|
||||||
|
|
||||||
---
|
## Contributing
|
||||||
|
|
||||||
## 🤝 Contributing
|
|
||||||
|
|
||||||
You can help by donating, contributing code, translating, or by telling others about it. To build the best maps app there is a need for software development, design, product, community development, and other areas. Reach out to us and let us know how you want to help.
|
You can help by donating, contributing code, translating, or by telling others about it. To build the best maps app there is a need for software development, design, product, community development, and other areas. Reach out to us and let us know how you want to help.
|
||||||
|
|
||||||
- Build instructions: [docs/INSTALL.md](docs/INSTALL.md)
|
If you want to build the project, check [docs/INSTALL.md](docs/INSTALL.md). If you want to help the project,
|
||||||
- Contribution guide: [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md)
|
see [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md). You can help in many ways, the ability to code is not necessary.
|
||||||
> [!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!
|
|
||||||
|
|
||||||
There is a dedicated Zulip chat for active contributors: [Zulip](https://comaps.zulipchat.com)
|
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: [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)
|
||||||
|
|
||||||
## 💸 Funding
|
## 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!
|
||||||
|
|
||||||
CoMaps is free. To stay that way, it relies on your support.
|
|
||||||
Donate via [OpenCollective](https://opencollective.com/comaps/donate) or [Liberapay](https://liberapay.com/CoMaps).
|
|
||||||
The project's financial information is completely open and transparent at [our Open Collective](https://opencollective.com/comaps).
|
The project's financial information is completely open and transparent at [our Open Collective](https://opencollective.com/comaps).
|
||||||
|
|
||||||
---
|
## Privacy
|
||||||
|
|
||||||
## 🔒 Privacy
|
The Android application was analysed by the [Exodus platform](https://reports.exodus-privacy.eu.org/fr/reports/app.comaps.google/latest/)
|
||||||
|
|
||||||
The Android app has been reviewed by [Exodus Privacy](https://reports.exodus-privacy.eu.org/en/reports/app.comaps.google/latest/).
|
## License and Copyright
|
||||||
|
|
||||||
To [verify](https://developer.android.com/studio/command-line/apksigner#usage-verify) the APK, use the following signing certificate fingerprints:
|
Licensed under the Apache License, Version 2.0. See
|
||||||
```
|
[LICENSE](LICENSE),
|
||||||
SHA-256: 4894e8e6963627ef660031d8593fe77297f835acb4e23810003e926135023b4c
|
[NOTICE](NOTICE)
|
||||||
SHA-1: 8b7b5739f917e9f7c681671ced0c9c8562123ade
|
and [data/copyright.html](data/copyright.html)
|
||||||
MD5: 9cce0ffea281dc2f0e0a154d6d2e281e
|
for more information.
|
||||||
```
|
|
||||||
---
|
|
||||||
|
|
||||||
## ⚖️ 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
@@ -1,4 +0,0 @@
|
|||||||
<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>
|
|
||||||
|
Before Width: | Height: | Size: 753 B |
@@ -65,13 +65,6 @@ project.ext.appName = 'CoMaps'
|
|||||||
android {
|
android {
|
||||||
namespace 'app.organicmaps'
|
namespace 'app.organicmaps'
|
||||||
|
|
||||||
dependenciesInfo {
|
|
||||||
// Disables dependency metadata when building APKs (for IzzyOnDroid/F-Droid)
|
|
||||||
includeInApk = false
|
|
||||||
// Disables dependency metadata when building Android App Bundles (for Google Play)
|
|
||||||
includeInBundle = false
|
|
||||||
}
|
|
||||||
|
|
||||||
buildFeatures {
|
buildFeatures {
|
||||||
dataBinding = true
|
dataBinding = true
|
||||||
buildConfig = true
|
buildConfig = true
|
||||||
|
|||||||
BIN
android/app/ic_launcher-playstore.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
@@ -6,12 +6,12 @@ Můžete se zde také připojit ke komunitě pomáhat s vytvářením nejlepší
|
|||||||
• Poskytujte zpětnou vazbu a nahlašujte problémy
|
• Poskytujte zpětnou vazbu a nahlašujte problémy
|
||||||
• Aktualizujte mapová data v aplikaci nebo na webu OpenStreetMap
|
• Aktualizujte mapová data v aplikaci nebo na webu OpenStreetMap
|
||||||
|
|
||||||
‣ <b>Zaměřené na offline použití</b>: Plánujte a navigujte své cesty do zahraničí bez nutnosti mobilních dat, hledejte body na vzdálených túrách apod. Všechny funkce aplikace jsou navrženy tak, aby fungovaly offline.
|
• <b>Zaměřené na offline použití</b>: Plánujte a navigujte své cesty do zahraničí bez nutnosti mobilních dat, hledejte body na vzdálených túrách apod. Všechny funkce aplikace jsou navrženy tak, aby fungovaly offline.
|
||||||
‣ <b>S ohledem na soukromí</b>: Aplikace je navržená s důrazem na soukromí – neidentifikuje lidi, nesleduje vás a nesbírá osobní údaje. Bez reklam.
|
• <b>S ohledem na soukromí</b>: Aplikace je navržená s důrazem na soukromí – neidentifikuje lidi, nesleduje vás a nesbírá osobní údaje. Bez reklam.
|
||||||
‣ <b>Jednoduché a vyladěné</b>: Základní, snadno použitelné funkce, které prostě fungují.
|
• <b>Jednoduché a vyladěné</b>: Základní, snadno použitelné funkce, které prostě fungují.
|
||||||
‣ <b>Šetří vaši baterii a místo</b>: Nevybíjí vaší baterii, jako ostatní navigační aplikace. Kompaktní mapy šetří cenné místo ve vašem telefonu.
|
• <b>Šetří vaši baterii a místo</b>: Nevybíjí vaší baterii, jako ostatní navigační aplikace. Kompaktní mapy šetří cenné místo ve vašem telefonu.
|
||||||
‣ <b>Bezplatné a vytvořené komunitou</b>: S vytvářením aplikace pomáhají lidé, jako jste vy, přidáváním míst do projektu OpenStreetMap, testováním a poskytováním zpětné vazby k funkcím a přispíváním svými vývojářskými schopnostmi a penězi.
|
• <b>Bezplatné a vytvořené komunitou</b>: S vytvářením aplikace pomáhají lidé, jako jste vy, přidáváním míst do projektu OpenStreetMap, testováním a poskytováním zpětné vazby k funkcím a přispíváním svými vývojářskými schopnostmi a penězi.
|
||||||
‣ <b>Otevřené a transparentní rozhodování a nakládání s financemi, neziskovost a plně otevřený zdrojový kód.</b>
|
• <b>Otevřené a transparentní rozhodování a nakládání s financemi, neziskovost a plně otevřený zdrojový kód.</b>
|
||||||
|
|
||||||
<b>Hlavní funkce</b>:
|
<b>Hlavní funkce</b>:
|
||||||
• Stahovatelné podrobné mapy s místy, která nenajdete ani v Mapách Google
|
• Stahovatelné podrobné mapy s místy, která nenajdete ani v Mapách Google
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
Jednoduchá navigace v mapě – Objevte více na své cestě – Vyvíjeno komunitou
|
Jednoduchá navigace v mapě - Objevte více na své cestě ‐ Vyvíjeno komunitou
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
Nem kortnavigation - Oplev mere af din rejse - Drevet af fællesskabet
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
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 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, datensparsam und nicht gewinnorientiert. CoMaps ist ein Fork/Abspaltung von Organic Maps, die wiederum ein Fork/Abspaltung von Maps.Me ist.
|
||||||
|
|
||||||
Lese mehr über die Gründe und Ziele des Projektes unter <b><i>codeberg.org/comaps</i></b>.
|
Lese mehr über die Gründe und Ziele des Projektes unter <b><i>codeberg.org/comaps</i></b>.
|
||||||
Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
|
Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
|
||||||
@@ -28,5 +28,5 @@ Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
|
|||||||
• Dunkler Modus für die Nutzung bei Nacht
|
• Dunkler Modus für die Nutzung bei Nacht
|
||||||
• Kartenbearbeitung direkt in der App mit einem einfachen Editor
|
• Kartenbearbeitung direkt in der App mit einem einfachen Editor
|
||||||
|
|
||||||
<b>Entdecke die Unabhängigkeit</b>
|
<b>Freiheit beginnt hier</b>
|
||||||
Entdecke deine Reise – navigiere in der Welt mit Datenschutz!
|
Entdecke deine Reise – navigiere in der Welt mit Datenschutz!
|
||||||
|
|||||||
@@ -1,9 +1,6 @@
|
|||||||
Wir stellen vor: Das neue CoMaps-Logo!
|
• OpenStreetMap-Daten vom 22. Juni
|
||||||
• Verbesserte Höhenlinien in vielen Regionen (Stufen von 20/50 m)
|
• Optionale automatische Backups von Lesezeichen & Tracks
|
||||||
• Links zu Panoramax-Bildern für ausgewählte POIs
|
• Neue 100m-Höhenlinien für Regionen die vorher gröbere/keine Isolinien hatten
|
||||||
• OpenStreetMap-Daten vom 13. Juli
|
• Vegetation & Spielplätze werden früher angezeigt, neue Farben für Campingplätze & andere Einrichtungen
|
||||||
• Neue Farben für viele Objekte und Farben werden früher angezeigt
|
• Pfade & Tracks werden standardmäßig bei höherem Zoom angezeigt, Outdoor-Stil für Detailübersicht
|
||||||
• Öffnungszeiten werden beim Antippen eines POI angezeigt
|
• Aktion des linken Button nichtm mehr im Hamburger-Menü, stattdessen werden "Über & Hilfe" dort angezeigt
|
||||||
• Verschiedene Arten von Feuchtgebieten
|
|
||||||
• Neue Farben für Vegetation und andere Features; einige neue Icons
|
|
||||||
• Wandern: bessere Darstellung der Höhenlinien
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 249 KiB |
BIN
android/app/src/fdroid/play/listings/en-US/graphics/icon/1.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 24 KiB |
@@ -1,10 +1,7 @@
|
|||||||
Introducing CoMaps logo!
|
• OpenStreetMap data as of June 22
|
||||||
|
• a setting for automatic bookmarks and tracks backup
|
||||||
• upgrade altitude contour lines for many regions to 20 or 50 meters step
|
• added 100m-step altitude isolines to all regions that had worse or no isolines
|
||||||
• add Panoramax Picture links to selected POIs
|
• display vegetation and playground color fills earlier, add fills to camp sites and some amenities
|
||||||
• OpenStreetMap data as of July 13
|
• paths & tracks appear on the map later by default - still appear earlier in the outdoor style
|
||||||
• add color fills to many features and display fills earlier for existing features
|
• hide active custom button action from the hamburger menu, move there About & Help from the settings
|
||||||
• display opening hours state when selecting a POI
|
• update map transport icons
|
||||||
• split all wetlands into several distinct types
|
|
||||||
• update vegetation and other map colors, update some map icons
|
|
||||||
• outdoors: bolder altitude contour lines
|
|
||||||
|
|||||||
@@ -1,9 +1,6 @@
|
|||||||
¡Presentamos el logo de CoMaps!
|
• datos de OpenStreetMap a 22 de junio
|
||||||
• mejora de isolíneas con más detalle para muchas regiones
|
• añadido ajuste para la copia de seguridad automática de marcadores y trazas
|
||||||
• añade enlaces de imágenes de Panoramax a POIs seleccionados
|
• añadidas isolíneas de 100 m a las regiones que tenían isolíneas peores o no tenían isolíneas
|
||||||
• datos de OpenStreetMap a 13 de julio
|
• se muestra antes la vegetación y zonas de juego, añadidas áreas a campings y otros servicios
|
||||||
• añadidos rellenos de color a muchas características
|
• los senderos y pistas aparecen más tarde - siguen igual en estilo de outdoors
|
||||||
• se muestra el estado de horarios de apertura al seleccionar un POI
|
• se oculta botón personalizado del menú y se mueve allí Acerca de y Ayuda desde los ajustes
|
||||||
• se dividen los humedales en tipos distintos
|
|
||||||
• se actualiza la vegetación y otros colores del mapa, así como otros iconos
|
|
||||||
• exteriores: líneas de contorno de altitud más gruesas
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
Présentation du logo CoMaps !
|
• Données OpenStreetMap du 22 juin
|
||||||
• Amélioration des courbes d’altitude à une précision de 20 ou 50 mètres pour de nombreuses régions
|
• Sauvegarde automatique des signets et traces GPS en local
|
||||||
• Ajout d'un lien vers les images Panoramax des POI
|
• Ajout des courbes d'altitude avec un précision de 100 mètres dans toutes les régions qui avaient peu de courbes ou aucune
|
||||||
• Données OpenStreetMap du 13 juillet
|
• Ajustements des styles notamment sur la végétation, les aires de jeu et les chemins
|
||||||
• Affichage de l’état des heures d’ouverture lors de la sélection d’un POI
|
• Masque l’action active du bouton personnalisé dans le menu hamburger
|
||||||
• Mise à jour du style(végétation et zones humides), mise à jour de certaines icônes de la carte
|
• Correction de certains plantages et bugs
|
||||||
• Outdoors: Améliorations de la visibilité des courbes d'altitude
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
Navigation cartographique facile - Découvrez davantage de votre voyage - Propulsé par la communauté
|
Navigation facile - Découvrez plus lors de votre voyage - Fait par la communauté
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
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 +0,0 @@
|
|||||||
CoMaps - Túra, Bicikli, Vezetés offline diszkréten
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
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!
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
Eenvoudige kaartnavigatie - Ontdek meer van je reis - Gemaakt door de community
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
Wprowadzamy logo CoMaps!
|
|
||||||
• zwiększenie dokładności izolinii w wielu regionach w krokach 20 do 50 metrów
|
|
||||||
• dodanie linków do zdjęć z Panoramax do wybranych POI
|
|
||||||
• aktualizacja danych OpenStreetMap z 13 lipca
|
|
||||||
• dodanie wypełnienia kolorem dla wielu typów obiektów
|
|
||||||
• wyświetlanie stanu godzin otwarcia przy wyborze POI
|
|
||||||
• podział mokradeł na kilka typów
|
|
||||||
• aktualizacja koloru roślinności i innych kolorów, aktualizacja części ikon na mapie
|
|
||||||
• tryb outdoorowy: pogrubione warstwice wysokości
|
|
||||||
@@ -8,6 +8,7 @@ Junte-se à comunidade e ajude a criar o melhor aplicativo de mapas.
|
|||||||
|
|
||||||
‣ <b>Foco offline</b>: Planeje e navegue em sua viagem ao exterior sem a necessidade de sinal de celular, pesquise pontos de referência durante uma caminhada distante, etc. Todas as funções do aplicativo foram projetadas para funcionar offline.
|
‣ <b>Foco offline</b>: Planeje e navegue em sua viagem ao exterior sem a necessidade de sinal de celular, pesquise pontos de referência durante uma caminhada distante, etc. Todas as funções do aplicativo foram projetadas para funcionar offline.
|
||||||
‣ <b>Respeito à privacidade</b>: O aplicativo foi projetado com a privacidade em mente - não identifica pessoas, não rastreia e não coleta informações pessoais. Livre de anúncios.
|
‣ <b>Respeito à privacidade</b>: O aplicativo foi projetado com a privacidade em mente - não identifica pessoas, não rastreia e não coleta informações pessoais. Livre de anúncios.
|
||||||
|
|
||||||
‣ <b>Simples e sofisticado</b>: recursos essenciais e fáceis de usar que simplesmente funcionam.
|
‣ <b>Simples e sofisticado</b>: recursos essenciais e fáceis de usar que simplesmente funcionam.
|
||||||
‣ <b>Economiza bateria e espaço</b>: Não esgota a bateria como outros aplicativos de navegação. Mapas compactos economizam espaço precioso no seu celular.
|
‣ <b>Economiza bateria e espaço</b>: Não esgota a bateria como outros aplicativos de navegação. Mapas compactos economizam espaço precioso no seu celular.
|
||||||
‣ <b>Gratuito e desenvolvido pela comunidade</b>: Pessoas como você ajudaram a desenvolver o aplicativo adicionando lugares ao OpenStreetMap, testando e dando feedback sobre os recursos e contribuindo com suas habilidades de desenvolvimento e dinheiro.
|
‣ <b>Gratuito e desenvolvido pela comunidade</b>: Pessoas como você ajudaram a desenvolver o aplicativo adicionando lugares ao OpenStreetMap, testando e dando feedback sobre os recursos e contribuindo com suas habilidades de desenvolvimento e dinheiro.
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
Apresentamos o logo do CoMaps!
|
|
||||||
• Curvas de nível mais detalhadas em muitas regiões
|
|
||||||
• Adicionados links de imagens do Panoramax para pontos de interesse selecionados
|
|
||||||
• Dados OSM de 13/07
|
|
||||||
• Adicionados preenchimentos de cor a muitos elementos
|
|
||||||
• Exibição de horário de funcionamento ao selecionar um ponto de interesse
|
|
||||||
• Divididas áreas úmidas em vários tipos distintos
|
|
||||||
• Atualizada cores/ícones para vegetação e outros elementos
|
|
||||||
• Ar livre: curvas de nível de altitude mais destacadas
|
|
||||||
@@ -1,32 +1,55 @@
|
|||||||
Um aplicativo de mapas gratuito e de código aberto, liderado pela comunidade, baseado em dados do OpenStreetMap e reforçado pelo compromisso com a transparência, privacidade e sem fins lucrativos. O CoMaps é um fork/spin-off do Organic Maps, que por sua vez é um fork do Maps.ME.
|
Um aplicativo de mapas gratuito e de código aberto, liderado pela comunidade, baseado em dados do OpenStreetMap e reforçado pelo compromisso com a transparência, privacidade e sem fins lucrativos. O CoMaps é um fork/spin-off do Organic Maps, que por sua vez é um fork do Maps.ME.
|
||||||
|
|
||||||
Leia mais sobre os motivos do projeto e sua direção em <b><i>codeberg.org/comaps</i></b>.
|
Leia mais sobre os motivos do projeto e sua direção em <b><i>codeberg.org/comaps</i></b>.
|
||||||
|
|
||||||
Junte-se à comunidade e ajude a criar o melhor aplicativo de mapas.
|
Junte-se à comunidade e ajude a criar o melhor aplicativo de mapas.
|
||||||
|
|
||||||
• Use o aplicativo e divulgue-o.
|
• Use o aplicativo e divulgue-o.
|
||||||
|
|
||||||
• Envie feedback e relate problemas.
|
• Envie feedback e relate problemas.
|
||||||
|
|
||||||
• Atualize os dados do mapa no aplicativo ou no site do OpenStreetMap.
|
• Atualize os dados do mapa no aplicativo ou no site do OpenStreetMap.
|
||||||
|
|
||||||
‣ <b>Foco offline</b>: Planeje e navegue em sua viagem ao exterior sem a necessidade de sinal de celular, pesquise pontos de referência durante uma caminhada distante, etc. Todas as funções do aplicativo foram projetadas para funcionar offline.
|
‣ <b>Foco offline</b>: Planeje e navegue em sua viagem ao exterior sem a necessidade de sinal de celular, pesquise pontos de referência durante uma caminhada distante, etc. Todas as funções do aplicativo foram projetadas para funcionar offline.
|
||||||
|
|
||||||
‣ <b>Respeitando a privacidade</b>: O aplicativo foi projetado com a privacidade em mente - não identifica pessoas, não rastreia e não coleta informações pessoais. Sem anúncios.
|
‣ <b>Respeitando a privacidade</b>: O aplicativo foi projetado com a privacidade em mente - não identifica pessoas, não rastreia e não coleta informações pessoais. Sem anúncios.
|
||||||
|
|
||||||
‣ <b>Simples e sofisticado</b>: recursos essenciais e fáceis de usar que simplesmente funcionam.
|
‣ <b>Simples e sofisticado</b>: recursos essenciais e fáceis de usar que simplesmente funcionam.
|
||||||
|
|
||||||
‣ <b>Economiza bateria e espaço</b>: Não consome muita bateria como outros aplicativos de navegação. Mapas compactos economizam espaço precioso no seu celular.
|
‣ <b>Economiza bateria e espaço</b>: Não consome muita bateria como outros aplicativos de navegação. Mapas compactos economizam espaço precioso no seu celular.
|
||||||
|
|
||||||
‣ <b>Gratuito e desenvolvido pela comunidade</b>: Pessoas como você ajudaram a desenvolver o aplicativo adicionando lugares ao OpenStreetMap, testando e dando feedback sobre os recursos e contribuindo com suas habilidades de desenvolvimento e dinheiro.
|
‣ <b>Gratuito e desenvolvido pela comunidade</b>: Pessoas como você ajudaram a desenvolver o aplicativo adicionando lugares ao OpenStreetMap, testando e dando feedback sobre os recursos e contribuindo com suas habilidades de desenvolvimento e dinheiro.
|
||||||
|
|
||||||
‣ <b>Tomada de decisões e finanças abertas e transparentes, sem fins lucrativos e totalmente de código aberto.</b>
|
‣ <b>Tomada de decisões e finanças abertas e transparentes, sem fins lucrativos e totalmente de código aberto.</b>
|
||||||
|
|
||||||
<b>Principais recursos</b>:
|
<b>Principais recursos</b>:
|
||||||
|
|
||||||
• Mapas detalhados para download com locais não disponíveis no Google Maps
|
• Mapas detalhados para download com locais não disponíveis no Google Maps
|
||||||
|
|
||||||
• Modo ao ar livre com trilhas em destaque, acampamentos, fontes de água, picos, curvas de nível, etc.
|
• Modo ao ar livre com trilhas em destaque, acampamentos, fontes de água, picos, curvas de nível, etc.
|
||||||
|
|
||||||
• Trilhas para caminhada e ciclovias
|
• Trilhas para caminhada e ciclovias
|
||||||
|
|
||||||
• Pontos de interesse como restaurantes, postos de gasolina, hotéis, lojas, pontos turísticos e muito mais
|
• Pontos de interesse como restaurantes, postos de gasolina, hotéis, lojas, pontos turísticos e muito mais
|
||||||
|
|
||||||
• Pesquise por nome, endereço ou por categoria de ponto de interesse
|
• Pesquise por nome, endereço ou por categoria de ponto de interesse
|
||||||
|
|
||||||
• Navegação com anúncios de voz para caminhadas, ciclismo ou direção
|
• Navegação com anúncios de voz para caminhadas, ciclismo ou direção
|
||||||
|
|
||||||
• Marque seus lugares favoritos com um único toque
|
• Marque seus lugares favoritos com um único toque
|
||||||
|
|
||||||
• Artigos offline da Wikipédia
|
• Artigos offline da Wikipédia
|
||||||
|
|
||||||
• Camada e direções de transporte público do metrô
|
• Camada e direções de transporte público do metrô
|
||||||
|
|
||||||
• Gravação de trilhas
|
• Gravação de trilhas
|
||||||
|
|
||||||
• Exporte e importe favoritos e trilhas nos formatos KML, KMZ e GPX
|
• Exporte e importe favoritos e trilhas nos formatos KML, KMZ e GPX
|
||||||
|
|
||||||
• Um modo escuro para usar à noite
|
• Um modo escuro para usar à noite
|
||||||
|
|
||||||
• Aprimore os dados do mapa para todos usando um editor básico integrado
|
• Aprimore os dados do mapa para todos usando um editor básico integrado
|
||||||
|
|
||||||
<b>A Liberdade Chegou</b>
|
<b>A Liberdade Chegou</b>
|
||||||
|
|
||||||
Descubra sua jornada, navegue pelo mundo com privacidade e comunidade em primeiro lugar!
|
Descubra sua jornada, navegue pelo mundo com privacidade e comunidade em primeiro lugar!
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
CoMaps - Drumeții, Ciclism, Condus Offline în confidențialitate
|
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
Бесплатное и свободное картографическое приложение, основанное на данных OpenStreetMap и подкреплённое обязательствами по прозрачности, конфиденциальности и некоммерческой направленности. CoMaps — это ответвление от Organic Maps, которое, в свою очередь, является ответвлением от Maps.ME.
|
Бесплатное и свободное картографическое приложение, основанное на данных OpenStreetMap и подкреплённое обязательствами по прозрачности, конфиденциальности и некоммерческой направленности. CoMaps — это ответвление от Organic Maps, которое, в свою очередь, является ответвлением от Maps.ME.
|
||||||
|
|
||||||
Подробнее о причинах проекта и его направлении читайте на сайте <b><i> codeberg.org/comaps </i><b>.
|
Подробнее о причинах проекта и его направлении читайте на <a href="https://codeberg.org/comaps">сайте</a>.
|
||||||
|
|
||||||
Присоединяйтесь к сообществу и помогите создать лучшее приложение с картами
|
Присоединяйтесь к сообществу и помогите создать лучшее приложение с картами
|
||||||
• Используйте приложение и распространяйте информацию о нём
|
• Используйте приложение и распространяйте информацию о нём
|
||||||
• Оставляйте отзывы и сообщайте о проблемах
|
• Оставляйте отзывы и сообщайте о проблемах
|
||||||
|
|||||||
@@ -1,9 +1,6 @@
|
|||||||
Представляем логотип CoMaps!
|
• карты OpenStreetMap от 22 июня
|
||||||
• Линии высот для многих регионов с шагом 20м или 50м
|
• автоматическое резервное копирование меток и треков
|
||||||
• Ссылки на изображения Panoramax к выбранным POI
|
• линии высот с шагом 100м для всех регионов, где линии с этим шагом отсутствовали
|
||||||
• Карты OpenStreetMap от 13 июля
|
• цветная заливка растительности и игровых площадок отображается раньше, добавлена заливка для кемпингов и других объектов
|
||||||
• Заливки цветом ко многим объектам и более ранняя заливка для существующих объектов
|
• тропы и грунтовки отображаются позже в стиле по умолчанию - используйте стиль «Активный отдых» для обзора троп
|
||||||
• Показ часов работы при выборе POI
|
• выбранная функция настраиваемой кнопки больше не дублируется в пунктах меню
|
||||||
• Разные водно-болотные угодья отличаются цветом
|
|
||||||
• Обновлены цвета растительности и другие цвета на карте, изменены некоторые иконки
|
|
||||||
• В стиле "Активный отдых" более четкие линии высот
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
Простая навигация по карте — Откройте больше за ваше путешествие — От сообщества
|
Простая навигация по карте — Откройте больше за ваше путешествие. От сообщества
|
||||||
|
|||||||
@@ -1,17 +1,18 @@
|
|||||||
Бесплатна апликација отвореног кода коју је обављала заједница и заснива се на ОpenStreetMap-у подацима, усмерени транспарентност, приватност и непрофитни. CoMaps је Апликације за органске карте виљушка, које је пак форк Maps.ME.
|
Бесплатна апликација отвореног кода коју је обављала заједница и заснива се на ОпенСтреетМап-у подацима, усмерени транспарентност, приватност и непрофитни. ЦОМПАПС је Апликације за органске карте виљушка, које је пак форк мапс.ме.
|
||||||
|
|
||||||
Прочитајте о разлозима пројекта и његовог правца на <b><i>codeberg.org/comaps</i></b>
|
Прочитајте о разлозима пројекта и његовог правца на <b><i>codeberg.org/comaps</i></b>
|
||||||
Придружите се отвореној заједници и помозите да направимо најбољу апликацију за мапе
|
Придружите се отвореној заједници и помозите да направимо најбољу апликацију за мапе
|
||||||
• Користите апликацију и проширите глас о томе
|
• Користите апликацију и проширите глас о томе
|
||||||
• Дајте повратне информације и пријавите проблеме
|
• Дајте повратне информације и пријавите проблеме
|
||||||
• Ажурирајте податке на мапи у апликацији или на веб локацији OpenStreetMap
|
• Ажурирајте податке на мапи у апликацији или на веб локацији OpenStreetMap
|
||||||
|
‣<b>фокусирано на офлајн Вар </b>: Планирајте и управљајте путовањем у иностранству без потребе за мобилним услугама, тражите путне тачке док је на даљинском покрету, итд.
|
||||||
|
|
||||||
‣ <b> фокусирано на офлајн Вар </b>: Планирајте и управљајте путовањем у иностранству без потребе за мобилним услугама, тражите путне тачке док је на даљинском покрету, итд. Све апликације су дизајниране за рад ван мреже.
|
Све апликације су дизајниране за рад ван мреже.
|
||||||
‣ <b> Поштовање приватности </b>: Апликација је осмишљена задржавања у уму приватност - не идентификује људе, не прати или прикупља личне податке. Нема реклама.
|
‣<b> Поштовање приватности </b>: Апликација је осмишљена задржавања у уму приватност - не идентификује људе, не прати или прикупља личне податке. Нема реклама.
|
||||||
‣ <b> Једноставно и елегантно </b>: Апликација је тривијална за употребу и једноставно функционише.
|
‣ <b> Једноставно и елегантно </b>: Апликација је тривијална за употребу и једноставно функционише.
|
||||||
‣ <b> Чува вашу батерију и простор </b>: не конзумира батерију као остале навигационе апликације. Компактне картице сачувајте драгоцени простор на вашем телефону.
|
‣ <b> Чува вашу батерију и простор </b>: не конзумира батерију као остале навигационе апликације. Компактне картице сачувајте драгоцени простор на вашем телефону.
|
||||||
‣ <b> Отворено и направио је заједницу </b>: Људи попут вас је помогли да додају апликацију додавањем локација на OpenStreetMap-у, тестирању и давање повратних информација о апликацији и доприносе вашим развојним вештинама и новцу.
|
‣ <b> Отворено и направио је заједницу </b>: Људи попут вас је помогли да додају апликацију додавањем локација на OpenStreetMap-у, тестирању и давање повратних информација о апликацији и доприносе вашим развојним вештинама и новцу.
|
||||||
‣ <b> Отворено и транспарентно доношење одлука и употреба финансија, непрофитна и потпуно отворена извора. </b>
|
‣ <b> Отворено и транспарентно доношење одлука и употреба финансија, непрофитна и потпуно отворена извора. </ Б>
|
||||||
|
|
||||||
<b> Главне карактеристике </b>:
|
<b> Главне карактеристике </b>:
|
||||||
• Преузмите детаљне мапе са локацијама које нису доступне са Гоогле мапама
|
• Преузмите детаљне мапе са локацијама које нису доступне са Гоогле мапама
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
Представљамо CoMaps лого!
|
|
||||||
• ажуриране изохипсе за многе регионе на кораке од 20 или 50 метара
|
|
||||||
• додате везе ка Panoramax сликама за изабране тачке интересовања (POI)
|
|
||||||
• подаци са OpenStreetMap-а од 13. јула
|
|
||||||
• додате боје за многе елементе и раније приказивање постојећих површина
|
|
||||||
• приказ стања радног времена при избору POI-ја
|
|
||||||
• мочваре подељене на неколико различитих типова
|
|
||||||
• ажуриране боје вегетације и других елемената на мапи, ажуриране поједине иконе
|
|
||||||
• на отвореном: наглашеније изохипсе
|
|
||||||
@@ -1 +1 @@
|
|||||||
Једноставна навигација - Сазнајте више о свом путовању - Ради на бази заједнице
|
Једноставна навигација - Сазнајте више о свом путовању - Покреће је заједница
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
Kullanımı kolay harita - Yolculuğun ötesine geçin - topluluğun katkılarıyla
|
Kolayca gezinin - Seyahat etmenin ötesini bulun - Gönüllüler tarafından yapıldı
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
CoMaps - Gizlilikle Yürüyün, Sürün, Gezin
|
CoMaps - İnternetsiz Seyahat Edin
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
Đị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.03.02-7-FDroid+25030207
|
version: 2025.06.30-22-FDroid+25063022
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
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. Ein Gemeinschaftsprojekt mit Fokus auf Transparenz und non-profit.
|
Eine von der Community betriebene, kostenlose Open-Source Karten App, die auf OpenStreetMap-Daten basiert. Transparent, datensparsam und nicht gewinnorientiert.
|
||||||
|
|
||||||
Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
|
Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
|
||||||
• Nutze die App und erzähle anderen davon
|
• Nutze die App und erzähle anderen davon
|
||||||
@@ -8,8 +8,8 @@ Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
|
|||||||
<i>Dein Feedback und deine 5-Sterne-Bewertung sind die beste Unterstützung für uns!</i>
|
<i>Dein Feedback und deine 5-Sterne-Bewertung sind die beste Unterstützung für uns!</i>
|
||||||
|
|
||||||
‣ <b>Einfach und ausgereift</b>: Essenzielle, leicht zu bedienende Funktionen, die einfach funktionieren.
|
‣ <b>Einfach und ausgereift</b>: Essenzielle, leicht zu bedienende Funktionen, die einfach funktionieren.
|
||||||
‣ <b>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>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>Datenschutz ist uns wichtig!</b>: Die App wurde mit Fokus auf Privatsphäre entwickelt – kein Tracking, keine Erfassung persönlicher Daten, keine Werbung.
|
‣ <b>Datenschutzfreundlich</b>: Die App wurde mit Fokus auf Privatsphäre entwickelt – keine Personenidentifikation, kein Tracking, keine Erfassung persönlicher Daten, keine Werbung.
|
||||||
‣ <b>Spart Akku und Speicherplatz</b>: Verbraucht nicht unnötig Akku wie andere Navi-Apps. Kompakte Karten sparen Speicherplatz auf Deinem Gerät.
|
‣ <b>Spart Akku und Speicherplatz</b>: Verbraucht nicht unnötig Akku wie andere Navi-Apps. Kompakte Karten sparen Speicherplatz auf Deinem Gerät.
|
||||||
‣ <b>Kostenlos und von der Community entwickelt</b>: Menschen wie du haben geholfen, die App zu entwickeln – durch das Hinzufügen von Orten zu OpenStreetMap, Testen von neuen Funktionen, Softwareentwicklung oder Spenden.
|
‣ <b>Kostenlos und von der Community entwickelt</b>: Menschen wie du haben geholfen, die App zu entwickeln – durch das Hinzufügen von Orten zu OpenStreetMap, Testen von neuen Funktionen, Softwareentwicklung oder Spenden.
|
||||||
‣ <b>Offen und transparent bei Entscheidungen und Finanzen, gemeinnützig und vollständig Open Source</b>
|
‣ <b>Offen und transparent bei Entscheidungen und Finanzen, gemeinnützig und vollständig Open Source</b>
|
||||||
@@ -32,5 +32,5 @@ Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
|
|||||||
|
|
||||||
Bitte melde Probleme, schlage neue Funktionen vor und werde Teil der Community auf unserer Website: <b><i>comaps.app</i></b>
|
Bitte melde Probleme, schlage neue Funktionen vor und werde Teil der Community auf unserer Website: <b><i>comaps.app</i></b>
|
||||||
|
|
||||||
<b>Entdecke die Unabhängigkeit</b>
|
<b>Freiheit beginnt hier</b>
|
||||||
Entdecke deine Reise – navigiere in der Welt mit Datenschutz!
|
Entdecke deine Reise – navigiere in der Welt mit Datenschutz!
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
1
android/app/src/google/play/listings/en-US/video-url.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
Mapa nabigazio erraza - Ezagutu gehiago zure bidaiaz - Komunitatean egina
|
|
||||||
@@ -1 +1 @@
|
|||||||
Navigation cartographique facile - Propulsé par la communauté
|
Navigation facile - Découvrez plus lors de votre voyage - Fait par la communauté
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
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 +0,0 @@
|
|||||||
CoMaps -Navega con Privacidade
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
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 +0,0 @@
|
|||||||
CoMaps - Viaje com Privacidade
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
CoMaps - Navighează liniștit
|
|
||||||
@@ -1 +1 @@
|
|||||||
Простая навигация по карте — Откройте больше за ваше путешествие — От сообщества
|
Простая навигация по карте — Откройте больше за ваше путешествие. От сообщества
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
Бесплатна апликација за мапе отвореног кода коју води заједница заснована на OpenStreetMap подацима и ојачана посвећеношћу транспарентности, приватности и непрофитности.
|
Бесплатна апликација за мапе отвореног кода коју води заједница заснована на OpenStreetMap подацима и ојачана посвећеношћу транспарентности, приватности и непрофитности.
|
||||||
|
|
||||||
Придружите се заједници и помозите да направите најбољу навигацију
|
Придружите се заједници и помозите да направимо најбољу навигацију
|
||||||
• Користите апликацију и ширите информације о њој
|
• Користите апликацију и ширите информације о њој
|
||||||
• Оставите повратне информације и пријавите проблеме
|
• Оставите повратне информације и пријавите проблеме
|
||||||
• Ажурирајте мапе из апликације или на сајту OpenStreetMap
|
• Ажурирајте мапе из апликације или на сајту OpenStreetMap
|
||||||
@@ -11,26 +11,26 @@
|
|||||||
‣ <b>Офлајн фокусирана</b>: Планирајте путовање у иностранство без употребе мобилне телефоније, потражите правац тачке током дугог путовања, итд . Све функције апликације су дизајниране за рад у режиму без интернета.
|
‣ <b>Офлајн фокусирана</b>: Планирајте путовање у иностранство без употребе мобилне телефоније, потражите правац тачке током дугог путовања, итд . Све функције апликације су дизајниране за рад у режиму без интернета.
|
||||||
‣ <b>Поштовање приватности</b>: Апликација је развијена с обзиром на приватност - не идентификује људе, не прати и не прикупља личне информације. Без реклама.
|
‣ <b>Поштовање приватности</b>: Апликација је развијена с обзиром на приватност - не идентификује људе, не прати и не прикупља личне информације. Без реклама.
|
||||||
‣ <b>Штеди батерију и простор</b>: Не празни батерију, као остале навигациje. Компактне mape штедe драгоценi prostor на вашем телефону..
|
‣ <b>Штеди батерију и простор</b>: Не празни батерију, као остале навигациje. Компактне mape штедe драгоценi prostor на вашем телефону..
|
||||||
‣ <b>Бесплатно и изграђено од стране заједнице</b>: Људи попут вас помогли су у изради апликације додавањем места на OpenStreetMap, тестирањем и давањем повратних информација о функцијама и доприносом својим развојним вештинама и новцем.
|
‣ <b>Free and Built by the Community</b>: Такви људи, као што сте помогли да креирате апликацију, додајући места у OpenStreetMap, тестира и остављајући повратне информације о функцијама, као и стављајући своје вештине развоја и новац.
|
||||||
‣ <b>Отворено и транспарентно доношење одлука и финансије, непрофитне и потпуно отвореног кода.</b>
|
‣ <b>Отворено и транспарентно доношење одлука и финансија, непрофитни и потпуно отворени кода.</b>
|
||||||
|
|
||||||
<b>Главне карактеристике</b>:
|
<b>Главне карактеристике</b>:
|
||||||
<li>Преузимање детаљних мапа са локацијама које нису доступне у Google Maps</li>
|
• Преузимање детаљне мапе са локацијама које нису доступне у Google Maps
|
||||||
<li>Режим на отвореном са истакнутим планинарским стазама, кампови, извори воде, врхови, контурне линије, итд</li>
|
• Истакнуте планинарске стазе, кампови, изворима воде, врхове, контуре линије итд
|
||||||
<li>Пешачке и бициклистичке стазе</li>
|
• Пешачке и бициклистичке стазе
|
||||||
<li>Тачке интереса попут ресторана, бензинских станица, хотели, продавнице, разгледање и још много тога</li>
|
• Тачке од интереса као што су ресторани, бензинске станице, хотели, атракције, шопинг и још много тога
|
||||||
<li>Претрага по имену, адреси или по ТОИ категоријама</li>
|
• Претрага по имену или адреси или по категорији интересних места
|
||||||
<li>Навигација са гласовним упутима за планинарење, бициклизам или вожњу аутомобилом</li>
|
• Навигација са гласовним огласима за планинарење, бициклизам или вожње аутомобила
|
||||||
<li>Обележите своја омиљена места једним додиром</li>
|
• Означи своја омиљене места са једним додиром
|
||||||
<li>Википедија чланци без интернета</li>
|
• Офлајн Википедиа чланци
|
||||||
<li>Нивои транзита у метроа и смер кретања</li>
|
• Транзитни слој метроа и упутства
|
||||||
<li>Снимање траса</li>
|
• Track recording
|
||||||
<li>Извоз и увоз маркера и траса у форматима KML, KMZ, GPX</li>
|
• Export and import bookmarks and tracks in KML, KMZ, GPX formats
|
||||||
<li>Тамни режим за употребу ноћу</li>
|
• A dark mode to use during the night
|
||||||
<li>Побољшавање картографских података за све, користећи основни едитор за уређивање</li>
|
• Improve map data for everyone using a basic built-in editor
|
||||||
<li>Подршка за Андроид Ауто</li>
|
• Подршка за Андроид Ауто
|
||||||
|
|
||||||
Молимо Вас да пријавите проблеме са апликацијом, предложите идеје и придружите се нашој заједници на <b><i>comaps.app</i></b> страни.
|
Молимо Вас да пријавите проблеме са апликацијом, предложите идеје и придружите се нашој заједници на <b><i>comaps.app</i></b> страни.
|
||||||
|
|
||||||
<b>Сад је слободно</b>
|
<b>Сад је слободна</b>
|
||||||
Откријте своје путовање, путујте светом с приватношћу и заједницом на челу!
|
Откријте своје путовање, путујте светом с приватношћу и заједницом на челу!
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
Једноставна навигација - Сазнајте више о свом путовању - Ради на бази заједнице
|
Једноставна навигација - Сазнајте више о свом путовању - Покреће је заједница
|
||||||
|
|||||||
@@ -1,36 +1,36 @@
|
|||||||
OpenStreetMap verilerine dayanan, 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ı.
|
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ı.
|
||||||
|
|
||||||
Topluluğa katılın ve en iyi harita uygulamasını oluşturmamıza yardım edin
|
Topluluğa katılın ve en iyi harita uygulamasını oluşturmaya yardımcı olun
|
||||||
• Uygulamayı kullanın ve çevrenize yayın
|
• Uygulamayı kullanın ve bunu herkese duyurun
|
||||||
• Geri bildirim verin ve sorunları bildirin
|
• Geri bildirimde bulunun ve sorunları bildirin
|
||||||
• Harita verilerini uygulamadan veya OpenStreetMap üzerinden düzenleyin
|
• Harita verilerini uygulamada veya OpenStreetMap web sitesinde güncelleyin
|
||||||
|
|
||||||
<i>Geri bildirimleriniz ve 5 yıldızlı yorumlarınız bizim için en iyi destektir!</i>
|
<i>Geri bildirimleriniz ve 5 yıldızlı yorumlarınız bizim için en iyi destektir!</i>
|
||||||
|
|
||||||
‣ <b>Basit ve Temiz</b>: Sadece temel, kullanımı basit, işe yarayan özellikler.
|
‣ <b>Basit ve Cilalı</b>: sadece işe yarayan, kullanımı kolay temel ö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>Ç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ı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>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>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>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>Ü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>Ü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 Şekilde Yürütülen Karar Alma ve Fonlama Süreçleri, Kâr Amacı Gütmez ve Tamamen Açık Kaynaklı.</b>
|
‣ <b>Açık ve Şeffaf Karar Alma ve Finansman, Kar Amacı Gütmeyen ve Tamamen Açık Kaynak.</b>
|
||||||
|
|
||||||
<b>Ana Özellikler</b>:
|
<b>Ana Özellikleri</b>:
|
||||||
• Google Haritalar'da bulunmayan yerleri içeren, çevrimdışı detaylı haritalar
|
• Google Haritalar'da bulunmayan yerleri içeren indirilebilir detaylı haritalar
|
||||||
• Yürüyüş parkurları, kamp alanları, su kaynakları, zirveler, kontur çizgileri vb. nesneleri vurgulayan açık hava modu
|
• Vurgulanan yürüyüş parkurları, kamp alanları, su kaynakları, zirveler, kontur çizgileriyle açık hava modu gibi
|
||||||
• Yürüyüş ve bisiklet yolları
|
• Yürüyüş yolları ve bisiklet yolları
|
||||||
• Restoran, benzin istasyonu, otel, mağaza, görülecek yerler ve çok daha fazla harita noktası
|
• Restoranlar, benzin istasyonları, oteller, mağazalar, turistik yerler gibi ilgi çekici noktalar ve daha fazlası
|
||||||
• İsim, adres veya harita noktası kategorisine göre arama yapın
|
• İsme veya adrese göre veya ilgi noktası kategorisine göre arama yapın
|
||||||
• Sesli yönlendirmeye sahip yürüyüş, bisiklet ve araç navigasyonu
|
• Yürüyerek, bisikletle veya araçla seyahat edenler için sesli duyurularla navigasyon
|
||||||
• En sevdiğiniz mekanları tek dokunuşla yer imlerinize kaydedin
|
• Favori yerlerinizi tek bir dokunuşla yer imlerine ekleyin
|
||||||
• Çevrimdışı Vikipedi makaleleri
|
• Çevrim dışı Wikipedia makaleleri
|
||||||
• Metro ulaşım katmanı ve rotaları
|
• Metro geçiş katmanı ve yönleri
|
||||||
• GPS izinizi kaydedin
|
• Rota kaydı
|
||||||
• Yer imi ve GPS izlerinizi KML, KMZ ve GPX biçimlerinde dışa veya içe aktarın
|
• Yer imlerini ve parkurları KML, KMZ, GPX formatlarında dışa ve içe aktarın
|
||||||
• Gece boyunca kullanmanızı sağlayacak koyu mod
|
• Geceleri kullanmak için karanlık mod
|
||||||
• Uygulama içi düzenleyiciyi kullanarak harita verilerini herkes için daha iyi hale getirin
|
• Temel bir yerleşik düzenleyici kullanarak herkes için harita verilerini iyileştirin
|
||||||
• Android Auto desteği
|
• Android Auto desteği
|
||||||
|
|
||||||
Lütfen <b><i>comaps.app</i></b> adresinden uygulama sorunlarını bildirin, önerilerinizi paylaşın ve topluluğumuza katılın.
|
Lütfen uygulama sorunlarını bildirin, fikir önerin ve <b><i>comaps.app</i></b> web sitesinde topluluğumuza katılın.
|
||||||
|
|
||||||
<b>Özgürlük Buradan Başlıyor</b>
|
<b>Özgürlük Burada</b>
|
||||||
Yolculuğunuzun ötesine geçin, gizlilik ve topluluğu ön planda tutarak dünyada gezinin!
|
Yolculuğunuzu keşfedin, gizlilik ve topluluk ön planda tutularak dünyayı keşfedin!
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
Kullanımı kolay harita - Yolculuğun ötesine geçin - topluluğun katkılarıyla
|
Kolayca gezinin - Seyahat etmenin ötesini bulun - Gönüllüler tarafından yapıldı
|
||||||
|
|||||||
@@ -1,36 +0,0 @@
|
|||||||
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!
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
Đị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 +0,0 @@
|
|||||||
CoMaps - Định vị riêng tư
|
|
||||||
@@ -20,9 +20,6 @@
|
|||||||
<uses-feature
|
<uses-feature
|
||||||
android:name="android.hardware.location.gps"
|
android:name="android.hardware.location.gps"
|
||||||
android:required="false"/>
|
android:required="false"/>
|
||||||
<uses-permission
|
|
||||||
android:name="android.permission.READ_EXTERNAL_STORAGE"
|
|
||||||
android:maxSdkVersion="22" />
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
|
||||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
||||||
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
|
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ extern "C"
|
|||||||
curFile.GetRemoteSize(),
|
curFile.GetRemoteSize(),
|
||||||
std::bind(&DownloadFileFinished, ptr, _1),
|
std::bind(&DownloadFileFinished, ptr, _1),
|
||||||
std::bind(&DownloadFileProgress, ptr, _1),
|
std::bind(&DownloadFileProgress, ptr, _1),
|
||||||
0, false));
|
512 * 1024, false));
|
||||||
});
|
});
|
||||||
|
|
||||||
return ERR_FILE_IN_PROGRESS;
|
return ERR_FILE_IN_PROGRESS;
|
||||||
|
|||||||
@@ -1804,4 +1804,74 @@ Java_app_organicmaps_Framework_nativeMemoryWarning(JNIEnv *, jclass)
|
|||||||
return frm()->MemoryWarning();
|
return frm()->MemoryWarning();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jboolean JNICALL
|
||||||
|
Java_app_organicmaps_Framework_nativeShouldShowProducts(JNIEnv * env, jclass)
|
||||||
|
{
|
||||||
|
return frm()->ShouldShowProducts();
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jobject JNICALL
|
||||||
|
Java_app_organicmaps_Framework_nativeGetProductsConfiguration(JNIEnv * env, jclass)
|
||||||
|
{
|
||||||
|
auto config = frm()->GetProductsConfiguration();
|
||||||
|
if (!config) return nullptr;
|
||||||
|
|
||||||
|
static jclass const productClass = jni::GetGlobalClassRef(
|
||||||
|
env,
|
||||||
|
"app/organicmaps/products/Product"
|
||||||
|
);
|
||||||
|
static jmethodID const productConstructor = jni::GetConstructorID(
|
||||||
|
env,
|
||||||
|
productClass,
|
||||||
|
"(Ljava/lang/String;Ljava/lang/String;)V"
|
||||||
|
);
|
||||||
|
|
||||||
|
jobjectArray products = jni::ToJavaArray(
|
||||||
|
env,
|
||||||
|
productClass,
|
||||||
|
config->GetProducts(),
|
||||||
|
[](JNIEnv * env, products::ProductsConfig::Product const & product)
|
||||||
|
{
|
||||||
|
jni::TScopedLocalRef const title(env, jni::ToJavaString(env, product.GetTitle()));
|
||||||
|
jni::TScopedLocalRef const link(env, jni::ToJavaString(env, product.GetLink()));
|
||||||
|
|
||||||
|
return env->NewObject(
|
||||||
|
productClass,
|
||||||
|
productConstructor,
|
||||||
|
title.get(),
|
||||||
|
link.get()
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
static jclass const productsConfigClass = jni::GetGlobalClassRef(
|
||||||
|
env,
|
||||||
|
"app/organicmaps/products/ProductsConfig"
|
||||||
|
);
|
||||||
|
static jmethodID const productsConfigConstructor = jni::GetConstructorID(
|
||||||
|
env,
|
||||||
|
productsConfigClass,
|
||||||
|
"(Ljava/lang/String;[Lapp/organicmaps/products/Product;)V"
|
||||||
|
);
|
||||||
|
|
||||||
|
jni::TScopedLocalRef const placePagePrompt(env, jni::ToJavaString(env, config->GetPlacePagePrompt()));
|
||||||
|
return env->NewObject(productsConfigClass, productsConfigConstructor, placePagePrompt.get(), products);
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_app_organicmaps_Framework_nativeDidCloseProductsPopup(JNIEnv * env, jclass, jstring reason)
|
||||||
|
{
|
||||||
|
frm()->DidCloseProductsPopup(frm()->FromString(jni::ToNativeString(env, reason)));
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_app_organicmaps_Framework_nativeDidSelectProduct(JNIEnv * env, jclass, jstring title, jstring link)
|
||||||
|
{
|
||||||
|
products::ProductsConfig::Product product(
|
||||||
|
jni::ToNativeString(env, title),
|
||||||
|
jni::ToNativeString(env, link)
|
||||||
|
);
|
||||||
|
|
||||||
|
frm()->DidSelectProduct(product);
|
||||||
|
}
|
||||||
|
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|||||||
@@ -321,30 +321,4 @@ Java_app_organicmaps_editor_OpeningHours_nativeIsTimetableStringValid(JNIEnv * e
|
|||||||
{
|
{
|
||||||
return OpeningHours(jni::ToNativeString(env, jSource)).IsValid();
|
return OpeningHours(jni::ToNativeString(env, jSource)).IsValid();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
JNIEXPORT jobject JNICALL
|
|
||||||
Java_app_organicmaps_editor_OpeningHours_nativeCurrentState(JNIEnv * env, jclass clazz, jobjectArray jTts)
|
|
||||||
{
|
|
||||||
TimeTableSet tts = NativeTimetableSet(env, jTts);
|
|
||||||
time_t const now = time(nullptr);
|
|
||||||
|
|
||||||
/// @todo We should check closed/open time for specific feature's timezone.
|
|
||||||
OpeningHours::InfoT ohInfo = MakeOpeningHours(tts).GetInfo(now);
|
|
||||||
jclass ohStateClass = jni::GetGlobalClassRef(env, "app/organicmaps/editor/OhState");
|
|
||||||
jclass ruleStateClass = jni::GetGlobalClassRef(env, "app/organicmaps/editor/OhState$State");
|
|
||||||
|
|
||||||
static const std::unordered_map<RuleState, const char*> ruleState = {
|
|
||||||
{RuleState::Open, "Open"},
|
|
||||||
{RuleState::Closed, "Closed"},
|
|
||||||
{RuleState::Unknown, "Unknown"}
|
|
||||||
};
|
|
||||||
|
|
||||||
jfieldID stateField = env->GetStaticFieldID(ruleStateClass, ruleState.at(ohInfo.state), "Lapp/organicmaps/editor/OhState$State;");
|
|
||||||
jobject stateObj = env->GetStaticObjectField(ruleStateClass, stateField);
|
|
||||||
jmethodID constructor = env->GetMethodID(ohStateClass, "<init>", "(Lapp/organicmaps/editor/OhState$State;JJ)V");
|
|
||||||
jobject javaOhState = env->NewObject(ohStateClass, constructor, stateObj, (jlong) ohInfo.nextTimeOpen, (jlong) ohInfo.nextTimeClosed);
|
|
||||||
|
|
||||||
return javaOhState;
|
|
||||||
}
|
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|||||||
@@ -17,9 +17,17 @@ using namespace jni;
|
|||||||
|
|
||||||
bool LoadOsmUserPreferences(std::string const & oauthToken, UserPreferences & outPrefs)
|
bool LoadOsmUserPreferences(std::string const & oauthToken, UserPreferences & outPrefs)
|
||||||
{
|
{
|
||||||
ServerApi06 const api(OsmOAuth::ServerAuth(oauthToken));
|
try
|
||||||
outPrefs = api.GetUserPreferences();
|
{
|
||||||
return (outPrefs.m_id != 0);
|
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;
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 15 KiB |
@@ -13,6 +13,7 @@ import app.organicmaps.api.RequestType;
|
|||||||
import app.organicmaps.bookmarks.data.DistanceAndAzimut;
|
import app.organicmaps.bookmarks.data.DistanceAndAzimut;
|
||||||
import app.organicmaps.bookmarks.data.FeatureId;
|
import app.organicmaps.bookmarks.data.FeatureId;
|
||||||
import app.organicmaps.bookmarks.data.MapObject;
|
import app.organicmaps.bookmarks.data.MapObject;
|
||||||
|
import app.organicmaps.products.ProductsConfig;
|
||||||
import app.organicmaps.sdk.routing.JunctionInfo;
|
import app.organicmaps.sdk.routing.JunctionInfo;
|
||||||
import app.organicmaps.sdk.routing.RouteMarkData;
|
import app.organicmaps.sdk.routing.RouteMarkData;
|
||||||
import app.organicmaps.sdk.routing.RouteMarkType;
|
import app.organicmaps.sdk.routing.RouteMarkType;
|
||||||
@@ -346,5 +347,15 @@ public class Framework
|
|||||||
public static native boolean nativeHasPlacePageInfo();
|
public static native boolean nativeHasPlacePageInfo();
|
||||||
|
|
||||||
public static native void nativeMemoryWarning();
|
public static native void nativeMemoryWarning();
|
||||||
|
|
||||||
|
public static native boolean nativeShouldShowProducts();
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public static native ProductsConfig nativeGetProductsConfiguration();
|
||||||
|
|
||||||
|
public static native void nativeDidCloseProductsPopup(String reason);
|
||||||
|
|
||||||
|
public static native void nativeDidSelectProduct(String title, String link);
|
||||||
|
|
||||||
public static native void nativeSaveRoute();
|
public static native void nativeSaveRoute();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,9 +41,9 @@ public class MapFragment extends BaseMwmFragment implements View.OnTouchListener
|
|||||||
mMap.updateMyPositionRoutingOffset(offsetY);
|
mMap.updateMyPositionRoutingOffset(offsetY);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void destroySurface(boolean activityIsChangingConfigurations)
|
public void destroySurface()
|
||||||
{
|
{
|
||||||
mMap.onSurfaceDestroyed(activityIsChangingConfigurations, isAdded());
|
mMap.onSurfaceDestroyed(requireActivity().isChangingConfigurations(), isAdded());
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isContextCreated()
|
public boolean isContextCreated()
|
||||||
|
|||||||
@@ -850,7 +850,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
@Override
|
@Override
|
||||||
public void drawIcon(FloatingActionButton imageView)
|
public void drawIcon(FloatingActionButton imageView)
|
||||||
{
|
{
|
||||||
imageView.setImageResource(R.drawable.ic_logo_monochrome);
|
imageView.setImageResource(R.drawable.ic_question_mark);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1303,7 +1303,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
{
|
{
|
||||||
// Explicitly destroy surface before activity recreation.
|
// Explicitly destroy surface before activity recreation.
|
||||||
if (mMapFragment != null)
|
if (mMapFragment != null)
|
||||||
mMapFragment.destroySurface(true);
|
mMapFragment.destroySurface();
|
||||||
super.recreate();
|
super.recreate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2615,7 +2615,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
items.add(new MenuBottomSheetItem(R.string.share_my_location, R.drawable.ic_share, this::onShareLocationOptionSelected));
|
items.add(new MenuBottomSheetItem(R.string.share_my_location, R.drawable.ic_share, this::onShareLocationOptionSelected));
|
||||||
|
|
||||||
if (!BUTTON_HELP_CODE.equals(activeLeftButton))
|
if (!BUTTON_HELP_CODE.equals(activeLeftButton))
|
||||||
items.add(new MenuBottomSheetItem(R.string.about_help, R.drawable.ic_logo_monochrome, this::showHelp));
|
items.add(new MenuBottomSheetItem(R.string.about_help, R.drawable.ic_question_mark, this::showHelp));
|
||||||
|
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.View;
|
|
||||||
|
|
||||||
import androidx.activity.result.ActivityResultLauncher;
|
import androidx.activity.result.ActivityResultLauncher;
|
||||||
import androidx.activity.result.contract.ActivityResultContracts;
|
import androidx.activity.result.contract.ActivityResultContracts;
|
||||||
@@ -17,10 +16,6 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.StringRes;
|
import androidx.annotation.StringRes;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
import androidx.core.graphics.Insets;
|
|
||||||
import androidx.core.view.OnApplyWindowInsetsListener;
|
|
||||||
import androidx.core.view.ViewCompat;
|
|
||||||
import androidx.core.view.WindowInsetsCompat;
|
|
||||||
|
|
||||||
import app.organicmaps.display.DisplayManager;
|
import app.organicmaps.display.DisplayManager;
|
||||||
import app.organicmaps.downloader.DownloaderActivity;
|
import app.organicmaps.downloader.DownloaderActivity;
|
||||||
@@ -74,17 +69,6 @@ public class SplashActivity extends AppCompatActivity
|
|||||||
|
|
||||||
UiThread.cancelDelayedTasks(mInitCoreDelayedTask);
|
UiThread.cancelDelayedTasks(mInitCoreDelayedTask);
|
||||||
setContentView(R.layout.activity_splash);
|
setContentView(R.layout.activity_splash);
|
||||||
|
|
||||||
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.root_view), new OnApplyWindowInsetsListener() {
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public WindowInsetsCompat onApplyWindowInsets(@NonNull View v, @NonNull WindowInsetsCompat insets)
|
|
||||||
{
|
|
||||||
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
|
|
||||||
v.setPadding(0, 0, 0, systemBars.bottom);
|
|
||||||
return insets;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
mPermissionRequest = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(),
|
mPermissionRequest = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(),
|
||||||
result -> Config.setLocationRequested());
|
result -> Config.setLocationRequested());
|
||||||
mApiRequest = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
|
mApiRequest = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import android.view.MenuInflater;
|
|||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
@@ -171,7 +172,7 @@ public class BookmarkCategorySettingsFragment extends BaseMwmToolbarFragment
|
|||||||
return !TextUtils.equals(mCategory.getDescription(), categoryDesc);
|
return !TextUtils.equals(mCategory.getDescription(), categoryDesc);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void clearAndFocus(TextInputEditText textView)
|
private void clearAndFocus(TextView textView)
|
||||||
{
|
{
|
||||||
textView.getEditableText().clear();
|
textView.getEditableText().clear();
|
||||||
textView.requestFocus();
|
textView.requestFocus();
|
||||||
|
|||||||
@@ -4,13 +4,12 @@ import android.content.res.Resources;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.bookmarks.data.BookmarkCategory;
|
import app.organicmaps.bookmarks.data.BookmarkCategory;
|
||||||
import app.organicmaps.bookmarks.data.BookmarkInfo;
|
import app.organicmaps.bookmarks.data.BookmarkInfo;
|
||||||
@@ -440,14 +439,14 @@ public class BookmarkListAdapter extends RecyclerView.Adapter<Holders.BaseBookma
|
|||||||
holder = bookmarkHolder;
|
holder = bookmarkHolder;
|
||||||
break;
|
break;
|
||||||
case TYPE_SECTION:
|
case TYPE_SECTION:
|
||||||
MaterialTextView tv = (MaterialTextView) inflater.inflate(R.layout.item_category_title, parent, false);
|
TextView tv = (TextView) inflater.inflate(R.layout.item_category_title, parent, false);
|
||||||
holder = new Holders.SectionViewHolder(tv);
|
holder = new Holders.SectionViewHolder(tv);
|
||||||
break;
|
break;
|
||||||
case TYPE_DESC:
|
case TYPE_DESC:
|
||||||
View desc = inflater.inflate(R.layout.item_category_description, parent, false);
|
View desc = inflater.inflate(R.layout.item_category_description, parent, false);
|
||||||
MaterialTextView moreBtn = desc.findViewById(R.id.more_btn);
|
TextView moreBtn = desc.findViewById(R.id.more_btn);
|
||||||
MaterialTextView text = desc.findViewById(R.id.text);
|
TextView text = desc.findViewById(R.id.text);
|
||||||
MaterialTextView title = desc.findViewById(R.id.title);
|
TextView title = desc.findViewById(R.id.title);
|
||||||
setMoreButtonVisibility(text, moreBtn);
|
setMoreButtonVisibility(text, moreBtn);
|
||||||
holder = new Holders.DescriptionViewHolder(desc, mSectionsDataSource.getCategory());
|
holder = new Holders.DescriptionViewHolder(desc, mSectionsDataSource.getCategory());
|
||||||
text.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn));
|
text.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn));
|
||||||
@@ -538,12 +537,12 @@ public class BookmarkListAdapter extends RecyclerView.Adapter<Holders.BaseBookma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setMoreButtonVisibility(MaterialTextView text, MaterialTextView moreBtn)
|
private void setMoreButtonVisibility(TextView text, TextView moreBtn)
|
||||||
{
|
{
|
||||||
text.post(() -> setShortModeDescription(text, moreBtn));
|
text.post(() -> setShortModeDescription(text, moreBtn));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onMoreButtonClicked(MaterialTextView textView, MaterialTextView moreBtn)
|
private void onMoreButtonClicked(TextView textView, TextView moreBtn)
|
||||||
{
|
{
|
||||||
if (isShortModeDescription(textView))
|
if (isShortModeDescription(textView))
|
||||||
{
|
{
|
||||||
@@ -555,18 +554,18 @@ public class BookmarkListAdapter extends RecyclerView.Adapter<Holders.BaseBookma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isShortModeDescription(MaterialTextView text)
|
private boolean isShortModeDescription(TextView text)
|
||||||
{
|
{
|
||||||
return text.getMaxLines() == MAX_VISIBLE_LINES;
|
return text.getMaxLines() == MAX_VISIBLE_LINES;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setExpandedModeDescription(MaterialTextView textView, MaterialTextView moreBtn)
|
private void setExpandedModeDescription(TextView textView, TextView moreBtn)
|
||||||
{
|
{
|
||||||
textView.setMaxLines(Integer.MAX_VALUE);
|
textView.setMaxLines(Integer.MAX_VALUE);
|
||||||
moreBtn.setVisibility(View.GONE);
|
moreBtn.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setShortModeDescription(MaterialTextView textView, MaterialTextView moreBtn)
|
private void setShortModeDescription(TextView textView, TextView moreBtn)
|
||||||
{
|
{
|
||||||
textView.setMaxLines(MAX_VISIBLE_LINES);
|
textView.setMaxLines(MAX_VISIBLE_LINES);
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import android.view.MenuInflater;
|
|||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
|
||||||
import androidx.activity.result.ActivityResultLauncher;
|
import androidx.activity.result.ActivityResultLauncher;
|
||||||
import androidx.activity.result.contract.ActivityResultContracts;
|
import androidx.activity.result.contract.ActivityResultContracts;
|
||||||
@@ -52,7 +53,6 @@ import app.organicmaps.widget.placepage.BookmarkColorDialogFragment;
|
|||||||
import app.organicmaps.widget.placepage.EditBookmarkFragment;
|
import app.organicmaps.widget.placepage.EditBookmarkFragment;
|
||||||
import app.organicmaps.widget.recycler.DividerItemDecorationWithPadding;
|
import app.organicmaps.widget.recycler.DividerItemDecorationWithPadding;
|
||||||
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
|
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
|
||||||
import com.google.android.material.imageview.ShapeableImageView;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -599,7 +599,7 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
|
|||||||
i.putExtra(MwmActivity.EXTRA_BOOKMARK_ID, bookmark.getBookmarkId());
|
i.putExtra(MwmActivity.EXTRA_BOOKMARK_ID, bookmark.getBookmarkId());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showColorDialog(ShapeableImageView v, int position)
|
private void showColorDialog(ImageView v, int position)
|
||||||
{
|
{
|
||||||
BookmarkListAdapter adapter = getBookmarkListAdapter();
|
BookmarkListAdapter adapter = getBookmarkListAdapter();
|
||||||
|
|
||||||
|
|||||||
@@ -4,13 +4,12 @@ import android.content.Context;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.RadioButton;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.google.android.material.radiobutton.MaterialRadioButton;
|
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.bookmarks.data.BookmarkCategory;
|
import app.organicmaps.bookmarks.data.BookmarkCategory;
|
||||||
|
|
||||||
@@ -102,8 +101,8 @@ public class ChooseBookmarkCategoryAdapter extends BaseBookmarkCategoryAdapter<C
|
|||||||
|
|
||||||
static class SingleChoiceHolder extends RecyclerView.ViewHolder
|
static class SingleChoiceHolder extends RecyclerView.ViewHolder
|
||||||
{
|
{
|
||||||
MaterialTextView name;
|
TextView name;
|
||||||
MaterialRadioButton checked;
|
RadioButton checked;
|
||||||
|
|
||||||
public SingleChoiceHolder(View convertView)
|
public SingleChoiceHolder(View convertView)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -6,16 +6,15 @@ import android.location.Location;
|
|||||||
import android.text.Spanned;
|
import android.text.Spanned;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.widget.CheckBox;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.PluralsRes;
|
import androidx.annotation.PluralsRes;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.google.android.material.imageview.ShapeableImageView;
|
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
|
||||||
import com.google.android.material.checkbox.MaterialCheckBox;
|
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.adapter.OnItemClickListener;
|
import app.organicmaps.adapter.OnItemClickListener;
|
||||||
import app.organicmaps.bookmarks.data.BookmarkCategory;
|
import app.organicmaps.bookmarks.data.BookmarkCategory;
|
||||||
@@ -35,9 +34,9 @@ public class Holders
|
|||||||
public static class GeneralViewHolder extends RecyclerView.ViewHolder
|
public static class GeneralViewHolder extends RecyclerView.ViewHolder
|
||||||
{
|
{
|
||||||
@NonNull
|
@NonNull
|
||||||
private final MaterialTextView mText;
|
private final TextView mText;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final ShapeableImageView mImage;
|
private final ImageView mImage;
|
||||||
|
|
||||||
GeneralViewHolder(@NonNull View itemView)
|
GeneralViewHolder(@NonNull View itemView)
|
||||||
{
|
{
|
||||||
@@ -47,13 +46,13 @@ public class Holders
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public MaterialTextView getText()
|
public TextView getText()
|
||||||
{
|
{
|
||||||
return mText;
|
return mText;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public ShapeableImageView getImage()
|
public ImageView getImage()
|
||||||
{
|
{
|
||||||
return mImage;
|
return mImage;
|
||||||
}
|
}
|
||||||
@@ -62,9 +61,9 @@ public class Holders
|
|||||||
public static class HeaderViewHolder extends RecyclerView.ViewHolder
|
public static class HeaderViewHolder extends RecyclerView.ViewHolder
|
||||||
{
|
{
|
||||||
@NonNull
|
@NonNull
|
||||||
private final MaterialTextView mButton;
|
private final TextView mButton;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final MaterialTextView mText;
|
private final TextView mText;
|
||||||
|
|
||||||
|
|
||||||
HeaderViewHolder(@NonNull View itemView)
|
HeaderViewHolder(@NonNull View itemView)
|
||||||
@@ -75,13 +74,13 @@ public class Holders
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public MaterialTextView getText()
|
public TextView getText()
|
||||||
{
|
{
|
||||||
return mText;
|
return mText;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public MaterialTextView getButton()
|
public TextView getButton()
|
||||||
{
|
{
|
||||||
return mButton;
|
return mButton;
|
||||||
}
|
}
|
||||||
@@ -169,7 +168,7 @@ public class Holders
|
|||||||
protected BookmarkCategory mEntity;
|
protected BookmarkCategory mEntity;
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
protected final MaterialTextView mSize;
|
protected final TextView mSize;
|
||||||
|
|
||||||
public CategoryViewHolderBase(@NonNull View root)
|
public CategoryViewHolderBase(@NonNull View root)
|
||||||
{
|
{
|
||||||
@@ -230,9 +229,9 @@ public class Holders
|
|||||||
@NonNull
|
@NonNull
|
||||||
private final View mView;
|
private final View mView;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final MaterialTextView mName;
|
private final TextView mName;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final MaterialCheckBox mVisibilityMarker;
|
private final CheckBox mVisibilityMarker;
|
||||||
|
|
||||||
CollectionViewHolder(@NonNull View root)
|
CollectionViewHolder(@NonNull View root)
|
||||||
{
|
{
|
||||||
@@ -269,11 +268,11 @@ public class Holders
|
|||||||
static class CategoryViewHolder extends CategoryViewHolderBase
|
static class CategoryViewHolder extends CategoryViewHolderBase
|
||||||
{
|
{
|
||||||
@NonNull
|
@NonNull
|
||||||
private final MaterialTextView mName;
|
private final TextView mName;
|
||||||
@NonNull
|
@NonNull
|
||||||
MaterialCheckBox mVisibilityMarker;
|
CheckBox mVisibilityMarker;
|
||||||
@NonNull
|
@NonNull
|
||||||
ShapeableImageView mMoreButton;
|
ImageView mMoreButton;
|
||||||
|
|
||||||
CategoryViewHolder(@NonNull View root)
|
CategoryViewHolder(@NonNull View root)
|
||||||
{
|
{
|
||||||
@@ -339,11 +338,11 @@ public class Holders
|
|||||||
static class BookmarkViewHolder extends BaseBookmarkHolder
|
static class BookmarkViewHolder extends BaseBookmarkHolder
|
||||||
{
|
{
|
||||||
@NonNull
|
@NonNull
|
||||||
private final ShapeableImageView mIcon;
|
private final ImageView mIcon;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final MaterialTextView mName;
|
private final TextView mName;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final MaterialTextView mDistance;
|
private final TextView mDistance;
|
||||||
|
|
||||||
BookmarkViewHolder(@NonNull View itemView)
|
BookmarkViewHolder(@NonNull View itemView)
|
||||||
{
|
{
|
||||||
@@ -385,12 +384,12 @@ public class Holders
|
|||||||
static class TrackViewHolder extends BaseBookmarkHolder
|
static class TrackViewHolder extends BaseBookmarkHolder
|
||||||
{
|
{
|
||||||
@NonNull
|
@NonNull
|
||||||
private final ShapeableImageView mIcon;
|
private final ImageView mIcon;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final MaterialTextView mName;
|
private final TextView mName;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final MaterialTextView mDistance;
|
private final TextView mDistance;
|
||||||
private final ShapeableImageView mMoreButton;
|
private final ImageView mMoreButton;
|
||||||
|
|
||||||
TrackViewHolder(@NonNull View itemView)
|
TrackViewHolder(@NonNull View itemView)
|
||||||
{
|
{
|
||||||
@@ -425,16 +424,16 @@ public class Holders
|
|||||||
|
|
||||||
public void setTrackIconClickListener(IconClickListener listener)
|
public void setTrackIconClickListener(IconClickListener listener)
|
||||||
{
|
{
|
||||||
mIcon.setOnClickListener(v -> listener.onItemClick((ShapeableImageView) v, getBindingAdapterPosition()));
|
mIcon.setOnClickListener(v -> listener.onItemClick((ImageView) v, getBindingAdapterPosition()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class SectionViewHolder extends BaseBookmarkHolder
|
public static class SectionViewHolder extends BaseBookmarkHolder
|
||||||
{
|
{
|
||||||
@NonNull
|
@NonNull
|
||||||
private final MaterialTextView mView;
|
private final TextView mView;
|
||||||
|
|
||||||
SectionViewHolder(@NonNull MaterialTextView itemView)
|
SectionViewHolder(@NonNull TextView itemView)
|
||||||
{
|
{
|
||||||
super(itemView);
|
super(itemView);
|
||||||
mView = itemView;
|
mView = itemView;
|
||||||
@@ -453,9 +452,9 @@ public class Holders
|
|||||||
static final float SPACING_MULTIPLE = 1.0f;
|
static final float SPACING_MULTIPLE = 1.0f;
|
||||||
static final float SPACING_ADD = 0.0f;
|
static final float SPACING_ADD = 0.0f;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final MaterialTextView mTitle;
|
private final TextView mTitle;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final MaterialTextView mDescText;
|
private final TextView mDescText;
|
||||||
|
|
||||||
DescriptionViewHolder(@NonNull View itemView, @NonNull BookmarkCategory category)
|
DescriptionViewHolder(@NonNull View itemView, @NonNull BookmarkCategory category)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -6,8 +6,7 @@ import android.view.LayoutInflater;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ArrayAdapter;
|
import android.widget.ArrayAdapter;
|
||||||
|
import android.widget.ImageView;
|
||||||
import com.google.android.material.imageview.ShapeableImageView;
|
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.bookmarks.data.Icon;
|
import app.organicmaps.bookmarks.data.Icon;
|
||||||
@@ -62,7 +61,7 @@ public class IconsAdapter extends ArrayAdapter<Icon>
|
|||||||
|
|
||||||
private static class SpinnerViewHolder
|
private static class SpinnerViewHolder
|
||||||
{
|
{
|
||||||
final ShapeableImageView icon;
|
final ImageView icon;
|
||||||
|
|
||||||
SpinnerViewHolder(View convertView)
|
SpinnerViewHolder(View convertView)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package app.organicmaps.bookmarks.data;
|
package app.organicmaps.bookmarks.data;
|
||||||
|
|
||||||
import com.google.android.material.imageview.ShapeableImageView;
|
import android.widget.ImageView;
|
||||||
|
|
||||||
public interface IconClickListener
|
public interface IconClickListener
|
||||||
{
|
{
|
||||||
void onItemClick(ShapeableImageView v, int position);
|
void onItemClick(ImageView v, int position);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package app.organicmaps.downloader;
|
package app.organicmaps.downloader;
|
||||||
|
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.widget.Button;
|
||||||
|
|
||||||
import com.google.android.material.button.MaterialButton;
|
|
||||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.util.StringUtils;
|
import app.organicmaps.util.StringUtils;
|
||||||
@@ -14,7 +14,7 @@ class BottomPanel
|
|||||||
{
|
{
|
||||||
private final DownloaderFragment mFragment;
|
private final DownloaderFragment mFragment;
|
||||||
private final FloatingActionButton mFab;
|
private final FloatingActionButton mFab;
|
||||||
private final MaterialButton mButton;
|
private final Button mButton;
|
||||||
|
|
||||||
private final View.OnClickListener mDownloadListener = new View.OnClickListener()
|
private final View.OnClickListener mDownloadListener = new View.OnClickListener()
|
||||||
{
|
{
|
||||||
@@ -45,15 +45,6 @@ class BottomPanel
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private final View.OnClickListener mRetryListener = new View.OnClickListener()
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public void onClick(View v)
|
|
||||||
{
|
|
||||||
MapManager.warn3gAndRetry(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
BottomPanel(DownloaderFragment fragment, View frame)
|
BottomPanel(DownloaderFragment fragment, View frame)
|
||||||
{
|
{
|
||||||
mFragment = fragment;
|
mFragment = fragment;
|
||||||
@@ -81,12 +72,6 @@ class BottomPanel
|
|||||||
mButton.setOnClickListener(mDownloadListener);
|
mButton.setOnClickListener(mDownloadListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setRetryFailedStates()
|
|
||||||
{
|
|
||||||
mButton.setText(R.string.downloader_retry);
|
|
||||||
mButton.setOnClickListener(mRetryListener);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setCancelState()
|
private void setCancelState()
|
||||||
{
|
{
|
||||||
mButton.setText(R.string.downloader_cancel_all);
|
mButton.setText(R.string.downloader_cancel_all);
|
||||||
@@ -116,7 +101,7 @@ class BottomPanel
|
|||||||
} // Special case for "Countries" node when no maps currently downloaded.
|
} // Special case for "Countries" node when no maps currently downloaded.
|
||||||
case STATUS_DOWNLOADABLE, STATUS_DONE, STATUS_PARTLY -> show = false;
|
case STATUS_DOWNLOADABLE, STATUS_DONE, STATUS_PARTLY -> show = false;
|
||||||
case STATUS_PROGRESS, STATUS_APPLYING, STATUS_ENQUEUED -> setCancelState();
|
case STATUS_PROGRESS, STATUS_APPLYING, STATUS_ENQUEUED -> setCancelState();
|
||||||
case STATUS_FAILED -> setRetryFailedStates();
|
case STATUS_FAILED -> setDownloadAllState();
|
||||||
default -> throw new IllegalArgumentException("Inappropriate status for \"" + root + "\": " + status);
|
default -> throw new IllegalArgumentException("Inappropriate status for \"" + root + "\": " + status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -134,7 +119,6 @@ class BottomPanel
|
|||||||
}
|
}
|
||||||
case STATUS_DONE -> show = false;
|
case STATUS_DONE -> show = false;
|
||||||
case STATUS_PROGRESS, STATUS_APPLYING, STATUS_ENQUEUED -> setCancelState();
|
case STATUS_PROGRESS, STATUS_APPLYING, STATUS_ENQUEUED -> setCancelState();
|
||||||
case STATUS_FAILED -> setRetryFailedStates();
|
|
||||||
default -> setDownloadAllState();
|
default -> setDownloadAllState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -209,7 +209,7 @@ class ChunkTask extends AsyncTask<Void, byte[], Integer>
|
|||||||
// @TODO Else display received web page to user - router is redirecting us to some page
|
// @TODO Else display received web page to user - router is redirecting us to some page
|
||||||
}
|
}
|
||||||
|
|
||||||
return downloadFromStream(new BufferedInputStream(urlConnection.getInputStream(), 128 * Constants.KB));
|
return downloadFromStream(new BufferedInputStream(urlConnection.getInputStream(), 65536));
|
||||||
} catch (final MalformedURLException ex)
|
} catch (final MalformedURLException ex)
|
||||||
{
|
{
|
||||||
Logger.e(TAG, "Invalid url: " + mUrl, ex);
|
Logger.e(TAG, "Invalid url: " + mUrl, ex);
|
||||||
@@ -229,7 +229,7 @@ class ChunkTask extends AsyncTask<Void, byte[], Integer>
|
|||||||
{
|
{
|
||||||
// Because of timeouts in InputStream.read (for bad connection),
|
// Because of timeouts in InputStream.read (for bad connection),
|
||||||
// try to introduce dynamic buffer size to read in one query.
|
// try to introduce dynamic buffer size to read in one query.
|
||||||
final int[] arrSize = {128, 32, 1};
|
final int[] arrSize = {64, 32, 1};
|
||||||
int ret = IO_EXCEPTION;
|
int ret = IO_EXCEPTION;
|
||||||
|
|
||||||
for (int size : arrSize)
|
for (int size : arrSize)
|
||||||
@@ -240,7 +240,7 @@ class ChunkTask extends AsyncTask<Void, byte[], Integer>
|
|||||||
break;
|
break;
|
||||||
} catch (final IOException ex)
|
} catch (final IOException ex)
|
||||||
{
|
{
|
||||||
Logger.e(TAG, "IOException in downloadFromStream for buffer size: " + size, ex);
|
Logger.e(TAG, "IOException in downloadFromStream for chunk size: " + size, ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,14 +6,13 @@ import android.text.TextUtils;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.Button;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
|
|
||||||
import com.google.android.material.button.MaterialButton;
|
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.base.BaseMwmFragment;
|
import app.organicmaps.base.BaseMwmFragment;
|
||||||
import app.organicmaps.base.BaseMwmFragmentActivity;
|
import app.organicmaps.base.BaseMwmFragmentActivity;
|
||||||
@@ -31,10 +30,10 @@ public class CountrySuggestFragment extends BaseMwmFragment implements View.OnCl
|
|||||||
private LinearLayout mLlSelectDownload;
|
private LinearLayout mLlSelectDownload;
|
||||||
private LinearLayout mLlActiveDownload;
|
private LinearLayout mLlActiveDownload;
|
||||||
private WheelProgressView mWpvDownloadProgress;
|
private WheelProgressView mWpvDownloadProgress;
|
||||||
private MaterialTextView mTvCountry;
|
private TextView mTvCountry;
|
||||||
private MaterialTextView mTvActiveCountry;
|
private TextView mTvActiveCountry;
|
||||||
private MaterialTextView mTvProgress;
|
private TextView mTvProgress;
|
||||||
private MaterialButton mBtnDownloadMap;
|
private Button mBtnDownloadMap;
|
||||||
|
|
||||||
private CountryItem mCurrentCountry;
|
private CountryItem mCurrentCountry;
|
||||||
private CountryItem mDownloadingCountry;
|
private CountryItem mDownloadingCountry;
|
||||||
@@ -151,7 +150,7 @@ public class CountrySuggestFragment extends BaseMwmFragment implements View.OnCl
|
|||||||
mLlNoLocation = view.findViewById(R.id.ll__location_unknown);
|
mLlNoLocation = view.findViewById(R.id.ll__location_unknown);
|
||||||
mBtnDownloadMap = view.findViewById(R.id.btn__download_map);
|
mBtnDownloadMap = view.findViewById(R.id.btn__download_map);
|
||||||
mBtnDownloadMap.setOnClickListener(this);
|
mBtnDownloadMap.setOnClickListener(this);
|
||||||
MaterialButton selectMap = view.findViewById(R.id.btn__select_map);
|
Button selectMap = view.findViewById(R.id.btn__select_map);
|
||||||
selectMap.setOnClickListener(this);
|
selectMap.setOnClickListener(this);
|
||||||
mWpvDownloadProgress = view.findViewById(R.id.wpv__download_progress);
|
mWpvDownloadProgress = view.findViewById(R.id.wpv__download_progress);
|
||||||
mWpvDownloadProgress.setOnClickListener(this);
|
mWpvDownloadProgress.setOnClickListener(this);
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ public class DownloaderNotifier
|
|||||||
.setAutoCancel(true)
|
.setAutoCancel(true)
|
||||||
.setCategory(NotificationCompat.CATEGORY_ERROR)
|
.setCategory(NotificationCompat.CATEGORY_ERROR)
|
||||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||||
.setSmallIcon(R.drawable.ic_logo_small)
|
.setSmallIcon(R.drawable.ic_launcher_small)
|
||||||
.setColor(ContextCompat.getColor(mContext, R.color.notification))
|
.setColor(ContextCompat.getColor(mContext, R.color.notification))
|
||||||
.setContentTitle(title)
|
.setContentTitle(title)
|
||||||
.setContentText(content)
|
.setContentText(content)
|
||||||
@@ -124,7 +124,7 @@ public class DownloaderNotifier
|
|||||||
return new NotificationCompat.Builder(mContext, CHANNEL_ID)
|
return new NotificationCompat.Builder(mContext, CHANNEL_ID)
|
||||||
.setAutoCancel(true)
|
.setAutoCancel(true)
|
||||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||||
.setSmallIcon(R.drawable.ic_logo_small)
|
.setSmallIcon(R.drawable.ic_launcher)
|
||||||
.setColor(ContextCompat.getColor(mContext, R.color.notification))
|
.setColor(ContextCompat.getColor(mContext, R.color.notification))
|
||||||
.setShowWhen(true)
|
.setShowWhen(true)
|
||||||
.setContentTitle(title)
|
.setContentTitle(title)
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package app.organicmaps.downloader;
|
|||||||
import static android.Manifest.permission.POST_NOTIFICATIONS;
|
import static android.Manifest.permission.POST_NOTIFICATIONS;
|
||||||
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||||
|
|
||||||
import android.app.ForegroundServiceStartNotAllowedException;
|
|
||||||
import android.app.Service;
|
import android.app.Service;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.ServiceInfo;
|
import android.content.pm.ServiceInfo;
|
||||||
@@ -43,24 +42,10 @@ public class DownloaderService extends Service implements MapManager.StorageCall
|
|||||||
|
|
||||||
var notification = mNotifier.buildProgressNotification();
|
var notification = mNotifier.buildProgressNotification();
|
||||||
Logger.i(TAG, "Starting Downloader Foreground Service");
|
Logger.i(TAG, "Starting Downloader Foreground Service");
|
||||||
try
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
|
||||||
{
|
ServiceCompat.startForeground(this, DownloaderNotifier.NOTIFICATION_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC);
|
||||||
int type = 0;
|
else
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
|
ServiceCompat.startForeground(this, DownloaderNotifier.NOTIFICATION_ID, notification, 0);
|
||||||
type = ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC;
|
|
||||||
ServiceCompat.startForeground(this, DownloaderNotifier.NOTIFICATION_ID, notification, type);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S &&
|
|
||||||
e instanceof ForegroundServiceStartNotAllowedException)
|
|
||||||
{
|
|
||||||
// App not in a valid state to start foreground service (e.g started from bg)
|
|
||||||
Logger.e(TAG, "Not in a valid state to start foreground service", e);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Logger.e(TAG, "Failed to promote the service to foreground", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
return START_NOT_STICKY;
|
return START_NOT_STICKY;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,13 +4,11 @@ import android.location.Location;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.core.view.ViewCompat;
|
import androidx.core.view.ViewCompat;
|
||||||
|
|
||||||
import com.google.android.material.button.MaterialButton;
|
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
|
||||||
|
|
||||||
import app.organicmaps.MwmActivity;
|
import app.organicmaps.MwmActivity;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.location.LocationHelper;
|
import app.organicmaps.location.LocationHelper;
|
||||||
@@ -30,11 +28,11 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
|
|||||||
|
|
||||||
private final MwmActivity mActivity;
|
private final MwmActivity mActivity;
|
||||||
private final View mFrame;
|
private final View mFrame;
|
||||||
private final MaterialTextView mParent;
|
private final TextView mParent;
|
||||||
private final MaterialTextView mTitle;
|
private final TextView mTitle;
|
||||||
private final MaterialTextView mSize;
|
private final TextView mSize;
|
||||||
private final WheelProgressView mProgress;
|
private final WheelProgressView mProgress;
|
||||||
private final MaterialButton mButton;
|
private final Button mButton;
|
||||||
|
|
||||||
private int mStorageSubscriptionSlot;
|
private int mStorageSubscriptionSlot;
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import android.view.LayoutInflater;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.webkit.WebView;
|
import android.webkit.WebView;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.DrawableRes;
|
import androidx.annotation.DrawableRes;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
@@ -18,10 +20,7 @@ import app.organicmaps.util.Constants;
|
|||||||
import app.organicmaps.util.Graphics;
|
import app.organicmaps.util.Graphics;
|
||||||
import app.organicmaps.util.InputUtils;
|
import app.organicmaps.util.InputUtils;
|
||||||
import app.organicmaps.util.UiUtils;
|
import app.organicmaps.util.UiUtils;
|
||||||
|
|
||||||
import com.google.android.material.imageview.ShapeableImageView;
|
|
||||||
import com.google.android.material.textfield.TextInputEditText;
|
import com.google.android.material.textfield.TextInputEditText;
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
|
||||||
|
|
||||||
public class AdvancedTimetableFragment extends BaseMwmFragment
|
public class AdvancedTimetableFragment extends BaseMwmFragment
|
||||||
implements View.OnClickListener, TimetableProvider
|
implements View.OnClickListener, TimetableProvider
|
||||||
@@ -29,8 +28,8 @@ public class AdvancedTimetableFragment extends BaseMwmFragment
|
|||||||
private boolean mIsExampleShown;
|
private boolean mIsExampleShown;
|
||||||
private TextInputEditText mInput;
|
private TextInputEditText mInput;
|
||||||
private WebView mExample;
|
private WebView mExample;
|
||||||
private MaterialTextView mExamplesTitle;
|
private TextView mExamplesTitle;
|
||||||
private static ShapeableImageView mSaveButton;
|
private static ImageView mSaveButton;
|
||||||
@Nullable
|
@Nullable
|
||||||
private String mInitTimetables;
|
private String mInitTimetables;
|
||||||
@Nullable
|
@Nullable
|
||||||
|
|||||||
@@ -3,14 +3,13 @@ package app.organicmaps.editor;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.CheckBox;
|
||||||
import android.widget.CompoundButton;
|
import android.widget.CompoundButton;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.google.android.material.checkbox.MaterialCheckBox;
|
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -101,8 +100,8 @@ public class CuisineAdapter extends RecyclerView.Adapter<CuisineAdapter.ViewHold
|
|||||||
|
|
||||||
protected class ViewHolder extends RecyclerView.ViewHolder implements CompoundButton.OnCheckedChangeListener
|
protected class ViewHolder extends RecyclerView.ViewHolder implements CompoundButton.OnCheckedChangeListener
|
||||||
{
|
{
|
||||||
final MaterialTextView cuisine;
|
final TextView cuisine;
|
||||||
final MaterialCheckBox selected;
|
final CheckBox selected;
|
||||||
|
|
||||||
public ViewHolder(View itemView)
|
public ViewHolder(View itemView)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ import android.text.method.LinkMovementMethod;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.CallSuper;
|
import androidx.annotation.CallSuper;
|
||||||
import androidx.annotation.DrawableRes;
|
import androidx.annotation.DrawableRes;
|
||||||
@@ -20,11 +22,8 @@ import androidx.recyclerview.widget.LinearLayoutManager;
|
|||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
import com.google.android.material.imageview.ShapeableImageView;
|
|
||||||
import com.google.android.material.textfield.TextInputLayout;
|
import com.google.android.material.textfield.TextInputLayout;
|
||||||
import com.google.android.material.textfield.TextInputEditText;
|
import com.google.android.material.textfield.TextInputEditText;
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
|
||||||
|
|
||||||
import app.organicmaps.Framework;
|
import app.organicmaps.Framework;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.base.BaseMwmFragment;
|
import app.organicmaps.base.BaseMwmFragment;
|
||||||
@@ -47,7 +46,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
|||||||
{
|
{
|
||||||
final static String LAST_INDEX_OF_NAMES_ARRAY = "LastIndexOfNamesArray";
|
final static String LAST_INDEX_OF_NAMES_ARRAY = "LastIndexOfNamesArray";
|
||||||
|
|
||||||
private MaterialTextView mCategory;
|
private TextView mCategory;
|
||||||
private View mCardName;
|
private View mCardName;
|
||||||
private View mCardAddress;
|
private View mCardAddress;
|
||||||
private View mCardDetails;
|
private View mCardDetails;
|
||||||
@@ -90,20 +89,20 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
|||||||
};
|
};
|
||||||
|
|
||||||
private MultilanguageAdapter mNamesAdapter;
|
private MultilanguageAdapter mNamesAdapter;
|
||||||
private MaterialTextView mNamesCaption;
|
private TextView mNamesCaption;
|
||||||
private MaterialTextView mAddLanguage;
|
private TextView mAddLanguage;
|
||||||
private MaterialTextView mMoreLanguages;
|
private TextView mMoreLanguages;
|
||||||
|
|
||||||
private MaterialTextView mStreet;
|
private TextView mStreet;
|
||||||
private TextInputEditText mHouseNumber;
|
private TextInputEditText mHouseNumber;
|
||||||
private TextInputEditText mBuildingLevels;
|
private TextInputEditText mBuildingLevels;
|
||||||
|
|
||||||
// Define Metadata entries, that have more tricky logic, separately.
|
// Define Metadata entries, that have more tricky logic, separately.
|
||||||
private MaterialTextView mPhone;
|
private TextView mPhone;
|
||||||
private MaterialTextView mEditPhoneLink;
|
private TextView mEditPhoneLink;
|
||||||
private MaterialTextView mCuisine;
|
private TextView mCuisine;
|
||||||
private SwitchCompat mWifi;
|
private SwitchCompat mWifi;
|
||||||
private MaterialTextView mSelfService;
|
private TextView mSelfService;
|
||||||
private SwitchCompat mOutdoorSeating;
|
private SwitchCompat mOutdoorSeating;
|
||||||
|
|
||||||
// Default Metadata entries.
|
// Default Metadata entries.
|
||||||
@@ -133,12 +132,12 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
|||||||
private TextInputLayout mInputBuildingLevels;
|
private TextInputLayout mInputBuildingLevels;
|
||||||
|
|
||||||
private View mEmptyOpeningHours;
|
private View mEmptyOpeningHours;
|
||||||
private MaterialTextView mOpeningHours;
|
private TextView mOpeningHours;
|
||||||
private View mEditOpeningHours;
|
private View mEditOpeningHours;
|
||||||
private TextInputEditText mDescription;
|
private TextInputEditText mDescription;
|
||||||
private final Map<Metadata.MetadataType, View> mDetailsBlocks = new HashMap<>();
|
private final Map<Metadata.MetadataType, View> mDetailsBlocks = new HashMap<>();
|
||||||
private final Map<Metadata.MetadataType, View> mSocialMediaBlocks = new HashMap<>();
|
private final Map<Metadata.MetadataType, View> mSocialMediaBlocks = new HashMap<>();
|
||||||
private MaterialTextView mReset;
|
private TextView mReset;
|
||||||
|
|
||||||
private EditorHostFragment mParent;
|
private EditorHostFragment mParent;
|
||||||
|
|
||||||
@@ -490,7 +489,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
|||||||
mOpeningHours.setOnClickListener(this);
|
mOpeningHours.setOnClickListener(this);
|
||||||
final View cardMore = view.findViewById(R.id.cv__more);
|
final View cardMore = view.findViewById(R.id.cv__more);
|
||||||
mDescription = findInput(cardMore);
|
mDescription = findInput(cardMore);
|
||||||
MaterialTextView osmInfo = view.findViewById(R.id.osm_info);
|
TextView osmInfo = view.findViewById(R.id.osm_info);
|
||||||
osmInfo.setMovementMethod(LinkMovementMethod.getInstance());
|
osmInfo.setMovementMethod(LinkMovementMethod.getInstance());
|
||||||
mReset = view.findViewById(R.id.reset);
|
mReset = view.findViewById(R.id.reset);
|
||||||
mReset.setOnClickListener(this);
|
mReset.setOnClickListener(this);
|
||||||
@@ -530,7 +529,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
|||||||
|
|
||||||
private static TextInputEditText findInputAndInitBlock(View blockWithInput, @DrawableRes int icon, String hint)
|
private static TextInputEditText findInputAndInitBlock(View blockWithInput, @DrawableRes int icon, String hint)
|
||||||
{
|
{
|
||||||
((ShapeableImageView) blockWithInput.findViewById(R.id.icon)).setImageResource(icon);
|
((ImageView) blockWithInput.findViewById(R.id.icon)).setImageResource(icon);
|
||||||
final TextInputLayout input = blockWithInput.findViewById(R.id.custom_input);
|
final TextInputLayout input = blockWithInput.findViewById(R.id.custom_input);
|
||||||
input.setHint(hint);
|
input.setHint(hint);
|
||||||
return input.findViewById(R.id.input);
|
return input.findViewById(R.id.input);
|
||||||
|
|||||||
@@ -4,13 +4,12 @@ import android.text.method.LinkMovementMethod;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.editor.data.FeatureCategory;
|
import app.organicmaps.editor.data.FeatureCategory;
|
||||||
import app.organicmaps.util.UiUtils;
|
import app.organicmaps.util.UiUtils;
|
||||||
@@ -79,7 +78,7 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
|||||||
protected class FeatureViewHolder extends RecyclerView.ViewHolder
|
protected class FeatureViewHolder extends RecyclerView.ViewHolder
|
||||||
{
|
{
|
||||||
@NonNull
|
@NonNull
|
||||||
private final MaterialTextView mName;
|
private final TextView mName;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final View mSelected;
|
private final View mSelected;
|
||||||
|
|
||||||
@@ -107,7 +106,7 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
|||||||
FooterViewHolder(@NonNull View itemView)
|
FooterViewHolder(@NonNull View itemView)
|
||||||
{
|
{
|
||||||
super(itemView);
|
super(itemView);
|
||||||
MaterialTextView categoryUnsuitableText = itemView.findViewById(R.id.editor_category_unsuitable_text);
|
TextView categoryUnsuitableText = itemView.findViewById(R.id.editor_category_unsuitable_text);
|
||||||
categoryUnsuitableText.setMovementMethod(LinkMovementMethod.getInstance());
|
categoryUnsuitableText.setMovementMethod(LinkMovementMethod.getInstance());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import android.text.format.DateFormat;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
|
import android.widget.TextView;
|
||||||
import android.widget.TimePicker;
|
import android.widget.TimePicker;
|
||||||
|
|
||||||
import androidx.annotation.IntRange;
|
import androidx.annotation.IntRange;
|
||||||
@@ -20,8 +21,6 @@ import androidx.fragment.app.FragmentManager;
|
|||||||
|
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
import com.google.android.material.tabs.TabLayout;
|
import com.google.android.material.tabs.TabLayout;
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.base.BaseMwmDialogFragment;
|
import app.organicmaps.base.BaseMwmDialogFragment;
|
||||||
import app.organicmaps.editor.data.HoursMinutes;
|
import app.organicmaps.editor.data.HoursMinutes;
|
||||||
@@ -135,19 +134,19 @@ public class HoursMinutesPickerFragment extends BaseMwmDialogFragment
|
|||||||
if (id != 0)
|
if (id != 0)
|
||||||
{
|
{
|
||||||
mPickerHoursLabel = mPicker.findViewById(id);
|
mPickerHoursLabel = mPicker.findViewById(id);
|
||||||
if (!(mPickerHoursLabel instanceof MaterialTextView))
|
if (!(mPickerHoursLabel instanceof TextView))
|
||||||
mPickerHoursLabel = null;
|
mPickerHoursLabel = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
mTabs = root.findViewById(R.id.tabs);
|
mTabs = root.findViewById(R.id.tabs);
|
||||||
MaterialTextView tabView = (MaterialTextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);
|
TextView tabView = (TextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);
|
||||||
tabView.setText(getResources().getString(R.string.editor_time_from));
|
tabView.setText(getResources().getString(R.string.editor_time_from));
|
||||||
final ColorStateList textColor = AppCompatResources.getColorStateList(requireContext(),
|
final ColorStateList textColor = AppCompatResources.getColorStateList(requireContext(),
|
||||||
ThemeUtils.isNightTheme(requireContext()) ? R.color.accent_color_selector_night
|
ThemeUtils.isNightTheme(requireContext()) ? R.color.accent_color_selector_night
|
||||||
: R.color.accent_color_selector);
|
: R.color.accent_color_selector);
|
||||||
tabView.setTextColor(textColor);
|
tabView.setTextColor(textColor);
|
||||||
mTabs.addTab(mTabs.newTab().setCustomView(tabView), true);
|
mTabs.addTab(mTabs.newTab().setCustomView(tabView), true);
|
||||||
tabView = (MaterialTextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);
|
tabView = (TextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);
|
||||||
tabView.setText(getResources().getString(R.string.editor_time_to));
|
tabView.setText(getResources().getString(R.string.editor_time_to));
|
||||||
tabView.setTextColor(textColor);
|
tabView.setTextColor(textColor);
|
||||||
mTabs.addTab(mTabs.newTab().setCustomView(tabView), true);
|
mTabs.addTab(mTabs.newTab().setCustomView(tabView), true);
|
||||||
|
|||||||
@@ -3,12 +3,11 @@ package app.organicmaps.editor;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.editor.data.Language;
|
import app.organicmaps.editor.data.Language;
|
||||||
|
|
||||||
@@ -43,12 +42,12 @@ public class LanguagesAdapter extends RecyclerView.Adapter<LanguagesAdapter.Hold
|
|||||||
|
|
||||||
protected class Holder extends RecyclerView.ViewHolder
|
protected class Holder extends RecyclerView.ViewHolder
|
||||||
{
|
{
|
||||||
MaterialTextView name;
|
TextView name;
|
||||||
|
|
||||||
public Holder(View itemView)
|
public Holder(View itemView)
|
||||||
{
|
{
|
||||||
super(itemView);
|
super(itemView);
|
||||||
name = (MaterialTextView) itemView;
|
name = (TextView) itemView;
|
||||||
itemView.setOnClickListener(v -> mFragment.onLanguageSelected(mLanguages[getBindingAdapterPosition()]));
|
itemView.setOnClickListener(v -> mFragment.onLanguageSelected(mLanguages[getBindingAdapterPosition()]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,30 +0,0 @@
|
|||||||
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,6 +60,4 @@ public final class OpeningHours
|
|||||||
* @return true if timetable string is valid OSM timetable.
|
* @return true if timetable string is valid OSM timetable.
|
||||||
*/
|
*/
|
||||||
public static native boolean nativeIsTimetableStringValid(String source);
|
public static native boolean nativeIsTimetableStringValid(String source);
|
||||||
|
|
||||||
public static native OhState nativeCurrentState(@NonNull Timetable[] timetables);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,11 +4,11 @@ import android.text.TextUtils;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.google.android.material.imageview.ShapeableImageView;
|
|
||||||
import com.google.android.material.textfield.TextInputLayout;
|
import com.google.android.material.textfield.TextInputLayout;
|
||||||
import com.google.android.material.textfield.TextInputEditText;
|
import com.google.android.material.textfield.TextInputEditText;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
@@ -94,7 +94,7 @@ public class PhoneListAdapter extends RecyclerView.Adapter<PhoneListAdapter.View
|
|||||||
{
|
{
|
||||||
private int mPosition = -1;
|
private int mPosition = -1;
|
||||||
private final TextInputEditText mInput;
|
private final TextInputEditText mInput;
|
||||||
private final ShapeableImageView deleteButton;
|
private final ImageView deleteButton;
|
||||||
|
|
||||||
public ViewHolder(@NonNull View itemView)
|
public ViewHolder(@NonNull View itemView)
|
||||||
{
|
{
|
||||||
@@ -116,7 +116,7 @@ public class PhoneListAdapter extends RecyclerView.Adapter<PhoneListAdapter.View
|
|||||||
deleteButton.setOnClickListener(this);
|
deleteButton.setOnClickListener(this);
|
||||||
// TODO: setting icons from code because icons defined in layout XML are white.
|
// TODO: setting icons from code because icons defined in layout XML are white.
|
||||||
deleteButton.setImageResource(R.drawable.ic_delete);
|
deleteButton.setImageResource(R.drawable.ic_delete);
|
||||||
((ShapeableImageView) itemView.findViewById(R.id.phone_icon)).setImageResource(R.drawable.ic_phone);
|
((ImageView) itemView.findViewById(R.id.phone_icon)).setImageResource(R.drawable.ic_phone);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPosition(int position)
|
public void setPosition(int position)
|
||||||
|
|||||||
@@ -4,13 +4,12 @@ import android.content.Context;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.CompoundButton;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.google.android.material.radiobutton.MaterialRadioButton;
|
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.util.Utils;
|
import app.organicmaps.util.Utils;
|
||||||
|
|
||||||
@@ -52,8 +51,8 @@ public class SelfServiceAdapter extends RecyclerView.Adapter<SelfServiceAdapter.
|
|||||||
|
|
||||||
protected class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
|
protected class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
|
||||||
{
|
{
|
||||||
final MaterialTextView selfServiceDef;
|
final TextView selfServiceDef;
|
||||||
final MaterialRadioButton selected;
|
final CompoundButton selected;
|
||||||
|
|
||||||
public ViewHolder(View itemView)
|
public ViewHolder(View itemView)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,8 +4,11 @@ import android.util.SparseArray;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.CheckBox;
|
||||||
import android.widget.CompoundButton;
|
import android.widget.CompoundButton;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.IdRes;
|
import androidx.annotation.IdRes;
|
||||||
import androidx.annotation.IntRange;
|
import androidx.annotation.IntRange;
|
||||||
@@ -14,10 +17,6 @@ import androidx.appcompat.widget.SwitchCompat;
|
|||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.google.android.material.button.MaterialButton;
|
|
||||||
import com.google.android.material.checkbox.MaterialCheckBox;
|
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
|
||||||
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.editor.data.HoursMinutes;
|
import app.organicmaps.editor.data.HoursMinutes;
|
||||||
import app.organicmaps.editor.data.TimeFormatUtils;
|
import app.organicmaps.editor.data.TimeFormatUtils;
|
||||||
@@ -186,15 +185,15 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
|
|||||||
// Limit closed spans to avoid dynamic inflation of views in recycler's children. Yeah, its a hack.
|
// Limit closed spans to avoid dynamic inflation of views in recycler's children. Yeah, its a hack.
|
||||||
static final int MAX_CLOSED_SPANS = 10;
|
static final int MAX_CLOSED_SPANS = 10;
|
||||||
|
|
||||||
SparseArray<MaterialCheckBox> days = new SparseArray<>(7);
|
SparseArray<CheckBox> days = new SparseArray<>(7);
|
||||||
View allday;
|
View allday;
|
||||||
SwitchCompat swAllday;
|
SwitchCompat swAllday;
|
||||||
View schedule;
|
View schedule;
|
||||||
View openClose;
|
View openClose;
|
||||||
View open;
|
View open;
|
||||||
View close;
|
View close;
|
||||||
MaterialTextView tvOpen;
|
TextView tvOpen;
|
||||||
MaterialTextView tvClose;
|
TextView tvClose;
|
||||||
View[] closedHours = new View[MAX_CLOSED_SPANS];
|
View[] closedHours = new View[MAX_CLOSED_SPANS];
|
||||||
View addClosed;
|
View addClosed;
|
||||||
View deleteTimetable;
|
View deleteTimetable;
|
||||||
@@ -317,7 +316,7 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
UiUtils.show(closedHours[i]);
|
UiUtils.show(closedHours[i]);
|
||||||
((MaterialTextView) closedHours[i].findViewById(R.id.tv__closed)).setText(timespan.toString());
|
((TextView) closedHours[i].findViewById(R.id.tv__closed)).setText(timespan.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
@@ -334,18 +333,18 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
|
|||||||
private void addDay(@IntRange(from = 1, to = 7) final int dayIndex, @IdRes int id)
|
private void addDay(@IntRange(from = 1, to = 7) final int dayIndex, @IdRes int id)
|
||||||
{
|
{
|
||||||
final View day = itemView.findViewById(id);
|
final View day = itemView.findViewById(id);
|
||||||
final MaterialCheckBox checkBox = day.findViewById(R.id.chb__day);
|
final CheckBox checkBox = day.findViewById(R.id.chb__day);
|
||||||
// Save index of the day to get it back when checkbox will be toggled.
|
// Save index of the day to get it back when checkbox will be toggled.
|
||||||
checkBox.setTag(dayIndex);
|
checkBox.setTag(dayIndex);
|
||||||
days.put(dayIndex, checkBox);
|
days.put(dayIndex, checkBox);
|
||||||
day.setOnClickListener(v -> checkBox.toggle());
|
day.setOnClickListener(v -> checkBox.toggle());
|
||||||
|
|
||||||
((MaterialTextView) day.findViewById(R.id.tv__day)).setText(TimeFormatUtils.formatShortWeekday(dayIndex));
|
((TextView) day.findViewById(R.id.tv__day)).setText(TimeFormatUtils.formatShortWeekday(dayIndex));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void switchWorkingDay(@IntRange(from = 1, to = 7) int dayIndex)
|
private void switchWorkingDay(@IntRange(from = 1, to = 7) int dayIndex)
|
||||||
{
|
{
|
||||||
final MaterialCheckBox checkBox = days.get(dayIndex);
|
final CheckBox checkBox = days.get(dayIndex);
|
||||||
if (checkBox.isChecked())
|
if (checkBox.isChecked())
|
||||||
addWorkingDay(dayIndex, getBindingAdapterPosition());
|
addWorkingDay(dayIndex, getBindingAdapterPosition());
|
||||||
else
|
else
|
||||||
@@ -362,7 +361,7 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
|
|||||||
|
|
||||||
private class AddTimetableViewHolder extends BaseTimetableViewHolder
|
private class AddTimetableViewHolder extends BaseTimetableViewHolder
|
||||||
{
|
{
|
||||||
private final MaterialButton mAdd;
|
private final Button mAdd;
|
||||||
|
|
||||||
AddTimetableViewHolder(View itemView)
|
AddTimetableViewHolder(View itemView)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,13 +4,12 @@ import android.content.res.Resources;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.CompoundButton;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.google.android.material.radiobutton.MaterialRadioButton;
|
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
|
||||||
|
|
||||||
import app.organicmaps.MwmApplication;
|
import app.organicmaps.MwmApplication;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.dialog.EditTextDialogFragment;
|
import app.organicmaps.dialog.EditTextDialogFragment;
|
||||||
@@ -87,9 +86,9 @@ public class StreetAdapter extends RecyclerView.Adapter<StreetAdapter.BaseViewHo
|
|||||||
|
|
||||||
protected class StreetViewHolder extends BaseViewHolder implements View.OnClickListener
|
protected class StreetViewHolder extends BaseViewHolder implements View.OnClickListener
|
||||||
{
|
{
|
||||||
final MaterialTextView streetDef;
|
final TextView streetDef;
|
||||||
final MaterialTextView streetLoc;
|
final TextView streetLoc;
|
||||||
final MaterialRadioButton selected;
|
final CompoundButton selected;
|
||||||
|
|
||||||
public StreetViewHolder(View itemView)
|
public StreetViewHolder(View itemView)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import android.view.LayoutInflater;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
@@ -18,7 +19,6 @@ import app.organicmaps.R;
|
|||||||
import app.organicmaps.base.BaseMwmFragment;
|
import app.organicmaps.base.BaseMwmFragment;
|
||||||
import app.organicmaps.util.UiUtils;
|
import app.organicmaps.util.UiUtils;
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
|
||||||
|
|
||||||
public class TimetableContainerFragment extends BaseMwmFragment implements TimetableChangedListener
|
public class TimetableContainerFragment extends BaseMwmFragment implements TimetableChangedListener
|
||||||
{
|
{
|
||||||
@@ -71,7 +71,7 @@ public class TimetableContainerFragment extends BaseMwmFragment implements Timet
|
|||||||
|
|
||||||
@SuppressWarnings("NullableProblems")
|
@SuppressWarnings("NullableProblems")
|
||||||
@NonNull
|
@NonNull
|
||||||
private MaterialTextView mSwitchMode;
|
private TextView mSwitchMode;
|
||||||
|
|
||||||
@SuppressWarnings("NullableProblems")
|
@SuppressWarnings("NullableProblems")
|
||||||
@NonNull
|
@NonNull
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ public class LocationHelper implements BaseLocationProvider.Listener
|
|||||||
{
|
{
|
||||||
private static final long INTERVAL_FOLLOW_MS = 0;
|
private static final long INTERVAL_FOLLOW_MS = 0;
|
||||||
private static final long INTERVAL_NOT_FOLLOW_MS = 3000;
|
private static final long INTERVAL_NOT_FOLLOW_MS = 3000;
|
||||||
private static final long INTERVAL_NAVIGATION_MS = 1000;
|
private static final long INTERVAL_NAVIGATION_MS = 0;
|
||||||
private static final long INTERVAL_TRACK_RECORDING = 0;
|
private static final long INTERVAL_TRACK_RECORDING = 0;
|
||||||
|
|
||||||
private static final long AGPS_EXPIRATION_TIME_MS = 16 * 60 * 60 * 1000; // 16 hours
|
private static final long AGPS_EXPIRATION_TIME_MS = 16 * 60 * 60 * 1000; // 16 hours
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package app.organicmaps.location;
|
package app.organicmaps.location;
|
||||||
|
|
||||||
import android.app.ForegroundServiceStartNotAllowedException;
|
|
||||||
import android.app.NotificationManager;
|
import android.app.NotificationManager;
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.app.Service;
|
import android.app.Service;
|
||||||
@@ -108,7 +107,7 @@ public class TrackRecordingService extends Service implements LocationListener
|
|||||||
.setOngoing(true)
|
.setOngoing(true)
|
||||||
.setShowWhen(true)
|
.setShowWhen(true)
|
||||||
.setOnlyAlertOnce(true)
|
.setOnlyAlertOnce(true)
|
||||||
.setSmallIcon(R.drawable.ic_logo_small)
|
.setSmallIcon(R.drawable.ic_launcher_small)
|
||||||
.setContentTitle(context.getString(R.string.track_recording))
|
.setContentTitle(context.getString(R.string.track_recording))
|
||||||
.addAction(0, context.getString(R.string.navigation_stop_button), getExitPendingIntent(context))
|
.addAction(0, context.getString(R.string.navigation_stop_button), getExitPendingIntent(context))
|
||||||
.setContentIntent(getPendingIntent(context))
|
.setContentIntent(getPendingIntent(context))
|
||||||
@@ -161,25 +160,10 @@ public class TrackRecordingService extends Service implements LocationListener
|
|||||||
}
|
}
|
||||||
|
|
||||||
Logger.i(TAG, "Starting Track Recording Foreground service");
|
Logger.i(TAG, "Starting Track Recording Foreground service");
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
|
||||||
try
|
ServiceCompat.startForeground(this, TrackRecordingService.TRACK_REC_NOTIFICATION_ID, getNotificationBuilder(this).build(), ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION);
|
||||||
{
|
else
|
||||||
int type = 0;
|
ServiceCompat.startForeground(this, TrackRecordingService.TRACK_REC_NOTIFICATION_ID, getNotificationBuilder(this).build(), 0);
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
|
|
||||||
type = ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION;
|
|
||||||
ServiceCompat.startForeground(this, TrackRecordingService.TRACK_REC_NOTIFICATION_ID, getNotificationBuilder(this).build(), type);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S &&
|
|
||||||
e instanceof ForegroundServiceStartNotAllowedException)
|
|
||||||
{
|
|
||||||
// App not in a valid state to start foreground service (e.g started from bg)
|
|
||||||
Logger.e(TAG, "Not in a valid state to start foreground service", e);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Logger.e(TAG, "Failed to promote the service to foreground", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
final LocationHelper locationHelper = LocationHelper.from(this);
|
final LocationHelper locationHelper = LocationHelper.from(this);
|
||||||
|
|
||||||
|
|||||||
@@ -484,8 +484,10 @@ public class MapButtonsController extends Fragment
|
|||||||
.build();
|
.build();
|
||||||
ViewCompat.setOnApplyWindowInsetsListener(mFrame, insetsListener);
|
ViewCompat.setOnApplyWindowInsetsListener(mFrame, insetsListener);
|
||||||
// Fixes insets on older Androids and with a search opened via API on all Androids.
|
// Fixes insets on older Androids and with a search opened via API on all Androids.
|
||||||
if (mFrame.hasWindowFocus())
|
if (android.os.Build.VERSION.SDK_INT <= android.os.Build.VERSION_CODES.Q)
|
||||||
ViewCompat.requestApplyInsets(mFrame);
|
mFrame.postDelayed(() -> ViewCompat.requestApplyInsets(mFrame), 1250);
|
||||||
|
else
|
||||||
|
mFrame.post(() -> ViewCompat.requestApplyInsets(mFrame));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
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;
|
||||||
|
}
|
||||||