Compare commits
87 Commits
2025.06.30
...
test/2025.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c287dde93f | ||
|
|
f7e4fdad6a | ||
|
|
f59fb509c9 | ||
|
|
9cd3db6f39 | ||
|
|
7138970ea6 | ||
|
|
cbd561ec90 | ||
|
|
048dc60be6 | ||
|
|
40018f5cc8 | ||
|
|
4314f281d1 | ||
|
|
b529a733c0 | ||
|
|
1b8172f744 | ||
|
|
c589aaa3cf | ||
|
|
13b91b36ae | ||
|
|
e523434b36 | ||
|
|
752fcaf09c | ||
|
|
7e2b05573f | ||
|
|
7e63d98cb7 | ||
|
|
304addba58 | ||
|
|
1becd3e0ba | ||
|
|
dee47e7a66 | ||
|
|
2e60bfc289 | ||
|
|
fdbb41e0fd | ||
|
|
090ed5044a | ||
|
|
54b6471400 | ||
|
|
415e2fc0c2 | ||
|
|
f0ed076858 | ||
|
|
57f28fa85b | ||
|
|
7228fe239d | ||
|
|
c294937c73 | ||
|
|
ebf84e7d5b | ||
|
|
19dd760c44 | ||
|
|
8a8ac5c660 | ||
|
|
7a8f7929fc | ||
|
|
b285ef348b | ||
|
|
87dad591ab | ||
|
|
9e49aae49e | ||
|
|
d621636549 | ||
|
|
ec1d2e6c82 | ||
|
|
6d0c52afcc | ||
|
|
3abf354099 | ||
|
|
9a759229f9 | ||
|
|
a3e1666ede | ||
|
|
15c7e71866 | ||
|
|
db1ef9b148 | ||
|
|
9951ebece7 | ||
|
|
7bfb488f1d | ||
|
|
df70ae1b01 | ||
|
|
15b3cda4d7 | ||
|
|
fae8849869 | ||
|
|
3585bd4fad | ||
|
|
99bb468448 | ||
|
|
46ec844398 | ||
|
|
f8d1914037 | ||
|
|
71386ce395 | ||
|
|
8d95d2e9b7 | ||
|
|
05c4413394 | ||
|
|
29bbbb13ee | ||
|
|
e321b1c5be | ||
|
|
736e1aa07b | ||
|
|
e32b01494a | ||
|
|
4496690e0a | ||
|
|
ef9618b3d6 | ||
|
|
13ba20aa25 | ||
|
|
23c23c118d | ||
|
|
5b4d458579 | ||
|
|
1bb2b2274f | ||
|
|
aec82794ac | ||
|
|
927299f4a9 | ||
|
|
87cb0307cf | ||
|
|
de7f60ea37 | ||
|
|
f7fb0e80e5 | ||
|
|
e49a74e287 | ||
|
|
77a7255e93 | ||
|
|
25b3abadef | ||
|
|
01388ae6dd | ||
|
|
4bf61f14f8 | ||
|
|
49603aa0a1 | ||
|
|
890c927bab | ||
|
|
d564f69b58 | ||
|
|
abd15756be | ||
|
|
ea1edec3df | ||
|
|
c17135f5a6 | ||
|
|
2471ff0545 | ||
|
|
a99d1c1a38 | ||
|
|
deb663e4f9 | ||
|
|
3858b0905f | ||
|
|
8db9289b56 |
@@ -7,9 +7,11 @@ CoMaps contributors:
|
||||
(in alphabetic order)
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Bastian Greshake Tzovaras
|
||||
clover sage
|
||||
Harry Bond <me@hbond.xyz>
|
||||
vikiawv
|
||||
Yannik Bloscheck
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
Organic Maps (formerly OMaps) contributors:
|
||||
|
||||
158
README.md
@@ -1,62 +1,85 @@
|
||||
<!--<div align="center">
|
||||
<img src="qt/res/logo.png" height="100"/>
|
||||
</div>-->
|
||||
|
||||
<!-- a nav bar -->
|
||||
[Project Intro](https://codeberg.org/comaps#comaps)
|
||||
| [Governance](https://codeberg.org/comaps/Governance#comaps-project-governance-docs)
|
||||
| [FAQ](https://codeberg.org/comaps/Governance/src/branch/main/FAQ.md)
|
||||
| [Contribute](#contributing)
|
||||
| [Donate](https://www.comaps.app/donate)
|
||||
| [Keep Connected](https://codeberg.org/comaps#keep-connected)
|
||||
|
||||
# [CoMaps](https://comaps.app) – Hike, Bike, Drive Offline – Easy Map Navigation with Privacy
|
||||
|
||||
[
|
||||

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

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

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

|
||||
](https://liberapay.com/CoMaps)
|
||||
<!-- Navigation Bar -->
|
||||
<p align="center">
|
||||
<a href="https://codeberg.org/comaps#comaps">Project Intro</a> |
|
||||
<a href="https://codeberg.org/comaps/Governance#comaps-project-governance-docs">Governance</a> |
|
||||
<a href="https://codeberg.org/comaps/Governance/src/branch/main/FAQ.md">FAQ</a> |
|
||||
<a href="#contributing">Contribute</a> |
|
||||
<a href="https://www.comaps.app/donate">Donate</a> |
|
||||
<a href="https://codeberg.org/comaps#keep-connected">Keep Connected</a>
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
A 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.
|
||||
<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>
|
||||
|
||||
There are apps for Android and iOS (and ARM MacOS).
|
||||
An alpha Linux / MacOS Qt desktop version, which is also suitable for Linux phones.
|
||||
---
|
||||
|
||||
[<img src="docs/badges/apple-appstore.png" alt="App Store" width="160">](https://apps.apple.com/app/comaps/id6747180809)
|
||||
[<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)
|
||||
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.
|
||||
|
||||
<p float="left">
|
||||
**Available for:** Android, iOS, ARM macOS, and alpha Linux/macOS desktop builds (also usable on Linux phones).
|
||||
|
||||
<p align="center">
|
||||
<a href="https://apps.apple.com/app/comaps/id6747180809">
|
||||
<img src="docs/badges/apple-appstore.png" alt="App Store" width="160"/>
|
||||
</a>
|
||||
<a href="https://play.google.com/store/apps/details?id=app.comaps.google">
|
||||
<img src="docs/badges/google-play.png" alt="Google Play" width="160"/>
|
||||
</a>
|
||||
<a href="https://f-droid.org/en/packages/app.comaps.fdroid/">
|
||||
<img src="docs/badges/fdroid.png" alt="F-Droid" width="160"/>
|
||||
</a>
|
||||
<a href="https://codeberg.org/comaps/comaps/releases">
|
||||
<img src="docs/badges/codeberg.png" alt="Codeberg" width="160"/>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
|
||||
<!-- Screenshots -->
|
||||
<p align="center">
|
||||
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/1.png" width="180" />
|
||||
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/2.png" width="180" />
|
||||
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/3.png" width="180" />
|
||||
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/4.png" width="180" />
|
||||
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/5.png" width="180" />
|
||||
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/6.png" width="180" />
|
||||
</p>
|
||||
|
||||
**Offline-focused**: Plan and navigate your trip abroad without the need for cellular service, search waypoints while on a distant hike, etc. All app functions are designed to work offline.
|
||||
---
|
||||
|
||||
**Respecting Privacy**: The app is designed with privacy in mind - does not identify people, does not track, and does not collect personal information. Ads-free.
|
||||
## ⚡️ Highlights
|
||||
|
||||
**Simple and Polished**: Essential, easy to use features that just work.
|
||||
- **Offline-first**: Navigate without a connection
|
||||
- **Privacy-respecting**: No tracking, Ads or data collection
|
||||
- **Lightweight**: Battery- and space-efficient
|
||||
- **Simple**: Polished, user-focused interface
|
||||
- **Community-built**: Free, open source, and collaborative
|
||||
- **Transparent**: Open finances and governance
|
||||
|
||||
**Saves Your Battery and Space**: Doesn’t drain your battery like other navigation apps. Compact maps save precious space on your phone.
|
||||
---
|
||||
|
||||
**Free and Built by the Community**: People like you helped build the app by adding places to [OpenStreetMap](https://www.openstreetmap.org), testing and giving feedback on features and contributing their development skills and money.
|
||||
|
||||
**Open and Transparent Decision-making and Financials, Not-for-profit and Fully Open Source.**
|
||||
|
||||
### Main Features
|
||||
## 🚀 Main Features
|
||||
|
||||
- Downloadable detailed maps with places which are not available with Google Maps
|
||||
|
||||
@@ -86,41 +109,46 @@ An alpha Linux / MacOS Qt desktop version, which is also suitable for Linux phon
|
||||
|
||||
- Android Auto and CarPlay support
|
||||
|
||||
*Freedom Is Here - Discover your journey, navigate the world with privacy and community at the forefront!*
|
||||
***Freedom Is Here – Navigate the world with privacy and community at the forefront.***
|
||||
|
||||
## Contributing
|
||||
---
|
||||
|
||||
## 🤝 Contributing
|
||||
|
||||
You can help by donating, contributing code, translating, or by telling others about it. To build the best maps app there is a need for software development, design, product, community development, and other areas. Reach out to us and let us know how you want to help.
|
||||
|
||||
If you want to build the project, check [docs/INSTALL.md](docs/INSTALL.md). If you want to help the project,
|
||||
see [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md). You can help in many ways, the ability to code is not necessary.
|
||||
- Build instructions: [docs/INSTALL.md](docs/INSTALL.md)
|
||||
- Contribution guide: [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md)
|
||||
> [!NOTE]
|
||||
> Some docs might be outdated, contain broken links or old references to Organic Maps, etc. Its a work in progress and help is much appreciated!
|
||||
|
||||
Some docs might be outdated, contain broken links or old references to Organic Maps, etc. Its a work in progress and help is much appreciated!
|
||||
There is a dedicated Zulip chat for active contributors: [Zulip](https://comaps.zulipchat.com)
|
||||
|
||||
There is a dedicated Zulip chat for active contributors: [comaps.zulipchat.com](https://comaps.zulipchat.com)
|
||||
---
|
||||
|
||||
### Feedback
|
||||
## 💬 Feedback
|
||||
|
||||
- Rate us on [App Store](https://apps.apple.com/app/comaps/id6747180809) and [Google Play](https://play.google.com/store/apps/details?id=app.comaps.google)
|
||||
- Star our repos on Codeberg
|
||||
- Report bugs or request features on the [issue tracker](https://codeberg.org/comaps/comaps/issues)
|
||||
|
||||
- **Rate us on the [App Store](https://apps.apple.com/app/comaps/id6747180809)
|
||||
and [Google Play](https://play.google.com/store/apps/details?id=app.comaps.google)**.
|
||||
- Star our repos on Codeberg
|
||||
- Report bugs and discuss features at [the issue tracker](https://codeberg.org/comaps/comaps/issues)
|
||||
---
|
||||
|
||||
## How is development funded?
|
||||
|
||||
The app is free for everyone, so we rely on donations. Please [donate](https://opencollective.com/comaps/donate) to support the CoMaps community and see this open project thrive!
|
||||
## 💸 Funding
|
||||
|
||||
CoMaps is free. To stay that way, it relies on your support.
|
||||
Donate via [OpenCollective](https://opencollective.com/comaps/donate) or [Liberapay](https://liberapay.com/CoMaps).
|
||||
The project's financial information is completely open and transparent at [our Open Collective](https://opencollective.com/comaps).
|
||||
|
||||
## Privacy
|
||||
---
|
||||
|
||||
The Android application was analysed by the [Exodus platform](https://reports.exodus-privacy.eu.org/fr/reports/app.comaps.google/latest/)
|
||||
## 🔒 Privacy
|
||||
|
||||
## License and Copyright
|
||||
The Android app has been reviewed by [Exodus Privacy](https://reports.exodus-privacy.eu.org/fr/reports/app.comaps.google/latest/).
|
||||
|
||||
Licensed under the Apache License, Version 2.0. See
|
||||
[LICENSE](LICENSE),
|
||||
[NOTICE](NOTICE)
|
||||
and [data/copyright.html](data/copyright.html)
|
||||
for more information.
|
||||
---
|
||||
|
||||
## ⚖️ License
|
||||
|
||||
Licensed under the Apache License 2.0.
|
||||
See [LICENSE](LICENSE), [NOTICE](NOTICE), and [data/copyright.html](data/copyright.html).
|
||||
@@ -1 +1 @@
|
||||
Jednoduchá navigace v mapě - Objevte více na své cestě ‐ Vyvíjeno komunitou
|
||||
Jednoduchá navigace v mapě – Objevte více na své cestě – Vyvíjeno komunitou
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
Aplicación de mapas gratuíta, de código aberto e xestionada pola comunidade, obtén os datos desde OpenStreetMap e co compromiso reforzado coa transparencia, privacidade e non ter o beneficio económico como obxectivo. CoMaps é unha bifurcación ou derivada de Organic Maps, que pola súa parte ven sendo unha bifurcación de Maps.ME.
|
||||
|
||||
Vai a <b><i>codeberg.org/comaps</i></b> e coñece as razóns da necesidade deste proxecto e as decisións tomadas.
|
||||
Únete alí á comunidade e axuda a que teñamos a mellor aplicación de mapas
|
||||
• Usa a aplicación e dille a outras persoas que o fas
|
||||
• Informa de fallos e publica túa experiencia
|
||||
• Actualiza os datos do mapa na aplicación ou no sitio web OpenStreetMap
|
||||
|
||||
‣ <b>Sen conexión de datos</b>: planea a viaxe e sigue a ruta sen precisar unha conexión á rede móbil, busca lugares relevantes nas andainas máis longas, etc. Todas as características da aplicación están deseñadas para funcionar sen precisar conexión de datos.
|
||||
‣ <b>Respecto pola privacidade</b>: a aplicación está deseñada coa privacidade en primeiro plano - non identifica ás persoas, non te segue, non recolle información sobre ti. Non ten publicidade.
|
||||
‣ <b>Simple e organizada</b>: características esenciais, fáciles de usar e que funcionan.
|
||||
‣ <b>Aforra batería e espazo</b>: non esgota a batería como outras aplicacións de navegación. Os mapas compactos aforran espazo na memoria do dispositivo.
|
||||
‣ <b>Gratuíta e feita pola comunidade</b>: persoas coma ti que axudan a crear a aplicación engadindo lugares en OpenStreetMap, probando novas características e dando a súa opinión, colaborando ao seu desenvolvemento con código ou financiamento.
|
||||
‣ <b>Proceso de toma de decisións Aberto e Transparente para os temas económicos, Sen ánimo de lucro e totalmente de Código Aberto</b>
|
||||
|
||||
<b>Características principais</b>:
|
||||
• Mapas detallados descargables con lugares que non están dispoñibles en Google Maps
|
||||
• Modo para actividades en exterior con camiños para andainas, lugares para acampar, fontes de auga, picos dos montes, curvas de nivel, etc
|
||||
• Rutas a pé e en bicicleta
|
||||
• Puntos de interese como restaurantes, gasoliñeiras, hoteis, tendas, miradores e moitos máis
|
||||
• Busca polo nome ou polo enderezo ou por categoría do punto de interese
|
||||
• Navegación con anuncios por voz para camiñar, ir en bicicleta ou conducir
|
||||
• Marca os lugares favoritos cun só toque
|
||||
• Artigos da Wikipedia sen conexión
|
||||
• Mapas do transporte por Metro
|
||||
• Gravación das rutas
|
||||
• Exportación e Importación de marcadores e rutas nos formatos KML, KMZ e GPX
|
||||
• Modo escuro para a noite
|
||||
• Contribúe a mellorar o mapa para todas as persoas usando o editor básico incluído
|
||||
|
||||
<b>Aquí es Libre</b>
|
||||
Atopa o teu camiño, navega polo mundo con privacidade e coa comunidade como prioridade!
|
||||
@@ -0,0 +1,32 @@
|
||||
Een door de community ontwikkelde, gratis en open source kaartenapp, gebaseerd op OpenStreetMap-gegevens, met een sterke focus op transparantie en privacy, en zonder winstoogmerk. CoMaps is een fork/spin-off van Organic Maps, welke is afgeleid van Maps.ME.
|
||||
|
||||
Meer informatie over de redenen voor het project en de richting ervan vindt u op <b><i>codeberg.org/comaps</i></b>.
|
||||
Sluit je aan bij de community en help mee aan de ontwikkeling van de beste kaartenapp:
|
||||
• Gebruik de app en deel je ervaringen met anderen
|
||||
• Geef feedback en meld eventuele problemen
|
||||
• Houd de kaarten up-to-date, zowel in de app als op de OpenStreetMap-website
|
||||
|
||||
‣ <b>Offline-georiënteerd</b>: Plan en navigeer je reis in het buitenland zonder internet, zoek waypoints tijdens een lange wandeling, enzovoort. Alle functies zijn ontworpen om offline te functioneren.
|
||||
‣ <b>Respect voor privacy</b>: De app is ontworpen met privacy in gedachten - geen gegevensverzameling en advertentievrij.
|
||||
‣ <b>Eenvoudig en verfijnd</b>: essentiële, gebruiksvriendelijke functies die gewoon werken.
|
||||
‣ <b>Bespaar je batterij en opslag</b>: De app verbruikt minder batterij dan andere navigatie-apps. Compacte kaarten besparen ruimte op je telefoon.
|
||||
‣ <b>Gratis en gebouwd door de community</b>: Mensen zoals jij helpen de app door plaatsen toe te voegen aan OpenStreetMap, functies te testen en feedback te geven, en hun programmervaardigheden bij te dragen of te doneren.
|
||||
‣ <b>Open en transparant besluitvormings- en financieel beleid, geen winstoogmerk en volledig open source.</b>
|
||||
|
||||
<b>Hoofdfuncties</b>:
|
||||
• Downloadbare gedetailleerde kaarten met plaatsen die niet beschikbaar zijn bij Google Maps
|
||||
• Buitenmodus met gemarkeerde wandelpaden, campings, waterbronnen, toppen, hoogtelijnen, enz.
|
||||
• Wandelpaden en fietspaden
|
||||
• Bezienswaardigheden zoals restaurants, tankstations, hotels, winkels en nog veel meer
|
||||
• Zoeken op naam of adres of op categorie
|
||||
• Navigatie met spraakmeldingen voor wandelen, fietsen of autorijden
|
||||
• Sla je favoriete plaatsen op met een enkele klik
|
||||
• Offline Wikipedia-artikelen
|
||||
• Metro laag en routebeschrijvingen
|
||||
• Trackregistratie
|
||||
• Exporteer en importeer bladwijzers en tracks in KML, KMZ, GPX-formaten
|
||||
• Een donkere modus voor gebruik 's nachts
|
||||
• Verbeter kaartgegevens voor iedereen met een eenvoudige ingebouwde editor
|
||||
|
||||
<b>Vrijheid is hier/b>
|
||||
Ontdek je reis, navigeer over de wereld met privacy en community voorop!
|
||||
@@ -0,0 +1 @@
|
||||
Eenvoudige kaartnavigatie - Ontdek meer van je reis - Gemaakt door de community
|
||||
@@ -1,55 +1,32 @@
|
||||
Um aplicativo de mapas gratuito e de código aberto, liderado pela comunidade, baseado em dados do OpenStreetMap e reforçado pelo compromisso com a transparência, privacidade e sem fins lucrativos. O CoMaps é um fork/spin-off do Organic Maps, que por sua vez é um fork do Maps.ME.
|
||||
|
||||
Leia mais sobre os motivos do projeto e sua direção em <b><i>codeberg.org/comaps</i></b>.
|
||||
|
||||
Junte-se à comunidade e ajude a criar o melhor aplicativo de mapas.
|
||||
|
||||
• Use o aplicativo e divulgue-o.
|
||||
|
||||
• Envie feedback e relate problemas.
|
||||
|
||||
• Atualize os dados do mapa no aplicativo ou no site do OpenStreetMap.
|
||||
|
||||
‣ <b>Foco offline</b>: Planeje e navegue em sua viagem ao exterior sem a necessidade de sinal de celular, pesquise pontos de referência durante uma caminhada distante, etc. Todas as funções do aplicativo foram projetadas para funcionar offline.
|
||||
|
||||
‣ <b>Respeitando a privacidade</b>: O aplicativo foi projetado com a privacidade em mente - não identifica pessoas, não rastreia e não coleta informações pessoais. Sem anúncios.
|
||||
|
||||
‣ <b>Simples e sofisticado</b>: recursos essenciais e fáceis de usar que simplesmente funcionam.
|
||||
|
||||
‣ <b>Economiza bateria e espaço</b>: Não consome muita bateria como outros aplicativos de navegação. Mapas compactos economizam espaço precioso no seu celular.
|
||||
|
||||
‣ <b>Gratuito e desenvolvido pela comunidade</b>: Pessoas como você ajudaram a desenvolver o aplicativo adicionando lugares ao OpenStreetMap, testando e dando feedback sobre os recursos e contribuindo com suas habilidades de desenvolvimento e dinheiro.
|
||||
|
||||
‣ <b>Tomada de decisões e finanças abertas e transparentes, sem fins lucrativos e totalmente de código aberto.</b>
|
||||
|
||||
<b>Principais recursos</b>:
|
||||
|
||||
• Mapas detalhados para download com locais não disponíveis no Google Maps
|
||||
|
||||
• Modo ao ar livre com trilhas em destaque, acampamentos, fontes de água, picos, curvas de nível, etc.
|
||||
|
||||
• Trilhas para caminhada e ciclovias
|
||||
|
||||
• Pontos de interesse como restaurantes, postos de gasolina, hotéis, lojas, pontos turísticos e muito mais
|
||||
|
||||
• Pesquise por nome, endereço ou por categoria de ponto de interesse
|
||||
|
||||
• Navegação com anúncios de voz para caminhadas, ciclismo ou direção
|
||||
|
||||
• Marque seus lugares favoritos com um único toque
|
||||
|
||||
• Artigos offline da Wikipédia
|
||||
|
||||
• Camada e direções de transporte público do metrô
|
||||
|
||||
• Gravação de trilhas
|
||||
|
||||
• Exporte e importe favoritos e trilhas nos formatos KML, KMZ e GPX
|
||||
|
||||
• Um modo escuro para usar à noite
|
||||
|
||||
• Aprimore os dados do mapa para todos usando um editor básico integrado
|
||||
|
||||
<b>A Liberdade Chegou</b>
|
||||
|
||||
Descubra sua jornada, navegue pelo mundo com privacidade e comunidade em primeiro lugar!
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
Бесплатное и свободное картографическое приложение, основанное на данных OpenStreetMap и подкреплённое обязательствами по прозрачности, конфиденциальности и некоммерческой направленности. CoMaps — это ответвление от Organic Maps, которое, в свою очередь, является ответвлением от Maps.ME.
|
||||
|
||||
Подробнее о причинах проекта и его направлении читайте на <a href="https://codeberg.org/comaps">сайте</a>.
|
||||
|
||||
Подробнее о причинах проекта и его направлении читайте на сайте <b><i> codeberg.org/comaps </i><b>.
|
||||
Присоединяйтесь к сообществу и помогите создать лучшее приложение с картами
|
||||
• Используйте приложение и распространяйте информацию о нём
|
||||
• Оставляйте отзывы и сообщайте о проблемах
|
||||
|
||||
@@ -1 +1 @@
|
||||
Простая навигация по карте — Откройте больше за ваше путешествие. От сообщества
|
||||
Простая навигация по карте — Откройте больше за ваше путешествие — От сообщества
|
||||
|
||||
@@ -1,18 +1,17 @@
|
||||
Бесплатна апликација отвореног кода коју је обављала заједница и заснива се на ОпенСтреетМап-у подацима, усмерени транспарентност, приватност и непрофитни. ЦОМПАПС је Апликације за органске карте виљушка, које је пак форк мапс.ме.
|
||||
Бесплатна апликација отвореног кода коју је обављала заједница и заснива се на ОpenStreetMap-у подацима, усмерени транспарентност, приватност и непрофитни. CoMaps је Апликације за органске карте виљушка, које је пак форк Maps.ME.
|
||||
|
||||
Прочитајте о разлозима пројекта и његовог правца на <b><i>codeberg.org/comaps</i></b>
|
||||
Придружите се отвореној заједници и помозите да направимо најбољу апликацију за мапе
|
||||
• Користите апликацију и проширите глас о томе
|
||||
• Дајте повратне информације и пријавите проблеме
|
||||
• Ажурирајте податке на мапи у апликацији или на веб локацији OpenStreetMap
|
||||
‣<b>фокусирано на офлајн Вар </b>: Планирајте и управљајте путовањем у иностранству без потребе за мобилним услугама, тражите путне тачке док је на даљинском покрету, итд.
|
||||
|
||||
Све апликације су дизајниране за рад ван мреже.
|
||||
‣<b> Поштовање приватности </b>: Апликација је осмишљена задржавања у уму приватност - не идентификује људе, не прати или прикупља личне податке. Нема реклама.
|
||||
‣ <b> фокусирано на офлајн Вар </b>: Планирајте и управљајте путовањем у иностранству без потребе за мобилним услугама, тражите путне тачке док је на даљинском покрету, итд. Све апликације су дизајниране за рад ван мреже.
|
||||
‣ <b> Поштовање приватности </b>: Апликација је осмишљена задржавања у уму приватност - не идентификује људе, не прати или прикупља личне податке. Нема реклама.
|
||||
‣ <b> Једноставно и елегантно </b>: Апликација је тривијална за употребу и једноставно функционише.
|
||||
‣ <b> Чува вашу батерију и простор </b>: не конзумира батерију као остале навигационе апликације. Компактне картице сачувајте драгоцени простор на вашем телефону.
|
||||
‣ <b> Отворено и направио је заједницу </b>: Људи попут вас је помогли да додају апликацију додавањем локација на OpenStreetMap-у, тестирању и давање повратних информација о апликацији и доприносе вашим развојним вештинама и новцу.
|
||||
‣ <b> Отворено и транспарентно доношење одлука и употреба финансија, непрофитна и потпуно отворена извора. </ Б>
|
||||
‣ <b> Отворено и транспарентно доношење одлука и употреба финансија, непрофитна и потпуно отворена извора. </b>
|
||||
|
||||
<b> Главне карактеристике </b>:
|
||||
• Преузмите детаљне мапе са локацијама које нису доступне са Гоогле мапама
|
||||
|
||||
@@ -1 +1 @@
|
||||
Kolayca gezinin - Seyahat etmenin ötesini bulun - Gönüllüler tarafından yapıldı
|
||||
Kullanımı kolay harita - Yolculuğun ötesine geçin - topluluğun katkılarıyla
|
||||
|
||||
@@ -1 +1 @@
|
||||
CoMaps - İnternetsiz Seyahat Edin
|
||||
CoMaps - Gizlilikle Yürüyün, Sürün, Gezin
|
||||
|
||||
@@ -1 +1 @@
|
||||
version: 2025.06.30-22-FDroid+25063022
|
||||
version: 2025.03.02-7-FDroid+25030207
|
||||
|
||||
@@ -1 +1 @@
|
||||
Jednoduchá navigace v mapě - Objevte více na své cestě ‐ Vyvíjeno komunitou
|
||||
Jednoduchá navigace v mapě – Objevte více na své cestě – Vyvíjeno komunitou
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
Mapa nabigazio erraza - Ezagutu gehiago zure bidaiaz - Komunitatean egina
|
||||
@@ -0,0 +1,35 @@
|
||||
Aplicación de mapas gratuíta, de código aberto e xestionada pola comunidade, obtén os datos desde OpenStreetMap e co compromiso reforzado coa transparencia, privacidade e non ter o beneficio económico como obxectivo.
|
||||
|
||||
Únete á comunidade e axuda a que teñamos a mellor aplicación de mapas
|
||||
• Usa a aplicación e dille a outras persoas que o fas
|
||||
• Informa de fallos e publica túa experiencia
|
||||
• Actualiza os datos do mapa na aplicación ou no sitio web OpenStreetMap
|
||||
|
||||
<i>Os teus comentarios e recensións de 5 estrelas son a mellor axuda para nós!
|
||||
|
||||
‣ <b>Sen conexión de datos</b>: planea a viaxe e sigue a ruta sen precisar unha conexión á rede móbil, busca lugares relevantes nas andainas máis longas, etc. Todas as características da aplicación están deseñadas para funcionar sen precisar conexión de datos.
|
||||
‣ <b>Respecto pola privacidade</b>: a aplicación está deseñada coa privacidade en primeiro plano - non identifica ás persoas, non te segue, non recolle información sobre ti. Non ten publicidade.
|
||||
‣ <b>Simple e organizada</b>: características esenciais, fáciles de usar e que funcionan.
|
||||
‣ <b>Aforra batería e espazo</b>: non esgota a batería como outras aplicacións de navegación. Os mapas compactos aforran espazo na memoria do dispositivo.
|
||||
‣ <b>Gratuíta e feita pola comunidade</b>: persoas coma ti que axudan a crear a aplicación engadindo lugares en OpenStreetMap, probando novas características e dando a súa opinión, colaborando ao seu desenvolvemento con código ou financiamento.
|
||||
‣ <b>Proceso de toma de decisións Aberto e Transparente para os temas económicos, Sen ánimo de lucro e totalmente de Código Aberto</b>
|
||||
|
||||
<b>Características principais</b>:
|
||||
• Mapas detallados descargables con lugares que non están dispoñibles en Google Maps
|
||||
• Modo para actividades en exterior con camiños para andainas, lugares para acampar, fontes de auga, picos dos montes, curvas de nivel, etc
|
||||
• Rutas a pé e en bicicleta
|
||||
• Puntos de interese como restaurantes, gasoliñeiras, hoteis, tendas, miradores e moitos máis
|
||||
• Busca polo nome ou polo enderezo ou por categoría do punto de interese
|
||||
• Navegación con anuncios por voz para camiñar, ir en bicicleta ou conducir
|
||||
• Marca os lugares favoritos cun só toque
|
||||
• Artigos da Wikipedia sen conexión
|
||||
• Mapas do transporte por Metro
|
||||
• Gravación das rutas
|
||||
• Exportación e Importación de marcadores e rutas nos formatos KML, KMZ e GPX
|
||||
• Modo escuro para a noite
|
||||
• Contribúe a mellorar o mapa para todas as persoas usando o editor básico incluído
|
||||
|
||||
Por favor informa de calquera incidencia que xurda así como suxire novas funcións na nosa comunidade en <b><i>comaps.app</i></b>
|
||||
|
||||
<b>Aquí es Libre</b>
|
||||
Atopa o teu camiño, navega polo mundo con privacidade e coa comunidade como prioridade!
|
||||
1
android/app/src/google/play/listings/gl-ES/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
CoMaps -Navega con Privacidade
|
||||
@@ -0,0 +1,36 @@
|
||||
Een door de community ontwikkelde, gratis en open source kaartenapp, gebaseerd op OpenStreetMap-gegevens, met een sterke focus op transparantie en privacy, en zonder winstoogmerk.
|
||||
|
||||
Sluit je aan bij de community en help mee aan de ontwikkeling van de beste kaartenapp:
|
||||
• Gebruik de app en deel je ervaringen met anderen
|
||||
• Geef feedback en meld eventuele problemen
|
||||
• Houd de kaarten up-to-date, zowel in de app als op de OpenStreetMap-website
|
||||
|
||||
<i>Jouw feedback en 5-sterrenbeoordelingen zijn de beste steun voor ons!!</i>
|
||||
|
||||
‣ <b>Eenvoudig en verfijnd</b>: essentiële, gebruiksvriendelijke functies die gewoon werken.
|
||||
‣ <b>Offline-georiënteerd</b>: Plan en navigeer je reis in het buitenland zonder internet, zoek waypoints tijdens een lange wandeling, enzovoort. Alle functies zijn ontworpen om offline te functioneren.
|
||||
‣ <b>Respect voor privacy</b>: De app is ontworpen met privacy in gedachten - geen gegevensverzameling en advertentievrij.
|
||||
‣ <b>Bespaar je batterij en opslag</b>: De app verbruikt minder batterij dan andere navigatie-apps. Compacte kaarten besparen ruimte op je telefoon.
|
||||
‣ <b>Gratis en gebouwd door de community</b>: Mensen zoals jij helpen de app door plaatsen toe te voegen aan OpenStreetMap, functies te testen en feedback te geven, en hun programmervaardigheden bij te dragen of te doneren.
|
||||
‣ <b>Open en transparant besluitvormings- en financieel beleid, geen winstoogmerk en volledig open source.</b>
|
||||
|
||||
<b>Hoofdfuncties</b>:
|
||||
• Downloadbare gedetailleerde kaarten met plaatsen die niet beschikbaar zijn bij Google Maps
|
||||
• Buitenmodus met gemarkeerde wandelpaden, campings, waterbronnen, toppen, hoogtelijnen, enz.
|
||||
• Wandelpaden en fietspaden
|
||||
• Bezienswaardigheden zoals restaurants, tankstations, hotels, winkels en nog veel meer
|
||||
• Zoeken op naam of adres of op categorie
|
||||
• Navigatie met spraakmeldingen voor wandelen, fietsen of autorijden
|
||||
• Sla je favoriete plaatsen op met een enkele klik
|
||||
• Offline Wikipedia-artikelen
|
||||
• Metro laag en routebeschrijvingen
|
||||
• Trackregistratie
|
||||
• Exporteer en importeer bladwijzers en tracks in KML, KMZ, GPX-formaten
|
||||
• Een donkere modus voor gebruik 's nachts
|
||||
• Verbeter kaartgegevens voor iedereen met een eenvoudige ingebouwde editor
|
||||
• Ondersteuning voor Android Auto
|
||||
|
||||
Meld app-problemen, stel nieuwe functies voor en sluit je aan bij onze community op de <b><i>comaps.app</i></b> website.
|
||||
|
||||
<b>Vrijheid is hier/b>
|
||||
Ontdek je reis, navigeer over de wereld met privacy en community voorop!
|
||||
1
android/app/src/google/play/listings/pt-PT/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
CoMaps - Viaje com Privacidade
|
||||
@@ -1 +1 @@
|
||||
Простая навигация по карте — Откройте больше за ваше путешествие. От сообщества
|
||||
Простая навигация по карте — Откройте больше за ваше путешествие — От сообщества
|
||||
|
||||
@@ -1,36 +1,36 @@
|
||||
OpenStreetMap verilerine dayanan ve şeffaflık, gizlilik ve kar amacı gütmeyen olma taahhüdüyle güçlendirilen, topluluk tarafından yönetilen ücretsiz ve açık kaynaklı bir harita uygulaması.
|
||||
OpenStreetMap verilerine dayanan, kâr amacı gütmeyen, gizlilik ve şeffaflık odaklı, topluluk tarafından yönetilen, özgür ve açık kaynak kodlu bir harita uygulaması.
|
||||
|
||||
Topluluğa katılın ve en iyi harita uygulamasını oluşturmaya yardımcı olun
|
||||
• Uygulamayı kullanın ve bunu herkese duyurun
|
||||
• Geri bildirimde bulunun ve sorunları bildirin
|
||||
• Harita verilerini uygulamada veya OpenStreetMap web sitesinde güncelleyin
|
||||
Topluluğa katılın ve en iyi harita uygulamasını oluşturmamıza yardım edin
|
||||
• Uygulamayı kullanın ve çevrenize yayın
|
||||
• Geri bildirim verin ve sorunları bildirin
|
||||
• Harita verilerini uygulamadan veya OpenStreetMap üzerinden düzenleyin
|
||||
|
||||
<i>Geri bildirimleriniz ve 5 yıldızlı yorumlarınız bizim için en iyi destektir!</i>
|
||||
|
||||
‣ <b>Basit ve Cilalı</b>: sadece işe yarayan, kullanımı kolay temel özellikler.
|
||||
‣ <b>Çevrim dışı odaklı</b>: Cep telefonu hizmetine ihtiyaç duymadan yurtdışı seyahatinizi planlayın ve gezinin, uzun bir yürüyüş sırasında rota noktalarını arayın, vb. Tüm uygulama işlevleri çevrimdışı çalışmak üzere tasarlanmıştır.
|
||||
‣ <b>Gizliliğe Saygı</b>: Uygulama gizlilik düşünülerek tasarlanmıştır; kişileri tanımlamaz, takip etmez ve kişisel bilgi toplamaz. Reklamsız.
|
||||
‣ <b>Pilinizden ve Alanınızdan Tasarruf Edin</b>: Diğer navigasyon uygulamaları gibi pilinizi tüketmez. Kompakt haritalar telefonunuzda değerli alan tasarrufu sağlar.
|
||||
‣ <b>Ücretsiz ve Topluluk Tarafından Oluşturuldu</b>: Sizin gibi insanlar, OpenStreetMap'e yerler ekleyerek, özellikleri test ederek ve geri bildirimde bulunarak ve geliştirme becerilerinizi ve paranızı katkıda bulunarak uygulamanın oluşturulmasına yardımcı oldunuz..
|
||||
‣ <b>Açık ve Şeffaf Karar Alma ve Finansman, Kar Amacı Gütmeyen ve Tamamen Açık Kaynak.</b>
|
||||
‣ <b>Basit ve Temiz</b>: Sadece temel, kullanımı basit, işe yarayan özellikler.
|
||||
‣ <b>Çevrimdışı Odaklı</b>: Mobil veriye ihtiyaç duymadan yurt dışı seyahatinizi planlayın ve gezin, uzun bir yürüyüş sırasında rotanızdaki noktaları bulun ve daha fazlası . Tüm özellikler çevrimdışı çalışmak üzere tasarlanmıştır.
|
||||
‣ <b>Gizliliğe Saygılı</b>: Uygulama gizliliğe saygılı olarak tasarlanmıştır. Kullanıcı profilinizi çıkarmaz, sizi takip etmez ve kişisel bilgi toplamaz. Üstelik tamamen reklamsızdır.
|
||||
‣ <b>Pil ve Depolamanızdan Tasarruf Eder</b>: Diğer navigasyon uygulamaları gibi pilinizi sömürmez. Compact maps değerli depolama alanınızdan tasarruf eder.
|
||||
‣ <b>Ücretsizdir ve Gücünü Topluluktan Alır</b>: Sizin gibi insanlar OpenStreetMap'e yer ekleyerek, yeni özellikleri test ederek, geri bildirimde bulunarak, program geliştirme becerileri ve bağışlarla katkıda bulunarak uygulamanın oluşturulmasına yardımcı oldu.
|
||||
‣ <b>Açık ve Şeffaf Şekilde Yürütülen Karar Alma ve Fonlama Süreçleri, Kâr Amacı Gütmez ve Tamamen Açık Kaynaklı.</b>
|
||||
|
||||
<b>Ana Özellikleri</b>:
|
||||
• Google Haritalar'da bulunmayan yerleri içeren indirilebilir detaylı haritalar
|
||||
• Vurgulanan yürüyüş parkurları, kamp alanları, su kaynakları, zirveler, kontur çizgileriyle açık hava modu gibi
|
||||
• Yürüyüş yolları ve bisiklet yolları
|
||||
• Restoranlar, benzin istasyonları, oteller, mağazalar, turistik yerler gibi ilgi çekici noktalar ve daha fazlası
|
||||
• İsme veya adrese göre veya ilgi noktası kategorisine göre arama yapın
|
||||
• Yürüyerek, bisikletle veya araçla seyahat edenler için sesli duyurularla navigasyon
|
||||
• Favori yerlerinizi tek bir dokunuşla yer imlerine ekleyin
|
||||
• Çevrim dışı Wikipedia makaleleri
|
||||
• Metro geçiş katmanı ve yönleri
|
||||
• Rota kaydı
|
||||
• Yer imlerini ve parkurları KML, KMZ, GPX formatlarında dışa ve içe aktarın
|
||||
• Geceleri kullanmak için karanlık mod
|
||||
• Temel bir yerleşik düzenleyici kullanarak herkes için harita verilerini iyileştirin
|
||||
<b>Ana Özellikler</b>:
|
||||
• Google Haritalar'da bulunmayan yerleri içeren, çevrimdışı detaylı haritalar
|
||||
• Yürüyüş parkurları, kamp alanları, su kaynakları, zirveler, kontur çizgileri vb. nesneleri vurgulayan açık hava modu
|
||||
• Yürüyüş ve bisiklet yolları
|
||||
• Restoran, benzin istasyonu, otel, mağaza, görülecek yerler ve çok daha fazla harita noktası
|
||||
• İsim, adres veya harita noktası kategorisine göre arama yapın
|
||||
• Sesli yönlendirmeye sahip yürüyüş, bisiklet ve araç navigasyonu
|
||||
• En sevdiğiniz mekanları tek dokunuşla yer imlerinize kaydedin
|
||||
• Çevrimdışı Vikipedi makaleleri
|
||||
• Metro ulaşım katmanı ve rotaları
|
||||
• GPS izinizi kaydedin
|
||||
• Yer imi ve GPS izlerinizi KML, KMZ ve GPX biçimlerinde dışa veya içe aktarın
|
||||
• Gece boyunca kullanmanızı sağlayacak koyu mod
|
||||
• Uygulama içi düzenleyiciyi kullanarak harita verilerini herkes için daha iyi hale getirin
|
||||
• Android Auto desteği
|
||||
|
||||
Lütfen uygulama sorunlarını bildirin, fikir önerin ve <b><i>comaps.app</i></b> web sitesinde topluluğumuza katılın.
|
||||
Lütfen <b><i>comaps.app</i></b> adresinden uygulama sorunlarını bildirin, önerilerinizi paylaşın ve topluluğumuza katılın.
|
||||
|
||||
<b>Özgürlük Burada</b>
|
||||
Yolculuğunuzu keşfedin, gizlilik ve topluluk ön planda tutularak dünyayı keşfedin!
|
||||
<b>Özgürlük Buradan Başlıyor</b>
|
||||
Yolculuğunuzun ötesine geçin, gizlilik ve topluluğu ön planda tutarak dünyada gezinin!
|
||||
|
||||
@@ -1 +1 @@
|
||||
Kolayca gezinin - Seyahat etmenin ötesini bulun - Gönüllüler tarafından yapıldı
|
||||
Kullanımı kolay harita - Yolculuğun ötesine geçin - topluluğun katkılarıyla
|
||||
|
||||
@@ -20,6 +20,9 @@
|
||||
<uses-feature
|
||||
android:name="android.hardware.location.gps"
|
||||
android:required="false"/>
|
||||
<uses-permission
|
||||
android:name="android.permission.READ_EXTERNAL_STORAGE"
|
||||
android:maxSdkVersion="22" />
|
||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
|
||||
|
||||
@@ -171,7 +171,7 @@ extern "C"
|
||||
curFile.GetRemoteSize(),
|
||||
std::bind(&DownloadFileFinished, ptr, _1),
|
||||
std::bind(&DownloadFileProgress, ptr, _1),
|
||||
512 * 1024, false));
|
||||
0, false));
|
||||
});
|
||||
|
||||
return ERR_FILE_IN_PROGRESS;
|
||||
|
||||
@@ -1804,74 +1804,4 @@ Java_app_organicmaps_Framework_nativeMemoryWarning(JNIEnv *, jclass)
|
||||
return frm()->MemoryWarning();
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean JNICALL
|
||||
Java_app_organicmaps_Framework_nativeShouldShowProducts(JNIEnv * env, jclass)
|
||||
{
|
||||
return frm()->ShouldShowProducts();
|
||||
}
|
||||
|
||||
JNIEXPORT jobject JNICALL
|
||||
Java_app_organicmaps_Framework_nativeGetProductsConfiguration(JNIEnv * env, jclass)
|
||||
{
|
||||
auto config = frm()->GetProductsConfiguration();
|
||||
if (!config) return nullptr;
|
||||
|
||||
static jclass const productClass = jni::GetGlobalClassRef(
|
||||
env,
|
||||
"app/organicmaps/products/Product"
|
||||
);
|
||||
static jmethodID const productConstructor = jni::GetConstructorID(
|
||||
env,
|
||||
productClass,
|
||||
"(Ljava/lang/String;Ljava/lang/String;)V"
|
||||
);
|
||||
|
||||
jobjectArray products = jni::ToJavaArray(
|
||||
env,
|
||||
productClass,
|
||||
config->GetProducts(),
|
||||
[](JNIEnv * env, products::ProductsConfig::Product const & product)
|
||||
{
|
||||
jni::TScopedLocalRef const title(env, jni::ToJavaString(env, product.GetTitle()));
|
||||
jni::TScopedLocalRef const link(env, jni::ToJavaString(env, product.GetLink()));
|
||||
|
||||
return env->NewObject(
|
||||
productClass,
|
||||
productConstructor,
|
||||
title.get(),
|
||||
link.get()
|
||||
);
|
||||
});
|
||||
|
||||
static jclass const productsConfigClass = jni::GetGlobalClassRef(
|
||||
env,
|
||||
"app/organicmaps/products/ProductsConfig"
|
||||
);
|
||||
static jmethodID const productsConfigConstructor = jni::GetConstructorID(
|
||||
env,
|
||||
productsConfigClass,
|
||||
"(Ljava/lang/String;[Lapp/organicmaps/products/Product;)V"
|
||||
);
|
||||
|
||||
jni::TScopedLocalRef const placePagePrompt(env, jni::ToJavaString(env, config->GetPlacePagePrompt()));
|
||||
return env->NewObject(productsConfigClass, productsConfigConstructor, placePagePrompt.get(), products);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_Framework_nativeDidCloseProductsPopup(JNIEnv * env, jclass, jstring reason)
|
||||
{
|
||||
frm()->DidCloseProductsPopup(frm()->FromString(jni::ToNativeString(env, reason)));
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_Framework_nativeDidSelectProduct(JNIEnv * env, jclass, jstring title, jstring link)
|
||||
{
|
||||
products::ProductsConfig::Product product(
|
||||
jni::ToNativeString(env, title),
|
||||
jni::ToNativeString(env, link)
|
||||
);
|
||||
|
||||
frm()->DidSelectProduct(product);
|
||||
}
|
||||
|
||||
} // extern "C"
|
||||
|
||||
@@ -321,4 +321,30 @@ Java_app_organicmaps_editor_OpeningHours_nativeIsTimetableStringValid(JNIEnv * e
|
||||
{
|
||||
return OpeningHours(jni::ToNativeString(env, jSource)).IsValid();
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jobject JNICALL
|
||||
Java_app_organicmaps_editor_OpeningHours_nativeCurrentState(JNIEnv * env, jclass clazz, jobjectArray jTts)
|
||||
{
|
||||
TimeTableSet tts = NativeTimetableSet(env, jTts);
|
||||
time_t const now = time(nullptr);
|
||||
|
||||
/// @todo We should check closed/open time for specific feature's timezone.
|
||||
OpeningHours::InfoT ohInfo = MakeOpeningHours(tts).GetInfo(now);
|
||||
jclass ohStateClass = jni::GetGlobalClassRef(env, "app/organicmaps/editor/OhState");
|
||||
jclass ruleStateClass = jni::GetGlobalClassRef(env, "app/organicmaps/editor/OhState$State");
|
||||
|
||||
static const std::unordered_map<RuleState, const char*> ruleState = {
|
||||
{RuleState::Open, "Open"},
|
||||
{RuleState::Closed, "Closed"},
|
||||
{RuleState::Unknown, "Unknown"}
|
||||
};
|
||||
|
||||
jfieldID stateField = env->GetStaticFieldID(ruleStateClass, ruleState.at(ohInfo.state), "Lapp/organicmaps/editor/OhState$State;");
|
||||
jobject stateObj = env->GetStaticObjectField(ruleStateClass, stateField);
|
||||
jmethodID constructor = env->GetMethodID(ohStateClass, "<init>", "(Lapp/organicmaps/editor/OhState$State;JJ)V");
|
||||
jobject javaOhState = env->NewObject(ohStateClass, constructor, stateObj, (jlong) ohInfo.nextTimeOpen, (jlong) ohInfo.nextTimeClosed);
|
||||
|
||||
return javaOhState;
|
||||
}
|
||||
} // extern "C"
|
||||
|
||||
@@ -17,17 +17,9 @@ using namespace jni;
|
||||
|
||||
bool LoadOsmUserPreferences(std::string const & oauthToken, UserPreferences & outPrefs)
|
||||
{
|
||||
try
|
||||
{
|
||||
ServerApi06 const api(OsmOAuth::ServerAuth(oauthToken));
|
||||
outPrefs = api.GetUserPreferences();
|
||||
return true;
|
||||
}
|
||||
catch (std::exception const & ex)
|
||||
{
|
||||
LOG(LWARNING, ("Can't load user preferences from server: ", ex.what()));
|
||||
}
|
||||
return false;
|
||||
ServerApi06 const api(OsmOAuth::ServerAuth(oauthToken));
|
||||
outPrefs = api.GetUserPreferences();
|
||||
return (outPrefs.m_id != 0);
|
||||
}
|
||||
} // namespace
|
||||
|
||||
|
||||
@@ -13,7 +13,6 @@ import app.organicmaps.api.RequestType;
|
||||
import app.organicmaps.bookmarks.data.DistanceAndAzimut;
|
||||
import app.organicmaps.bookmarks.data.FeatureId;
|
||||
import app.organicmaps.bookmarks.data.MapObject;
|
||||
import app.organicmaps.products.ProductsConfig;
|
||||
import app.organicmaps.sdk.routing.JunctionInfo;
|
||||
import app.organicmaps.sdk.routing.RouteMarkData;
|
||||
import app.organicmaps.sdk.routing.RouteMarkType;
|
||||
@@ -347,15 +346,5 @@ public class Framework
|
||||
public static native boolean nativeHasPlacePageInfo();
|
||||
|
||||
public static native void nativeMemoryWarning();
|
||||
|
||||
public static native boolean nativeShouldShowProducts();
|
||||
|
||||
@Nullable
|
||||
public static native ProductsConfig nativeGetProductsConfiguration();
|
||||
|
||||
public static native void nativeDidCloseProductsPopup(String reason);
|
||||
|
||||
public static native void nativeDidSelectProduct(String title, String link);
|
||||
|
||||
public static native void nativeSaveRoute();
|
||||
}
|
||||
|
||||
@@ -41,9 +41,9 @@ public class MapFragment extends BaseMwmFragment implements View.OnTouchListener
|
||||
mMap.updateMyPositionRoutingOffset(offsetY);
|
||||
}
|
||||
|
||||
public void destroySurface()
|
||||
public void destroySurface(boolean activityIsChangingConfigurations)
|
||||
{
|
||||
mMap.onSurfaceDestroyed(requireActivity().isChangingConfigurations(), isAdded());
|
||||
mMap.onSurfaceDestroyed(activityIsChangingConfigurations, isAdded());
|
||||
}
|
||||
|
||||
public boolean isContextCreated()
|
||||
|
||||
@@ -1303,7 +1303,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
{
|
||||
// Explicitly destroy surface before activity recreation.
|
||||
if (mMapFragment != null)
|
||||
mMapFragment.destroySurface();
|
||||
mMapFragment.destroySurface(true);
|
||||
super.recreate();
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.activity.result.contract.ActivityResultContracts;
|
||||
@@ -16,6 +17,10 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.core.graphics.Insets;
|
||||
import androidx.core.view.OnApplyWindowInsetsListener;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.core.view.WindowInsetsCompat;
|
||||
|
||||
import app.organicmaps.display.DisplayManager;
|
||||
import app.organicmaps.downloader.DownloaderActivity;
|
||||
@@ -69,6 +74,17 @@ public class SplashActivity extends AppCompatActivity
|
||||
|
||||
UiThread.cancelDelayedTasks(mInitCoreDelayedTask);
|
||||
setContentView(R.layout.activity_splash);
|
||||
|
||||
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.root_view), new OnApplyWindowInsetsListener() {
|
||||
@NonNull
|
||||
@Override
|
||||
public WindowInsetsCompat onApplyWindowInsets(@NonNull View v, @NonNull WindowInsetsCompat insets)
|
||||
{
|
||||
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||
v.setPadding(0, 0, 0, systemBars.bottom);
|
||||
return insets;
|
||||
}
|
||||
});
|
||||
mPermissionRequest = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(),
|
||||
result -> Config.setLocationRequested());
|
||||
mApiRequest = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
|
||||
|
||||
@@ -11,7 +11,6 @@ import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -172,7 +171,7 @@ public class BookmarkCategorySettingsFragment extends BaseMwmToolbarFragment
|
||||
return !TextUtils.equals(mCategory.getDescription(), categoryDesc);
|
||||
}
|
||||
|
||||
private void clearAndFocus(TextView textView)
|
||||
private void clearAndFocus(TextInputEditText textView)
|
||||
{
|
||||
textView.getEditableText().clear();
|
||||
textView.requestFocus();
|
||||
|
||||
@@ -4,12 +4,13 @@ import android.content.res.Resources;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.bookmarks.data.BookmarkCategory;
|
||||
import app.organicmaps.bookmarks.data.BookmarkInfo;
|
||||
@@ -439,14 +440,14 @@ public class BookmarkListAdapter extends RecyclerView.Adapter<Holders.BaseBookma
|
||||
holder = bookmarkHolder;
|
||||
break;
|
||||
case TYPE_SECTION:
|
||||
TextView tv = (TextView) inflater.inflate(R.layout.item_category_title, parent, false);
|
||||
MaterialTextView tv = (MaterialTextView) inflater.inflate(R.layout.item_category_title, parent, false);
|
||||
holder = new Holders.SectionViewHolder(tv);
|
||||
break;
|
||||
case TYPE_DESC:
|
||||
View desc = inflater.inflate(R.layout.item_category_description, parent, false);
|
||||
TextView moreBtn = desc.findViewById(R.id.more_btn);
|
||||
TextView text = desc.findViewById(R.id.text);
|
||||
TextView title = desc.findViewById(R.id.title);
|
||||
MaterialTextView moreBtn = desc.findViewById(R.id.more_btn);
|
||||
MaterialTextView text = desc.findViewById(R.id.text);
|
||||
MaterialTextView title = desc.findViewById(R.id.title);
|
||||
setMoreButtonVisibility(text, moreBtn);
|
||||
holder = new Holders.DescriptionViewHolder(desc, mSectionsDataSource.getCategory());
|
||||
text.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn));
|
||||
@@ -537,12 +538,12 @@ public class BookmarkListAdapter extends RecyclerView.Adapter<Holders.BaseBookma
|
||||
}
|
||||
}
|
||||
|
||||
private void setMoreButtonVisibility(TextView text, TextView moreBtn)
|
||||
private void setMoreButtonVisibility(MaterialTextView text, MaterialTextView moreBtn)
|
||||
{
|
||||
text.post(() -> setShortModeDescription(text, moreBtn));
|
||||
}
|
||||
|
||||
private void onMoreButtonClicked(TextView textView, TextView moreBtn)
|
||||
private void onMoreButtonClicked(MaterialTextView textView, MaterialTextView moreBtn)
|
||||
{
|
||||
if (isShortModeDescription(textView))
|
||||
{
|
||||
@@ -554,18 +555,18 @@ public class BookmarkListAdapter extends RecyclerView.Adapter<Holders.BaseBookma
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isShortModeDescription(TextView text)
|
||||
private boolean isShortModeDescription(MaterialTextView text)
|
||||
{
|
||||
return text.getMaxLines() == MAX_VISIBLE_LINES;
|
||||
}
|
||||
|
||||
private void setExpandedModeDescription(TextView textView, TextView moreBtn)
|
||||
private void setExpandedModeDescription(MaterialTextView textView, MaterialTextView moreBtn)
|
||||
{
|
||||
textView.setMaxLines(Integer.MAX_VALUE);
|
||||
moreBtn.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
private void setShortModeDescription(TextView textView, TextView moreBtn)
|
||||
private void setShortModeDescription(MaterialTextView textView, MaterialTextView moreBtn)
|
||||
{
|
||||
textView.setMaxLines(MAX_VISIBLE_LINES);
|
||||
|
||||
|
||||
@@ -11,7 +11,6 @@ import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.activity.result.contract.ActivityResultContracts;
|
||||
@@ -53,6 +52,7 @@ import app.organicmaps.widget.placepage.BookmarkColorDialogFragment;
|
||||
import app.organicmaps.widget.placepage.EditBookmarkFragment;
|
||||
import app.organicmaps.widget.recycler.DividerItemDecorationWithPadding;
|
||||
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -599,7 +599,7 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
|
||||
i.putExtra(MwmActivity.EXTRA_BOOKMARK_ID, bookmark.getBookmarkId());
|
||||
}
|
||||
|
||||
private void showColorDialog(ImageView v, int position)
|
||||
private void showColorDialog(ShapeableImageView v, int position)
|
||||
{
|
||||
BookmarkListAdapter adapter = getBookmarkListAdapter();
|
||||
|
||||
|
||||
@@ -4,12 +4,13 @@ import android.content.Context;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.radiobutton.MaterialRadioButton;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.bookmarks.data.BookmarkCategory;
|
||||
|
||||
@@ -101,8 +102,8 @@ public class ChooseBookmarkCategoryAdapter extends BaseBookmarkCategoryAdapter<C
|
||||
|
||||
static class SingleChoiceHolder extends RecyclerView.ViewHolder
|
||||
{
|
||||
TextView name;
|
||||
RadioButton checked;
|
||||
MaterialTextView name;
|
||||
MaterialRadioButton checked;
|
||||
|
||||
public SingleChoiceHolder(View convertView)
|
||||
{
|
||||
|
||||
@@ -6,15 +6,16 @@ import android.location.Location;
|
||||
import android.text.Spanned;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.PluralsRes;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
import com.google.android.material.checkbox.MaterialCheckBox;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.adapter.OnItemClickListener;
|
||||
import app.organicmaps.bookmarks.data.BookmarkCategory;
|
||||
@@ -34,9 +35,9 @@ public class Holders
|
||||
public static class GeneralViewHolder extends RecyclerView.ViewHolder
|
||||
{
|
||||
@NonNull
|
||||
private final TextView mText;
|
||||
private final MaterialTextView mText;
|
||||
@NonNull
|
||||
private final ImageView mImage;
|
||||
private final ShapeableImageView mImage;
|
||||
|
||||
GeneralViewHolder(@NonNull View itemView)
|
||||
{
|
||||
@@ -46,13 +47,13 @@ public class Holders
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public TextView getText()
|
||||
public MaterialTextView getText()
|
||||
{
|
||||
return mText;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public ImageView getImage()
|
||||
public ShapeableImageView getImage()
|
||||
{
|
||||
return mImage;
|
||||
}
|
||||
@@ -61,9 +62,9 @@ public class Holders
|
||||
public static class HeaderViewHolder extends RecyclerView.ViewHolder
|
||||
{
|
||||
@NonNull
|
||||
private final TextView mButton;
|
||||
private final MaterialTextView mButton;
|
||||
@NonNull
|
||||
private final TextView mText;
|
||||
private final MaterialTextView mText;
|
||||
|
||||
|
||||
HeaderViewHolder(@NonNull View itemView)
|
||||
@@ -74,13 +75,13 @@ public class Holders
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public TextView getText()
|
||||
public MaterialTextView getText()
|
||||
{
|
||||
return mText;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public TextView getButton()
|
||||
public MaterialTextView getButton()
|
||||
{
|
||||
return mButton;
|
||||
}
|
||||
@@ -168,7 +169,7 @@ public class Holders
|
||||
protected BookmarkCategory mEntity;
|
||||
|
||||
@NonNull
|
||||
protected final TextView mSize;
|
||||
protected final MaterialTextView mSize;
|
||||
|
||||
public CategoryViewHolderBase(@NonNull View root)
|
||||
{
|
||||
@@ -229,9 +230,9 @@ public class Holders
|
||||
@NonNull
|
||||
private final View mView;
|
||||
@NonNull
|
||||
private final TextView mName;
|
||||
private final MaterialTextView mName;
|
||||
@NonNull
|
||||
private final CheckBox mVisibilityMarker;
|
||||
private final MaterialCheckBox mVisibilityMarker;
|
||||
|
||||
CollectionViewHolder(@NonNull View root)
|
||||
{
|
||||
@@ -268,11 +269,11 @@ public class Holders
|
||||
static class CategoryViewHolder extends CategoryViewHolderBase
|
||||
{
|
||||
@NonNull
|
||||
private final TextView mName;
|
||||
private final MaterialTextView mName;
|
||||
@NonNull
|
||||
CheckBox mVisibilityMarker;
|
||||
MaterialCheckBox mVisibilityMarker;
|
||||
@NonNull
|
||||
ImageView mMoreButton;
|
||||
ShapeableImageView mMoreButton;
|
||||
|
||||
CategoryViewHolder(@NonNull View root)
|
||||
{
|
||||
@@ -338,11 +339,11 @@ public class Holders
|
||||
static class BookmarkViewHolder extends BaseBookmarkHolder
|
||||
{
|
||||
@NonNull
|
||||
private final ImageView mIcon;
|
||||
private final ShapeableImageView mIcon;
|
||||
@NonNull
|
||||
private final TextView mName;
|
||||
private final MaterialTextView mName;
|
||||
@NonNull
|
||||
private final TextView mDistance;
|
||||
private final MaterialTextView mDistance;
|
||||
|
||||
BookmarkViewHolder(@NonNull View itemView)
|
||||
{
|
||||
@@ -384,12 +385,12 @@ public class Holders
|
||||
static class TrackViewHolder extends BaseBookmarkHolder
|
||||
{
|
||||
@NonNull
|
||||
private final ImageView mIcon;
|
||||
private final ShapeableImageView mIcon;
|
||||
@NonNull
|
||||
private final TextView mName;
|
||||
private final MaterialTextView mName;
|
||||
@NonNull
|
||||
private final TextView mDistance;
|
||||
private final ImageView mMoreButton;
|
||||
private final MaterialTextView mDistance;
|
||||
private final ShapeableImageView mMoreButton;
|
||||
|
||||
TrackViewHolder(@NonNull View itemView)
|
||||
{
|
||||
@@ -424,16 +425,16 @@ public class Holders
|
||||
|
||||
public void setTrackIconClickListener(IconClickListener listener)
|
||||
{
|
||||
mIcon.setOnClickListener(v -> listener.onItemClick((ImageView) v, getBindingAdapterPosition()));
|
||||
mIcon.setOnClickListener(v -> listener.onItemClick((ShapeableImageView) v, getBindingAdapterPosition()));
|
||||
}
|
||||
}
|
||||
|
||||
public static class SectionViewHolder extends BaseBookmarkHolder
|
||||
{
|
||||
@NonNull
|
||||
private final TextView mView;
|
||||
private final MaterialTextView mView;
|
||||
|
||||
SectionViewHolder(@NonNull TextView itemView)
|
||||
SectionViewHolder(@NonNull MaterialTextView itemView)
|
||||
{
|
||||
super(itemView);
|
||||
mView = itemView;
|
||||
@@ -452,9 +453,9 @@ public class Holders
|
||||
static final float SPACING_MULTIPLE = 1.0f;
|
||||
static final float SPACING_ADD = 0.0f;
|
||||
@NonNull
|
||||
private final TextView mTitle;
|
||||
private final MaterialTextView mTitle;
|
||||
@NonNull
|
||||
private final TextView mDescText;
|
||||
private final MaterialTextView mDescText;
|
||||
|
||||
DescriptionViewHolder(@NonNull View itemView, @NonNull BookmarkCategory category)
|
||||
{
|
||||
|
||||
@@ -6,7 +6,8 @@ import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.bookmarks.data.Icon;
|
||||
@@ -61,7 +62,7 @@ public class IconsAdapter extends ArrayAdapter<Icon>
|
||||
|
||||
private static class SpinnerViewHolder
|
||||
{
|
||||
final ImageView icon;
|
||||
final ShapeableImageView icon;
|
||||
|
||||
SpinnerViewHolder(View convertView)
|
||||
{
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package app.organicmaps.bookmarks.data;
|
||||
|
||||
import android.widget.ImageView;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
|
||||
public interface IconClickListener
|
||||
{
|
||||
void onItemClick(ImageView v, int position);
|
||||
void onItemClick(ShapeableImageView v, int position);
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package app.organicmaps.downloader;
|
||||
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.util.StringUtils;
|
||||
@@ -14,7 +14,7 @@ class BottomPanel
|
||||
{
|
||||
private final DownloaderFragment mFragment;
|
||||
private final FloatingActionButton mFab;
|
||||
private final Button mButton;
|
||||
private final MaterialButton mButton;
|
||||
|
||||
private final View.OnClickListener mDownloadListener = new View.OnClickListener()
|
||||
{
|
||||
@@ -45,6 +45,15 @@ class BottomPanel
|
||||
}
|
||||
};
|
||||
|
||||
private final View.OnClickListener mRetryListener = new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
MapManager.warn3gAndRetry(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
|
||||
}
|
||||
};
|
||||
|
||||
BottomPanel(DownloaderFragment fragment, View frame)
|
||||
{
|
||||
mFragment = fragment;
|
||||
@@ -72,6 +81,12 @@ class BottomPanel
|
||||
mButton.setOnClickListener(mDownloadListener);
|
||||
}
|
||||
|
||||
private void setRetryFailedStates()
|
||||
{
|
||||
mButton.setText(R.string.downloader_retry);
|
||||
mButton.setOnClickListener(mRetryListener);
|
||||
}
|
||||
|
||||
private void setCancelState()
|
||||
{
|
||||
mButton.setText(R.string.downloader_cancel_all);
|
||||
@@ -101,7 +116,7 @@ class BottomPanel
|
||||
} // Special case for "Countries" node when no maps currently downloaded.
|
||||
case STATUS_DOWNLOADABLE, STATUS_DONE, STATUS_PARTLY -> show = false;
|
||||
case STATUS_PROGRESS, STATUS_APPLYING, STATUS_ENQUEUED -> setCancelState();
|
||||
case STATUS_FAILED -> setDownloadAllState();
|
||||
case STATUS_FAILED -> setRetryFailedStates();
|
||||
default -> throw new IllegalArgumentException("Inappropriate status for \"" + root + "\": " + status);
|
||||
}
|
||||
}
|
||||
@@ -119,6 +134,7 @@ class BottomPanel
|
||||
}
|
||||
case STATUS_DONE -> show = false;
|
||||
case STATUS_PROGRESS, STATUS_APPLYING, STATUS_ENQUEUED -> setCancelState();
|
||||
case STATUS_FAILED -> setRetryFailedStates();
|
||||
default -> setDownloadAllState();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,7 +209,7 @@ class ChunkTask extends AsyncTask<Void, byte[], Integer>
|
||||
// @TODO Else display received web page to user - router is redirecting us to some page
|
||||
}
|
||||
|
||||
return downloadFromStream(new BufferedInputStream(urlConnection.getInputStream(), 65536));
|
||||
return downloadFromStream(new BufferedInputStream(urlConnection.getInputStream(), 128 * Constants.KB));
|
||||
} catch (final MalformedURLException ex)
|
||||
{
|
||||
Logger.e(TAG, "Invalid url: " + mUrl, ex);
|
||||
@@ -229,7 +229,7 @@ class ChunkTask extends AsyncTask<Void, byte[], Integer>
|
||||
{
|
||||
// Because of timeouts in InputStream.read (for bad connection),
|
||||
// try to introduce dynamic buffer size to read in one query.
|
||||
final int[] arrSize = {64, 32, 1};
|
||||
final int[] arrSize = {128, 32, 1};
|
||||
int ret = IO_EXCEPTION;
|
||||
|
||||
for (int size : arrSize)
|
||||
@@ -240,7 +240,7 @@ class ChunkTask extends AsyncTask<Void, byte[], Integer>
|
||||
break;
|
||||
} catch (final IOException ex)
|
||||
{
|
||||
Logger.e(TAG, "IOException in downloadFromStream for chunk size: " + size, ex);
|
||||
Logger.e(TAG, "IOException in downloadFromStream for buffer size: " + size, ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,13 +6,14 @@ import android.text.TextUtils;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmFragment;
|
||||
import app.organicmaps.base.BaseMwmFragmentActivity;
|
||||
@@ -30,10 +31,10 @@ public class CountrySuggestFragment extends BaseMwmFragment implements View.OnCl
|
||||
private LinearLayout mLlSelectDownload;
|
||||
private LinearLayout mLlActiveDownload;
|
||||
private WheelProgressView mWpvDownloadProgress;
|
||||
private TextView mTvCountry;
|
||||
private TextView mTvActiveCountry;
|
||||
private TextView mTvProgress;
|
||||
private Button mBtnDownloadMap;
|
||||
private MaterialTextView mTvCountry;
|
||||
private MaterialTextView mTvActiveCountry;
|
||||
private MaterialTextView mTvProgress;
|
||||
private MaterialButton mBtnDownloadMap;
|
||||
|
||||
private CountryItem mCurrentCountry;
|
||||
private CountryItem mDownloadingCountry;
|
||||
@@ -150,7 +151,7 @@ public class CountrySuggestFragment extends BaseMwmFragment implements View.OnCl
|
||||
mLlNoLocation = view.findViewById(R.id.ll__location_unknown);
|
||||
mBtnDownloadMap = view.findViewById(R.id.btn__download_map);
|
||||
mBtnDownloadMap.setOnClickListener(this);
|
||||
Button selectMap = view.findViewById(R.id.btn__select_map);
|
||||
MaterialButton selectMap = view.findViewById(R.id.btn__select_map);
|
||||
selectMap.setOnClickListener(this);
|
||||
mWpvDownloadProgress = view.findViewById(R.id.wpv__download_progress);
|
||||
mWpvDownloadProgress.setOnClickListener(this);
|
||||
|
||||
@@ -124,7 +124,7 @@ public class DownloaderNotifier
|
||||
return new NotificationCompat.Builder(mContext, CHANNEL_ID)
|
||||
.setAutoCancel(true)
|
||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||
.setSmallIcon(R.drawable.ic_launcher)
|
||||
.setSmallIcon(R.drawable.ic_launcher_small)
|
||||
.setColor(ContextCompat.getColor(mContext, R.color.notification))
|
||||
.setShowWhen(true)
|
||||
.setContentTitle(title)
|
||||
|
||||
@@ -4,11 +4,13 @@ import android.location.Location;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.view.ViewCompat;
|
||||
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.MwmActivity;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.location.LocationHelper;
|
||||
@@ -28,11 +30,11 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
|
||||
|
||||
private final MwmActivity mActivity;
|
||||
private final View mFrame;
|
||||
private final TextView mParent;
|
||||
private final TextView mTitle;
|
||||
private final TextView mSize;
|
||||
private final MaterialTextView mParent;
|
||||
private final MaterialTextView mTitle;
|
||||
private final MaterialTextView mSize;
|
||||
private final WheelProgressView mProgress;
|
||||
private final Button mButton;
|
||||
private final MaterialButton mButton;
|
||||
|
||||
private int mStorageSubscriptionSlot;
|
||||
|
||||
|
||||
@@ -7,8 +7,6 @@ import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.webkit.WebView;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.DrawableRes;
|
||||
import androidx.annotation.NonNull;
|
||||
@@ -20,7 +18,10 @@ import app.organicmaps.util.Constants;
|
||||
import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.util.InputUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
public class AdvancedTimetableFragment extends BaseMwmFragment
|
||||
implements View.OnClickListener, TimetableProvider
|
||||
@@ -28,8 +29,8 @@ public class AdvancedTimetableFragment extends BaseMwmFragment
|
||||
private boolean mIsExampleShown;
|
||||
private TextInputEditText mInput;
|
||||
private WebView mExample;
|
||||
private TextView mExamplesTitle;
|
||||
private static ImageView mSaveButton;
|
||||
private MaterialTextView mExamplesTitle;
|
||||
private static ShapeableImageView mSaveButton;
|
||||
@Nullable
|
||||
private String mInitTimetables;
|
||||
@Nullable
|
||||
|
||||
@@ -3,13 +3,14 @@ package app.organicmaps.editor;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.checkbox.MaterialCheckBox;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -100,8 +101,8 @@ public class CuisineAdapter extends RecyclerView.Adapter<CuisineAdapter.ViewHold
|
||||
|
||||
protected class ViewHolder extends RecyclerView.ViewHolder implements CompoundButton.OnCheckedChangeListener
|
||||
{
|
||||
final TextView cuisine;
|
||||
final CheckBox selected;
|
||||
final MaterialTextView cuisine;
|
||||
final MaterialCheckBox selected;
|
||||
|
||||
public ViewHolder(View itemView)
|
||||
{
|
||||
|
||||
@@ -8,8 +8,6 @@ import android.text.method.LinkMovementMethod;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.CallSuper;
|
||||
import androidx.annotation.DrawableRes;
|
||||
@@ -22,8 +20,11 @@ import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.Framework;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmFragment;
|
||||
@@ -46,7 +47,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
{
|
||||
final static String LAST_INDEX_OF_NAMES_ARRAY = "LastIndexOfNamesArray";
|
||||
|
||||
private TextView mCategory;
|
||||
private MaterialTextView mCategory;
|
||||
private View mCardName;
|
||||
private View mCardAddress;
|
||||
private View mCardDetails;
|
||||
@@ -89,20 +90,20 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
};
|
||||
|
||||
private MultilanguageAdapter mNamesAdapter;
|
||||
private TextView mNamesCaption;
|
||||
private TextView mAddLanguage;
|
||||
private TextView mMoreLanguages;
|
||||
private MaterialTextView mNamesCaption;
|
||||
private MaterialTextView mAddLanguage;
|
||||
private MaterialTextView mMoreLanguages;
|
||||
|
||||
private TextView mStreet;
|
||||
private MaterialTextView mStreet;
|
||||
private TextInputEditText mHouseNumber;
|
||||
private TextInputEditText mBuildingLevels;
|
||||
|
||||
// Define Metadata entries, that have more tricky logic, separately.
|
||||
private TextView mPhone;
|
||||
private TextView mEditPhoneLink;
|
||||
private TextView mCuisine;
|
||||
private MaterialTextView mPhone;
|
||||
private MaterialTextView mEditPhoneLink;
|
||||
private MaterialTextView mCuisine;
|
||||
private SwitchCompat mWifi;
|
||||
private TextView mSelfService;
|
||||
private MaterialTextView mSelfService;
|
||||
private SwitchCompat mOutdoorSeating;
|
||||
|
||||
// Default Metadata entries.
|
||||
@@ -132,12 +133,12 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
private TextInputLayout mInputBuildingLevels;
|
||||
|
||||
private View mEmptyOpeningHours;
|
||||
private TextView mOpeningHours;
|
||||
private MaterialTextView mOpeningHours;
|
||||
private View mEditOpeningHours;
|
||||
private TextInputEditText mDescription;
|
||||
private final Map<Metadata.MetadataType, View> mDetailsBlocks = new HashMap<>();
|
||||
private final Map<Metadata.MetadataType, View> mSocialMediaBlocks = new HashMap<>();
|
||||
private TextView mReset;
|
||||
private MaterialTextView mReset;
|
||||
|
||||
private EditorHostFragment mParent;
|
||||
|
||||
@@ -489,7 +490,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
mOpeningHours.setOnClickListener(this);
|
||||
final View cardMore = view.findViewById(R.id.cv__more);
|
||||
mDescription = findInput(cardMore);
|
||||
TextView osmInfo = view.findViewById(R.id.osm_info);
|
||||
MaterialTextView osmInfo = view.findViewById(R.id.osm_info);
|
||||
osmInfo.setMovementMethod(LinkMovementMethod.getInstance());
|
||||
mReset = view.findViewById(R.id.reset);
|
||||
mReset.setOnClickListener(this);
|
||||
@@ -529,7 +530,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
|
||||
private static TextInputEditText findInputAndInitBlock(View blockWithInput, @DrawableRes int icon, String hint)
|
||||
{
|
||||
((ImageView) blockWithInput.findViewById(R.id.icon)).setImageResource(icon);
|
||||
((ShapeableImageView) blockWithInput.findViewById(R.id.icon)).setImageResource(icon);
|
||||
final TextInputLayout input = blockWithInput.findViewById(R.id.custom_input);
|
||||
input.setHint(hint);
|
||||
return input.findViewById(R.id.input);
|
||||
|
||||
@@ -4,12 +4,13 @@ import android.text.method.LinkMovementMethod;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.editor.data.FeatureCategory;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
@@ -78,7 +79,7 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
||||
protected class FeatureViewHolder extends RecyclerView.ViewHolder
|
||||
{
|
||||
@NonNull
|
||||
private final TextView mName;
|
||||
private final MaterialTextView mName;
|
||||
@NonNull
|
||||
private final View mSelected;
|
||||
|
||||
@@ -106,7 +107,7 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
||||
FooterViewHolder(@NonNull View itemView)
|
||||
{
|
||||
super(itemView);
|
||||
TextView categoryUnsuitableText = itemView.findViewById(R.id.editor_category_unsuitable_text);
|
||||
MaterialTextView categoryUnsuitableText = itemView.findViewById(R.id.editor_category_unsuitable_text);
|
||||
categoryUnsuitableText.setMovementMethod(LinkMovementMethod.getInstance());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,6 @@ import android.text.format.DateFormat;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
import android.widget.TimePicker;
|
||||
|
||||
import androidx.annotation.IntRange;
|
||||
@@ -21,6 +20,8 @@ import androidx.fragment.app.FragmentManager;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.tabs.TabLayout;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmDialogFragment;
|
||||
import app.organicmaps.editor.data.HoursMinutes;
|
||||
@@ -134,19 +135,19 @@ public class HoursMinutesPickerFragment extends BaseMwmDialogFragment
|
||||
if (id != 0)
|
||||
{
|
||||
mPickerHoursLabel = mPicker.findViewById(id);
|
||||
if (!(mPickerHoursLabel instanceof TextView))
|
||||
if (!(mPickerHoursLabel instanceof MaterialTextView))
|
||||
mPickerHoursLabel = null;
|
||||
}
|
||||
|
||||
mTabs = root.findViewById(R.id.tabs);
|
||||
TextView tabView = (TextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);
|
||||
MaterialTextView tabView = (MaterialTextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);
|
||||
tabView.setText(getResources().getString(R.string.editor_time_from));
|
||||
final ColorStateList textColor = AppCompatResources.getColorStateList(requireContext(),
|
||||
ThemeUtils.isNightTheme(requireContext()) ? R.color.accent_color_selector_night
|
||||
: R.color.accent_color_selector);
|
||||
tabView.setTextColor(textColor);
|
||||
mTabs.addTab(mTabs.newTab().setCustomView(tabView), true);
|
||||
tabView = (TextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);
|
||||
tabView = (MaterialTextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);
|
||||
tabView.setText(getResources().getString(R.string.editor_time_to));
|
||||
tabView.setTextColor(textColor);
|
||||
mTabs.addTab(mTabs.newTab().setCustomView(tabView), true);
|
||||
|
||||
@@ -3,11 +3,12 @@ package app.organicmaps.editor;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.editor.data.Language;
|
||||
|
||||
@@ -42,12 +43,12 @@ public class LanguagesAdapter extends RecyclerView.Adapter<LanguagesAdapter.Hold
|
||||
|
||||
protected class Holder extends RecyclerView.ViewHolder
|
||||
{
|
||||
TextView name;
|
||||
MaterialTextView name;
|
||||
|
||||
public Holder(View itemView)
|
||||
{
|
||||
super(itemView);
|
||||
name = (TextView) itemView;
|
||||
name = (MaterialTextView) itemView;
|
||||
itemView.setOnClickListener(v -> mFragment.onLanguageSelected(mLanguages[getBindingAdapterPosition()]));
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
package app.organicmaps.editor;
|
||||
|
||||
import androidx.annotation.Keep;
|
||||
|
||||
// Used by JNI.
|
||||
@Keep
|
||||
public class OhState
|
||||
{
|
||||
public enum State
|
||||
{
|
||||
Open,
|
||||
Closed,
|
||||
Unknown
|
||||
}
|
||||
|
||||
public State state;
|
||||
/** Unix timestamp in seconds**/
|
||||
public long nextTimeOpen;
|
||||
/** Unix timestamp in seconds **/
|
||||
public long nextTimeClosed;
|
||||
|
||||
// Used by JNI.
|
||||
@Keep
|
||||
public OhState(State state, long nextTimeOpen, long nextTimeClosed)
|
||||
{
|
||||
this.state = state;
|
||||
this.nextTimeOpen = nextTimeOpen;
|
||||
this.nextTimeClosed = nextTimeClosed;
|
||||
}
|
||||
}
|
||||
@@ -60,4 +60,6 @@ public final class OpeningHours
|
||||
* @return true if timetable string is valid OSM timetable.
|
||||
*/
|
||||
public static native boolean nativeIsTimetableStringValid(String source);
|
||||
|
||||
public static native OhState nativeCurrentState(@NonNull Timetable[] timetables);
|
||||
}
|
||||
|
||||
@@ -4,11 +4,11 @@ import android.text.TextUtils;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
import app.organicmaps.R;
|
||||
@@ -94,7 +94,7 @@ public class PhoneListAdapter extends RecyclerView.Adapter<PhoneListAdapter.View
|
||||
{
|
||||
private int mPosition = -1;
|
||||
private final TextInputEditText mInput;
|
||||
private final ImageView deleteButton;
|
||||
private final ShapeableImageView deleteButton;
|
||||
|
||||
public ViewHolder(@NonNull View itemView)
|
||||
{
|
||||
@@ -116,7 +116,7 @@ public class PhoneListAdapter extends RecyclerView.Adapter<PhoneListAdapter.View
|
||||
deleteButton.setOnClickListener(this);
|
||||
// TODO: setting icons from code because icons defined in layout XML are white.
|
||||
deleteButton.setImageResource(R.drawable.ic_delete);
|
||||
((ImageView) itemView.findViewById(R.id.phone_icon)).setImageResource(R.drawable.ic_phone);
|
||||
((ShapeableImageView) itemView.findViewById(R.id.phone_icon)).setImageResource(R.drawable.ic_phone);
|
||||
}
|
||||
|
||||
public void setPosition(int position)
|
||||
|
||||
@@ -4,12 +4,13 @@ import android.content.Context;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.radiobutton.MaterialRadioButton;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.util.Utils;
|
||||
|
||||
@@ -51,8 +52,8 @@ public class SelfServiceAdapter extends RecyclerView.Adapter<SelfServiceAdapter.
|
||||
|
||||
protected class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
|
||||
{
|
||||
final TextView selfServiceDef;
|
||||
final CompoundButton selected;
|
||||
final MaterialTextView selfServiceDef;
|
||||
final MaterialRadioButton selected;
|
||||
|
||||
public ViewHolder(View itemView)
|
||||
{
|
||||
|
||||
@@ -4,11 +4,8 @@ import android.util.SparseArray;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.IdRes;
|
||||
import androidx.annotation.IntRange;
|
||||
@@ -17,6 +14,10 @@ import androidx.appcompat.widget.SwitchCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.checkbox.MaterialCheckBox;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.editor.data.HoursMinutes;
|
||||
import app.organicmaps.editor.data.TimeFormatUtils;
|
||||
@@ -185,15 +186,15 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
|
||||
// Limit closed spans to avoid dynamic inflation of views in recycler's children. Yeah, its a hack.
|
||||
static final int MAX_CLOSED_SPANS = 10;
|
||||
|
||||
SparseArray<CheckBox> days = new SparseArray<>(7);
|
||||
SparseArray<MaterialCheckBox> days = new SparseArray<>(7);
|
||||
View allday;
|
||||
SwitchCompat swAllday;
|
||||
View schedule;
|
||||
View openClose;
|
||||
View open;
|
||||
View close;
|
||||
TextView tvOpen;
|
||||
TextView tvClose;
|
||||
MaterialTextView tvOpen;
|
||||
MaterialTextView tvClose;
|
||||
View[] closedHours = new View[MAX_CLOSED_SPANS];
|
||||
View addClosed;
|
||||
View deleteTimetable;
|
||||
@@ -316,7 +317,7 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
|
||||
else
|
||||
{
|
||||
UiUtils.show(closedHours[i]);
|
||||
((TextView) closedHours[i].findViewById(R.id.tv__closed)).setText(timespan.toString());
|
||||
((MaterialTextView) closedHours[i].findViewById(R.id.tv__closed)).setText(timespan.toString());
|
||||
}
|
||||
|
||||
i++;
|
||||
@@ -333,18 +334,18 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
|
||||
private void addDay(@IntRange(from = 1, to = 7) final int dayIndex, @IdRes int id)
|
||||
{
|
||||
final View day = itemView.findViewById(id);
|
||||
final CheckBox checkBox = day.findViewById(R.id.chb__day);
|
||||
final MaterialCheckBox checkBox = day.findViewById(R.id.chb__day);
|
||||
// Save index of the day to get it back when checkbox will be toggled.
|
||||
checkBox.setTag(dayIndex);
|
||||
days.put(dayIndex, checkBox);
|
||||
day.setOnClickListener(v -> checkBox.toggle());
|
||||
|
||||
((TextView) day.findViewById(R.id.tv__day)).setText(TimeFormatUtils.formatShortWeekday(dayIndex));
|
||||
((MaterialTextView) day.findViewById(R.id.tv__day)).setText(TimeFormatUtils.formatShortWeekday(dayIndex));
|
||||
}
|
||||
|
||||
private void switchWorkingDay(@IntRange(from = 1, to = 7) int dayIndex)
|
||||
{
|
||||
final CheckBox checkBox = days.get(dayIndex);
|
||||
final MaterialCheckBox checkBox = days.get(dayIndex);
|
||||
if (checkBox.isChecked())
|
||||
addWorkingDay(dayIndex, getBindingAdapterPosition());
|
||||
else
|
||||
@@ -361,7 +362,7 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
|
||||
|
||||
private class AddTimetableViewHolder extends BaseTimetableViewHolder
|
||||
{
|
||||
private final Button mAdd;
|
||||
private final MaterialButton mAdd;
|
||||
|
||||
AddTimetableViewHolder(View itemView)
|
||||
{
|
||||
|
||||
@@ -4,12 +4,13 @@ import android.content.res.Resources;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.radiobutton.MaterialRadioButton;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.dialog.EditTextDialogFragment;
|
||||
@@ -86,9 +87,9 @@ public class StreetAdapter extends RecyclerView.Adapter<StreetAdapter.BaseViewHo
|
||||
|
||||
protected class StreetViewHolder extends BaseViewHolder implements View.OnClickListener
|
||||
{
|
||||
final TextView streetDef;
|
||||
final TextView streetLoc;
|
||||
final CompoundButton selected;
|
||||
final MaterialTextView streetDef;
|
||||
final MaterialTextView streetLoc;
|
||||
final MaterialRadioButton selected;
|
||||
|
||||
public StreetViewHolder(View itemView)
|
||||
{
|
||||
|
||||
@@ -7,7 +7,6 @@ import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -19,6 +18,7 @@ import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmFragment;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
public class TimetableContainerFragment extends BaseMwmFragment implements TimetableChangedListener
|
||||
{
|
||||
@@ -71,7 +71,7 @@ public class TimetableContainerFragment extends BaseMwmFragment implements Timet
|
||||
|
||||
@SuppressWarnings("NullableProblems")
|
||||
@NonNull
|
||||
private TextView mSwitchMode;
|
||||
private MaterialTextView mSwitchMode;
|
||||
|
||||
@SuppressWarnings("NullableProblems")
|
||||
@NonNull
|
||||
|
||||
@@ -484,10 +484,8 @@ public class MapButtonsController extends Fragment
|
||||
.build();
|
||||
ViewCompat.setOnApplyWindowInsetsListener(mFrame, insetsListener);
|
||||
// Fixes insets on older Androids and with a search opened via API on all Androids.
|
||||
if (android.os.Build.VERSION.SDK_INT <= android.os.Build.VERSION_CODES.Q)
|
||||
mFrame.postDelayed(() -> ViewCompat.requestApplyInsets(mFrame), 1250);
|
||||
else
|
||||
mFrame.post(() -> ViewCompat.requestApplyInsets(mFrame));
|
||||
if (mFrame.hasWindowFocus())
|
||||
ViewCompat.requestApplyInsets(mFrame);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
package app.organicmaps.products;
|
||||
|
||||
import androidx.annotation.Keep;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
// Called from JNI.
|
||||
@Keep
|
||||
@SuppressWarnings("unused")
|
||||
public class Product {
|
||||
@Nullable
|
||||
public String title;
|
||||
|
||||
@Nullable
|
||||
public String link;
|
||||
|
||||
public Product(@Nullable String title, @Nullable String link) {
|
||||
this.title = title;
|
||||
this.link = link;
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
package app.organicmaps.products;
|
||||
|
||||
import androidx.annotation.Keep;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
// Called from JNI.
|
||||
@Keep
|
||||
@SuppressWarnings("unused")
|
||||
public class ProductsConfig {
|
||||
public ProductsConfig(@Nullable String placePagePrompt, @Nullable Product[] products) {
|
||||
this.placePagePrompt = placePagePrompt;
|
||||
this.products = products;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public String placePagePrompt;
|
||||
|
||||
@Nullable
|
||||
public Product[] products;
|
||||
}
|
||||
@@ -56,13 +56,5 @@ public final class Constants
|
||||
public static final String XIAOMI = "XIAOMI";
|
||||
}
|
||||
|
||||
public static class ProductsPopupCloseReason
|
||||
{
|
||||
public static final String CLOSE = "close";
|
||||
public static final String REMIND_LATER = "remind_later";
|
||||
public static final String ALREADY_DONATED = "already_donated";
|
||||
public static final String SELECT_PRODUCT = "select_product";
|
||||
}
|
||||
|
||||
private Constants() {}
|
||||
}
|
||||
|
||||
@@ -9,8 +9,6 @@ import android.text.TextWatcher;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -34,8 +32,10 @@ import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
||||
|
||||
import com.google.android.material.appbar.MaterialToolbar;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -54,8 +54,8 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
||||
private TextInputEditText mEtName;
|
||||
@NonNull
|
||||
private TextInputLayout clearNameBtn;
|
||||
private TextView mTvBookmarkGroup;
|
||||
private ImageView mIvColor;
|
||||
private MaterialTextView mTvBookmarkGroup;
|
||||
private ShapeableImageView mIvColor;
|
||||
private BookmarkCategory mBookmarkCategory;
|
||||
@Nullable
|
||||
private Icon mIcon;
|
||||
@@ -208,7 +208,7 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
||||
|
||||
ViewCompat.setOnApplyWindowInsetsListener(toolbar, PaddingInsetsListener.excludeBottom());
|
||||
|
||||
final ImageView imageView = toolbar.findViewById(R.id.save);
|
||||
final ShapeableImageView imageView = toolbar.findViewById(R.id.save);
|
||||
switch (mType)
|
||||
{
|
||||
case TYPE_BOOKMARK ->
|
||||
@@ -412,7 +412,7 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
||||
{
|
||||
mListener = listener;
|
||||
}
|
||||
private void clearAndFocus(TextView textView)
|
||||
private void clearAndFocus(TextInputEditText textView)
|
||||
{
|
||||
textView.getEditableText().clear();
|
||||
textView.requestFocus();
|
||||
|
||||
@@ -4,8 +4,6 @@ import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.AttrRes;
|
||||
import androidx.annotation.NonNull;
|
||||
@@ -15,6 +13,10 @@ import androidx.core.view.WindowInsetsCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.lifecycle.Observer;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
||||
@@ -109,8 +111,8 @@ public final class PlacePageButtons extends Fragment implements Observer<List<Pl
|
||||
LayoutInflater inflater = LayoutInflater.from(requireContext());
|
||||
View parent = inflater.inflate(R.layout.place_page_button, mButtonsContainer, false);
|
||||
|
||||
ImageView icon = parent.findViewById(R.id.icon);
|
||||
TextView title = parent.findViewById(R.id.title);
|
||||
ShapeableImageView icon = parent.findViewById(R.id.icon);
|
||||
MaterialTextView title = parent.findViewById(R.id.title);
|
||||
|
||||
title.setText(current.getTitle());
|
||||
parent.setContentDescription(getString(current.getTitle()));
|
||||
|
||||
@@ -13,7 +13,6 @@ import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.IdRes;
|
||||
import androidx.annotation.NonNull;
|
||||
@@ -34,11 +33,16 @@ import app.organicmaps.downloader.CountryItem;
|
||||
import app.organicmaps.downloader.DownloaderStatusIcon;
|
||||
import app.organicmaps.downloader.MapManager;
|
||||
import app.organicmaps.editor.Editor;
|
||||
import app.organicmaps.editor.OhState;
|
||||
import app.organicmaps.editor.OpeningHours;
|
||||
import app.organicmaps.editor.data.HoursMinutes;
|
||||
import app.organicmaps.editor.data.Timetable;
|
||||
import app.organicmaps.location.LocationHelper;
|
||||
import app.organicmaps.location.LocationListener;
|
||||
import app.organicmaps.location.SensorHelper;
|
||||
import app.organicmaps.location.SensorListener;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.util.DateUtils;
|
||||
import app.organicmaps.util.SharingUtils;
|
||||
import app.organicmaps.util.StringUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
@@ -49,12 +53,15 @@ import app.organicmaps.widget.placepage.sections.PlacePageBookmarkFragment;
|
||||
import app.organicmaps.widget.placepage.sections.PlacePageLinksFragment;
|
||||
import app.organicmaps.widget.placepage.sections.PlacePageOpeningHoursFragment;
|
||||
import app.organicmaps.widget.placepage.sections.PlacePagePhoneFragment;
|
||||
import app.organicmaps.widget.placepage.sections.PlacePageProductsFragment;
|
||||
import app.organicmaps.widget.placepage.sections.PlacePageWikipediaFragment;
|
||||
|
||||
import com.google.android.material.appbar.MaterialToolbar;
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
@@ -71,7 +78,6 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
{
|
||||
private static final String PREF_COORDINATES_FORMAT = "coordinates_format";
|
||||
private static final String BOOKMARK_FRAGMENT_TAG = "BOOKMARK_FRAGMENT_TAG";
|
||||
private static final String PRODUCTS_FRAGMENT_TAG = "PRODUCTS_FRAGMENT_TAG";
|
||||
private static final String WIKIPEDIA_FRAGMENT_TAG = "WIKIPEDIA_FRAGMENT_TAG";
|
||||
private static final String PHONE_FRAGMENT_TAG = "PHONE_FRAGMENT_TAG";
|
||||
private static final String OPENING_HOURS_FRAGMENT_TAG = "OPENING_HOURS_FRAGMENT_TAG";
|
||||
@@ -85,41 +91,44 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
CoordinatesFormat.MGRS,
|
||||
CoordinatesFormat.OSMLink);
|
||||
private View mFrame;
|
||||
private Context mContext;
|
||||
|
||||
// Preview.
|
||||
private ViewGroup mPreview;
|
||||
private MaterialToolbar mToolbar;
|
||||
private TextView mTvTitle;
|
||||
private TextView mTvSecondaryTitle;
|
||||
private TextView mTvSubtitle;
|
||||
private MaterialTextView mTvTitle;
|
||||
private MaterialTextView mTvSecondaryTitle;
|
||||
private MaterialTextView mTvSubtitle;
|
||||
private MaterialTextView mTvOpenState;
|
||||
private ArrowView mAvDirection;
|
||||
private TextView mTvDistance;
|
||||
private TextView mTvAddress;
|
||||
private MaterialTextView mTvDistance;
|
||||
private MaterialTextView mTvAddress;
|
||||
// Details.
|
||||
private TextView mTvLatlon;
|
||||
private MaterialTextView mTvLatlon;
|
||||
private View mWifi;
|
||||
private TextView mTvWiFi;
|
||||
private MaterialTextView mTvWiFi;
|
||||
private View mOperator;
|
||||
private TextView mTvOperator;
|
||||
private MaterialTextView mTvOperator;
|
||||
private View mNetwork;
|
||||
private TextView mTvNetwork;
|
||||
private MaterialTextView mTvNetwork;
|
||||
private View mLevel;
|
||||
private TextView mTvLevel;
|
||||
private MaterialTextView mTvLevel;
|
||||
private View mAtm;
|
||||
private TextView mTvAtm;
|
||||
private MaterialTextView mTvAtm;
|
||||
private View mCapacity;
|
||||
private TextView mTvCapacity;
|
||||
private MaterialTextView mTvCapacity;
|
||||
private View mWheelchair;
|
||||
private TextView mTvWheelchair;
|
||||
private MaterialTextView mTvWheelchair;
|
||||
private View mDriveThrough;
|
||||
private TextView mTvDriveThrough;
|
||||
private MaterialTextView mTvDriveThrough;
|
||||
private View mSelfService;
|
||||
private TextView mTvSelfService;
|
||||
private MaterialTextView mTvSelfService;
|
||||
private View mCuisine;
|
||||
private TextView mTvCuisine;
|
||||
private MaterialTextView mTvCuisine;
|
||||
private View mOutdoorSeating;
|
||||
private TextView mTvOutdoorSeating;
|
||||
private MaterialTextView mTvOutdoorSeating;
|
||||
private View mEntrance;
|
||||
private TextView mTvEntrance;
|
||||
private MaterialTextView mTvEntrance;
|
||||
private View mEditPlace;
|
||||
private View mAddOrganisation;
|
||||
private View mAddPlace;
|
||||
@@ -129,7 +138,7 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
private CoordinatesFormat mCoordsFormat = CoordinatesFormat.LatLonDecimal;
|
||||
// Downloader`s stuff
|
||||
private DownloaderStatusIcon mDownloaderIcon;
|
||||
private TextView mDownloaderInfo;
|
||||
private MaterialTextView mDownloaderInfo;
|
||||
private int mStorageCallbackSlot;
|
||||
@Nullable
|
||||
private CountryItem mCurrentCountry;
|
||||
@@ -161,7 +170,7 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
private PlacePageViewModel mViewModel;
|
||||
private MapObject mMapObject;
|
||||
|
||||
private static void refreshMetadataOrHide(@Nullable String metadata, @NonNull View metaLayout, @NonNull TextView metaTv)
|
||||
private static void refreshMetadataOrHide(@Nullable String metadata, @NonNull View metaLayout, @NonNull MaterialTextView metaTv)
|
||||
{
|
||||
if (!TextUtils.isEmpty(metadata))
|
||||
{
|
||||
@@ -203,7 +212,6 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
|
||||
mFrame = view;
|
||||
mFrame.setOnClickListener((v) -> mPlacePageViewListener.onPlacePageRequestToggleState());
|
||||
|
||||
mPreview = mFrame.findViewById(R.id.pp__preview);
|
||||
|
||||
mFrame.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
|
||||
@@ -222,6 +230,7 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
mTvSecondaryTitle.setOnClickListener(this);
|
||||
mToolbar = mFrame.findViewById(R.id.toolbar);
|
||||
mTvSubtitle = mPreview.findViewById(R.id.tv__subtitle);
|
||||
mTvOpenState = mPreview.findViewById(R.id.tv__open_state);
|
||||
|
||||
View directionFrame = mPreview.findViewById(R.id.direction_frame);
|
||||
mTvDistance = mPreview.findViewById(R.id.tv__straight_distance);
|
||||
@@ -314,6 +323,7 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
mViewModel.getMapObject().removeObserver(this);
|
||||
LocationHelper.from(requireContext()).removeListener(this);
|
||||
SensorHelper.from(requireContext()).removeListener(this);
|
||||
UiThread.cancelDelayedTasks(updateOpenState);
|
||||
detachCountry();
|
||||
}
|
||||
|
||||
@@ -392,18 +402,6 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
updateViewFragment(PlacePageWikipediaFragment.class, WIKIPEDIA_FRAGMENT_TAG, R.id.place_page_wikipedia_fragment, hasWikipediaEntry());
|
||||
}
|
||||
|
||||
// private boolean hasProductsEntry()
|
||||
// {
|
||||
// return Framework.nativeShouldShowProducts();
|
||||
// }
|
||||
|
||||
// private void updateProductsView()
|
||||
// {
|
||||
// var hasProductsEntry = hasProductsEntry();
|
||||
//
|
||||
// updateViewFragment(PlacePageProductsFragment.class, PRODUCTS_FRAGMENT_TAG, R.id.place_page_products_fragment, hasProductsEntry);
|
||||
// }
|
||||
|
||||
private void setTextAndColorizeSubtitle()
|
||||
{
|
||||
String text = mMapObject.getSubtitle();
|
||||
@@ -426,6 +424,8 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
{
|
||||
UiUtils.setTextAndHideIfEmpty(mTvTitle, mMapObject.getTitle());
|
||||
UiUtils.setTextAndHideIfEmpty(mTvSecondaryTitle, mMapObject.getSecondaryTitle());
|
||||
refreshOpenState();
|
||||
|
||||
if (mToolbar != null)
|
||||
mToolbar.setTitle(mMapObject.getTitle());
|
||||
setTextAndColorizeSubtitle();
|
||||
@@ -481,9 +481,9 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
mEditPlace.setEnabled(Editor.nativeShouldEnableEditPlace());
|
||||
mAddOrganisation.setEnabled(Editor.nativeShouldEnableAddPlace());
|
||||
mAddPlace.setEnabled(Editor.nativeShouldEnableAddPlace());
|
||||
TextView mTvEditPlace = mEditPlace.findViewById(R.id.tv__editor);
|
||||
TextView mTvAddBusiness = mAddPlace.findViewById(R.id.tv__editor);
|
||||
TextView mTvAddPlace = mAddPlace.findViewById(R.id.tv__editor);
|
||||
MaterialTextView mTvEditPlace = mEditPlace.findViewById(R.id.tv__editor);
|
||||
MaterialTextView mTvAddBusiness = mAddPlace.findViewById(R.id.tv__editor);
|
||||
MaterialTextView mTvAddPlace = mAddPlace.findViewById(R.id.tv__editor);
|
||||
final int editPlaceButtonColor = Editor.nativeShouldEnableEditPlace() ? ContextCompat.getColor(getContext(), UiUtils.getStyledResourceId(getContext(), androidx.appcompat.R.attr.colorAccent)) : getResources().getColor(R.color.button_accent_text_disabled);
|
||||
mTvEditPlace.setTextColor(editPlaceButtonColor);
|
||||
mTvAddBusiness.setTextColor(editPlaceButtonColor);
|
||||
@@ -494,7 +494,6 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
}
|
||||
updateLinksView();
|
||||
updateOpeningHoursView();
|
||||
//updateProductsView(); Disable begging message on placepage
|
||||
updateWikipediaView();
|
||||
updateBookmarkView();
|
||||
updatePhoneView();
|
||||
@@ -561,6 +560,62 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
mTvLatlon.setText(latLon);
|
||||
}
|
||||
|
||||
Runnable updateOpenState = this::refreshOpenState;
|
||||
|
||||
private void refreshOpenState()
|
||||
{
|
||||
UiThread.runLater(updateOpenState, 45000); // Refresh every 45s
|
||||
|
||||
final String ohStr = mMapObject.getMetadata(Metadata.MetadataType.FMD_OPEN_HOURS);
|
||||
final Timetable[] timetables = OpeningHours.nativeTimetablesFromString(ohStr);
|
||||
|
||||
if (timetables != null && timetables.length != 0)
|
||||
{
|
||||
final Context context = requireContext();
|
||||
final OhState poiState = OpeningHours.nativeCurrentState(timetables);
|
||||
|
||||
// Ignore unknown rule state
|
||||
if (poiState.state == OhState.State.Unknown)
|
||||
{ UiUtils.hide(mTvOpenState); return; }
|
||||
|
||||
// Get colours
|
||||
final ForegroundColorSpan colorGreen = new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_green));
|
||||
final ForegroundColorSpan colorYellow = new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_yellow));
|
||||
final ForegroundColorSpan colorRed = new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_red));
|
||||
|
||||
// Get next state info
|
||||
final SpannableStringBuilder openStateString = new SpannableStringBuilder();
|
||||
final boolean isOpen = (poiState.state == OhState.State.Open); // False == Closed due to early exit for Unknown
|
||||
final long nextStateTime = isOpen ? poiState.nextTimeClosed : poiState.nextTimeOpen; // Unix time (seconds)
|
||||
final int minsToNextState = (int) ((nextStateTime - (System.currentTimeMillis() / 1000)) / 60);
|
||||
|
||||
if (minsToNextState <= 60) // POI opens/closes in 60 mins
|
||||
{
|
||||
final String minsToChangeStr = minsToNextState + " " + getString(R.string.minute);
|
||||
final String nextChangeFormatted = getString(isOpen ? R.string.closes_in : R.string.opens_in, minsToChangeStr);
|
||||
final ForegroundColorSpan nextChangeColor = isOpen ? colorYellow : colorRed;
|
||||
//TODO: We should check closed/open time for specific feature's timezone.
|
||||
ZonedDateTime time = ZonedDateTime.ofInstant(Instant.ofEpochSecond(nextStateTime), ZoneId.systemDefault());
|
||||
String localizedTime = new HoursMinutes(time.getHour(), time.getMinute(), DateUtils.is24HourFormat(context)).toString();
|
||||
|
||||
openStateString.append(nextChangeFormatted, nextChangeColor, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||
.append(" • ") // Add spacer
|
||||
.append(getString(R.string.at, localizedTime));
|
||||
}
|
||||
else if (isOpen)
|
||||
openStateString.append(getString(R.string.open_now), colorGreen, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
//TODO: Add "Closes at 18:00" etc
|
||||
else // Closed
|
||||
openStateString.append(getString(R.string.closed_now), colorRed, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
//TODO: Add "Opens at 18:00" etc
|
||||
|
||||
UiUtils.setTextAndHideIfEmpty(mTvOpenState, openStateString);
|
||||
return;
|
||||
}
|
||||
// No valid timetable
|
||||
UiUtils.hide(mTvOpenState);
|
||||
}
|
||||
|
||||
private void addOrganisation()
|
||||
{
|
||||
((MwmActivity) requireActivity()).showPositionChooserForEditor(true, false);
|
||||
@@ -571,9 +626,6 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
((MwmActivity) requireActivity()).showPositionChooserForEditor(false, true);
|
||||
}
|
||||
|
||||
/// @todo
|
||||
/// - Why ll__place_editor and ll__place_latlon check if (mMapObject == null)
|
||||
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
|
||||
@@ -3,7 +3,6 @@ package app.organicmaps.widget.placepage.sections;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
@@ -21,6 +20,8 @@ import java.util.List;
|
||||
import static app.organicmaps.editor.data.TimeFormatUtils.formatNonBusinessTime;
|
||||
import static app.organicmaps.editor.data.TimeFormatUtils.formatWeekdaysRange;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
public class PlaceOpeningHoursAdapter extends RecyclerView.Adapter<PlaceOpeningHoursAdapter.ViewHolder>
|
||||
{
|
||||
private List<WeekScheduleData> mWeekSchedule = Collections.emptyList();
|
||||
@@ -161,9 +162,9 @@ public class PlaceOpeningHoursAdapter extends RecyclerView.Adapter<PlaceOpeningH
|
||||
|
||||
public static class ViewHolder extends RecyclerView.ViewHolder
|
||||
{
|
||||
private final TextView mWeekdays;
|
||||
private final TextView mOpenTime;
|
||||
private final TextView mNonBusinessTime;
|
||||
private final MaterialTextView mWeekdays;
|
||||
private final MaterialTextView mOpenTime;
|
||||
private final MaterialTextView mNonBusinessTime;
|
||||
|
||||
public ViewHolder(@NonNull View itemView)
|
||||
{
|
||||
|
||||
@@ -13,7 +13,6 @@ import android.view.ViewGroup;
|
||||
import android.webkit.WebSettings;
|
||||
import android.webkit.WebView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -21,6 +20,9 @@ import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.lifecycle.Observer;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.bookmarks.data.Bookmark;
|
||||
import app.organicmaps.bookmarks.data.BookmarkManager;
|
||||
@@ -37,7 +39,7 @@ public class PlacePageBookmarkFragment extends Fragment implements View.OnClickL
|
||||
EditBookmarkFragment.EditBookmarkListener
|
||||
{
|
||||
private View mFrame;
|
||||
private TextView mTvBookmarkNote;
|
||||
private MaterialTextView mTvBookmarkNote;
|
||||
@Nullable
|
||||
private WebView mWvBookmarkNote;
|
||||
|
||||
|
||||
@@ -5,7 +5,6 @@ import android.text.TextUtils;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -27,43 +26,45 @@ import java.util.List;
|
||||
import static android.view.View.GONE;
|
||||
import static android.view.View.VISIBLE;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
public class PlacePageLinksFragment extends Fragment implements Observer<MapObject>
|
||||
{
|
||||
private static final String TAG = PlacePageLinksFragment.class.getSimpleName();
|
||||
|
||||
private View mFrame;
|
||||
private View mFacebookPage;
|
||||
private TextView mTvFacebookPage;
|
||||
private MaterialTextView mTvFacebookPage;
|
||||
private View mInstagramPage;
|
||||
private TextView mTvInstagramPage;
|
||||
private MaterialTextView mTvInstagramPage;
|
||||
private View mTwitterPage;
|
||||
private TextView mTvTwitterPage;
|
||||
private MaterialTextView mTvTwitterPage;
|
||||
private View mFediversePage;
|
||||
private TextView mTvFediversePage;
|
||||
private MaterialTextView mTvFediversePage;
|
||||
private View mBlueskyPage;
|
||||
private TextView mTvBlueskyPage;
|
||||
private MaterialTextView mTvBlueskyPage;
|
||||
private View mVkPage;
|
||||
private TextView mTvVkPage;
|
||||
private MaterialTextView mTvVkPage;
|
||||
private View mLinePage;
|
||||
private TextView mTvLinePage;
|
||||
private MaterialTextView mTvLinePage;
|
||||
|
||||
private View mWebsite;
|
||||
private TextView mTvWebsite;
|
||||
private MaterialTextView mTvWebsite;
|
||||
private View mWebsiteMenu;
|
||||
private TextView mTvWebsiteMenuSubsite;
|
||||
private MaterialTextView mTvWebsiteMenuSubsite;
|
||||
private View mEmail;
|
||||
private TextView mTvEmail;
|
||||
private MaterialTextView mTvEmail;
|
||||
private View mWikimedia;
|
||||
private TextView mTvWikimedia;
|
||||
private MaterialTextView mTvWikimedia;
|
||||
|
||||
private View mPanoramax;
|
||||
private TextView mTvPanoramax;
|
||||
private MaterialTextView mTvPanoramax;
|
||||
|
||||
private PlacePageViewModel mViewModel;
|
||||
private MapObject mMapObject;
|
||||
|
||||
private static void refreshMetadataOrHide(@Nullable String metadata, @NonNull View metaLayout,
|
||||
@NonNull TextView metaTv)
|
||||
@NonNull MaterialTextView metaTv)
|
||||
{
|
||||
if (!TextUtils.isEmpty(metadata))
|
||||
{
|
||||
|
||||
@@ -5,7 +5,6 @@ import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.ColorInt;
|
||||
import androidx.annotation.NonNull;
|
||||
@@ -15,6 +14,9 @@ import androidx.fragment.app.Fragment;
|
||||
import androidx.lifecycle.Observer;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.bookmarks.data.MapObject;
|
||||
import app.organicmaps.bookmarks.data.Metadata;
|
||||
@@ -34,9 +36,9 @@ import java.util.Locale;
|
||||
public class PlacePageOpeningHoursFragment extends Fragment implements Observer<MapObject>
|
||||
{
|
||||
private View mFrame;
|
||||
private TextView mTodayLabel;
|
||||
private TextView mTodayOpenTime;
|
||||
private TextView mTodayNonBusinessTime;
|
||||
private MaterialTextView mTodayLabel;
|
||||
private MaterialTextView mTodayOpenTime;
|
||||
private MaterialTextView mTodayNonBusinessTime;
|
||||
private RecyclerView mFullWeekOpeningHours;
|
||||
private PlaceOpeningHoursAdapter mOpeningHoursAdapter;
|
||||
|
||||
|
||||
@@ -1,107 +0,0 @@
|
||||
package app.organicmaps.widget.placepage.sections;
|
||||
|
||||
import static androidx.core.util.ObjectsCompat.requireNonNull;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import app.organicmaps.Framework;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.products.Product;
|
||||
import app.organicmaps.products.ProductsConfig;
|
||||
import app.organicmaps.util.Constants;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
|
||||
public class PlacePageProductsFragment extends Fragment
|
||||
{
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
|
||||
{
|
||||
return inflater.inflate(R.layout.place_page_products_fragment, container, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
|
||||
var config = Framework.nativeGetProductsConfiguration();
|
||||
if (config != null && isValidConfig(config))
|
||||
{
|
||||
UiUtils.show(view);
|
||||
|
||||
updateView(view, config);
|
||||
} else
|
||||
{
|
||||
UiUtils.hide(view);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateView(@NonNull View view, @NonNull ProductsConfig config)
|
||||
{
|
||||
var layoutInflater = LayoutInflater.from(view.getContext());
|
||||
|
||||
TextView productsPrompt = requireNonNull(view.findViewById(R.id.products_prompt));
|
||||
LinearLayout productsButtons = requireNonNull(view.findViewById(R.id.products_buttons));
|
||||
View closeButton = requireNonNull(view.findViewById(R.id.products_close));
|
||||
View productsRemindLater = requireNonNull(view.findViewById(R.id.products_remind_later));
|
||||
View alreadyDonated = requireNonNull(view.findViewById(R.id.products_already_donated));
|
||||
|
||||
productsPrompt.setText(config.placePagePrompt);
|
||||
|
||||
productsButtons.removeAllViews();
|
||||
|
||||
for (var product : Objects.requireNonNull(config.products))
|
||||
{
|
||||
var button = (Button) layoutInflater.inflate(R.layout.item_product, productsButtons, false);
|
||||
button.setText(product.title);
|
||||
button.setOnClickListener((v) -> {
|
||||
onProductSelected(product);
|
||||
});
|
||||
|
||||
productsButtons.addView(button);
|
||||
}
|
||||
|
||||
closeButton.setOnClickListener((v) -> {
|
||||
closeWithReason(view, Constants.ProductsPopupCloseReason.CLOSE);
|
||||
});
|
||||
|
||||
productsRemindLater.setOnClickListener((v) -> {
|
||||
closeWithReason(view, Constants.ProductsPopupCloseReason.REMIND_LATER);
|
||||
});
|
||||
|
||||
alreadyDonated.setOnClickListener((v) -> {
|
||||
closeWithReason(view, Constants.ProductsPopupCloseReason.ALREADY_DONATED);
|
||||
});
|
||||
}
|
||||
|
||||
private void closeWithReason(View view, String reason)
|
||||
{
|
||||
Framework.nativeDidCloseProductsPopup(reason);
|
||||
UiUtils.hide(view);
|
||||
}
|
||||
|
||||
private void onProductSelected(Product product)
|
||||
{
|
||||
Utils.openUrl(requireActivity(), product.link);
|
||||
Framework.nativeDidSelectProduct(product.title, product.link);
|
||||
}
|
||||
|
||||
private boolean isValidConfig(@NonNull ProductsConfig config)
|
||||
{
|
||||
return config.products != null && config.products.length > 0;
|
||||
}
|
||||
}
|
||||
@@ -7,13 +7,15 @@ import android.text.TextUtils;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.lifecycle.Observer;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.bookmarks.data.MapObject;
|
||||
import app.organicmaps.bookmarks.data.Metadata;
|
||||
@@ -29,7 +31,7 @@ public class PlacePageWikipediaFragment extends Fragment implements Observer<Map
|
||||
private View mWiki;
|
||||
private View mPlaceDescriptionViewContainer;
|
||||
|
||||
private TextView mPlaceDescriptionView;
|
||||
private MaterialTextView mPlaceDescriptionView;
|
||||
|
||||
private PlacePageViewModel mViewModel;
|
||||
|
||||
|
||||
@@ -7,10 +7,12 @@ import android.text.TextUtils;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.util.Utils;
|
||||
|
||||
@@ -61,7 +63,7 @@ public class PlacePhoneAdapter extends RecyclerView.Adapter<PlacePhoneAdapter.Vi
|
||||
|
||||
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener
|
||||
{
|
||||
private final TextView mPhone;
|
||||
private final MaterialTextView mPhone;
|
||||
|
||||
public ViewHolder(@NonNull View itemView)
|
||||
{
|
||||
|
||||
|
Before Width: | Height: | Size: 476 B |
|
Before Width: | Height: | Size: 210 B |
|
Before Width: | Height: | Size: 338 B |
|
Before Width: | Height: | Size: 152 B |
|
Before Width: | Height: | Size: 596 B |
|
Before Width: | Height: | Size: 212 B |
|
Before Width: | Height: | Size: 874 B |
|
Before Width: | Height: | Size: 262 B |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 316 B |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<inset xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:drawable="@drawable/visibility_selector"
|
||||
android:insetLeft="12dp" />
|
||||
12
android/app/src/main/res/drawable/ic_downloader_update.xml
Normal file
@@ -0,0 +1,12 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="40dp"
|
||||
android:height="40dp"
|
||||
android:tint="#FFFFFF"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M12,6v1.79c0,0.45 0.54,0.67 0.85,0.35l2.79,-2.79c0.2,-0.2 0.2,-0.51 0,-0.71l-2.79,-2.79c-0.31,-0.31 -0.85,-0.09 -0.85,0.36L12,4c-4.42,0 -8,3.58 -8,8 0,1.04 0.2,2.04 0.57,2.95 0.27,0.67 1.13,0.85 1.64,0.34 0.27,-0.27 0.38,-0.68 0.23,-1.04C6.15,13.56 6,12.79 6,12c0,-3.31 2.69,-6 6,-6zM17.79,8.71c-0.27,0.27 -0.38,0.69 -0.23,1.04 0.28,0.7 0.44,1.46 0.44,2.25 0,3.31 -2.69,6 -6,6v-1.79c0,-0.45 -0.54,-0.67 -0.85,-0.35l-2.79,2.79c-0.2,0.2 -0.2,0.51 0,0.71l2.79,2.79c0.31,0.31 0.85,0.09 0.85,-0.35L12,20c4.42,0 8,-3.58 8,-8 0,-1.04 -0.2,-2.04 -0.57,-2.95 -0.27,-0.67 -1.13,-0.85 -1.64,-0.34z" />
|
||||
|
||||
</vector>
|
||||
37
android/app/src/main/res/drawable/ic_facebook.xml
Normal file
@@ -0,0 +1,37 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="36"
|
||||
android:viewportHeight="36">
|
||||
|
||||
<path android:pathData="M15,35.8C6.5,34.3 0,26.9 0,18 0,8.1 8.1,0 18,0s18,8.1 18,18c0,8.9 -6.5,16.3 -15,17.8l-1,-0.8h-4l-1,0.8z">
|
||||
|
||||
<aapt:attr name="android:fillColor">
|
||||
|
||||
<gradient
|
||||
android:endX="18"
|
||||
android:endY="0"
|
||||
android:startX="18"
|
||||
android:startY="34.754"
|
||||
android:type="linear">
|
||||
|
||||
<item
|
||||
android:color="#FF0062E0"
|
||||
android:offset="0" />
|
||||
|
||||
<item
|
||||
android:color="#FF19AFFF"
|
||||
android:offset="1" />
|
||||
|
||||
</gradient>
|
||||
|
||||
</aapt:attr>
|
||||
|
||||
</path>
|
||||
|
||||
<path
|
||||
android:fillColor="#FFF"
|
||||
android:pathData="m25,23 l0.8,-5H21v-3.5c0,-1.4 0.5,-2.5 2.7,-2.5H26V7.4c-1.3,-0.2 -2.7,-0.4 -4,-0.4 -4.1,0 -7,2.5 -7,7v4h-4.5v5H15v12.7c1,0.2 2,0.3 3,0.3s2,-0.1 3,-0.3V23h4z" />
|
||||
|
||||
</vector>
|
||||
@@ -27,7 +27,7 @@
|
||||
android:clipChildren="false"
|
||||
android:gravity="center"
|
||||
tools:ignore="UselessParent">
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/downloader_parent"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -35,7 +35,7 @@
|
||||
android:textAppearance="@style/MwmTextAppearance.Body2"
|
||||
android:gravity="center_horizontal"
|
||||
tools:text="Some country very loooooooooong country"/>
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/downloader_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -45,7 +45,7 @@
|
||||
android:gravity="center_horizontal"
|
||||
tools:text="Some name very loooooooooong name"
|
||||
tools:ignore="UnusedAttribute"/>
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/downloader_size"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -58,7 +58,7 @@
|
||||
android:layout_width="180dp"
|
||||
android:layout_height="@dimen/downloader_status_size"
|
||||
android:clipChildren="false">
|
||||
<Button
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/downloader_button"
|
||||
style="@style/MwmWidget.Button.Primary"
|
||||
android:layout_width="180dp"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
android:layout_height="match_parent"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tool="http://schemas.android.com/tools"
|
||||
android:id="@+id/root_view"
|
||||
android:orientation="vertical"
|
||||
tool:background="@color/bg_primary"
|
||||
android:gravity="center">
|
||||
|
||||
@@ -89,15 +89,17 @@
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center_vertical" >
|
||||
<Button
|
||||
android:layout_weight="1"
|
||||
android:id="@+id/btn__manage_route"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
style="@style/MwmWidget.Button"
|
||||
android:text="@string/planning_route_manage_route"
|
||||
android:drawableStart="@drawable/ic_manage_route"
|
||||
android:drawablePadding="6dp"/>
|
||||
android:drawablePadding="@dimen/margin_quarter_plus"/>
|
||||
|
||||
<Button
|
||||
android:layout_weight="0"
|
||||
android:id="@+id/btn__save"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:textAppearanceLarge"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?clickableBackground">
|
||||
|
||||
<ImageView
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
android:id="@+id/iv__color"
|
||||
android:layout_width="@dimen/track_circle_size"
|
||||
android:layout_height="@dimen/track_circle_size"
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
android:layout_below="@+id/ll__bookmark_name"
|
||||
android:layout_marginStart="@dimen/margin_half"
|
||||
android:layout_marginEnd="@dimen/margin_half">
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/tv__bookmark_set_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -52,7 +52,7 @@
|
||||
android:layout_marginEnd="@dimen/margin_quadruple"
|
||||
android:text="@string/list"
|
||||
android:textAppearance="@style/MwmTextAppearance.Body3" />
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/tv__bookmark_set"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -73,7 +73,7 @@
|
||||
android:layout_alignBottom="@id/tv__bookmark_set"
|
||||
android:layout_marginEnd="@dimen/margin_quadruple"
|
||||
android:background="@color/divider" />
|
||||
<ImageView
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
android:id="@+id/iv__bookmark_color"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
android:layout_height="match_parent">
|
||||
<include layout="@layout/toolbar_with_search"/>
|
||||
|
||||
<Button
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/action"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/height_block_base"
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:theme="@style/MwmWidget.ToolbarTheme">
|
||||
|
||||
<ImageView
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
app:tint="@color/image_view"
|
||||
android:id="@+id/save"
|
||||
app:srcCompat="@drawable/ic_done"
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/margin_half"
|
||||
android:orientation="vertical">
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/osm_info"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -21,7 +21,7 @@
|
||||
android:layout_marginBottom="@dimen/margin_base"
|
||||
android:text="@string/editor_about_osm"
|
||||
android:textAppearance="@style/MwmTextAppearance.Body4"/>
|
||||
<androidx.cardview.widget.CardView
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:id="@+id/cv__category"
|
||||
style="@style/MwmWidget.Editor.CardView">
|
||||
<RelativeLayout
|
||||
@@ -31,7 +31,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="0dp"
|
||||
android:padding="@dimen/margin_half_plus">
|
||||
<ImageView
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
android:id="@+id/icon"
|
||||
style="@style/MwmWidget.Editor.MetadataIcon"
|
||||
android:layout_width="wrap_content"
|
||||
@@ -42,7 +42,7 @@
|
||||
tools:src="@drawable/ic_operator"
|
||||
app:tint="?iconTint" />
|
||||
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -52,7 +52,7 @@
|
||||
android:text="@string/editor_edit_place_category_title"
|
||||
android:textAppearance="@style/MwmTextAppearance.Body4"
|
||||
tools:text="Trololo"/>
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -61,13 +61,13 @@
|
||||
android:textAppearance="@style/MwmTextAppearance.Body1"
|
||||
tools:text="Ololo"/>
|
||||
</RelativeLayout>
|
||||
</androidx.cardview.widget.CardView>
|
||||
<androidx.cardview.widget.CardView
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:id="@+id/cv__name"
|
||||
style="@style/MwmWidget.Editor.CardView">
|
||||
<include layout="@layout/localized_name"/>
|
||||
</androidx.cardview.widget.CardView>
|
||||
<androidx.cardview.widget.CardView
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:id="@+id/cv__address"
|
||||
style="@style/MwmWidget.Editor.CardView">
|
||||
<LinearLayout
|
||||
@@ -76,7 +76,7 @@
|
||||
android:orientation="vertical"
|
||||
android:paddingEnd="@dimen/margin_base"
|
||||
android:paddingStart="@dimen/margin_base">
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/margin_base"
|
||||
@@ -89,18 +89,18 @@
|
||||
style="@style/MwmWidget.Editor.MetadataBlock.Clickable"
|
||||
android:paddingBottom="@dimen/margin_half"
|
||||
android:paddingTop="@dimen/margin_half">
|
||||
<ImageView
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
style="@style/MwmWidget.Editor.MetadataIcon"
|
||||
app:srcCompat="@drawable/ic_street_address"
|
||||
tools:ignore="ContentDescription" />
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/street_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/editor_margin_left"
|
||||
android:text="@string/street"
|
||||
android:textAppearance="@style/MwmTextAppearance.Body4"/>
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/street"
|
||||
style="@style/MwmWidget.Editor.FieldLayout"
|
||||
android:layout_below="@id/street_title"
|
||||
@@ -124,8 +124,8 @@
|
||||
android:id="@+id/block_zipcode"
|
||||
layout="@layout/item_editor_input"/>
|
||||
</LinearLayout>
|
||||
</androidx.cardview.widget.CardView>
|
||||
<androidx.cardview.widget.CardView
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:id="@+id/cv__details"
|
||||
style="@style/MwmWidget.Editor.CardView">
|
||||
<LinearLayout
|
||||
@@ -134,7 +134,7 @@
|
||||
android:orientation="vertical"
|
||||
android:paddingEnd="@dimen/margin_base"
|
||||
android:paddingStart="@dimen/margin_base">
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/margin_base"
|
||||
@@ -153,18 +153,18 @@
|
||||
style="@style/MwmWidget.Editor.MetadataBlock.Clickable"
|
||||
android:paddingBottom="@dimen/margin_half"
|
||||
android:paddingTop="@dimen/margin_half">
|
||||
<ImageView
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
style="@style/MwmWidget.Editor.MetadataIcon"
|
||||
app:srcCompat="@drawable/ic_cuisine"
|
||||
tools:ignore="ContentDescription" />
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/title_cuisine"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/editor_margin_left"
|
||||
android:text="@string/cuisine"
|
||||
android:textAppearance="@style/MwmTextAppearance.Body4"/>
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/cuisine"
|
||||
style="@style/MwmWidget.Editor.FieldLayout"
|
||||
android:layout_below="@id/title_cuisine"
|
||||
@@ -197,11 +197,11 @@
|
||||
<RelativeLayout
|
||||
android:id="@+id/block_phone"
|
||||
style="@style/MwmWidget.Editor.MetadataBlock.Clickable">
|
||||
<ImageView
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
style="@style/MwmWidget.Editor.MetadataIcon"
|
||||
app:srcCompat="@drawable/ic_phone"
|
||||
tools:ignore="ContentDescription"/>
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/phone"
|
||||
style="@style/MwmWidget.Editor.FieldLayout.EditText"
|
||||
android:layout_width="match_parent"
|
||||
@@ -209,7 +209,7 @@
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_marginStart="@dimen/editor_margin_left"
|
||||
android:layout_toStartOf="@+id/edit_phone"/>
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/edit_phone"
|
||||
android:layout_marginStart="@dimen/margin_half_plus"
|
||||
android:background="?clickableBackground"
|
||||
@@ -235,11 +235,11 @@
|
||||
<RelativeLayout
|
||||
android:id="@+id/block_wifi"
|
||||
style="@style/MwmWidget.Editor.MetadataBlock.Clickable">
|
||||
<ImageView
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
style="@style/MwmWidget.Editor.MetadataIcon"
|
||||
app:srcCompat="@drawable/ic_wifi"
|
||||
tools:ignore="ContentDescription" />
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
style="@style/MwmWidget.Editor.FieldLayout.EditText"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -260,18 +260,18 @@
|
||||
style="@style/MwmWidget.Editor.MetadataBlock.Clickable"
|
||||
android:paddingBottom="@dimen/margin_half"
|
||||
android:paddingTop="@dimen/margin_half">
|
||||
<ImageView
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
style="@style/MwmWidget.Editor.MetadataIcon"
|
||||
app:srcCompat="@drawable/ic_self_service"
|
||||
tools:ignore="ContentDescription" />
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/self_service_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/editor_margin_left"
|
||||
android:text="@string/self_service"
|
||||
android:textAppearance="@style/MwmTextAppearance.Body4"/>
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/self_service"
|
||||
style="@style/MwmWidget.Editor.FieldLayout"
|
||||
android:layout_below="@id/self_service_title"
|
||||
@@ -292,11 +292,11 @@
|
||||
<RelativeLayout
|
||||
android:id="@+id/block_outdoor_seating"
|
||||
style="@style/MwmWidget.Editor.MetadataBlock.Clickable">
|
||||
<ImageView
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
style="@style/MwmWidget.Editor.MetadataIcon"
|
||||
app:srcCompat="@drawable/ic_outdoor_seating"
|
||||
tools:ignore="ContentDescription" />
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
style="@style/MwmWidget.Editor.FieldLayout.EditText"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -312,9 +312,9 @@
|
||||
android:layout_centerVertical="true"/>
|
||||
</RelativeLayout>
|
||||
</LinearLayout>
|
||||
</androidx.cardview.widget.CardView>
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:id="@+id/cv__social_media"
|
||||
style="@style/MwmWidget.Editor.CardView">
|
||||
<LinearLayout
|
||||
@@ -323,7 +323,7 @@
|
||||
android:orientation="vertical"
|
||||
android:paddingEnd="@dimen/margin_base"
|
||||
android:paddingStart="@dimen/margin_base">
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/margin_base"
|
||||
@@ -355,9 +355,9 @@
|
||||
android:id="@+id/block_bluesky"
|
||||
layout="@layout/item_editor_input"/>
|
||||
</LinearLayout>
|
||||
</androidx.cardview.widget.CardView>
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:id="@+id/cv__building"
|
||||
style="@style/MwmWidget.Editor.CardView">
|
||||
<LinearLayout
|
||||
@@ -366,7 +366,7 @@
|
||||
android:orientation="vertical"
|
||||
android:paddingEnd="@dimen/margin_base"
|
||||
android:paddingStart="@dimen/margin_base">
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/margin_base"
|
||||
@@ -381,9 +381,9 @@
|
||||
layout="@layout/item_editor_input"/>
|
||||
|
||||
</LinearLayout>
|
||||
</androidx.cardview.widget.CardView>
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:id="@+id/cv__more"
|
||||
style="@style/MwmWidget.Editor.CardView">
|
||||
<LinearLayout
|
||||
@@ -391,7 +391,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:padding="@dimen/margin_base">
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="@string/robotoMedium"
|
||||
@@ -411,13 +411,13 @@
|
||||
android:hint="@string/editor_note_hint"/>
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
</LinearLayout>
|
||||
</androidx.cardview.widget.CardView>
|
||||
<androidx.cardview.widget.CardView
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:id="@+id/cv__more"
|
||||
style="@style/MwmWidget.Editor.CardView"
|
||||
android:layout_marginTop="@dimen/margin_double"
|
||||
android:layout_marginBottom="@dimen/margin_base">
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/reset"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="36dp"
|
||||
@@ -426,6 +426,6 @@
|
||||
android:textAppearance="@style/MwmTextAppearance.Button"
|
||||
android:textColor="@color/base_red"
|
||||
tools:text="Reset my changes"/>
|
||||
</androidx.cardview.widget.CardView>
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
</LinearLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
android:layout_marginEnd="?actionBarSize"
|
||||
tools:visibility="gone" />
|
||||
|
||||
<ImageView
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
app:tint="@color/image_view"
|
||||
android:id="@+id/save"
|
||||
android:layout_width="?actionBarSize"
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/tv__append_phone"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
android:gravity="end|center_vertical"
|
||||
android:theme="@style/MwmWidget.ToolbarTheme"
|
||||
tools:ignore="UnusedAttribute">
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/save"
|
||||
style="@style/MwmWidget.Downloader.ToolbarButton"
|
||||
android:text="@string/editor_report_problem_send_button"/>
|
||||
@@ -38,24 +38,24 @@
|
||||
android:orientation="vertical"
|
||||
tools:visibility="gone">
|
||||
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/problem_not_exist"
|
||||
style="@style/MwmWidget.Editor.Problem"
|
||||
android:text="@string/editor_report_problem_no_place_title"
|
||||
android:tag="@string/problem_does_not_exist"/>
|
||||
|
||||
<!-- TODO: Uncomment when the multiple choices are supported -->
|
||||
<!--<TextView-->
|
||||
<!--<com.google.android.material.textview.MaterialTextView-->
|
||||
<!--android:id="@+id/problem_closed_repair"-->
|
||||
<!--style="@style/MwmWidget.Editor.Problem"-->
|
||||
<!--android:text="@string/editor_report_problem_under_construction_title"/>-->
|
||||
|
||||
<!--<TextView-->
|
||||
<!--<com.google.android.material.textview.MaterialTextView-->
|
||||
<!--android:id="@+id/problem_duplicated_place"-->
|
||||
<!--style="@style/MwmWidget.Editor.Problem"-->
|
||||
<!--android:text="@string/editor_report_problem_duplicate_place_title"/>-->
|
||||
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/problem_other"
|
||||
style="@style/MwmWidget.Editor.Problem"
|
||||
android:text="@string/editor_report_problem_other_title"/>
|
||||
@@ -77,7 +77,7 @@
|
||||
android:padding="@dimen/margin_base"
|
||||
android:textAppearance="@style/MwmTextAppearance.Body1"/>
|
||||
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/margin_base"
|
||||
@@ -85,7 +85,7 @@
|
||||
android:layout_marginTop="@dimen/margin_quarter_plus"
|
||||
android:text="@string/editor_report_problem_desription_1"/>
|
||||
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/margin_base"
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
wheel:layout_constraintEnd_toEndOf="parent"
|
||||
wheel:layout_constraintStart_toStartOf="parent"
|
||||
wheel:layout_constraintTop_toTopOf="parent">
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
@@ -33,7 +33,7 @@
|
||||
android:text="@string/search_without_internet_advertisement"
|
||||
android:textAppearance="@style/MwmTextAppearance.Body2"/>
|
||||
|
||||
<ImageView
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="@dimen/placeholder_size"
|
||||
android:layout_marginTop="@dimen/margin_half"
|
||||
@@ -47,7 +47,7 @@
|
||||
android:layout_weight="1"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="vertical">
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/tv__country_name"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -58,7 +58,7 @@
|
||||
android:textAppearance="@style/MwmTextAppearance.Title"
|
||||
tools:text="Some country name"/>
|
||||
|
||||
<Button
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/btn__download_map"
|
||||
style="@style/MwmWidget.Button.Primary"
|
||||
android:layout_marginTop="@dimen/margin_half"
|
||||
@@ -75,7 +75,7 @@
|
||||
android:orientation="vertical"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible">
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/height_block_base"
|
||||
android:layout_marginTop="@dimen/margin_half"
|
||||
@@ -83,7 +83,7 @@
|
||||
android:text="@string/unknown_current_position"
|
||||
android:textAppearance="@style/MwmTextAppearance.Body3"/>
|
||||
|
||||
<Button
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/btn__select_map"
|
||||
style="@style/MwmWidget.Button.Primary"
|
||||
android:layout_marginTop="@dimen/margin_half"
|
||||
@@ -103,13 +103,13 @@
|
||||
android:visibility="gone"
|
||||
wheel:layout_constraintBottom_toTopOf="@+id/ll__select_download"
|
||||
wheel:layout_constraintTop_toTopOf="parent">
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/tv__active_country_name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="@style/MwmTextAppearance.Title"/>
|
||||
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/downloader_progress"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
android:layout_alignParentBottom="true"
|
||||
android:background="?cardBackground"/>
|
||||
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/tv__mode_switch"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
||||