Compare commits

..

1 Commits

Author SHA1 Message Date
Mihail Mitrofanov
8462351aba [android] Allow customization of the first (OM logo / About) button 2025-06-08 16:15:00 +07:00
435 changed files with 18509 additions and 18852 deletions

View File

@@ -29,16 +29,16 @@
A community-led free & open source maps app based on [OpenStreetMap](https://www.openstreetmap.org) data and reinforced with commitment to transparency, privacy and being not-for-profit. CoMaps is a fork/spin-off of Organic Maps, which in turn is a fork of Maps.ME.
There are apps for Android and iOS (and ARM MacOS).
An alpha Linux / MacOS Qt desktop version, which is also suitable for Linux phones.
There are apps for Android and iOS (and ARM macOS).
An alpha linux / macOS Qt desktop version, which is also suitable for linux phones.
The June app release is available on Google Play, F-Droid and as an APK to download now! We are working on publishing in the iOS App Store as well, please stay tuned!
The first app release is available as an APK download now! We are still working on publishing on F-Droid, Google Play Store and iOS App Store as well, please stay tuned!
<!--
[<img src="docs/badges/apple-appstore.png" alt="App Store" width="160">](https://apps.apple.com/app/comaps/id1567437057)
[<img src="docs/badges/google-play.png" alt="Google Play" width="160">](https://play.google.com/store/apps/details?id=app.comaps)
[<img src="docs/badges/fdroid.png" alt="F-Droid" width="160">](https://f-droid.org/en/packages/app.comaps/)
-->
[<img src="docs/badges/google-play.png" alt="Google Play" width="160">](https://play.google.com/store/apps/details?id=app.comaps.google)
[<img src="docs/badges/fdroid.png" alt="F-Droid" width="160">](https://f-droid.org/en/packages/app.comaps.fdroid/)
[<img src="docs/badges/codeberg.png" alt="Codeberg" width="160">](https://codeberg.org/comaps/comaps/releases)
<p float="left">
@@ -52,7 +52,7 @@ The June app release is available on Google Play, F-Droid and as an APK to downl
**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.
**Simple and Polished**: Essential, easy to use features that just work.
**Simple and Polished**: essential easy to use features that just work.
**Saves Your Battery and Space**: Doesnt drain your battery like other navigation apps. Compact maps save precious space on your phone.

View File

@@ -169,7 +169,6 @@ android {
fdroid {
dimension 'default'
applicationIdSuffix '.fdroid'
versionName = android.defaultConfig.versionName + '-FDroid'
buildConfigField 'String', 'SUPPORT_MAIL', '"fdroid@comaps.app"'
}

View File

@@ -14,19 +14,21 @@ Můžete se zde také připojit ke komunitě pomáhat s vytvářením nejlepší
• <b>Otevřené a transparentní rozhodování a nakládání s financemi, neziskovost a plně otevřený zdrojový kód.</b>
<b>Hlavní funkce</b>:
• Stahovatelné podrobné mapy s místy, která nenajdete ani v Mapách Google
• Outdoorový režim se zvýrazněnými turistickými trasami, tábořišti, vodními zdroji, vrcholy, vrstevnicemi atd.
• Pěší trasy a cyklostezky
• Body zájmu, jako jsou restaurace, čerpací stanice, hotely, obchody, vyhlídky a mnoho dalšího
• Hledání podle názvu nebo adresy nebo podle kategorie bodů zájmu
• Navigace s hlasovými pokyny pro chůzi, jízdu na kole nebo řízení
• Uložení oblíbených míst jedním klepnutím
• Offline články z Wikipedie
• Vrstva metra a navigace v něm
• Záznam tras
• Export a import záložek a tras ve formátech KML, KMZ a GPX
• Tmavý režim k použití během noci
• Zlepšování mapových dat pro všechny pomocí jednoduchého vestavěného editoru
<ul>
<li>Stahovatelné podrobné mapy s místy, která nenajdete ani v Mapách Google</li>
<li>Outdoorový režim se zvýrazněnými turistickými trasami, tábořišti, vodními zdroji, vrcholy, vrstevnicemi atd.</li>
<li>Pěší trasy a cyklostezky</li>
<li>Body zájmu, jako jsou restaurace, čerpací stanice, hotely, obchody, vyhlídky a mnoho dalšího</li>
<li>Hledání podle názvu nebo adresy nebo podle kategorie bodů zájmu</li>
<li>Navigace s hlasovými pokyny pro chůzi, jízdu na kole nebo řízení</li>
<li>Uložení oblíbených míst jedním klepnutím</li>
<li>Offline články z Wikipedie</li>
<li>Vrstva metra a navigace v něm</li>
<li>Záznam tras</li>
<li>Export a import záložek a tras ve formátech KML, KMZ a GPX</li>
<li>Tmavý režim k použití během noci</li>
<li>Zlepšování mapových dat pro všechny pomocí jednoduchého vestavěného editoru</li>
</ul>
<b>Svoboda je tady</b>
Objevujte své cesty, navigujte se světem se soukromím a komunitou na prvním místě!

View File

@@ -14,6 +14,7 @@ Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
‣ <b>Offen und transparent bei Entscheidungen und Finanzen, gemeinnützig und vollständig Open-Source</b>
<b>Hauptfunktionen</b>:
<ul>
• Detaillierte, herunterladbare Karten mit Orten, die bei Google Maps oft fehlen
• Outdoor-Modus mit hervorgehobenen Wanderwegen, Campingplätzen, Wasserquellen, Gipfeln, Höhenlinien usw.
• Geh- und Radwege

View File

@@ -1,8 +1,10 @@
• OpenStreetMap Daten vom 2. Juni
• Neue Einstellungsoption zum Ändern oder Ausblenden der "Über CoMaps" Schaltfläche ganz links
Routen als GPS Track speichern
Qingdao Metro, Gärtnereien, Leitplanken, Leitern, Studios, Tanzsäle, Feuerstellen und Stundenhotels hinzugefügt
• transparente Navigationsleiste im Light Mode
Mastodon und Bluesky Kontaktoptionen für POIs und im OSM-Editor hinzugefügt
Anzeige der Kompassgradzahl in der Richtungspfeilansicht
Erster CoMaps Release!
Was ist neu im Vergleich zu Organic Maps:
OpenStreetMap-Daten vom 15. Mai
OSM Login jetzt über den Webbrowser
Der halbtransparente Hintergrund in der U-Bahn-Ansicht wurde entfernt
Größe der lokalen Karte beim ersten Karten download anzeigen
Der Metaserver wurde durch eine feste Liste an Kartenservern ersetzt
• Der Nachtmodus schaltet jetzt besser um, auch wenn kein GPS-Signal da ist
• Übersetzungen aktualisiert
• Rebranding das Logo ist noch vorläufig

View File

@@ -14,19 +14,21 @@ Join the community there and help make the best maps app
‣ <b>Open and Transparent Decision-making and Financials, Not-for-profit and Fully Open Source.</b>
<b>Main Features</b>:
• Downloadable detailed maps with places which are not available with Google Maps
• Outdoor mode with highlighted hiking trails, campsites, water sources, peaks, contour lines, etc
• Walking paths and cycleways
• Points of interest like restaurants, gas stations, hotels, shops, sightseeings and many more
• Search by name or an address or by point of interest category
• Navigation with voice announcements for walking, cycling, or driving
• Bookmark your favorite places with a single tap
• Offline Wikipedia articles
• Subway transit layer and directions
• Track recording
• Export and import bookmarks and tracks in KML, KMZ, GPX formats
• A dark mode to use during the night
• Improve map data for everyone using a basic built-in editor
<ul>
<li>Downloadable detailed maps with places which are not available with Google Maps</li>
<li>Outdoor mode with highlighted hiking trails, campsites, water sources, peaks, contour lines, etc</li>
<li>Walking paths and cycleways</li>
<li>Points of interest like restaurants, gas stations, hotels, shops, sightseeings and many more</li>
<li>Search by name or an address or by point of interest category</li>
<li>Navigation with voice announcements for walking, cycling, or driving</li>
<li>Bookmark your favorite places with a single tap</li>
<li>Offline Wikipedia articles</li>
<li>Subway transit layer and directions</li>
<li>Track recording</li>
<li>Export and import bookmarks and tracks in KML, KMZ, GPX formats</li>
<li>A dark mode to use during the night</li>
<li>Improve map data for everyone using a basic built-in editor</li>
</ul>
<b>Freedom Is Here</b>
Discover your journey, navigate the world with privacy and community at the forefront!

View File

@@ -1,8 +1,11 @@
• OpenStreetMap data as of June 2
• add a setting to change the leftmost button or hide it
save built routes as tracks
add Qingdao metro, plant nurseries, highway guard rails, ladders, studios, dance venues, firepits, love hotels
transparent system navigation bar in the light mode
add Mastodon and Bluesky contact options to POIs and OSM editor
display Azimuth angle in direction arrow view
Initial CoMaps release!
Changes from the Organic Maps upstream:
OpenStreetMap data as of May 15
login to OSM account via a web browser
removed semi-transparent background in Subway layer
replaced metaserver with a static map servers list
add local map size to the startup download screen
• improved auto night mode switch when there is no location fix
• fix incorrect map info when tapping on a not downloaded region
• update translations
• rebranding - the logo is provisional still

View File

@@ -0,0 +1,12 @@
Lanzamiento inicial de CoMaps
Cambios respecto a la versión de Organic Maps:
• Datos nuevos al 15 de mayo
• Inicio de sesión a OSM a través de navegador
• Eliminado fondo semitransparente en la capa de Metro
• Sustitución del metaserver por lista estática de servidores
• Añadido tamaño del mapa local al inicio
• Mejora del cambio automático al modo nocturno al no conocerse ubicación
• Correcciones de fallos
• Actualización de traducciones
• Cambio de branding con logo provisional

View File

@@ -14,19 +14,21 @@ Liitu kogukonnaga ja aita luua parimat kaardirakendust:
‣ <b>Organisatsioon on avatud ja kasutab läbipaistvat otsustusprotsessi ning rahastamist ega taotle kasumit. Rakendus on avatud lähtekoodiga.</b>
<b>Põhifunktsionaalsused</b>:
• Allalaaditavad detailsed kaardid, mille sisu tihtipeale ei leia Google Mapsist
• Kaardivaade välitingimuste jaoks, kus matkarajad, laagriplatsid, allikad, mäetipud, kontuurjooned ja palju muud vajalikku on esile tõstetud
• Jalgrajad, rattateed ning maanteed
• Huvipunktid, nagu restoranid, tanklad, hotellid, poed, vaatamisväärsused ja palju muud
• Otsida saad nime, aadressi või huvipunkti kategooria alusel
• Tee juhatamine hääljuhiste abil toimib nii kõndimisel, rattasõidul kui auto juhtimisel
• Ühe puudutusega saad oma lemmikkohad märkida järjehoidjana
• Vikipeedia artiklid, mida saad lugeda ilma võrguühenduseta
• Metroode plaanid ja suunajuhised
• Raja või teekonna salvestamise võimalus
• Järjehoidjate ja radade eksport ning import KML, KMZ ja GPX vormingutes
• Tume kaardivaade kasutamiseks öösel
• Kasutades lihtsat muutmisliidest saad kaarti kõikide huvides täiendada
<ul>
<li>Allalaaditavad detailsed kaardid, mille sisu tihtipeale ei leia Google Mapsist</li>
<li>Kaardivaade välitingimuste jaoks, kus matkarajad, laagriplatsid, allikad, mäetipud, kontuurjooned ja palju muud vajalikku on esile tõstetud</li>
<li>Jalgrajad, rattateed ning maanteed</li>
<li>Huvipunktid, nagu restoranid, tanklad, hotellid, poed, vaatamisväärsused ja palju muud</li>
<li>Otsida saad nime, aadressi või huvipunkti kategooria alusel</li>
<li>Tee juhatamine hääljuhiste abil toimib nii kõndimisel, rattasõidul kui auto juhtimisel</li>
<li>Ühe puudutusega saad oma lemmikkohad märkida järjehoidjana</li>
<li>Vikipeedia artiklid, mida saad lugeda ilma võrguühenduseta</li>
<li>Metroode plaanid ja suunajuhised</li>
<li>Raja või teekonna salvestamise võimalus</li>
<li>Järjehoidjate ja radade eksport ning import KML, KMZ ja GPX vormingutes</li>
<li>Tume kaardivaade kasutamiseks öösel</li>
<li>Kasutades lihtsat muutmisliidest saad kaarti kõikide huvides täiendada</li>
</ul>
<b>Vabadus on siin</b>
Uuri maailma ja avasta uusi teid - tee seda privaatselt ja kogukonnaga arvestades!

View File

@@ -1 +0,0 @@
Helppo karttanavigointi - Löydä lisää matkaltasi - Yhteisön voimin

View File

@@ -1 +1 @@
CoMaps - Vaella, pyöräile, autoile ilman verkkoyhteyttä, yksityisesti
CoMaps - Vaella, pyöräile, autoile ilman verkkoyhteyttä yksityisesti

View File

@@ -14,19 +14,21 @@ Rejoignez la communauté et aidez-nous à créer la meilleure application de nav
‣ <b>Prises de décisions et comptes clairs et transparents, but non lucratif et complètement open source.</b>
<b>Fonctionnalités principales :</b>
• Cartes détaillées téléchargeables avec des lieux non disponibles sur Google Maps
• Mode extérieur avec sentiers de randonnée, campings, sources d'eau, sommets, courbes de niveau, etc. surlignés
• Chemins piétons et pistes cyclables
• Points d'intérêt comme des restaurants, stations-service, hôtels, magasins, lieux touristiques et bien plus
• Recherche par nom, adresse ou catégorie de point d'intérêt
• Navigation avec annonces vocales pour la marche, le vélo ou la conduite
• Mettez en favori vos lieux préférés en un seul clic
• Articles Wikipédia hors-ligne
• Plan de métro et indications pour s'y rendre
• Enregistrement des parcours
• Exportez et importez vos favoris aux formats KML, KMZ et GPX
• Mode sombre pour utiliser pendant la nuit
• Amélioration de la carte par tout le monde avec un éditeur simple intégré
<ul>
<li>Cartes détaillées téléchargeables avec des lieux non disponibles sur Google Maps</li>
<li>Mode extérieur avec sentiers de randonnée, campings, sources d'eau, sommets, courbes de niveau, etc. surlignés</li>
<li>Chemins piétons et pistes cyclables</li>
<li>Points d'intérêt comme des restaurants, stations-service, hôtels, magasins, lieux touristiques et bien plus</li>
<li>Recherche par nom, adresse ou catégorie de point d'intérêt</li>
<li>Navigation avec annonces vocales pour la marche, le vélo ou la conduite</li>
<li>Mettez en favori vos lieux préférés en un seul clic</li>
<li>Articles Wikipédia hors-ligne</li>
<li>Plan de métro et indications pour s'y rendre</li>
<li>Enregistrement des parcours</li>
<li>Exportez et importez vos favoris aux formats KML, KMZ et GPX</li>
<li>Mode sombre pour utiliser pendant la nuit</li>
<li>Amélioration de la carte par tout le monde avec un éditeur simple intégré</li>
</ul>
<b>La liberté est ici</b>
Découvrez votre voyage, naviguez dans le monde en plaçant la vie privée et la communauté au premier plan !

View File

@@ -1,8 +1,11 @@
• Données OpenStreetMap du 02 juin
• Ajout d'une option pour personnaliser le bouton tout à gauche sur l'écran principal
Ajout de la possibilité d'enregistrer un itinéraire en tant que traces GPS
Ajout du métro de Qingdao, et divers objets sur la carte
Support de la barre de navigation transparent en mode clair
Ajout des tags Mastodon et Bluesky sur les lieux et dans l'éditeur
• Affichage de l'azimut
Première version de CoMaps!
Changements par rapport à Organic Maps:
Données OpenStreetMap du 15 mai
Connexion au compte OSM via le navigateur
Retrait du fond semi-transparent sur la couche Métro
Remplacement du metaserveur par une liste statique de serveurs
• Ajout de la taille de la carte locale au premier démarrage
• Amélioration du mode nuit automatique
• Correction de la suggestion de téléchargements de cartes
• Mise à jour des traductions
• Rebranding - le logo est encore provisoire

View File

@@ -1 +1 @@
CoMaps - Rando, vélo, conduite hors ligne & privée
CoMaps - Randonnée, vélo, conduite hors ligne en toute confidentialité

View File

@@ -14,19 +14,21 @@ Pridružite se otvorenoj zajednici i pomozite izraditi najbolju aplikaciju za ka
‣ <b>Otvoreno i transparentno donošenje odluka i korištenja financija, Neprofitna i potpuno Otvorenog koda.</b>
<b>Glavne značajke</b>:
• Preuzimanje detaljnih karti s lokacijama koje nisu dostupne s Google kartama
• Karte za izlete s istaknutim pješačkim stazama, kampovima, izvorima vode, planinskim vrhovima, konturnim linijama itd.
• Pješačke i biciklističke staze
• Točke interesa kao što su restorani, benzinske crpke, hoteli, trgovine, vidikovci i još mnogo toga
• Pretražujte po nazivu ili adresi ili po kategoriji interesa
• Navigacija s glasovnim najavama za hodanje, vožnju biciklom ili automobilom
• Obilježite svoja omiljena mjesta jednim dodirom
• Offline članci Wikipedije
• Tranzitni sloj podzemne željeznice sa navigacijom
• Snimanje GPS tragova
• Izvoz i uvoz oznaka i staza u KML, KMZ, i GPX formatima
• Tamni način rada za korištenje tijekom noći
• Poboljšajte kartu za sve korisnike, koristeći osnovni ugrađeni uređivač karte
<ul>
<li>Preuzimanje detaljnih karti s lokacijama koje nisu dostupne s Google kartama</li>
<li>Karte za izlete s istaknutim pješačkim stazama, kampovima, izvorima vode, planinskim vrhovima, konturnim linijama itd.</li>
<li>Pješačke i biciklističke staze</li>
<li>Točke interesa kao što su restorani, benzinske crpke, hoteli, trgovine, vidikovci i još mnogo toga</li>
<li>Pretražujte po nazivu ili adresi ili po kategoriji interesa</li>
<li>Navigacija s glasovnim najavama za hodanje, vožnju biciklom ili automobilom</li>
<li>Obilježite svoja omiljena mjesta jednim dodirom</li>
<li>Offline članci Wikipedije</li>
<li>Tranzitni sloj podzemne željeznice sa navigacijom</li>
<li>Snimanje GPS tragova</li>
<li>Izvoz i uvoz oznaka i staza u KML, KMZ, i GPX formatima</li>
<li>Tamni način rada za korištenje tijekom noći</li>
<li>Poboljšajte kartu za sve korisnike, koristeći osnovni ugrađeni uređivač karte</li>
</ul>
<b>Sloboda je ovdje</b>
Otkrijte svoje putovanje, navigirajte svijetom s privatnošću i zajednicom na prvom mjestu!

View File

@@ -14,19 +14,21 @@ Unisciti alla nostra comunità e aiutaci a creare la migliore app di mappe.
‣ <b>Aperta e Trasparente nel Processo Decisionale e Finanziario, Senza Scopo di Lucro e Completamente Open Source</b>
<b>Funzionalità principali</b>:
• Scarica mappe dettagliate di luoghi che non sono disponibili su Google Maps
• Modalità Outdoor con percorsi escursionistici, campeggi, sorgenti d'acqua, picchi, dislivelli ed altro evidenziati
• Strade pedonali e piste ciclabili
• Punti d'interesse come ristoranti, stazioni di benzina, hotel, negozi, luoghi turistici e molto altro
• Cerca per nome, indirizzo o categoria
• Navigazione con assistente vocale a piedi, in bici o in macchina
• Salva i tuoi luoghi preferiti con un tocco
• Leggi gli articoli Wikipedia Offline
• Cartina delle metropolitane con direzioni
• Registrazione del percorso
• Esporta ed importa i tuoi luoghi preferiti e percorsi nei formati KML, KMZ o GPX
• Modalità notturna per la notte
• Migliora le mappe per tutti usando l'editor interno
<ul>
<li>Scarica mappe dettagliate di luoghi che non sono disponibili su Google Maps</li>
<li>Modalità Outdoor con percorsi escursionistici, campeggi, sorgenti d'acqua, picchi, dislivelli ed altro evidenziati</li>
<li>Strade pedonali e piste ciclabili</li>
<li>Punti d'interesse come ristoranti, stazioni di benzina, hotel, negozi, luoghi turistici e molto altro</li>
<li>Cerca per nome, indirizzo o categoria</li>
<li>Navigazione con assistente vocale a piedi, in bici o in macchina</li>
<li>Salva i tuoi luoghi preferiti con un tocco</li>
<li>Leggi gli articoli Wikipedia Offline</li>
<li>Cartina delle metropolitane con direzioni</li>
<li>Registrazione del percorso</li>
<li>Esporta ed importa i tuoi luoghi preferiti e percorsi nei formati KML, KMZ o GPX</li>
<li>Modalità notturna per la notte</li>
<li>Migliora le mappe per tutti usando l'editor interno</li>
</ul>
<b>La Libertà è Qui</b>
Esplora la tua nuova avventura, naviga il mondo con Privacy e la comunità in prima linea!

View File

@@ -1,8 +0,0 @@
• Data di OpenStreetmap fino a giugno 2°
• Nuova impostazione per cambiare o modificare la positione del tasto sinistra
• Salvare i percorsi costruiti come tracce
• È stato aggiunto: metropolitana di Qingdao, giardinaggi, guardrail, scale, studio,
sala da ballo, focolari, love hotel
• Barra di navigatione transparente di sisteme in moda luce
• Aggiungi le opzioni di contatto Mastodon e Bluesky ai POI e all'editor di OSM
• Visualizza l'angolo di azimut nella freccia di direzione

View File

@@ -0,0 +1,11 @@
Pierwsze wydanie CoMaps!
Zmiany w stosunku do Organic Maps:
• dane OSM z 15.05,
• logowanie do OSM przez przeglądarkę,
• usunięto półprzezroczyste tło w warstwie Metra,
• zastąpiono metaserver statyczną listą serwerów map,
• dodano rozmiar mapy do ekranu pobierania przy uruchamianiu,
• poprawiono przełączanie trybu nocnego bez lokalizacji,
• poprawiono niepoprawne informacje o mapie po dotknięciu niepobranego regionu,
• zaktualizowano tłumaczenia,
• rebranding - logo wciąż tymczasowe.

View File

@@ -15,19 +15,21 @@ Junte-se à comunidade e ajude a criar o melhor aplicativo de mapas.
‣ <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 categoria de ponto de interesse
• Navegação com anúncios de voz para caminhada, ciclismo ou direção
• Marque seus lugares favoritos com um único toque
• Artigos offline da Wikipédia
• Caminho de transporte e direções do metrô
• Gravação de trilhas
• Exporte e importe favoritos e trilhas em Formatos KML, KMZ, GPX
• Um modo escuro para usar à noite
• Aprimore os dados do mapa para todos usando um editor básico integrado
<ul>
<li>Mapas detalhados para download com locais não disponíveis no Google Maps</li>
<li>Modo ao ar livre com trilhas em destaque, acampamentos, fontes de água, picos, curvas de nível, etc.</li>
<li>Trilhas para caminhada e ciclovias</li>
<li>Pontos de interesse como restaurantes, postos de gasolina, hotéis, lojas, pontos turísticos e muito mais</li>
<li>Pesquise por nome, endereço ou categoria de ponto de interesse</li>
<li>Navegação com anúncios de voz para caminhada, ciclismo ou direção</li>
<li>Marque seus lugares favoritos com um único toque</li>
<li>Artigos offline da Wikipédia</li>
<li>Caminho de transporte e direções do metrô</li>
<li>Gravação de trilhas</li>
<li>Exporte e importe favoritos e trilhas em Formatos KML, KMZ, GPX</li>
<li>Um modo escuro para usar à noite</li>
<li>Aprimore os dados do mapa para todos usando um editor básico integrado</li>
</ul>
<b>A Liberdade Chegou</b>
Descubra sua jornada, navegue pelo mundo com privacidade e comunidade em primeiro lugar!

View File

@@ -1,8 +1,9 @@
• Dados do OSM de 2/06
• Adicionada uma configuração para alterar ou ocultar o botão mais à esquerda
Salve rotas construídas como trilhas
Adicionado metrô de Qingdao, viveiros de plantas, guarda-corpos de rodovias, escadas, estúdios, casas de dança, fogueiras e motéis
Barra de navegação do sistema transparente no modo claro
Adicionadas opções de contato Mastodon e Bluesky aos POIs e ao editor OSM
Exibição de ângulo de azimute na visualização de seta de direção
Lançamento inicial do CoMaps!
Alterações em relação ao Organic Maps:
Dados do OSM de 15/05
Login na conta OSM por meio de autenticação no navegador
Remoção do fundo semitransparente na camada Metrô
Substituição do metaserver por uma lista estática de servidores de mapas
Melhoria na alternância automática do modo noturno quando não há localização
• Novas traduções
• Rebranding - O logo ainda é provisório

View File

@@ -0,0 +1,9 @@
Lançamento inicial do CoMaps!
Alterações em relação ao Organic Maps:
• Dados do OSM de 15/05
• Login na conta OSM através de um navegador web auth
• Removido o fundo semi-transparente na camada do Metro
• Substituído o metaserver por uma lista estática de servidores de mapas
• Melhoria na mudança automática do modo noturno quando não há localização
• Novas traduções
• Rebranding - logótipo ainda provisório

View File

@@ -1 +0,0 @@
CoMaps - Andar, Pedalar, Dirigir Offline com Privacidade

View File

@@ -8,19 +8,21 @@
‣ <b>Открытое и прозрачное принятие решений, финансовая отчетность, некоммерческая организация и полностью открытый исходный код.</b>
<b>Главные особенности</b>:
• Загружаемые и подробные карты с местами, которые недоступны в Google Maps
• Режим Outdoor с отмеченными туристическими тропами, кемпингами, источниками воды, вершинами, контурными линиями и т.д.
• Пешеходные переходы и велодорожки
• Точки интереса, такие как: рестораны, заправочные станции, отели, магазины, достопримечательности и многое другое
• Поиск по имени, адресу или категории достопримечательностей
• Навигация с голосовыми уведомлениями для пешеходов, велосипедистов или водителей
• Возможность добавлять любимые места в закладки одним касанием
• Загружаемые страницы Википедии
• Слой общественного транспорта (метро)
• Запись маршрута
• Экспорт и импорт закладок и маршрутов в форматах KML, KMZ, GPX
• Темный режим для использования в ночное время
• Улучшение картографических данных для всех с помощью базового встроенного редактора
• Поддержка Android Auto и CarPlay
<ul>
<li>Загружаемые и подробные карты с местами, которые недоступны в Google Maps</li>
<li>Режим Outdoor с отмеченными туристическими тропами, кемпингами, источниками воды, вершинами, контурными линиями и т.д.</li>
<li>Пешеходные переходы и велодорожки</li>
<li>Точки интереса, такие как: рестораны, заправочные станции, отели, магазины, достопримечательности и многое другое</li>
<li>Поиск по имени, адресу или категории достопримечательностей</li>
<li>Навигация с голосовыми уведомлениями для пешеходов, велосипедистов или водителей</li>
<li>Возможность добавлять любимые места в закладки одним касанием</li>
<li>Загружаемые страницы Википедии</li>
<li>Слой общественного транспорта (метро)</li>
<li>Запись маршрута</li>
<li>Экспорт и импорт закладок и маршрутов в форматах KML, KMZ, GPX</li>
<li>Темный режим для использования в ночное время</li>
<li>Улучшение картографических данных для всех с помощью базового встроенного редактора</li>
<li>Поддержка Android Auto и CarPlay</li>
</ul>
<i>Свобода здесь - Открой для себя поездки, навигацию по миру, ставя приватность и сообщество во главе</i>

View File

@@ -1,7 +0,0 @@
• карты OpenStreetMap от 2 июня
• настройка для изменения функции левой кнопки или её скрытия
• сохранение построенных маршрутов в виде треков
• добавлены: метро в Qingdao, питомники растений, отбойники на шоссе, постоянные лестницы-стремянки, студии, места для танцев, кострища, отели любви
• прозрачная полоска с системными кнопками (в светлом режиме)
• в объекты на карте (а также в их редактор) добавлены Mastodon и Bluesky контакты
• к стрелке направления на выбранный объект добавлен азимут

View File

@@ -1,33 +0,0 @@
Бесплатна апликација отвореног кода коју је обављала заједница и заснива се на ОпенСтреетМап-у подацима, усмерени транспарентност, приватност и непрофитни. ЦОМПАПС је Апликације за органске карте виљушка, које је пак форк мапс.ме.
Прочитајте о разлозима пројекта и његовог правца на <b><i>codeberg.org/comaps</i></b>
Придружите се отвореној заједници и помозите да направимо најбољу апликацију за мапе
• Користите апликацију и проширите глас о томе
• Дајте повратне информације и пријавите проблеме
• Ажурирајте податке на мапи у апликацији или на веб локацији OpenStreetMap
‣<b>фокусирано на офлајн Вар </b>: Планирајте и управљајте путовањем у иностранству без потребе за мобилним услугама, тражите путне тачке док је на даљинском покрету, итд.
Све апликације су дизајниране за рад ван мреже.
‣<b> Поштовање приватности </b>: Апликација је осмишљена задржавања у уму приватност - не идентификује људе, не прати или прикупља личне податке. Нема реклама.
‣ <b> Једноставно и елегантно </b>: Апликација је тривијална за употребу и једноставно функционише.
‣ <b> Чува вашу батерију и простор </b>: не конзумира батерију као остале навигационе апликације. Компактне картице сачувајте драгоцени простор на вашем телефону.
‣ <b> Отворено и направио је заједницу </b>: Људи попут вас је помогли да додају апликацију додавањем локација на OpenStreetMap-у, тестирању и давање повратних информација о апликацији и доприносе вашим развојним вештинама и новцу.
‣ <b> Отворено и транспарентно доношење одлука и употреба финансија, непрофитна и потпуно отворена извора. </ Б>
<b> Главне карактеристике </b>:
• Преузмите детаљне мапе са локацијама које нису доступне са Гоогле мапама
• Улазнице за излете са истакнутим планинарским стазама, камповима, изворима воде, планинске врхове, контурне линије итд.
• Стазе за планинарење и бицикле
• Тачке интереса као што су ресторани, бензинске пумпе, хотели, продавнице, погледа и још много тога
• Претражите име или адресу или по категоријама камате
• навигација са гласовним најавама за ходање, бициклизам или аутомобил
• Означите своја омиљена места једним додиром
• Офлајн чланци Википедије
• транзитни слој подземне пруге са навигацијом
• Снимање ГПС трагова
• Ознака и увоз и увоз у KML, KMZ, GPX формате
• Тамни режим за употребу током ноћи
• Побољшајте карту за све кориснике, користећи основни уредни уредник мапе
<b> Слобода је овде </b>
Откријте своје путовање, крећете се са свијетом са приватношћу и заједницом на првом месту!

View File

@@ -1,2 +0,0 @@
Gönüllüler tarafından yürütülen, OpenStreetMap harita verisini kullanan, şeffaf, mahremiyete saygılı, kamu yararına olma kararlılığıyla güçlendirilmiş bir özgür yazılım. CoMaps OrganicMaps isimli, esasen Maps.ME'nin çatalı olan bir özgür yazılımın çatalıdır.
Projenin ortaya çıkma sebebini ve gidişatını <b><i>codeberg.org/comaps</i></b>'den okuyabilirsiniz.

View File

@@ -1 +0,0 @@
Kolayca gezinin - Seyahat etmenin ötesini bulun - Gönüllüler tarafından yapıldı

View File

@@ -1 +0,0 @@
CoMaps - İnternetsiz Seyahat Edin

View File

@@ -14,19 +14,21 @@
‣ <b>决策问责、财务透明、非营利性、完全开源。</b>
<b>主要功能</b>
• 可下载详细的地图包括许多Google地图中未显示的地方
• 突出显示远足路线、露营地、水源、山峰、等高线等的户外模式
• 步行道和自行车道
• 餐厅、加油站、酒店、商店、景点等众多兴趣点
• 按名称、地址或兴趣点类别搜索
• 步行、骑车或驾驶时,可通过语音提示进行导航
• 一键收藏您中意的地点
• 离线阅读维基百科文章
• 地铁交通图层和路线指示
• 轨迹记录
• 以 KML、KMZ 和 GPX 格式导出和导入书签和轨迹
• 选择天暗后自动开启的黑暗模式
• 使用基本的内置编辑器来编辑 OpenStreetMap 地点,帮助大家改进地图数据
<ul>
<li>可下载详细的地图包括许多Google地图中未显示的地方</li>
<li>突出显示远足路线、露营地、水源、山峰、等高线等的户外模式</li>
<li>步行道和自行车道</li>
<li>餐厅、加油站、酒店、商店、景点等众多兴趣点</li>
<li>按名称、地址或兴趣点类别搜索</li>
<li>步行、骑车或驾驶时,可通过语音提示进行导航</li>
<li>一键收藏您中意的地点</li>
<li>离线阅读维基百科文章</li>
<li>地铁交通图层和路线指示</li>
<li>轨迹记录</li>
<li>以 KML、KMZ 和 GPX 格式导出和导入书签和轨迹</li>
<li>选择天暗后自动开启的黑暗模式</li>
<li>使用基本的内置编辑器来编辑 OpenStreetMap 地点,帮助大家改进地图数据</li>
</ul>
<b>自由在此</b>
探索您的旅程,以隐私和社区为本,畅游世界!

View File

@@ -14,19 +14,21 @@
‣ <b>決策問責、財務透明、非營利性、完全開源。</b>
<b>主要功能</b>
• 可下載詳細的地圖包括許多Google地圖中未顯示的地方
• 突出顯示遠足路線、露營地、水源、山峰、等高線等的戶外模式
• 步道和自行車道
• 餐廳、加油站、旅館、商店、景點等眾多興趣點
• 按名稱、地址或興趣點類別搜尋
• 步行、騎車或駕駛時,可透過語音提示進行導航
• 一鍵收藏您喜愛的地點
• 離線閱讀維基百科文章
• 列車運輸圖層及路線指示
• 軌跡記錄
• 以 KML、KMZ 和 GPX 格式匯出和匯入書籤和軌跡
• 選擇天暗後自動開啟的黑暗模式
• 使用基本的內建編輯器來編輯 OpenStreetMap 地點,幫助大家改進地圖資料
<ul>
<li>可下載詳細的地圖包括許多Google地圖中未顯示的地方</li>
<li>突出顯示遠足路線、露營地、水源、山峰、等高線等的戶外模式</li>
<li>步道和自行車道</li>
<li>餐廳、加油站、旅館、商店、景點等眾多興趣點</li>
<li>按名稱、地址或興趣點類別搜尋</li>
<li>步行、騎車或駕駛時,可透過語音提示進行導航</li>
<li>一鍵收藏您喜愛的地點</li>
<li>離線閱讀維基百科文章</li>
<li>列車運輸圖層及路線指示</li>
<li>軌跡記錄</li>
<li>以 KML、KMZ 和 GPX 格式匯出和匯入書籤和軌跡</li>
<li>選擇天暗後自動開啟的黑暗模式</li>
<li>使用基本的內建編輯器來編輯 OpenStreetMap 地點,幫助大家改進地圖資料</li>
</ul>
<b>自由在此</b>
探索您的旅程,以隱私和社群為本,暢遊世界!

View File

@@ -1,36 +0,0 @@
Yhteisön johtama vapaa ja avoimeen lähdekoodiin perustuva karttasovellus, jonka karttadata perustuu OpenStreetMap:n avoimeen dataan. Sovelluksessa painottuu vahva sitoutuminen läpinäkyvyyteen, yksityisyyteen ja voittoa tavoittelemattomaan toimintaan.
Liity yhteisöön ja auta kehittämään parasta karttasovellusta
• Käytä sovellusta ja levitä sanaa
• Anna palautetta ja raportoi ongelmista
• Päivitä karttadataa sovelluksessa tai OpenStreetMap:n verkkosivuilla
<i>Palautteesi ja 5-tähden arvostelu on paras tukesi meille!</i>
‣ <b>Yksinkertainen ja viimeistelty</b>: Olennaiset ominaisuudet, joita on helppo käyttää.
‣ <b>Offline-painotteinen</b>: Suunnittele ja navigoi matkasi ilman verkkoyhteyttä. Etsi reittipisteitä retkilläsi. Kaikki sovelluksen toiminnot on suunniteltu käytettäväksi ilman verkkoyhteyttä.
‣ <b>Kunnioittaa yksityisyyttä</b>: Sovellus on suunniteltu yksityisyyttä silmälläpitäen. Sovellu ei tunnista ihmisä, seuraa toimintaasi, eikä kerää henkilökohtaisia tietojasi. Mainosvapaa.
‣ <b>Säästää akkua ja tilaa</b>: Ei kuluta akkua, kuten toiset karttasovellukset. Kompaktit kartat säästävät tilaa puhelimessasi.
‣ <b>Ilmainen ja yhteisön rakentama</b>: Ihmiset, kuten sinä ovat auttaneet sovelluksen kehityksessä lisäämällä paikkoja OpenStreetMap:iin, testaamalla sovellusta ja antamalla palautetta. Voit auttaa myös kehittämällä sovellusta ja lahjoittamalla sovelluskehitykseen.
‣ <b>Avoin ja läpinäkyvä päätöksenteko ja rahoitus. Voittoa tavoittelematon ja täysin avoimeen lähdekoodiin perustuva.</b>
<b>Tärkeimmät ominaisuudet</b>:
• Ladattavat yksityiskohtaiset kartat paikoista, joita ei löydy edes Google Maps:sta
• Ulkoilutila, josta löytyy korostettuna reitit, leirintäpaikat, vesipisteet, huiput ja korkeuserot yms.
• Kävely- ja pyörätiet
• Kiinnostavat paikat, kuten ravintolat, huoltoasemat, hotellit, kaupat, nähtävyydet ja monta muuta
• Etsi nimellä, osoitteella tai kiinnostavan paikan kategorialla
• Navigointi ääni-ilmoituksilla kävellessä, pyöräillessä tai ajaessa
• Tallenna suosikkipaikkasi yhdellä napautuksella
• Offline Wikipedia-artikkelit
• Maanalaisen liikenteen tasot ja ohjeet
• Reittien tallennus
• Tuo ja vie kirjanmerkkejä ja reittejä KML-, KMZ- ja GPX-formaateissa
• Tumma tila iltaa ja yötä varten
• Paranna karttadataa kaikille sisäänrakennetulla editorilla
• Android Auto -tuki
Raportoi sovellusvirheistä, ehdota ideoita liity yhteisöön osoitteessa <b><i>comaps.app</i></b>
<b>Vapaus on täällä</b>
Löydä matkasi, navigoi maailmassa yksityisyyden ja yhteisön tukemana!

View File

@@ -1 +0,0 @@
Helppo karttanavigointi - Löydä lisää matkaltasi - Yhteisön voimin

View File

@@ -1,45 +0,0 @@
Um aplicativo de mapas gratuito e de código aberto, liderado pela comunidade e baseado em dados do OpenStreetMap, reforçado pelo compromisso com a transparência, privacidade e sem fins lucrativos.
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.
<i>Seu feedback e avaliações 5 estrelas são o nosso melhor suporte!</i>
‣ <b>Simples e refinado</b>: recursos essenciais e fáceis de usar que simplesmente funcionam.
‣ <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. Livre de anúncios.
‣ <b>Economiza bateria e espaço</b>: Não esgota a bateria como outros aplicativos de navegação. Mapas compactos economizam espaço precioso no seu celular.
‣ <b>Gratuito e desenvolvido pela comunidade</b>: Pessoas como você ajudaram a desenvolver o aplicativo adicionando locais ao OpenStreetMap, testando e dando feedback sobre os recursos, além de contribuir com suas habilidades de desenvolvimento e recursos financeiros.
‣ <b>Tomada de decisões e finanças abertas e transparentes, sem fins lucrativos e totalmente de código aberto.</b>
‣ Simples e sofisticado: recursos essenciais e fáceis de usar que simplesmente funcionam.
‣ Foco offline: 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.
‣ Respeito à privacidade: O aplicativo foi projetado com a privacidade em mente - não identifica pessoas, não rastreia e não coleta informações pessoais. Livre de anúncios.
‣ Economiza bateria e espaço: Não consome bateria como outros aplicativos de navegação. Mapas compactos economizam espaço precioso no seu celular.
‣ Gratuito e desenvolvido pela comunidade: Pessoas como você ajudaram a desenvolver o aplicativo adicionando lugares ao OpenStreetMap, testando e dando feedback sobre os recursos e contribuindo com dinheiro e habilidades de desenvolvimento.
‣ Tomada de decisões e finanças abertas e transparentes, sem fins lucrativos e totalmente de código aberto.
Principais recursos:
• Mapas detalhados para download com locais que não estão disponíveis em muitos mapas comerciais
• Modo ao ar livre com trilhas destacadas, 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 categoria de ponto de interesse
• Navegação com anúncios de voz para caminhada, ciclismo ou direção
• Marque seus lugares favoritos com um único toque
• Sincronização com iCloud para seus favoritos e trilhas
• Artigos offline da Wikipédia
• Camada e direções de transporte público de metrô
• Gravação de trilhas
• Exporte e importe favoritos e trilhas nos formatos KML, KMZ e GPX
• Modo escuro para usar à noite
• Aprimore os dados do mapa para todos usando um editor básico integrado
• Suporte para Android Auto
Por favor, reporte problemas com o aplicativo, sugira ideias e junte-se à nossa comunidade no site <b><i>comaps.app</i></b>.
<b>A Liberdade Chegou</b>
Descubra sua jornada, navegue pelo mundo com privacidade e comunidade em primeiro lugar!

View File

@@ -1 +0,0 @@
Fácil navegação - Descubra mais sobre sua jornada - Desenvolvido pela comunidade

View File

@@ -1 +0,0 @@
CoMaps - Navegue privadamente

View File

@@ -1 +0,0 @@
Kolayca gezinin - Seyahat etmenin ötesini bulun - Gönüllüler tarafından yapıldı

View File

@@ -1 +0,0 @@
CoMaps - Mahremiyetli Seyahat

View File

@@ -119,7 +119,7 @@
<data android:scheme="http"/>
<data android:scheme="https"/>
<data android:host="comaps.at"/>
<data android:host="comaps.app"/>
</intent-filter>
<intent-filter>

View File

@@ -34,8 +34,8 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StyleRes;
import androidx.annotation.UiThread;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
@@ -100,9 +100,9 @@ import app.organicmaps.settings.DrivingOptionsActivity;
import app.organicmaps.settings.RoadType;
import app.organicmaps.settings.SettingsActivity;
import app.organicmaps.settings.UnitLocale;
import app.organicmaps.leftbutton.LeftButton;
import app.organicmaps.leftbutton.LeftButtonsHolder;
import app.organicmaps.leftbutton.LeftToggleButton;
import app.organicmaps.universalbuttons.UniversalButton;
import app.organicmaps.universalbuttons.UniversalButtonsHolder;
import app.organicmaps.universalbuttons.UniversalToggleButton;
import app.organicmaps.util.Config;
import app.organicmaps.util.LocationUtils;
import app.organicmaps.util.PowerManagment;
@@ -119,8 +119,6 @@ import app.organicmaps.widget.menu.MainMenu;
import app.organicmaps.widget.placepage.PlacePageController;
import app.organicmaps.widget.placepage.PlacePageData;
import app.organicmaps.widget.placepage.PlacePageViewModel;
import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
@@ -134,10 +132,9 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static app.organicmaps.location.LocationState.FOLLOW;
import static app.organicmaps.location.LocationState.FOLLOW_AND_ROTATE;
import static app.organicmaps.location.LocationState.LOCATION_TAG;
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_ADD_PLACE_CODE;
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_HELP_CODE;
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_RECORD_TRACK_CODE;
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_SETTINGS_CODE;
import static app.organicmaps.universalbuttons.UniversalButtonsHolder.BUTTON_ADD_PLACE_CODE;
import static app.organicmaps.universalbuttons.UniversalButtonsHolder.BUTTON_RECORD_TRACK_CODE;
import static app.organicmaps.universalbuttons.UniversalButtonsHolder.BUTTON_SETTINGS_CODE;
import static app.organicmaps.util.PowerManagment.POWER_MANAGEMENT_TAG;
public class MwmActivity extends BaseMwmFragmentActivity
@@ -188,7 +185,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
private MapFragment mMapFragment;
private View mPointChooser;
private MaterialToolbar mPointChooserToolbar;
private Toolbar mPointChooserToolbar;
private RoutingPlanInplaceController mRoutingPlanInplaceController;
@@ -211,7 +208,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
private int mNavBarHeight;
private LeftButtonsHolder buttonsHolder;
private UniversalButtonsHolder buttonsHolder;
private PlacePageViewModel mPlacePageViewModel;
private MapButtonsViewModel mMapButtonsViewModel;
@@ -614,12 +611,12 @@ public class MwmActivity extends BaseMwmFragmentActivity
if (activityResult.getResultCode() == Activity.RESULT_OK)
{
Intent data = activityResult.getData();
if (data != null && data.hasExtra(MwmActivity.this.getString(R.string.pref_left_button)))
if (data != null && data.hasExtra(UniversalButtonsHolder.KEY_PREF_UNIVERSAL_BUTTON))
{
MapButtonsController mMapButtonsController = (MapButtonsController) getSupportFragmentManager().findFragmentById(R.id.map_buttons);
if (mMapButtonsController != null)
{
mMapButtonsController.reloadLeftButton(buttonsHolder.getActiveButton());
mMapButtonsController.reloadUniversalButton(buttonsHolder.getActiveButton());
}
}
}
@@ -826,35 +823,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
private void prepareNavigationButtons()
{
buttonsHolder = LeftButtonsHolder.getInstance(this);
buttonsHolder.registerButton(new LeftButton()
{
@Override
public String getCode()
{
return BUTTON_HELP_CODE;
}
@Override
public String getPrefsName()
{
return getString(R.string.help);
}
@Override
public void drawIcon(FloatingActionButton imageView)
{
imageView.setImageResource(R.drawable.ic_question_mark);
}
@Override
public void onClick(FloatingActionButton left)
{
Intent intent = new Intent(MwmActivity.this, HelpActivity.class);
MwmActivity.this.startActivity(intent);
}
});
buttonsHolder.registerButton(new LeftButton()
buttonsHolder = UniversalButtonsHolder.getInstance(this);
buttonsHolder.registerDefaultUniversalButtons(this);
buttonsHolder.registerButton(new UniversalButton()
{
@Override
public String getCode()
@@ -875,12 +846,12 @@ public class MwmActivity extends BaseMwmFragmentActivity
}
@Override
public void onClick(FloatingActionButton left)
public void onClick(FloatingActionButton universalButtonView)
{
onAddPlace();
}
});
buttonsHolder.registerButton(new LeftButton()
buttonsHolder.registerButton(new UniversalButton()
{
@Override
public String getCode()
@@ -901,13 +872,13 @@ public class MwmActivity extends BaseMwmFragmentActivity
}
@Override
public void onClick(FloatingActionButton left)
public void onClick(FloatingActionButton universalButtonView)
{
onOpenSettings();
}
});
buttonsHolder.registerButton(new LeftToggleButton()
buttonsHolder.registerButton(new UniversalToggleButton()
{
private boolean isRecording = TrackRecorder.nativeIsTrackRecordingEnabled();
@@ -935,7 +906,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
imageView.setImageResource(R.drawable.ic_track_recording_off);
int color = isRecording
? ContextCompat.getColor(MwmActivity.this, R.color.active_track_recording)
? Color.parseColor("#0057ff")
: ThemeUtils.getColor(MwmActivity.this, R.attr.iconTint);
ColorStateList colorStateList = ColorStateList.valueOf(color);
@@ -943,10 +914,10 @@ public class MwmActivity extends BaseMwmFragmentActivity
}
@Override
public void onClick(FloatingActionButton left)
public void onClick(FloatingActionButton universalButtonView)
{
onTrackRecordingOptionSelected();
drawIcon(left);
drawIcon(universalButtonView);
}
});
}
@@ -957,7 +928,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
if (mPreviousMapLayoutMode != layoutMode)
{
MapButtonsController mapButtonsController = new MapButtonsController();
mapButtonsController.setLeftButton(buttonsHolder.getActiveButton());
mapButtonsController.setUniversalButton(buttonsHolder.getActiveButton());
FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction().replace(R.id.map_buttons, mapButtonsController);

View File

@@ -15,12 +15,11 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StyleRes;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentFactory;
import androidx.fragment.app.FragmentManager;
import com.google.android.material.appbar.MaterialToolbar;
import app.organicmaps.MwmApplication;
import app.organicmaps.R;
import app.organicmaps.SplashActivity;
@@ -149,7 +148,7 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity
onBackPressed();
}
protected MaterialToolbar getToolbar()
protected Toolbar getToolbar()
{
return findViewById(R.id.toolbar);
}

View File

@@ -10,13 +10,11 @@ import androidx.annotation.CallSuper;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.ViewCompat;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.appbar.MaterialToolbar;
import app.organicmaps.R;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
@@ -25,7 +23,7 @@ import app.organicmaps.widget.PlaceholderView;
public abstract class BaseMwmRecyclerFragment<T extends RecyclerView.Adapter> extends Fragment
{
private MaterialToolbar mToolbar;
private Toolbar mToolbar;
@SuppressWarnings("NotNullFieldNotInitialized")
@NonNull

View File

@@ -6,13 +6,11 @@ import androidx.annotation.CallSuper;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.ViewCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentFactory;
import androidx.fragment.app.FragmentManager;
import com.google.android.material.appbar.MaterialToolbar;
import app.organicmaps.R;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
@@ -28,7 +26,7 @@ public abstract class BaseToolbarActivity extends BaseMwmFragmentActivity
{
super.onSafeCreate(savedInstanceState);
MaterialToolbar toolbar = getToolbar();
Toolbar toolbar = getToolbar();
if (toolbar != null)
{
int title = getToolbarTitle();
@@ -44,7 +42,7 @@ public abstract class BaseToolbarActivity extends BaseMwmFragmentActivity
}
}
protected void setupHomeButton(@NonNull MaterialToolbar toolbar)
protected void setupHomeButton(@NonNull Toolbar toolbar)
{
UiUtils.showHomeUpButton(toolbar);
}
@@ -94,7 +92,7 @@ public abstract class BaseToolbarActivity extends BaseMwmFragmentActivity
if (title != null)
{
MaterialToolbar toolbar = getToolbar();
Toolbar toolbar = getToolbar();
if (toolbar != null && toolbar.getTitle() != null)
{
mLastTitle = toolbar.getTitle().toString();

View File

@@ -480,13 +480,6 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
UiUtils.showIf(mSearchResultsMode && !TextUtils.isEmpty(found), mFoundName);
long size = getMapDisplaySize();
mSize.setText(StringUtils.getFileSizeString(mFragment.requireContext(), size));
mStatusIcon.update(mItem);
}
private long getMapDisplaySize()
{
long size;
if (mItem.status == CountryItem.STATUS_ENQUEUED ||
mItem.status == CountryItem.STATUS_PROGRESS ||
@@ -494,16 +487,13 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
{
size = mItem.enqueuedSize;
}
else if (mItem.status == CountryItem.STATUS_FAILED ||
mItem.status == CountryItem.STATUS_DOWNLOADABLE)
{
size = mItem.totalSize;
}
else
{
size = ((!mSearchResultsMode && mMyMapsMode) ? mItem.size : mItem.totalSize);
}
return size;
mSize.setText(StringUtils.getFileSizeString(mFragment.requireContext(), size));
mStatusIcon.update(mItem);
}
}

View File

@@ -189,7 +189,6 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
initMetadataEntry(Metadata.MetadataType.FMD_WEBSITE, R.string.error_enter_correct_web);
initMetadataEntry(Metadata.MetadataType.FMD_WEBSITE_MENU, R.string.error_enter_correct_web);
initMetadataEntry(Metadata.MetadataType.FMD_EMAIL, R.string.error_enter_correct_email);
initMetadataEntry(Metadata.MetadataType.FMD_LEVEL, R.string.error_enter_correct_level);
initMetadataEntry(Metadata.MetadataType.FMD_CONTACT_FEDIVERSE, R.string.error_enter_correct_fediverse_page);
initMetadataEntry(Metadata.MetadataType.FMD_CONTACT_FACEBOOK, R.string.error_enter_correct_facebook_page);
initMetadataEntry(Metadata.MetadataType.FMD_CONTACT_INSTAGRAM, R.string.error_enter_correct_instagram_page);
@@ -432,7 +431,8 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
// Details
View mBlockLevels = view.findViewById(R.id.block_levels);
mBuildingLevels = findInputAndInitBlock(mBlockLevels, R.drawable.ic_floor, R.string.editor_building_levels);
mBuildingLevels = findInputAndInitBlock(mBlockLevels, R.drawable.ic_floor,
getString(R.string.editor_storey_number, Editor.nativeGetMaxEditableBuildingLevels()));
mBuildingLevels.setInputType(InputType.TYPE_CLASS_NUMBER);
mInputBuildingLevels = mBlockLevels.findViewById(R.id.custom_input);
View blockPhone = view.findViewById(R.id.block_phone);
@@ -446,8 +446,6 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
R.drawable.ic_website_menu, R.string.website_menu, InputType.TYPE_TEXT_VARIATION_URI);
View emailBlock = initBlock(view, Metadata.MetadataType.FMD_EMAIL, R.id.block_email,
R.drawable.ic_email, R.string.email, InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
View levelBlock = initBlock(view, Metadata.MetadataType.FMD_LEVEL, R.id.block_level,
R.drawable.ic_level_white, R.string.editor_level, InputType.TYPE_CLASS_NUMBER);
View fediverseContactBlock = initBlock(view, Metadata.MetadataType.FMD_CONTACT_FEDIVERSE, R.id.block_fediverse,
R.drawable.ic_mastodon_white, R.string.mastodon, InputType.TYPE_TEXT_VARIATION_URI);
View facebookContactBlock = initBlock(view, Metadata.MetadataType.FMD_CONTACT_FACEBOOK, R.id.block_facebook,
@@ -505,7 +503,6 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
mDetailsBlocks.put(Metadata.MetadataType.FMD_WEBSITE, websiteBlock);
mDetailsBlocks.put(Metadata.MetadataType.FMD_WEBSITE_MENU, websiteMenuBlock);
mDetailsBlocks.put(Metadata.MetadataType.FMD_EMAIL, emailBlock);
mDetailsBlocks.put(Metadata.MetadataType.FMD_LEVEL, levelBlock);
mDetailsBlocks.put(Metadata.MetadataType.FMD_OPERATOR, operatorBlock);
mSocialMediaBlocks.put(Metadata.MetadataType.FMD_CONTACT_FEDIVERSE, fediverseContactBlock);

View File

@@ -6,6 +6,7 @@ import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.ScrollView;
@@ -23,16 +24,14 @@ import app.organicmaps.util.Utils;
import app.organicmaps.util.WindowInsetUtils.ScrollableContentInsetsListener;
import app.organicmaps.util.concurrency.ThreadPool;
import app.organicmaps.util.concurrency.UiThread;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.textfield.TextInputEditText;
public class OsmLoginFragment extends BaseMwmToolbarFragment
{
private ProgressBar mProgress;
private MaterialButton mLoginButton;
private MaterialButton mLostPasswordButton;
private Button mLoginButton;
private Button mLostPasswordButton;
private TextInputEditText mLoginInput;
private TextInputEditText mPasswordInput;
@@ -52,7 +51,7 @@ public class OsmLoginFragment extends BaseMwmToolbarFragment
mPasswordInput = view.findViewById(R.id.osm_password);
mLoginButton = view.findViewById(R.id.login);
mLostPasswordButton = view.findViewById(R.id.lost_password);
MaterialButton registerButton = view.findViewById(R.id.register);
Button registerButton = view.findViewById(R.id.register);
registerButton.setOnClickListener((v) -> Utils.openUrl(requireActivity(), Constants.Url.OSM_REGISTER));
mProgress = view.findViewById(R.id.osm_login_progress);
final String dataVersion = DateUtils.getShortDateFormatter().format(Framework.getDataVersion());

View File

@@ -6,7 +6,9 @@ import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -20,17 +22,15 @@ import app.organicmaps.util.WindowInsetUtils;
import app.organicmaps.util.concurrency.ThreadPool;
import app.organicmaps.util.concurrency.UiThread;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textview.MaterialTextView;
import java.text.NumberFormat;
public class ProfileFragment extends BaseMwmToolbarFragment
{
private View mUserInfoBlock;
private MaterialTextView mEditsSent;
private MaterialTextView mProfileName;
private ShapeableImageView mProfileImage;
private TextView mEditsSent;
private TextView mProfileName;
private ImageView mProfileImage;
private ProgressBar mProfileInfoLoading;
@Nullable

View File

@@ -1,14 +0,0 @@
package app.organicmaps.leftbutton;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
public interface LeftButton
{
String getCode();
String getPrefsName();
default void drawIcon(FloatingActionButton imageView) {}
default void onClick(FloatingActionButton leftButtonView) {}
}

View File

@@ -1,96 +0,0 @@
package app.organicmaps.leftbutton;
import android.content.Context;
import android.content.SharedPreferences;
import android.text.TextUtils;
import androidx.annotation.Nullable;
import androidx.preference.PreferenceManager;
import app.organicmaps.R;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
public class LeftButtonsHolder
{
private static volatile LeftButtonsHolder instance;
public static final String DISABLE_BUTTON_CODE = "disable";
public static final String BUTTON_HELP_CODE = "help";
public static final String BUTTON_SETTINGS_CODE = "settings";
public static final String BUTTON_ADD_PLACE_CODE = "add-place";
public static final String BUTTON_RECORD_TRACK_CODE = "record-track";
private static final String DEFAULT_BUTTON_CODE = BUTTON_HELP_CODE;
private final String leftButtonPreferenceKey;
private final SharedPreferences prefs;
private final Map<String, LeftButton> availableButtons = new LinkedHashMap<>();
private LeftButtonsHolder(Context context)
{
this.prefs = PreferenceManager.getDefaultSharedPreferences(context);
this.leftButtonPreferenceKey = context.getString(R.string.pref_left_button);
initDisableButton(context);
}
public void registerButton(LeftButton button)
{
availableButtons.put(button.getCode(), button);
}
@Nullable
public LeftButton getActiveButton()
{
String activeButtonCode = prefs.getString(leftButtonPreferenceKey, DEFAULT_BUTTON_CODE);
if (!TextUtils.isEmpty(activeButtonCode))
return availableButtons.get(activeButtonCode);
else
return null;
}
public Collection<LeftButton> getAllButtons()
{
return availableButtons.values();
}
public static LeftButtonsHolder getInstance(Context context)
{
LeftButtonsHolder localInstance = instance;
if (localInstance == null)
{
synchronized (LeftButtonsHolder.class)
{
localInstance = instance;
if (localInstance == null)
{
instance = localInstance = new LeftButtonsHolder(context);
}
}
}
return localInstance;
}
private void initDisableButton(Context context)
{
availableButtons.put(DISABLE_BUTTON_CODE, new LeftButton()
{
@Override
public String getCode()
{
return DISABLE_BUTTON_CODE;
}
@Override
public String getPrefsName()
{
return context.getString(R.string.pref_left_button_disable);
}
}
);
}
}

View File

@@ -1,6 +0,0 @@
package app.organicmaps.leftbutton;
public interface LeftToggleButton extends LeftButton
{
void setChecked(boolean checked);
}

View File

@@ -213,7 +213,7 @@ public class LocationHelper implements BaseLocationProvider.Listener
if (mSavedLocation != null)
{
if (!LocationUtils.isLocationBetterThanLast(location, mSavedLocation))
if (!LocationUtils.isFromFusedProvider(location) && !LocationUtils.isLocationBetterThanLast(location, mSavedLocation))
{
Logger.d(TAG, "The new " + location + " is worse than the last " + mSavedLocation);
return;

View File

@@ -2,7 +2,6 @@ package app.organicmaps.location;
import android.content.Context;
import android.location.Location;
import android.os.SystemClock;
import androidx.annotation.NonNull;
@@ -58,7 +57,6 @@ class RouteSimulationProvider extends BaseLocationProvider
location.setLatitude(mPoints[mCurrentPoint].mLat);
location.setLongitude(mPoints[mCurrentPoint].mLon);
location.setAccuracy(1.0f);
location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
mListener.onLocationChanged(location);
mCurrentPoint += 1;
UiThread.runLater(this::nextPoint, INTERVAL_MS);

View File

@@ -1,8 +1,5 @@
package app.organicmaps.maplayer;
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_HELP_CODE;
import static app.organicmaps.leftbutton.LeftButtonsHolder.DISABLE_BUTTON_CODE;
import android.animation.ArgbEvaluator;
import android.animation.ObjectAnimator;
import android.content.Context;
@@ -36,8 +33,8 @@ import app.organicmaps.maplayer.isolines.IsolinesManager;
import app.organicmaps.maplayer.subway.SubwayManager;
import app.organicmaps.maplayer.traffic.TrafficManager;
import app.organicmaps.routing.RoutingController;
import app.organicmaps.leftbutton.LeftButton;
import app.organicmaps.leftbutton.LeftToggleButton;
import app.organicmaps.universalbuttons.UniversalButton;
import app.organicmaps.universalbuttons.UniversalToggleButton;
import app.organicmaps.util.Config;
import app.organicmaps.util.ThemeUtils;
import app.organicmaps.util.UiUtils;
@@ -84,11 +81,11 @@ public class MapButtonsController extends Fragment
private final Observer<Boolean> mTrackRecorderObserver = (enable) -> {
updateMenuBadge(enable);
showButton(enable, MapButtons.trackRecordingStatus);
updateLeftButtonToggleState(enable);
updateUniversalButtonState(enable);
};
private final Observer<Integer> mTopButtonMarginObserver = this::updateTopButtonsMargin;
private LeftButton mLeftButton;
private UniversalButton mUniversalButton;
@Nullable
@Override
@@ -156,7 +153,7 @@ public class MapButtonsController extends Fragment
private void initBottomButtons()
{
// universal button
applyLeftButton();
applyUniversalButton();
// bookmarks button
View bookmarksButton = mFrame.findViewById(R.id.btn_bookmarks);
@@ -193,32 +190,32 @@ public class MapButtonsController extends Fragment
}
}
private void applyLeftButton()
private void applyUniversalButton()
{
FloatingActionButton leftButtonView = mFrame.findViewById(R.id.left_button);
if (leftButtonView != null && mLeftButton != null && !mLeftButton.getCode().equals(DISABLE_BUTTON_CODE))
FloatingActionButton universalButtonView = mFrame.findViewById(R.id.universal_button);
if (universalButtonView != null && mUniversalButton != null)
{
UiUtils.show(leftButtonView);
UiUtils.show(universalButtonView);
Context context = getContext();
if (context == null)
return;
leftButtonView.setImageTintList(ColorStateList.valueOf(ThemeUtils.getColor(context, R.attr.iconTint)));
universalButtonView.setImageTintList(ColorStateList.valueOf(ThemeUtils.getColor(context, R.attr.iconTint)));
// Christmas tree with help button
if (Config.isNY() &&
mLeftButton.getCode().equals(BUTTON_HELP_CODE) &&
mUniversalButton.getCode().equals("help") &&
!TextUtils.isEmpty(Config.getDonateUrl(requireContext()))
)
{
leftButtonView.setImageResource(R.drawable.ic_christmas_tree);
leftButtonView.setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.help));
universalButtonView.setImageResource(R.drawable.ic_christmas_tree);
universalButtonView.setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.help));
}
else
{
mLeftButton.drawIcon(leftButtonView);
leftButtonView.setOnClickListener((v) -> mLeftButton.onClick(leftButtonView));
mUniversalButton.drawIcon(universalButtonView);
universalButtonView.setOnClickListener((v) -> mUniversalButton.onClick(universalButtonView));
}
// else
// {
@@ -228,9 +225,9 @@ public class MapButtonsController extends Fragment
// if (!ThemeUtils.isNightTheme(requireContext()))
// helpButton.getDrawable().setTintList(null);
}
else if (leftButtonView != null)
else if (universalButtonView != null)
{
UiUtils.hide(leftButtonView);
UiUtils.hide(universalButtonView);
}
}
@@ -481,8 +478,6 @@ public class MapButtonsController extends Fragment
.setAllSides()
.build();
ViewCompat.setOnApplyWindowInsetsListener(mFrame, insetsListener);
// Fixes insets on older Androids and with a search opened via API on all Androids.
mFrame.post(() -> ViewCompat.requestApplyInsets(mFrame));
}
@Override
@@ -509,24 +504,24 @@ public class MapButtonsController extends Fragment
mSearchWheel.reset();
}
public void setLeftButton(LeftButton leftButton)
public void setUniversalButton(UniversalButton universalButton)
{
this.mLeftButton = leftButton;
this.mUniversalButton = universalButton;
}
public void reloadLeftButton(LeftButton leftButton)
public void reloadUniversalButton(UniversalButton universalButton)
{
setLeftButton(leftButton);
applyLeftButton();
setUniversalButton(universalButton);
applyUniversalButton();
}
private void updateLeftButtonToggleState(boolean isEnabled)
private void updateUniversalButtonState(boolean isEnabled)
{
if (mLeftButton instanceof LeftToggleButton)
if (mUniversalButton instanceof UniversalToggleButton)
{
((LeftToggleButton) mLeftButton).setChecked(isEnabled);
((UniversalToggleButton) mUniversalButton).setChecked(isEnabled);
reloadLeftButton(mLeftButton);
reloadUniversalButton(mUniversalButton);
}
}

View File

@@ -16,6 +16,7 @@ import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.CallSuper;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.ViewCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
@@ -46,7 +47,6 @@ import app.organicmaps.util.WindowInsetUtils;
import app.organicmaps.widget.PlaceholderView;
import app.organicmaps.widget.SearchToolbarController;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
import com.google.android.material.tabs.TabLayout;
@@ -226,7 +226,7 @@ public class SearchFragment extends BaseMwmFragment
private void updateFrames()
{
final boolean hasQuery = mToolbarController.hasQuery();
MaterialToolbar toolbar = mToolbarController.getToolbar();
Toolbar toolbar = mToolbarController.getToolbar();
AppBarLayout.LayoutParams lp = (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
lp.setScrollFlags(hasQuery ? AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS
| AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL : 0);

View File

@@ -1,7 +1,5 @@
package app.organicmaps.settings;
import static app.organicmaps.leftbutton.LeftButtonsHolder.DISABLE_BUTTON_CODE;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
@@ -27,8 +25,8 @@ import app.organicmaps.help.HelpActivity;
import app.organicmaps.location.LocationHelper;
import app.organicmaps.location.LocationProviderFactory;
import app.organicmaps.sdk.routing.RoutingOptions;
import app.organicmaps.leftbutton.LeftButton;
import app.organicmaps.leftbutton.LeftButtonsHolder;
import app.organicmaps.universalbuttons.UniversalButton;
import app.organicmaps.universalbuttons.UniversalButtonsHolder;
import app.organicmaps.util.Config;
import app.organicmaps.util.NetworkPolicy;
import app.organicmaps.util.PowerManagment;
@@ -41,8 +39,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
@@ -77,22 +73,26 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
initSearchPrivacyPrefsCallbacks();
initScreenSleepEnabledPrefsCallbacks();
initShowOnLockScreenPrefsCallbacks();
initLeftButtonPrefs();
initUniversalButtonPrefs();
}
private void initLeftButtonPrefs()
private void initUniversalButtonPrefs()
{
final String leftButtonPreferenceKey = getString(R.string.pref_left_button);
final ListPreference pref = getPreference(leftButtonPreferenceKey);
LeftButtonsHolder holder = LeftButtonsHolder.getInstance(requireContext());
final ListPreference pref = getPreference(UniversalButtonsHolder.KEY_PREF_UNIVERSAL_BUTTON);
UniversalButtonsHolder holder = UniversalButtonsHolder.getInstance(requireContext());
LeftButton currentButton = holder.getActiveButton();
Collection<LeftButton> buttons = holder.getAllButtons();
UniversalButton currentButton = holder.getActiveButton();
Collection<UniversalButton> buttons = holder.getAllButtons();
List<String> entryList = new ArrayList<>(buttons.size());
List<String> valueList = new ArrayList<>(buttons.size());
List<String> entryList = new ArrayList<>(buttons.size() + 1);
List<String> valueList = new ArrayList<>(buttons.size() + 1);
for (LeftButton button : buttons)
String notDisplayId = "not_display";
entryList.add(requireContext().getString(R.string.pref_universal_button_not_display));
valueList.add(notDisplayId);
for (UniversalButton button : buttons)
{
entryList.add(button.getPrefsName());
valueList.add(button.getCode());
@@ -108,8 +108,8 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
}
else
{
pref.setSummary(R.string.pref_left_button_disable);
pref.setValue(DISABLE_BUTTON_CODE);
pref.setSummary(R.string.pref_universal_button_not_display);
pref.setValue(notDisplayId);
}
pref.setOnPreferenceChangeListener((preference, newValue) -> {
@@ -120,7 +120,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
}
Intent intent = new Intent();
intent.putExtra(leftButtonPreferenceKey, newValue.toString());
intent.putExtra(UniversalButtonsHolder.KEY_PREF_UNIVERSAL_BUTTON, newValue.toString());
requireActivity().setResult(-1, intent);

View File

@@ -0,0 +1,14 @@
package app.organicmaps.universalbuttons;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
public interface UniversalButton
{
String getCode();
String getPrefsName();
void drawIcon(FloatingActionButton imageView);
void onClick(FloatingActionButton universalButtonView);
}

View File

@@ -0,0 +1,109 @@
package app.organicmaps.universalbuttons;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.text.TextUtils;
import androidx.annotation.Nullable;
import androidx.preference.PreferenceManager;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import app.organicmaps.MwmApplication;
import app.organicmaps.R;
import app.organicmaps.help.HelpActivity;
public class UniversalButtonsHolder
{
private static volatile UniversalButtonsHolder instance;
public static final String KEY_PREF_UNIVERSAL_BUTTON = "universal_button";
private static final String BUTTON_HELP_CODE = "help";
public static final String BUTTON_SETTINGS_CODE = "settings";
public static final String BUTTON_ADD_PLACE_CODE = "add-place";
public static final String BUTTON_RECORD_TRACK_CODE = "record-track";
private static final String DEFAULT_BUTTON_CODE = BUTTON_HELP_CODE;
private final Context context;
private final SharedPreferences prefs;
private final Map<String, UniversalButton> availableButtons = new HashMap<>();
private UniversalButtonsHolder(Context context)
{
this.context = context;
this.prefs = PreferenceManager.getDefaultSharedPreferences(context);
}
public void registerButton(UniversalButton button)
{
availableButtons.put(button.getCode(), button);
}
public void registerDefaultUniversalButtons(Context context)
{
registerButton(new UniversalButton()
{
@Override
public String getCode()
{
return BUTTON_HELP_CODE;
}
@Override
public String getPrefsName()
{
return context.getString(R.string.help);
}
@Override
public void drawIcon(FloatingActionButton imageView)
{
imageView.setImageResource(R.drawable.ic_question_mark);
}
@Override
public void onClick(FloatingActionButton universalButtonView)
{
Intent intent = new Intent(context, HelpActivity.class);
context.startActivity(intent);
}
});
}
@Nullable
public UniversalButton getActiveButton()
{
String activeButtonCode = prefs.getString(KEY_PREF_UNIVERSAL_BUTTON, DEFAULT_BUTTON_CODE);
if (!TextUtils.isEmpty(activeButtonCode))
return availableButtons.get(activeButtonCode);
else
return null;
}
public Collection<UniversalButton> getAllButtons()
{
return availableButtons.values();
}
public static UniversalButtonsHolder getInstance(Context context)
{
UniversalButtonsHolder localInstance = instance;
if (localInstance == null)
{
synchronized (UniversalButtonsHolder.class)
{
localInstance = instance;
if (localInstance == null)
{
instance = localInstance = new UniversalButtonsHolder(context);
}
}
}
return localInstance;
}
}

View File

@@ -0,0 +1,8 @@
package app.organicmaps.universalbuttons;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
public interface UniversalToggleButton extends UniversalButton
{
void setChecked(boolean checked);
}

View File

@@ -13,7 +13,7 @@ public final class Constants
public static class Url
{
public static final String SHORT_SHARE_PREFIX = "cm://";
public static final String HTTP_SHARE_PREFIX = "https://comaps.at/";
public static final String HTTP_SHARE_PREFIX = "https://comaps.app/";
public static final String MAILTO_SCHEME = "mailto:";
public static final String MAIL_SUBJECT = "?subject=";
@@ -23,6 +23,7 @@ public final class Constants
public static final String MASTODON = "https://floss.social/@comaps";
public static final String FB_OM_COMMUNITY_HTTP = "https://www.facebook.com/profile.php?id=61575286559965";
public static final String FB_OM_COMMUNITY_NATIVE = "fb://profile/61575286559965";
//public static final String TWITTER = "https://twitter.com/user";
public static final String CODE_REPO = "https://codeberg.org/comaps/comaps";

View File

@@ -84,9 +84,6 @@ public class LocationUtils
public static boolean isLocationBetterThanLast(@NonNull Location newLocation, @NonNull Location lastLocation)
{
if (newLocation.getElapsedRealtimeNanos() < lastLocation.getElapsedRealtimeNanos())
return false;
// As described in isAccuracySatisfied, GPS may have zero accuracy "for some reasons".
if (isFromGpsProvider(lastLocation) && lastLocation.getAccuracy() == 0.0f)
return true;

View File

@@ -27,6 +27,7 @@ import androidx.annotation.DimenRes;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.core.content.res.ResourcesCompat;
import androidx.core.graphics.Insets;
@@ -36,8 +37,6 @@ import androidx.core.view.WindowInsetsControllerCompat;
import androidx.recyclerview.widget.RecyclerView;
import app.organicmaps.MwmApplication;
import app.organicmaps.R;
import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.textfield.TextInputLayout;
import java.util.Objects;
@@ -194,7 +193,7 @@ public final class UiUtils
hide(tv);
}
public static void showHomeUpButton(MaterialToolbar toolbar)
public static void showHomeUpButton(Toolbar toolbar)
{
toolbar.setNavigationIcon(ThemeUtils.getResource(toolbar.getContext(), androidx.appcompat.R.attr.homeAsUpIndicator));
}
@@ -298,7 +297,7 @@ public final class UiUtils
systemInsets.right, view.getPaddingBottom());
}
public static void setupNavigationIcon(@NonNull MaterialToolbar toolbar,
public static void setupNavigationIcon(@NonNull Toolbar toolbar,
@NonNull View.OnClickListener listener)
{
View customNavigationButton = toolbar.findViewById(R.id.back);
@@ -312,14 +311,14 @@ public final class UiUtils
}
}
public static void setupHomeUpButtonAsNavigationIcon(@NonNull MaterialToolbar toolbar,
public static void setupHomeUpButtonAsNavigationIcon(@NonNull Toolbar toolbar,
@NonNull View.OnClickListener listener)
{
UiUtils.showHomeUpButton(toolbar);
toolbar.setNavigationOnClickListener(listener);
}
public static void clearHomeUpButton(@NonNull MaterialToolbar toolbar)
public static void clearHomeUpButton(@NonNull Toolbar toolbar)
{
toolbar.setNavigationIcon(null);
toolbar.setNavigationOnClickListener(null);

View File

@@ -3,15 +3,14 @@ package app.organicmaps.util.bottomsheet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.R;
import app.organicmaps.location.TrackRecorder;
import app.organicmaps.util.Config;
@@ -50,7 +49,7 @@ public class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.ViewHolder>
public void onBindViewHolder(ViewHolder viewHolder, final int position)
{
final MenuBottomSheetItem item = dataSet.get(position);
final ShapeableImageView iv = viewHolder.getIconImageView();
final ImageView iv = viewHolder.getIconImageView();
if (item.iconRes == R.drawable.ic_donate && Config.isNY())
{
iv.setImageResource(R.drawable.ic_christmas_tree);
@@ -60,7 +59,7 @@ public class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.ViewHolder>
iv.setImageResource(item.iconRes);
viewHolder.getContainer().setOnClickListener((v) -> onMenuItemClick(item));
viewHolder.getTitleTextView().setText(item.titleRes);
MaterialTextView badge = viewHolder.getBadgeTextView();
TextView badge = viewHolder.getBadgeTextView();
if (item.badgeCount > 0)
{
badge.setText(String.valueOf(item.badgeCount));
@@ -88,9 +87,9 @@ public class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.ViewHolder>
public static class ViewHolder extends RecyclerView.ViewHolder
{
private final LinearLayout container;
private final ShapeableImageView iconImageView;
private final MaterialTextView titleTextView;
private final MaterialTextView badgeTextView;
private final ImageView iconImageView;
private final TextView titleTextView;
private final TextView badgeTextView;
public ViewHolder(View view)
{
@@ -101,17 +100,17 @@ public class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.ViewHolder>
badgeTextView = view.findViewById(R.id.bottom_sheet_menu_item_badge);
}
public ShapeableImageView getIconImageView()
public ImageView getIconImageView()
{
return iconImageView;
}
public MaterialTextView getTitleTextView()
public TextView getTitleTextView()
{
return titleTextView;
}
public MaterialTextView getBadgeTextView()
public TextView getBadgeTextView()
{
return badgeTextView;
}

View File

@@ -7,6 +7,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -19,7 +20,6 @@ import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import com.google.android.material.textview.MaterialTextView;
import java.util.ArrayList;
import java.util.Objects;
@@ -93,7 +93,7 @@ public class MenuBottomSheetFragment extends BottomSheetDialogFragment
{
super.onViewCreated(view, savedInstanceState);
attachToNearestContext();
MaterialTextView titleView = view.findViewById(R.id.bottomSheetTitle);
TextView titleView = view.findViewById(R.id.bottomSheetTitle);
RecyclerView recyclerView = view.findViewById(R.id.bottomSheetMenuContainer);
if (getArguments() != null)
{

View File

@@ -9,10 +9,8 @@ import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.ViewCompat;
import com.google.android.material.appbar.MaterialToolbar;
import app.organicmaps.R;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
@@ -23,7 +21,7 @@ public class ToolbarController
@Nullable
private Activity mActivity;
@NonNull
private final MaterialToolbar mToolbar;
private final Toolbar mToolbar;
@NonNull
protected final View.OnClickListener mNavigationClickListener = view -> onUpClick();
@@ -41,7 +39,7 @@ public class ToolbarController
setSupportActionBar(activity, mToolbar);
}
private void setSupportActionBar(@NonNull Activity activity, @NonNull MaterialToolbar toolbar)
private void setSupportActionBar(@NonNull Activity activity, @NonNull Toolbar toolbar)
{
AppCompatActivity appCompatActivity = (AppCompatActivity) activity;
appCompatActivity.setSupportActionBar(toolbar);
@@ -88,7 +86,7 @@ public class ToolbarController
}
@NonNull
public MaterialToolbar getToolbar()
public Toolbar getToolbar()
{
return mToolbar;
}

View File

@@ -14,6 +14,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowCompat;
import androidx.core.view.WindowInsetsCompat;
@@ -32,8 +33,6 @@ import app.organicmaps.util.Graphics;
import app.organicmaps.util.InputUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;
@@ -204,7 +203,7 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
private void initToolbar(View view)
{
MaterialToolbar toolbar = view.findViewById(R.id.toolbar);
Toolbar toolbar = view.findViewById(R.id.toolbar);
ViewCompat.setOnApplyWindowInsetsListener(toolbar, PaddingInsetsListener.excludeBottom());

View File

@@ -18,6 +18,7 @@ import android.widget.TextView;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
@@ -51,8 +52,6 @@ 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 java.util.ArrayList;
@@ -87,7 +86,7 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
private View mFrame;
// Preview.
private ViewGroup mPreview;
private MaterialToolbar mToolbar;
private Toolbar mToolbar;
private TextView mTvTitle;
private TextView mTvSecondaryTitle;
private TextView mTvSubtitle;

View File

@@ -6,7 +6,7 @@
android:viewportHeight="80">
<path
android:pathData="m4.858,10.076c0,-5.523 4.477,-10 10,-10h60c5.523,0 10,4.477 10,10v60c0,5.523 -4.477,10 -10,10h-60c-5.523,0 -10,-4.477 -10,-10z"
android:fillColor="@color/active_track_recording"
android:fillColor="#0057ff"
android:fillAlpha="0.78" />
<path
android:pathData="m78.907,32.87 l-31.833,13.318 13.335,5.772 6.188,13.147z"

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="?attr/menuBackground"/>
<solid android:color="#FFFFFF"/>
<corners android:radius="10dp"/>
<padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" />
</shape>

View File

@@ -3,5 +3,5 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="12dp" />
<solid android:color="@color/active_track_recording" />
<solid android:color="#0057ff" />
</shape>

View File

@@ -52,15 +52,5 @@
android:layout_marginTop="@dimen/margin_direction_mid"
android:textSize="@dimen/text_direction_dist"
tools:text="9000 km"/>
<TextView
android:id="@+id/tv__azimuth"
style="@style/MwmWidget.TextView.Direction"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_direction_small"
android:gravity="center_horizontal"
android:textSize="@dimen/text_direction_subtitle"
tools:text="123.4°" />
</LinearLayout>
</RelativeLayout>

View File

@@ -35,7 +35,7 @@
android:layout_weight="1"
android:orientation="vertical"
android:padding="@dimen/margin_base">
<com.google.android.material.textview.MaterialTextView
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -47,7 +47,7 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.imageview.ShapeableImageView
<ImageView
android:id="@+id/imageView"
android:layout_width="@dimen/osm_logo"
android:layout_height="@dimen/osm_logo"
@@ -56,7 +56,7 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.textview.MaterialTextView
<TextView
android:id="@+id/osm_presentation"
android:layout_width="0dp"
android:layout_height="wrap_content"
@@ -108,7 +108,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/margin_base">
<com.google.android.material.button.MaterialButton
<Button
android:id="@+id/login"
style="@style/MwmWidget.Button.Accent"
android:layout_width="match_parent"
@@ -123,7 +123,7 @@
android:elevation="@dimen/design_fab_elevation"
android:visibility="gone" />
</FrameLayout>
<com.google.android.material.button.MaterialButton
<Button
android:id="@+id/lost_password"
style="@style/MwmWidget.Button"
android:layout_width="match_parent"
@@ -138,14 +138,14 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_base"
android:layout_marginBottom="@dimen/margin_base" />
<com.google.android.material.textview.MaterialTextView
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@string/robotoRegular"
android:text="@string/no_osm_account"
android:textAppearance="@style/MwmTextAppearance.Body2"
android:textColor="?android:textColorPrimary" />
<com.google.android.material.button.MaterialButton
<Button
android:id="@+id/register"
style="@style/MwmWidget.Button.Accent"
android:layout_width="match_parent"

View File

@@ -9,7 +9,7 @@
android:clipChildren="false"
android:clipToPadding="false">
<include
android:id="@+id/left_button"
android:id="@+id/universal_button"
layout="@layout/map_buttons_help"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -25,7 +25,7 @@
android:layout_marginStart="@dimen/margin_base_plus"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_goneMarginStart="@dimen/margin_half_plus"
app:layout_constraintStart_toEndOf="@+id/left_button" />
app:layout_constraintStart_toEndOf="@+id/universal_button" />
<include
android:id="@+id/btn_bookmarks"
layout="@layout/map_buttons_bookmarks_square"

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<merge
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/accept_btn"
style="@style/MwmWidget.Button.Primary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/accept"/>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/sharing_options_img_size">
<TextView
android:id="@+id/decline_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="?attr/selectableItemBackground"
android:fontFamily="@string/robotoMedium"
android:gravity="center"
android:letterSpacing="0.01"
android:textAllCaps="true"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textSize="@dimen/text_size_body_3"
android:textStyle="normal"
android:text="@string/learn_more"
tools:ignore="UnusedAttribute"
tools:text="NOT NOW" />
</FrameLayout>
</LinearLayout>
</merge>

View File

@@ -8,7 +8,7 @@
android:gravity="center"
android:orientation="vertical">
<com.google.android.material.imageview.ShapeableImageView
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="32dp"
@@ -22,7 +22,7 @@
android:gravity="center"
android:orientation="vertical">
<com.google.android.material.textview.MaterialTextView
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
@@ -31,7 +31,7 @@
android:textAppearance="@style/TextAppearance.MaterialComponents.Headline4"
android:textStyle="bold" />
<com.google.android.material.textview.MaterialTextView
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/car_used_on_the_car_screen"
@@ -39,7 +39,7 @@
android:textAppearance="@style/TextAppearance.MaterialComponents.Body1" />
</LinearLayout>
<com.google.android.material.button.MaterialButton
<Button
android:id="@+id/btn_continue"
style="@style/MwmWidget.Button.Accent"
android:layout_width="match_parent"

View File

@@ -7,13 +7,13 @@
android:gravity="center"
android:orientation="vertical">
<com.google.android.material.imageview.ShapeableImageView
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="32dp"
app:srcCompat="@drawable/ic_location_permission_request" />
<com.google.android.material.textview.MaterialTextView
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="32dp"
@@ -23,7 +23,7 @@
android:textAppearance="@style/TextAppearance.MaterialComponents.Headline4"
android:textStyle="bold" />
<com.google.android.material.button.MaterialButton
<Button
android:id="@+id/btn_grant_permissions"
style="@style/MwmWidget.Button.Accent"
android:layout_width="match_parent"

View File

@@ -13,7 +13,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<com.google.android.material.textview.MaterialTextView
<TextView
android:id="@+id/bottomSheetTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@@ -4,7 +4,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.imageview.ShapeableImageView
<ImageView
android:layout_width="match_parent"
android:layout_height="4dp"
android:layout_marginTop="@dimen/margin_quarter"

View File

@@ -11,14 +11,14 @@
android:background="?clickableBackground"
android:orientation="horizontal">
<com.google.android.material.imageview.ShapeableImageView
<ImageView
android:id="@+id/bottom_sheet_menu_item_icon"
android:layout_width="@dimen/bookmark_icon_size"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
tools:src="@drawable/ic_menu_download"
app:tint="?android:textColorSecondary"/>
<com.google.android.material.textview.MaterialTextView
<TextView
android:id="@+id/bottom_sheet_menu_item_text"
android:textAppearance="@style/MwmTextAppearance.Body1"
android:layout_width="0dp"
@@ -29,7 +29,7 @@
android:gravity="center_vertical"
android:singleLine="true"
tools:text="Menu Item" />
<com.google.android.material.textview.MaterialTextView
<TextView
android:id="@+id/bottom_sheet_menu_item_badge"
style="@style/MwmWidget.Counter"
android:layout_gravity="end|center_vertical"

View File

@@ -6,7 +6,7 @@
android:background="?cardBackground"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
style="@style/MwmWidget.ToolbarStyle"
android:layout_width="match_parent"

View File

@@ -6,7 +6,7 @@
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
style="@style/MwmWidget.ToolbarStyle"
android:layout_width="match_parent"
@@ -15,7 +15,7 @@
android:gravity="end|center_vertical"
android:theme="@style/MwmWidget.ToolbarTheme"
tools:ignore="UnusedAttribute">
</com.google.android.material.appbar.MaterialToolbar>
</androidx.appcompat.widget.Toolbar>
<LinearLayout
android:layout_marginTop="@dimen/margin_half_double_plus"
android:orientation="horizontal"

View File

@@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?windowBackgroundForced">
<com.google.android.material.appbar.MaterialToolbar
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
style="@style/MwmWidget.ToolbarStyle"
android:layout_width="match_parent"
@@ -22,7 +22,7 @@
android:layout_gravity="end|center_vertical"
android:scaleType="centerInside"
android:contentDescription="@string/save" />
</com.google.android.material.appbar.MaterialToolbar>
</androidx.appcompat.widget.Toolbar>
<FrameLayout
style="@style/MwmWidget.FrameLayout.Elevation"
android:layout_width="match_parent"

View File

@@ -228,9 +228,7 @@
android:id="@+id/block_email"
layout="@layout/item_editor_input"/>
<include
android:id="@+id/block_level"
layout="@layout/item_editor_input"/>
<!-- ToDo: Level is missing compared with iOS. -->
<RelativeLayout
android:id="@+id/block_wifi"

View File

@@ -7,7 +7,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">
<com.google.android.material.appbar.MaterialToolbar
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
style="@style/MwmWidget.ToolbarStyle"
android:layout_width="match_parent"
@@ -43,7 +43,7 @@
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.appbar.MaterialToolbar>
</androidx.appcompat.widget.Toolbar>
<FrameLayout
android:id="@+id/fragment_container"

View File

@@ -26,7 +26,7 @@
android:orientation="vertical"
android:padding="@dimen/margin_base"
tools:ignore="ScrollViewSize">
<com.google.android.material.textview.MaterialTextView
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -39,7 +39,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/margin_base">
<com.google.android.material.imageview.ShapeableImageView
<ImageView
android:id="@+id/osm_logo"
android:layout_width="@dimen/osm_logo"
android:layout_height="@dimen/osm_logo"
@@ -48,7 +48,7 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.textview.MaterialTextView
<TextView
android:id="@+id/osm_presentation"
android:layout_width="0dp"
android:layout_height="wrap_content"
@@ -92,7 +92,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/margin_base">
<com.google.android.material.button.MaterialButton
<Button
android:id="@+id/login"
style="@style/MwmWidget.Button.Accent"
android:layout_width="match_parent"
@@ -107,7 +107,7 @@
android:elevation="@dimen/design_fab_elevation"
android:visibility="gone" />
</FrameLayout>
<com.google.android.material.button.MaterialButton
<Button
android:id="@+id/lost_password"
style="@style/MwmWidget.Button"
android:layout_width="wrap_content"
@@ -122,14 +122,14 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_base"
android:layout_marginBottom="@dimen/margin_base" />
<com.google.android.material.textview.MaterialTextView
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@string/robotoRegular"
android:text="@string/no_osm_account"
android:textAppearance="@style/MwmTextAppearance.Body2"
android:textColor="?android:textColorPrimary" />
<com.google.android.material.button.MaterialButton
<Button
android:id="@+id/register"
style="@style/MwmWidget.Button.Accent"
android:layout_width="match_parent"

View File

@@ -6,7 +6,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.appbar.MaterialToolbar
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
style="@style/MwmWidget.ToolbarStyle"
android:layout_width="match_parent"
@@ -15,7 +15,7 @@
android:gravity="end|center_vertical"
android:theme="@style/MwmWidget.ToolbarTheme"
tools:ignore="UnusedAttribute">
<com.google.android.material.imageview.ShapeableImageView
<ImageView
android:id="@+id/logout"
android:layout_width="?actionBarSize"
android:layout_height="?actionBarSize"
@@ -24,7 +24,7 @@
android:scaleType="center"
app:srcCompat="@drawable/ic_logout"
android:contentDescription="@string/logout" />
</com.google.android.material.appbar.MaterialToolbar>
</androidx.appcompat.widget.Toolbar>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -44,7 +44,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="horizontal">
<com.google.android.material.imageview.ShapeableImageView
<ImageView
android:id="@+id/user_profile_image"
android:layout_width="100dp"
android:layout_height="match_parent"
@@ -57,7 +57,7 @@
android:layout_weight="1"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.google.android.material.textview.MaterialTextView
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/user_profile_name"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -68,7 +68,7 @@
android:autoSizeTextType="uniform"
android:textSize="25sp"
tools:text="Long Username" />
<com.google.android.material.textview.MaterialTextView
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/user_sent_edits"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -76,7 +76,7 @@
android:textSize="35sp"
android:textStyle="bold"
tools:text="2,000,000" />
<com.google.android.material.textview.MaterialTextView
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/verified_changes_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -93,7 +93,7 @@
android:layout_height="0dp"
android:layout_weight="1">
<com.google.android.material.textview.MaterialTextView
<TextView
android:id="@+id/osm_history"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -110,7 +110,7 @@
android:textColor="?colorAccent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.textview.MaterialTextView
<TextView
android:id="@+id/osm_notes"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -126,7 +126,7 @@
android:textColor="?colorAccent"
app:layout_constraintTop_toBottomOf="@id/osm_history" />
<com.google.android.material.textview.MaterialTextView
<TextView
android:id="@+id/about_osm"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@@ -6,7 +6,7 @@
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.appbar.MaterialToolbar
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
style="@style/MwmWidget.ToolbarStyle"
android:layout_width="match_parent"
@@ -18,7 +18,7 @@
android:id="@+id/save"
style="@style/MwmWidget.Downloader.ToolbarButton"
android:text="@string/editor_report_problem_send_button"/>
</com.google.android.material.appbar.MaterialToolbar>
</androidx.appcompat.widget.Toolbar>
<ScrollView
android:id="@+id/scrollView"

View File

@@ -9,10 +9,9 @@
<CheckBox
android:id="@+id/checkbox"
android:layout_width="@dimen/margin_double_plus"
android:layout_height="wrap_content"
android:layout_height="match_parent"
android:layout_centerVertical="true"
android:layout_alignParentTop="true"
android:layout_alignBottom="@id/bottom_line_container"
android:layout_marginStart="@dimen/margin_quarter"
android:background="@null"
android:button="@drawable/button_visibility_centre_inset"
android:buttonTint="?accentColorSelector" />
@@ -33,7 +32,7 @@
android:layout_height="wrap_content"
android:layout_below="@id/name"
android:layout_alignStart="@id/name"
android:paddingBottom="@dimen/margin_half_plus"
android:layout_marginBottom="@dimen/margin_half_plus"
android:layout_toStartOf="@id/more"
android:orientation="horizontal">
<TextView
@@ -49,11 +48,9 @@
<ImageView
android:id="@+id/more"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_alignParentTop="true"
android:layout_alignBottom="@id/bottom_line_container"
android:background="?selectableItemBackgroundBorderless"
android:importantForAccessibility="no"
android:paddingHorizontal="@dimen/margin_half"

View File

@@ -13,7 +13,7 @@
android:clipChildren="false"
android:clipToPadding="false">
<include
android:id="@+id/left_button"
android:id="@+id/universal_button"
layout="@layout/map_buttons_help"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -32,7 +32,7 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/btn_bookmarks"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/left_button" />
app:layout_constraintStart_toEndOf="@+id/universal_button" />
<include
android:id="@+id/btn_bookmarks"
layout="@layout/map_buttons_bookmarks_square"

View File

@@ -16,6 +16,7 @@
android:clipChildren="false"
android:layout_gravity="center"
android:gravity="center_horizontal"
android:backgroundTint="?menuBackground"
android:background="@drawable/onmap_downloader_background"
tools:ignore="UselessParent">

View File

@@ -6,7 +6,7 @@
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.appbar.MaterialToolbar
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar_point_chooser"
style="@style/MwmWidget.ToolbarStyle"
android:layout_width="match_parent"
@@ -41,7 +41,7 @@
</LinearLayout>
</com.google.android.material.appbar.MaterialToolbar>
</androidx.appcompat.widget.Toolbar>
<TextView
android:layout_width="match_parent"

View File

@@ -11,7 +11,7 @@
<FrameLayout android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
style="@style/MwmWidget.ToolbarStyle"
android:theme="@style/MwmWidget.ToolbarTheme"
@@ -131,7 +131,7 @@
</RelativeLayout>
</com.google.android.material.appbar.MaterialToolbar>
</androidx.appcompat.widget.Toolbar>
</FrameLayout>
<FrameLayout
android:id="@+id/driving_options_btn_container"

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.appbar.MaterialToolbar
<androidx.appcompat.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
style="@style/MwmWidget.ToolbarStyle"

View File

@@ -4,7 +4,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.google.android.material.appbar.MaterialToolbar
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
style="@style/MwmWidget.ToolbarStyle"
android:layout_width="match_parent"

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.appbar.MaterialToolbar
<androidx.appcompat.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
style="@style/MwmWidget.ToolbarStyle"

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.appbar.MaterialToolbar
<androidx.appcompat.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
style="@style/MwmWidget.ToolbarStyle.NoElevation"
@@ -11,4 +11,4 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"/>
</com.google.android.material.appbar.MaterialToolbar>
</androidx.appcompat.widget.Toolbar>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.appbar.MaterialToolbar
<androidx.appcompat.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
style="@style/MwmWidget.ToolbarStyle"
@@ -13,4 +13,4 @@
android:orientation="vertical">
<include layout="@layout/toolbar_search_controls" />
</LinearLayout>
</com.google.android.material.appbar.MaterialToolbar>
</androidx.appcompat.widget.Toolbar>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.appbar.MaterialToolbar
<androidx.appcompat.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
style="@style/MwmWidget.ToolbarStyle.NoElevation"
@@ -12,4 +12,4 @@
android:orientation="vertical">
<include layout="@layout/toolbar_search_controls" />
</LinearLayout>
</com.google.android.material.appbar.MaterialToolbar>
</androidx.appcompat.widget.Toolbar>

View File

@@ -484,6 +484,7 @@
<string name="download_over_mobile_header">Laai af oor n mobieledataverbinding?</string>
<string name="download_over_mobile_message">Dit kan behoorlik duur wees met sommige planne of indien dooldata aktief is.</string>
<string name="error_enter_correct_house_number">Voer n geldige gebounommer in</string>
<string name="editor_storey_number">Aantal verdiepings (maksimum van %d)</string>
<!-- Error message in Editor when a user tries to set the number of floors for a building higher than %d floors -->
<string name="error_enter_correct_storey_number">Die aantal verdiepings mag nie %d oorskry nie</string>
<string name="editor_zip_code">Poskode</string>

View File

@@ -510,6 +510,7 @@
<string name="download_over_mobile_header">تنزيل باستخدام بيانات الجوال؟</string>
<string name="download_over_mobile_message">قد يكون هذا مكلفاً جداً في بعض الاحيان أو عند التجوال.</string>
<string name="error_enter_correct_house_number">أدخل رقم بناء صحيح</string>
<string name="editor_storey_number">عدد الطوابق (بحد أقصى %d)</string>
<!-- Error message in Editor when a user tries to set the number of floors for a building higher than %d floors -->
<string name="error_enter_correct_storey_number">يجب ألا يتجاوز عدد طوابق المبنى %d</string>
<string name="editor_zip_code">الرمز البريدي</string>

View File

@@ -45,7 +45,7 @@
<string name="type.amenity.charging_station">محطة شحن</string>
<string name="type.amenity.charging_station.bicycle">محطة شحن الدراجات</string>
<string name="type.amenity.charging_station.motorcar">محطة شحن السيارات</string>
<string name="type.amenity.childcare">حضّانة</string>
<string name="type.amenity.childcare">حضانة</string>
<string name="type.amenity.cinema">سينما</string>
<string name="type.leisure.bowling_alley">صالة بولينج</string>
<string name="type.amenity.clinic">عيادة</string>
@@ -62,7 +62,7 @@
<string name="type.amenity.exhibition_centre">مركز المعرض</string>
<string name="type.amenity.money_transfer">تحويل المال</string>
<string name="type.amenity.music_school">مدرسة موسيقى</string>
<string name="type.amenity.language_school">مدرسة لغات</string>
<string name="type.amenity.language_school">مدرسة لغة</string>
<string name="type.office.diplomatic">سفارة</string>
<string name="type.amenity.fast_food">وجبات سريعة</string>
<string name="type.amenity.ferry_terminal">محطة عبّارات</string>
@@ -1278,7 +1278,4 @@
<string name="type.amenity.dojo">دوجو</string>
<!-- https://wiki.openstreetmap.org/wiki/Tag:leisure=sports_hall -->
<string name="type.leisure.sports_hall">الصالة الرياضية</string>
<string name="type.aerialway.mixed_lift">رفع مختلط</string>
<string name="type.amenity.love_hotel">فندق جب</string>
<string name="type.amenity.studio">معرض</string>
</resources>

View File

@@ -499,6 +499,7 @@
<string name="download_over_mobile_header">Mobil şəbəkə vasitəsilə endirilsin?</string>
<string name="download_over_mobile_message">Bəzi planlarda və ya rouminqlə bu olduqca bahalı hesab oluna bilərr.</string>
<string name="error_enter_correct_house_number">Etibarlı bina nömrəsini daxil edin</string>
<string name="editor_storey_number">Mərtəbə sayı (maks. %d)</string>
<!-- Error message in Editor when a user tries to set the number of floors for a building higher than %d floors -->
<string name="error_enter_correct_storey_number">Mərtəbələrin sayı %d-dən çox olmamalıdır</string>
<string name="editor_zip_code">Poçt kodu</string>

Some files were not shown because too many files have changed in this diff Show More