mirror of
https://codeberg.org/comaps/comaps
synced 2025-12-24 06:53:46 +00:00
Compare commits
14 Commits
release/20
...
generate-2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0ec4a4085d | ||
|
|
b36ffe72a9 | ||
|
|
4a3d15c453 | ||
|
|
150607ac93 | ||
|
|
15e0abfc49 | ||
|
|
5308f02f4d | ||
|
|
26be9a19dc | ||
|
|
2cb1ed517b | ||
|
|
db70b77054 | ||
|
|
9f8d4c8bdb | ||
|
|
fb92edd0f5 | ||
|
|
463b2f0417 | ||
|
|
73f2074c0b | ||
|
|
cc698dba49 |
@@ -1,9 +1,8 @@
|
||||
name: DCO
|
||||
name: dco
|
||||
on: [pull_request]
|
||||
|
||||
jobs:
|
||||
check:
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: codeberg-tiny
|
||||
steps:
|
||||
- name: Check for Developer Certificate of Origin (DCO) compliance
|
||||
uses: https://github.com/KineticCafe/actions-dco@fb284c903a7673a3d4b0bdd104479a6f0d46dae7 # v1.3.6
|
||||
- uses: https://github.com/KineticCafe/actions-dco@v1
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -9,6 +9,7 @@ Makefile.Release
|
||||
object_script.*.Debug
|
||||
object_script.*.Release
|
||||
compile_commands.json
|
||||
*.local.*
|
||||
|
||||
stxxl.errlog
|
||||
stxxl.log
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
../../../../google/java/app/organicmaps/location
|
||||
1
android/app/src/fdroid/java/app/organicmaps/sdk/location
Symbolic link
1
android/app/src/fdroid/java/app/organicmaps/sdk/location
Symbolic link
@@ -0,0 +1 @@
|
||||
../../../../../google/java/app/organicmaps/sdk/location
|
||||
@@ -1 +0,0 @@
|
||||
মানচিত্র নেভিগেশন - আপনার যাত্রা সম্পর্কে আরও জানুন - সম্প্রদায় কর্তৃক পরিচালিত
|
||||
@@ -1 +0,0 @@
|
||||
কোম্যাপস - অফলাইনে হাইকিং, সাইকেলিং ও ড্রাইভিং
|
||||
@@ -0,0 +1 @@
|
||||
সহজ মানচিত্র নেভিগেশন - আপনার যাত্রা সম্পর্কে আরও জানুন - সম্প্রদায় কর্তৃক পরিচালিত
|
||||
1
android/app/src/fdroid/play/listings/bn/title.txt
Normal file
1
android/app/src/fdroid/play/listings/bn/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
কোম্যাপস - অফলাইনে হাইকিং, সাইকেলিং এবং ড্রাইভিং করুন গোপনীয়তা সহ
|
||||
@@ -0,0 +1,7 @@
|
||||
• Data OpenStreetMap k 4. 8.
|
||||
• vylepšené barvy mapy pro vodu, lesy, křoviny, různé vybavení, pěší zóny atd.
|
||||
• přidány stanice lesní stráže, krytých parkovišť pro jízdní kola, únikových her, úschoven zavazadel, partnerských pošt
|
||||
• vylepšeny výškové vrstevnice na 20 m pro některé oblíbené turistické oblasti
|
||||
• podpora více zkratek a aliasů pro vyhledávání
|
||||
• přidání ikon pro vyhledávání a záložky pro rychlé občerstvení, jízdní kola a dobíjecí stanice
|
||||
• plynulejší pohyb šipky pro určení polohy
|
||||
@@ -1,8 +1,7 @@
|
||||
• OpenStreetMap-Daten vom 22. August
|
||||
• Neue Geschwindigkeitsanzeige & Details aufgezeichneter Strecken
|
||||
• Besserer dunkler Modus, neue farbige Labels
|
||||
• Anzeige wann Orte & Öffnungszeiten überprüft wurden
|
||||
• Routenplanung berücksichtigt Stoppschilder, Ampeln & bedingte Einschränkungen.
|
||||
• GPS-Peilung wird statt Kompass bevorzugt & höhere GPS-Frequenz.
|
||||
• Adressen & Notizen im OSM-Editor unterstützt.
|
||||
• Mehr Verbesserungen an UI-Elementen & Kartenstil, alle Details in den Codeberg-Versionshinweisen!
|
||||
• OpenStreetMap-Daten vom 4. August
|
||||
• Verbesserte Farben für Wasser, Wälder, Gestrüpp, verschiedene Einrichtungen, Fussgängerbereiche etc.
|
||||
• Besucherstationen, überdachte Fahrradparkplätze, Escaperooms, Gepäckschließfächer, und Postpartner hinzugefügt
|
||||
• Konturhöhenlinien aktualisiert, bis zu 20m für beliebte Wanderregionen
|
||||
• Unterstützung für mehr Such-Abkürzungen und Synonyme
|
||||
• Such- und Lesezeichen-Symbole für Fast Food, Rad- und Lade-Stationen
|
||||
• Der Positionspfeil bewegt sich gleichmässiger
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
• OpenStreetMap data as of August 22
|
||||
• New current speed indicator, display track info
|
||||
• Improved dark map style, added coloured labels
|
||||
• Display when places & opening hours were last checked
|
||||
• Routing now considers turns, stop signs, lights & conditional restrictions
|
||||
• Prefer GPS bearing over compass and increase location poll rate
|
||||
• Enable adding standalone addresses & notes in the editor
|
||||
• Various UI element & map style improvements
|
||||
Check our Codeberg release notes for more changes!
|
||||
• OpenStreetMap data as of August 4
|
||||
• improve map colors for water, forests, scrubs, various amenities, pedestrian areas etc.
|
||||
• add ranger stations, covered bicycle parkings, escape games, luggage lockers, post office partners
|
||||
• upgrade altitude contour lines to 20m step for some popular hiking regions
|
||||
• support more search abbreviations and aliases
|
||||
• add search and bookmark icons for fast food, bicycle and charging stations
|
||||
• more smooth position arrow movements
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
• Datos de OSM a 22-08-2025
|
||||
• Nuevo indicador de velocidad e información de pista
|
||||
• Modo oscuro mejorado y nombres de POI coloreados
|
||||
• Indicador de última revisión de lugares y horarios de apertura
|
||||
• Rutas mejoradas teniendo en cuenta giros, señales de STOP, semáforos y restricciones
|
||||
• Mayor precisión para determinar tu localización y sentido
|
||||
• Añade direcciones y notas con el editor
|
||||
• Otras mejoras en elementos de la interfaz y estilo del mapa
|
||||
Entra en nuestro Codeberg para más cambios!
|
||||
• Datos de OpenStreetMap a fecha 2025.08.04
|
||||
• Mejora de colores del mapa para agua, bosques, matorrales, servicios, zonas peatonales, etc.
|
||||
• Añadidas estaciones de guardabosques, aparcamientos cubiertos de bicis, juegos de escape, consignas y oficinas de correo
|
||||
• Nuevas curvas de nivel (20 m) en regiones populares para senderismo
|
||||
• Más abreviaturas y alias de búsqueda
|
||||
• Iconos de búsqueda y marcadores para comida rápida, bicicletas y estaciones de recarga
|
||||
• Más fluidez de la flecha de posición
|
||||
|
||||
@@ -1 +1 @@
|
||||
CoMaps - کوهنوردی، دوچرخهسواری و رانندگی آفلاین
|
||||
CoMaps - کوه نوردی، دوچرخه سواری و رانندگی افلاین و خصوصی
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
• Données OSM du 22 août
|
||||
• Nouvel indicateur de vitesse et détails des pistes
|
||||
• Amélioration du style sombre, ajout de labels colorées
|
||||
• Affichage de la date de dernière vérification d'un lieu
|
||||
• Support dans le routage des virages, signalisations et restrictions
|
||||
• Amélioration de la boussole et de la précision GPS
|
||||
• Support des adresses et des notes dans l'éditeur
|
||||
• Diverses améliorations d'UI et du style de la carte
|
||||
Plus d'informations sur notre Codeberg
|
||||
@@ -1 +1 @@
|
||||
CoMaps - Pješačite, biciklirajte, vozite Offline
|
||||
CoMaps - Pješačite, biciklirajte, vozite Offline i privatno
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
A CoMaps egy közösség által létrehozott, ingyenes és nyílt forráskódú térképalkalmazás, amely az OpenStreetMap térképadatain alapul, és amelyet az átláthatóság, a magánélet védelme és a nonprofit jelleg iránti elkötelezettség erősít. A CoMaps az Organic Maps villája, amely viszont a Maps.ME villája.
|
||||
|
||||
A projekt előzményeiről és az irányáról a <b><i>codeberg.org/comaps</i></b> oldalon olvashatsz.
|
||||
Csatlakozz ott a közösséghez, és segíts a legjobb térképalkalmazás elkészítésében.
|
||||
• Használd az alkalmazást és terjeszd a hírét
|
||||
• Adj visszajelzést és jelentsd a problémákat
|
||||
• Frissítsd és javítsd a térképadatokat az alkalmazásban vagy az OpenStreetMap weboldalán.
|
||||
|
||||
‣ <b>Offline-fókuszú:</b> Tervezd meg és navigáld külföldi útad mobilszolgáltatás nélkül, keress útpontokat egy távoli túra során stb. Az alkalmazás minden funkcióját úgy terveztük, hogy internetkapcsolat nélkül is működjön.
|
||||
‣ <b>A magánélet tiszteletben tartása:</b> Az alkalmazás az adatvédelem szem előtt tartásával készült, nem azonosítja az embereket, nem követi nyomon és nem gyűjt személyes adatokat, és reklámmentes.
|
||||
‣ <b>Takarékosdik az akkumulátorral és a tárhellyel:</b> Nem meríti le az akkumulátort, mint más navigációs alkalmazások. A jól összeállítot kis méretű térképek értékes helyet takarítanak meg a telefonon.
|
||||
‣ <b>Egyszerű és szép grafikus felület,</b> nagyszerű és könnyen használható funkciók, amelyek egyszerűen működnek.
|
||||
‣ <b>Ingyenes és a közösség által készített:</b> A hozzád hasonló emberek segítettek az alkalmazás létrehozásában azáltal, hogy hozzáadtak helyeket az OpenStreetMap térképhez, tesztelték és visszajelzést adtak a funkciókról, valamint hozzájárultak a fejlesztői képességeikkel és a pénzükkel.
|
||||
‣ <b>Nyílt és átlátható döntéshozatal és pénzügyek, nonprofit és teljesen nyílt forráskódú.</b>
|
||||
|
||||
<b>Főbb jellemzők:</b>
|
||||
• Letölthető részletes térképek olyan helyekkel, amelyek sok kereskedelmi térképen nem állnak rendelkezésre.
|
||||
• Szabadtéri üzemmód kiemelt túraútvonalakkal, táborhelyekkel, vízforrásokkal, csúcsokkal, szintvonalakkal stb.
|
||||
• Sétaútvonalak és kerékpárutak
|
||||
• Érdekes pontok, mint például éttermek, benzinkutak, szállodák, üzletek, látnivalók és még sok minden más
|
||||
• Keresés név, cím vagy az érdekes pontok kategóriája alapján
|
||||
• Navigáció hangutasításokkal gyalogláshoz, kerékpározáshoz vagy vezetéshez
|
||||
• Kedvenc helyeid könyvjelzővel láthatod el egyetlen érintéssel
|
||||
• Wikipedia szócikkek internetkapcsolat nélkül
|
||||
• Metró tranzit réteg és irányok
|
||||
• Útvonal mentése
|
||||
• Könyvjelzők és nyomvonalak exportálása és importálása KML, KMZ, GPX formátumokban
|
||||
• Sötét üzemmód az éjszakai használathoz
|
||||
• Térképadatok javítása mindenki számára egy alapvető beépített szerkesztő segítségével
|
||||
|
||||
<b>Itt van a szabadság</b>
|
||||
Fedezd fel az utadat, navigálj a világban úgy, hogy a magánélet és a közösség kerüljön előtérbe!
|
||||
@@ -0,0 +1 @@
|
||||
Navigation facile del mappa – Discoperi tu viage – Alimentate per le communitate
|
||||
@@ -1,4 +1,4 @@
|
||||
Una app realizzata dalla community gratuita e open-source, basata su OpenStreetMap e sull'impegno alla trasparenza, al rispetto della Privacy e senza scopo di lucro. CoMaps è uno spin-off di Organic Maps, che a sua volta deriva da Maps.ME.
|
||||
Una app sviluppata dalla comunità, gratuita e open-source, basata su OpenStreetMap e sull'impegno alla trasparenza, al rispetto della Privacy senza scopo di lucro. CoMaps è uno spin-off di Organic Maps, che a sua volta deriva da Maps.ME.
|
||||
|
||||
Leggi delle ragioni del progetto e della sua direzione futura su <b><i>codeberg.org/comaps</i></b>.
|
||||
Unisciti alla nostra comunità e aiutaci a creare la migliore app di mappe.
|
||||
@@ -15,7 +15,7 @@ Unisciti alla nostra comunità e aiutaci a creare la migliore app di mappe.
|
||||
|
||||
<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 altri punti d'interesse evidenziati
|
||||
• 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
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
• Dati di OpenStreetMap aggiornati al 4 Agosto
|
||||
• Migliorati i colori per acqua, foreste, servizi etc
|
||||
• Aggiunte le stazioni delle guardie forestali, i parcheggi coperti per bici, gli escape games e altri servizi
|
||||
• Aggiornato l'intervallo delle isolinee a 20 m per le zone escursionistiche più popolari
|
||||
• Aggiunto il supporto per un maggior numero di alias
|
||||
• Aggiunte le icone per i fast food, i punti di ricarica e le biciclette
|
||||
• Resi più fluidi i movimenti della freccia di posizione
|
||||
@@ -1 +1 @@
|
||||
Navigazione semplice - Immergiti nella tua avventura - Realizzato dalla comunità
|
||||
Navigazione semplice - Immergiti nella tua avventura - Sviluppato dalla comunità
|
||||
|
||||
@@ -1 +1 @@
|
||||
CoMaps - Wandel, fiets, rijd offline met privacy
|
||||
CoMaps - Wandel, fiets, rijdt offline met privacy
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
CoMaps - Gå tur, sykkel, kjør - med personvern
|
||||
@@ -1,8 +1,7 @@
|
||||
• Dados OSM de 22/08
|
||||
• Novo indicador de velocidade e tela de informações de trilha
|
||||
• Melhor estilo de mapa escuro, rótulos coloridos adicionados
|
||||
• Exibição da última atualização de locais e horários de funcionamento
|
||||
• O roteamento agora considera conversões, PARE, semáforos, e restrições condicionais
|
||||
• Preferência por orientação GPS em vez de bússola e aumento da frequência de localização
|
||||
• Editor: adição de endereços e notas independentes
|
||||
• Melhorias em elementos da interface e estilo de mapa
|
||||
• Dados OSM de 4/08
|
||||
• Melhoria nas cores para água, florestas, matagais, serviços, áreas de pedestres, etc.
|
||||
• Adição de guarda-florestais, estacionamentos cobertos para bicicletas, jogos de fuga, armários para bagagem e parceiros postais
|
||||
• Melhoria na precisão de curvas de nível para 20 m em algumas regiões populares
|
||||
• Suporte a mais abreviações para busca
|
||||
• Adição de ícones de pesquisa e favoritos para fast food, bicicletas e estações de recarga
|
||||
• Movimentos mais suaves para seta de posição
|
||||
|
||||
32
android/app/src/fdroid/play/listings/pt/full-description.txt
Normal file
32
android/app/src/fdroid/play/listings/pt/full-description.txt
Normal file
@@ -0,0 +1,32 @@
|
||||
Um aplicativo de mapas gratuito e de código aberto, liderado pela comunidade, baseado em dados do OpenStreetMap e reforçado pelo compromisso com a transparência, privacidade e sem fins lucrativos. O CoMaps é um fork/spin-off do Organic Maps, que por sua vez é um fork do Maps.ME.
|
||||
|
||||
Leia mais sobre os motivos do projeto e sua direção em <b><i>codeberg.org/comaps</i></b>.
|
||||
Junte-se à comunidade e ajude a criar o melhor aplicativo de mapas.
|
||||
• Use o aplicativo e divulgue-o.
|
||||
• Envie feedback e relate problemas.
|
||||
• Atualize os dados do mapa no aplicativo ou no site do OpenStreetMap.
|
||||
|
||||
‣ <b>Foco offline</b>: Planeje e navegue em sua viagem ao exterior sem a necessidade de sinal de celular, pesquise pontos de referência durante uma caminhada distante, etc. Todas as funções do aplicativo foram projetadas para funcionar offline.
|
||||
‣ <b>Respeitando a privacidade</b>: O aplicativo foi projetado com a privacidade em mente - não identifica pessoas, não rastreia e não coleta informações pessoais. Sem anúncios.
|
||||
‣ <b>Simples e sofisticado</b>: recursos essenciais e fáceis de usar que simplesmente funcionam.
|
||||
‣ <b>Economiza bateria e espaço</b>: Não consome muita bateria como outros aplicativos de navegação. Mapas compactos economizam espaço precioso no seu celular.
|
||||
‣ <b>Gratuito e desenvolvido pela comunidade</b>: Pessoas como você ajudaram a desenvolver o aplicativo adicionando lugares ao OpenStreetMap, testando e dando feedback sobre os recursos e contribuindo com suas habilidades de desenvolvimento e dinheiro.
|
||||
‣ <b>Tomada de decisões e finanças abertas e transparentes, sem fins lucrativos e totalmente de código aberto.</b>
|
||||
|
||||
<b>Principais recursos</b>:
|
||||
• Mapas detalhados para download com locais não disponíveis no Google Maps
|
||||
• Modo ao ar livre com trilhas em destaque, acampamentos, fontes de água, picos, curvas de nível, etc.
|
||||
• Trilhas para caminhada e ciclovias
|
||||
• Pontos de interesse como restaurantes, postos de gasolina, hotéis, lojas, pontos turísticos e muito mais
|
||||
• Pesquise por nome, endereço ou por categoria de ponto de interesse
|
||||
• Navegação com anúncios de voz para caminhadas, ciclismo ou direção
|
||||
• Marque seus lugares favoritos com um único toque
|
||||
• Artigos offline da Wikipédia
|
||||
• Camada e direções de transporte público do metrô
|
||||
• Gravação de trilhas
|
||||
• Exporte e importe favoritos e trilhas nos formatos KML, KMZ e GPX
|
||||
• Um modo escuro para usar à noite
|
||||
• Aprimore os dados do mapa para todos usando um editor básico integrado
|
||||
|
||||
<b>A Liberdade Chegou</b>
|
||||
Descubra sua jornada, navegue pelo mundo com privacidade e comunidade em primeiro lugar!
|
||||
@@ -0,0 +1 @@
|
||||
Navegação fácil nos mapas - Descubra mais sobre o seu percurso - Feito por todos
|
||||
1
android/app/src/fdroid/play/listings/pt/title.txt
Normal file
1
android/app/src/fdroid/play/listings/pt/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
CoMaps - Mapas e Navegação - Offline e Privada
|
||||
@@ -1 +1 @@
|
||||
CoMaps - călătorește offline cu confidențialitate
|
||||
CoMaps - Drumeții, Ciclism, Condus Offline în confidențialitate
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
• Данные 22 августа
|
||||
• Новый спидометр,информация о маршруте
|
||||
• Улучшен тёмный стиль,цветные метки
|
||||
• Время последней проверки часов работы
|
||||
• Построении маршрута учитывает повороты, знак «Стоп»,светофоры и ограничения
|
||||
• Предпочтение отдается GPS-координатам,а не компасу,увеличена частота опроса местоположения
|
||||
• Можно добавлять отдельные адреса и заметки в редакторе
|
||||
• Улучшены различные элементы пользовательского интерфейса и стиль карты
|
||||
Ознакомьтесь с примечания к релизу про изменения!
|
||||
• Карты OpenStreetMap от 4 августа
|
||||
• Улучшен цвет воды, леса, кустарников, различных объектов инфраструктуры, пешеходных зон и т.д.
|
||||
• Добавлены лесничества, крытые велопарковки, квесты, камеры хранения
|
||||
• Для некоторых популярных туристических регионов добавлены линии высот 20м
|
||||
• Поддержка дополнительных поисковых сокращений и синонимов
|
||||
• Добавлены иконки меток и результатов поиска для фастфуда, велопарковок и зарядных станций
|
||||
• Более плавное движение стрелки местоположения
|
||||
|
||||
@@ -1,32 +1,32 @@
|
||||
Бесплатна апликација отвореног кода коју одржава заједница, која се заснива на ОpenStreetMap подацима. Непрофитна, транспарентна и цени вашу приватност. CoMaps је настала од апликације Organic Maps, које је настала од апликације Maps.ME.
|
||||
Бесплатна апликација отвореног кода коју је обављала заједница и заснива се на ОpenStreetMap-у подацима, усмерени транспарентност, приватност и непрофитни. CoMaps је Апликације за органске карте виљушка, које је пак форк Maps.ME.
|
||||
|
||||
Прочитајте о разлозима пројекта и његовог правца на <b><i>codeberg.org/comaps</i></b>
|
||||
Придружите се отвореној заједници и помозите да направимо најбољу апликацију за мапе
|
||||
• Користите апликацију и проширите глас о томе
|
||||
• Дајте повратне информације и пријавите проблеме
|
||||
• Ажурирајте податке на мапи у апликацији или на сајту OpenStreetMap
|
||||
• Ажурирајте податке на мапи у апликацији или на веб локацији OpenStreetMap
|
||||
|
||||
‣ <b>Фокусирано на офлајн рад</b>: Планирајте и управљајте путовањем у иностранству без потребе за мобилним интернетом, тражите успутне тачке док сте на забаченом планинском путу, итд. Све функционалности су дизајниране за рад без интернета.
|
||||
‣ <b>Поштовање приватности</b>: Апликација је осмишљена са приватношћу корисника на уму - не идентификује људе, не прати или прикупља личне податке. Нема реклама.
|
||||
‣ <b>Једноставно и елегантно</b>: Апликација је лака за употребу и једноставно функционише.
|
||||
‣ <b>Чува вашу батерију и простор</b>: Не троши батерију као остале апликације за навигацију. Компактне мапе чувају драгоцени простор на вашем телефону.
|
||||
‣ <b>Отворено и направљено од стране заједнице</b>: Људи попут вас су допринели развоју апликације додавањем локација на OpenStreetMap, тестирањем, давањем повратних информација о апликацији и помогли су својим програмерским вештинама и донацијама.
|
||||
‣ <b>Отворено и транспарентно доношење одлука и употреба донација, непрофитна и потпуно отвореног кода.</b>
|
||||
‣ <b> фокусирано на офлајн Вар </b>: Планирајте и управљајте путовањем у иностранству без потребе за мобилним услугама, тражите путне тачке док је на даљинском покрету, итд. Све апликације су дизајниране за рад ван мреже.
|
||||
‣ <b> Поштовање приватности </b>: Апликација је осмишљена задржавања у уму приватност - не идентификује људе, не прати или прикупља личне податке. Нема реклама.
|
||||
‣ <b> Једноставно и елегантно </b>: Апликација је тривијална за употребу и једноставно функционише.
|
||||
‣ <b> Чува вашу батерију и простор </b>: не конзумира батерију као остале навигационе апликације. Компактне картице сачувајте драгоцени простор на вашем телефону.
|
||||
‣ <b> Отворено и направио је заједницу </b>: Људи попут вас је помогли да додају апликацију додавањем локација на OpenStreetMap-у, тестирању и давање повратних информација о апликацији и доприносе вашим развојним вештинама и новцу.
|
||||
‣ <b> Отворено и транспарентно доношење одлука и употреба финансија, непрофитна и потпуно отворена извора. </b>
|
||||
|
||||
<b> Главне карактеристике </b>:
|
||||
• Преузмимање детаљне мапе са локацијама које нису доступне са Google мапама
|
||||
• Режим за излете са истакнутим планинарским стазама, камповима, изворима воде, планинским врховима, изохипсама итд.
|
||||
• Преузмите детаљне мапе са локацијама које нису доступне са Гоогле мапама
|
||||
• Улазнице за излете са истакнутим планинарским стазама, камповима, изворима воде, планинске врхове, контурне линије итд.
|
||||
• Стазе за планинарење и бицикле
|
||||
• Тачке интереса као што су ресторани, бензинске пумпе, хотели, продавнице, знаменитости и још много тога
|
||||
• Претрага по називу, адреси или категоријама
|
||||
• Навигација са гласовним инструкцијама за ходање, вожњу бицикла или аутомобила
|
||||
• Означивање омиљених места једним додиром
|
||||
• Тачке интереса као што су ресторани, бензинске пумпе, хотели, продавнице, погледа и још много тога
|
||||
• Претражите име или адресу или по категоријама камате
|
||||
• навигација са гласовним најавама за ходање, бициклизам или аутомобил
|
||||
• Означите своја омиљена места једним додиром
|
||||
• Офлајн чланци Википедије
|
||||
• Транзитни слој подземне железнице са навигацијом
|
||||
• Снимање ГПС путања
|
||||
• Увоз и увоз маркера и путања у KML, KMZ, GPX формате
|
||||
• транзитни слој подземне пруге са навигацијом
|
||||
• Снимање ГПС трагова
|
||||
• Ознака и увоз и увоз у KML, KMZ, GPX формате
|
||||
• Тамни режим за употребу током ноћи
|
||||
• Побољшајте карту за све кориснике, користећи основни едитор за мапе
|
||||
• Побољшајте карту за све кориснике, користећи основни уредни уредник мапе
|
||||
|
||||
<b> Слобода је овде </b>
|
||||
Откријте своје путовање, крећете се са светом са приватношћу и заједницом на првом месту!
|
||||
Откријте своје путовање, крећете се са свијетом са приватношћу и заједницом на првом месту!
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
• подаци из OpenStreetMap-а од 4. августа
|
||||
• побољшане боје на мапи за воду, шуме, жбуње, разне објекте, пешачке зоне итд.
|
||||
• додате станице ренџера, наткривена паркинг места за бицикле, escape room-ови, ормарићи за пртљаг
|
||||
• унапређене изохипсе на кораке од 20 м за популарне планинарске регионе
|
||||
• подршка за више скраћеница и алтернативних назива у претрази
|
||||
• додате иконе за претрагу и обележавање за брзу храну, бицикле и станице за пуњење
|
||||
• равномерније кретање стрелице која приказује позицију
|
||||
@@ -1 +1 @@
|
||||
version: 2025.08.31-15-FDroid+25083115
|
||||
version: 2025.03.02-7-FDroid+25030207
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.organicmaps.location;
|
||||
package app.organicmaps.sdk.location;
|
||||
|
||||
import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
|
||||
import static android.Manifest.permission.ACCESS_FINE_LOCATION;
|
||||
@@ -10,7 +10,6 @@ import android.location.Location;
|
||||
import android.os.Looper;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.RequiresPermission;
|
||||
import app.organicmaps.sdk.location.BaseLocationProvider;
|
||||
import app.organicmaps.sdk.util.LocationUtils;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
import com.google.android.gms.common.api.ApiException;
|
||||
@@ -1,25 +1,23 @@
|
||||
package app.organicmaps.location;
|
||||
package app.organicmaps.sdk.location;
|
||||
|
||||
import android.content.Context;
|
||||
import androidx.annotation.NonNull;
|
||||
import app.organicmaps.sdk.location.AndroidNativeProvider;
|
||||
import app.organicmaps.sdk.location.BaseLocationProvider;
|
||||
import app.organicmaps.sdk.location.LocationProviderFactory;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
import com.google.android.gms.common.ConnectionResult;
|
||||
import com.google.android.gms.common.GoogleApiAvailability;
|
||||
|
||||
public class LocationProviderFactoryImpl implements LocationProviderFactory
|
||||
public class LocationProviderFactory
|
||||
{
|
||||
private static final String TAG = LocationProviderFactoryImpl.class.getSimpleName();
|
||||
private static final String TAG = LocationProviderFactory.class.getSimpleName();
|
||||
|
||||
public boolean isGoogleLocationAvailable(@NonNull Context context)
|
||||
public static boolean isGoogleLocationAvailable(@NonNull Context context)
|
||||
{
|
||||
return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context) == ConnectionResult.SUCCESS;
|
||||
}
|
||||
|
||||
public BaseLocationProvider getProvider(@NonNull Context context, @NonNull BaseLocationProvider.Listener listener)
|
||||
public static BaseLocationProvider getProvider(@NonNull Context context,
|
||||
@NonNull BaseLocationProvider.Listener listener)
|
||||
{
|
||||
if (isGoogleLocationAvailable(context) && Config.useGoogleServices())
|
||||
{
|
||||
@@ -1 +0,0 @@
|
||||
../../../../google/java/app/organicmaps/location
|
||||
1
android/app/src/huawei/java/app/organicmaps/sdk/location
Symbolic link
1
android/app/src/huawei/java/app/organicmaps/sdk/location
Symbolic link
@@ -0,0 +1 @@
|
||||
../../../../../google/java/app/organicmaps/sdk/location
|
||||
@@ -10,8 +10,6 @@ import androidx.core.content.ContextCompat;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
||||
import app.organicmaps.sdk.bookmarks.data.ElevationInfo;
|
||||
import app.organicmaps.sdk.bookmarks.data.Track;
|
||||
import app.organicmaps.sdk.bookmarks.data.TrackStatistics;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.widget.placepage.AxisValueFormatter;
|
||||
@@ -33,16 +31,17 @@ import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class ChartController implements OnChartValueSelectedListener
|
||||
public class ChartController implements OnChartValueSelectedListener,
|
||||
BookmarkManager.OnElevationActivePointChangedListener,
|
||||
BookmarkManager.OnElevationCurrentPositionChangedListener
|
||||
{
|
||||
private static final int CHART_Y_LABEL_COUNT = 3;
|
||||
private static final int CHART_X_LABEL_COUNT = 6;
|
||||
private static final int CHART_ANIMATION_DURATION = 0;
|
||||
private static final int CHART_ANIMATION_DURATION = 1500;
|
||||
private static final int CHART_FILL_ALPHA = (int) (0.12 * 255);
|
||||
private static final int CHART_AXIS_GRANULARITY = 100;
|
||||
private static final float CUBIC_INTENSITY = 0.2f;
|
||||
private static final int CURRENT_POSITION_OUT_OF_TRACK = -1;
|
||||
private static final String ELEVATION_PROFILE_POINTS = "ELEVATION_PROFILE_POINTS";
|
||||
|
||||
@SuppressWarnings("NullableProblems")
|
||||
@NonNull
|
||||
@@ -63,7 +62,6 @@ public class ChartController implements OnChartValueSelectedListener
|
||||
private final Context mContext;
|
||||
private long mTrackId = Utils.INVALID_ID;
|
||||
private boolean mCurrentPositionOutOfTrack = true;
|
||||
private boolean mInformSelectedActivePointToCore = true;
|
||||
|
||||
public ChartController(@NonNull Context context)
|
||||
{
|
||||
@@ -72,6 +70,8 @@ public class ChartController implements OnChartValueSelectedListener
|
||||
|
||||
public void initialize(@NonNull View view)
|
||||
{
|
||||
BookmarkManager.INSTANCE.setElevationActivePointChangedListener(this);
|
||||
BookmarkManager.INSTANCE.setElevationCurrentPositionChangedListener(this);
|
||||
final Resources resources = mContext.getResources();
|
||||
mChart = view.findViewById(R.id.elevation_profile_chart);
|
||||
|
||||
@@ -101,6 +101,13 @@ public class ChartController implements OnChartValueSelectedListener
|
||||
initAxises();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public void destroy()
|
||||
{
|
||||
BookmarkManager.INSTANCE.setElevationActivePointChangedListener(null);
|
||||
BookmarkManager.INSTANCE.setElevationCurrentPositionChangedListener(null);
|
||||
}
|
||||
|
||||
private void highlightChartCurrentLocation()
|
||||
{
|
||||
mChart.highlightValues(Collections.singletonList(getCurrentPosHighlight()),
|
||||
@@ -135,17 +142,15 @@ public class ChartController implements OnChartValueSelectedListener
|
||||
mChart.getAxisRight().setEnabled(false);
|
||||
}
|
||||
|
||||
public void setData(Track track)
|
||||
public void setData(@NonNull ElevationInfo info)
|
||||
{
|
||||
mTrackId = track.getTrackId();
|
||||
ElevationInfo info = track.getElevationInfo();
|
||||
TrackStatistics stats = track.getTrackStatistics();
|
||||
mTrackId = info.getId();
|
||||
List<Entry> values = new ArrayList<>();
|
||||
|
||||
for (ElevationInfo.Point point : info.getPoints())
|
||||
values.add(new Entry((float) point.getDistance(), point.getAltitude(), point));
|
||||
values.add(new Entry((float) point.getDistance(), point.getAltitude()));
|
||||
|
||||
LineDataSet set = new LineDataSet(values, ELEVATION_PROFILE_POINTS);
|
||||
LineDataSet set = new LineDataSet(values, "Elevation_profile_points");
|
||||
set.setMode(LineDataSet.Mode.CUBIC_BEZIER);
|
||||
set.setCubicIntensity(CUBIC_INTENSITY);
|
||||
set.setDrawFilled(true);
|
||||
@@ -168,8 +173,8 @@ public class ChartController implements OnChartValueSelectedListener
|
||||
mChart.setData(data);
|
||||
mChart.animateX(CHART_ANIMATION_DURATION);
|
||||
|
||||
mMinAltitude.setText(Framework.nativeFormatAltitude(stats.getMinElevation()));
|
||||
mMaxAltitude.setText(Framework.nativeFormatAltitude(stats.getMaxElevation()));
|
||||
mMinAltitude.setText(Framework.nativeFormatAltitude(info.getMinAltitude()));
|
||||
mMaxAltitude.setText(Framework.nativeFormatAltitude(info.getMaxAltitude()));
|
||||
|
||||
highlightActivePointManually();
|
||||
}
|
||||
@@ -187,9 +192,7 @@ public class ChartController implements OnChartValueSelectedListener
|
||||
if (mTrackId == Utils.INVALID_ID)
|
||||
return;
|
||||
|
||||
if (mInformSelectedActivePointToCore)
|
||||
BookmarkManager.INSTANCE.setElevationActivePoint(mTrackId, e.getX(), (ElevationInfo.Point) e.getData());
|
||||
mInformSelectedActivePointToCore = true;
|
||||
BookmarkManager.INSTANCE.setElevationActivePoint(mTrackId, e.getX());
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@@ -208,6 +211,7 @@ public class ChartController implements OnChartValueSelectedListener
|
||||
highlightChartCurrentLocation();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCurrentPositionChanged()
|
||||
{
|
||||
if (mTrackId == Utils.INVALID_ID)
|
||||
@@ -218,6 +222,7 @@ public class ChartController implements OnChartValueSelectedListener
|
||||
highlightActivePointManually();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onElevationActivePointChanged()
|
||||
{
|
||||
if (mTrackId == Utils.INVALID_ID)
|
||||
@@ -229,7 +234,6 @@ public class ChartController implements OnChartValueSelectedListener
|
||||
private void highlightActivePointManually()
|
||||
{
|
||||
Highlight highlight = getActivePoint();
|
||||
mInformSelectedActivePointToCore = false;
|
||||
mChart.highlightValue(highlight, true);
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,6 @@ import androidx.annotation.StringRes;
|
||||
import androidx.annotation.StyleRes;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import app.organicmaps.base.BaseMwmFragmentActivity;
|
||||
import app.organicmaps.downloader.MapManagerHelper;
|
||||
import app.organicmaps.intent.Factory;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.downloader.CountryItem;
|
||||
@@ -36,7 +35,7 @@ import app.organicmaps.sdk.location.LocationListener;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.ConnectionState;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
@@ -117,10 +116,10 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
||||
private final app.organicmaps.sdk.DownloadResourcesLegacyActivity.Listener mResourcesDownloadListener =
|
||||
new app.organicmaps.sdk.DownloadResourcesLegacyActivity.Listener() {
|
||||
@Override
|
||||
public void onProgress(final int bytesDownloaded)
|
||||
public void onProgress(final int percent)
|
||||
{
|
||||
if (!isFinishing())
|
||||
mProgress.setProgressCompat(bytesDownloaded, true);
|
||||
mProgress.setProgressCompat(percent, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -156,9 +155,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
||||
showMap();
|
||||
return;
|
||||
|
||||
case CountryItem.STATUS_FAILED:
|
||||
MapManagerHelper.showError(DownloadResourcesLegacyActivity.this, item, null);
|
||||
return;
|
||||
case CountryItem.STATUS_FAILED: MapManager.showError(DownloadResourcesLegacyActivity.this, item, null); return;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -253,8 +250,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
||||
setDownloadMessage(bytes);
|
||||
|
||||
mProgress.setMax(bytes);
|
||||
// Start progress at 1% according to M3 guidelines
|
||||
mProgress.setProgressCompat(bytes/100, true);
|
||||
mProgress.setProgressCompat(0, true);
|
||||
}
|
||||
else
|
||||
finishFilesDownload(bytes);
|
||||
@@ -372,11 +368,10 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
||||
String fileSizeString = StringUtils.getFileSizeString(this, item.totalSize);
|
||||
mTvMessage.setText(getString(R.string.downloading_country_can_proceed, item.name, fileSizeString));
|
||||
mProgress.setMax((int) item.totalSize);
|
||||
// Start progress at 1% according to M3 guidelines
|
||||
mProgress.setProgressCompat((int) (item.totalSize/100), true);
|
||||
mProgress.setProgressCompat(0, true);
|
||||
|
||||
mCountryDownloadListenerSlot = MapManager.nativeSubscribe(mCountryDownloadListener);
|
||||
MapManagerHelper.startDownload(mCurrentCountry);
|
||||
MapManager.startDownload(mCurrentCountry);
|
||||
setAction(PROCEED_TO_MAP);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -12,7 +12,6 @@ import static app.organicmaps.sdk.location.LocationState.FOLLOW;
|
||||
import static app.organicmaps.sdk.location.LocationState.FOLLOW_AND_ROTATE;
|
||||
import static app.organicmaps.sdk.location.LocationState.LOCATION_TAG;
|
||||
import static app.organicmaps.sdk.util.PowerManagment.POWER_MANAGEMENT_TAG;
|
||||
import static app.organicmaps.sdk.util.Utils.dimen;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
@@ -112,6 +111,7 @@ import app.organicmaps.sdk.settings.UnitLocale;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.LocationUtils;
|
||||
import app.organicmaps.sdk.util.PowerManagment;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
import app.organicmaps.sdk.widget.placepage.PlacePageData;
|
||||
import app.organicmaps.search.FloatingSearchToolbarController;
|
||||
@@ -122,7 +122,6 @@ import app.organicmaps.settings.SettingsActivity;
|
||||
import app.organicmaps.util.SharingUtils;
|
||||
import app.organicmaps.util.ThemeSwitcher;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
|
||||
import app.organicmaps.util.bottomsheet.MenuBottomSheetItem;
|
||||
@@ -458,10 +457,12 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
@StyleRes
|
||||
protected int getThemeResourceId(@NonNull String theme)
|
||||
{
|
||||
if (Config.UiTheme.isDefault(theme))
|
||||
Context context = getApplicationContext();
|
||||
|
||||
if (ThemeUtils.isDefaultTheme(context, theme))
|
||||
return R.style.MwmTheme_MainActivity;
|
||||
|
||||
if (Config.UiTheme.isNight(theme))
|
||||
if (ThemeUtils.isNightTheme(context, theme))
|
||||
return R.style.MwmTheme_Night_MainActivity;
|
||||
|
||||
return super.getThemeResourceId(theme);
|
||||
@@ -583,7 +584,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
|
||||
private void refreshLightStatusBar()
|
||||
{
|
||||
UiUtils.setLightStatusBar(this, !(ThemeUtils.isNightTheme() || RoutingController.get().isPlanning()
|
||||
UiUtils.setLightStatusBar(this, !(ThemeUtils.isNightTheme(this) || RoutingController.get().isPlanning()
|
||||
|| ChoosePositionMode.get() != ChoosePositionMode.None));
|
||||
}
|
||||
|
||||
@@ -593,7 +594,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
UiUtils.setViewInsetsPaddingBottom(mPointChooser, windowInsets);
|
||||
UiUtils.setViewInsetsPaddingNoBottom(mPointChooserToolbar, windowInsets);
|
||||
final int trackRecorderOffset =
|
||||
TrackRecorder.nativeIsTrackRecordingEnabled() ? dimen(this, R.dimen.map_button_size) : 0;
|
||||
TrackRecorder.nativeIsTrackRecordingEnabled() ? UiUtils.dimen(this, R.dimen.map_button_size) : 0;
|
||||
mNavBarHeight = isFullscreen() ? 0 : windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).bottom;
|
||||
// For the first loading, set compass top margin to status bar size
|
||||
// The top inset will be then be updated by the routing controller
|
||||
@@ -1647,17 +1648,17 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
final int orientation = getResources().getConfiguration().orientation;
|
||||
final boolean isTrackRecordingEnabled = TrackRecorder.nativeIsTrackRecordingEnabled();
|
||||
if (isTrackRecordingEnabled && (orientation != Configuration.ORIENTATION_LANDSCAPE))
|
||||
offsetY += dimen(this, R.dimen.map_button_size);
|
||||
offsetY += UiUtils.dimen(this, R.dimen.map_button_size);
|
||||
if (orientation == Configuration.ORIENTATION_LANDSCAPE)
|
||||
{
|
||||
if (show)
|
||||
{
|
||||
final boolean isSmallScreen = UiUtils.getDisplayTotalHeight(this) < dimen(this, R.dimen.dp_400);
|
||||
final boolean isSmallScreen = UiUtils.getDisplayTotalHeight(this) < UiUtils.dimen(this, R.dimen.dp_400);
|
||||
if (!isSmallScreen || TrackRecorder.nativeIsTrackRecordingEnabled())
|
||||
offsetX += dimen(this, R.dimen.map_button_size);
|
||||
offsetX += UiUtils.dimen(this, R.dimen.map_button_size);
|
||||
}
|
||||
else if (isTrackRecordingEnabled)
|
||||
offsetY += dimen(this, R.dimen.map_button_size);
|
||||
offsetY += UiUtils.dimen(this, R.dimen.map_button_size);
|
||||
}
|
||||
updateCompassOffset(offsetY, offsetX);
|
||||
}
|
||||
@@ -2456,7 +2457,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
if (mCurrentWindowInsets != null)
|
||||
{
|
||||
final int offset = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top;
|
||||
updateCompassOffset(offset + dimen(this, R.dimen.map_button_size));
|
||||
updateCompassOffset(offset + UiUtils.dimen(this, R.dimen.map_button_size));
|
||||
}
|
||||
Toast.makeText(this, R.string.track_recording, Toast.LENGTH_SHORT).show();
|
||||
TrackRecordingService.startForegroundService(getApplicationContext());
|
||||
@@ -2549,7 +2550,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
items.add(new MenuBottomSheetItem(R.string.download_maps, R.drawable.ic_download, getDownloadMapsCounter(),
|
||||
this::onDownloadMapsOptionSelected));
|
||||
|
||||
mDonatesUrl = Utils.getDonateUrl(getApplicationContext());
|
||||
mDonatesUrl = Config.getDonateUrl(getApplicationContext());
|
||||
if (!mDonatesUrl.isEmpty())
|
||||
items.add(new MenuBottomSheetItem(R.string.donate, R.drawable.ic_donate, this::onDonateOptionSelected));
|
||||
|
||||
|
||||
@@ -14,10 +14,8 @@ import androidx.lifecycle.DefaultLifecycleObserver;
|
||||
import androidx.lifecycle.LifecycleObserver;
|
||||
import androidx.lifecycle.LifecycleOwner;
|
||||
import androidx.lifecycle.ProcessLifecycleOwner;
|
||||
import androidx.preference.PreferenceManager;
|
||||
import app.organicmaps.background.OsmUploadWork;
|
||||
import app.organicmaps.downloader.DownloaderNotifier;
|
||||
import app.organicmaps.location.LocationProviderFactoryImpl;
|
||||
import app.organicmaps.location.TrackRecordingService;
|
||||
import app.organicmaps.routing.NavigationService;
|
||||
import app.organicmaps.sdk.Map;
|
||||
@@ -43,9 +41,6 @@ public class MwmApplication extends Application implements Application.ActivityL
|
||||
@NonNull
|
||||
private static final String TAG = MwmApplication.class.getSimpleName();
|
||||
|
||||
@NonNull
|
||||
private final LocationProviderFactoryImpl mLocationProviderFactory = new LocationProviderFactoryImpl();
|
||||
|
||||
@SuppressWarnings("NotNullFieldNotInitialized")
|
||||
@NonNull
|
||||
private OrganicMaps mOrganicMaps;
|
||||
@@ -104,12 +99,6 @@ public class MwmApplication extends Application implements Application.ActivityL
|
||||
return mOrganicMaps;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public LocationProviderFactoryImpl getLocationProviderFactory()
|
||||
{
|
||||
return mLocationProviderFactory;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static MwmApplication from(@NonNull Context context)
|
||||
{
|
||||
@@ -130,10 +119,7 @@ public class MwmApplication extends Application implements Application.ActivityL
|
||||
|
||||
sInstance = this;
|
||||
|
||||
PreferenceManager.setDefaultValues(this, R.xml.prefs_main, false);
|
||||
mOrganicMaps = new OrganicMaps(getApplicationContext(), BuildConfig.FLAVOR, BuildConfig.APPLICATION_ID,
|
||||
BuildConfig.VERSION_CODE, BuildConfig.VERSION_NAME,
|
||||
BuildConfig.FILE_PROVIDER_AUTHORITY, mLocationProviderFactory);
|
||||
mOrganicMaps = new OrganicMaps(getApplicationContext());
|
||||
|
||||
ConnectionState.INSTANCE.initialize(this);
|
||||
|
||||
|
||||
@@ -9,8 +9,7 @@ import androidx.annotation.IntegerRes;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import app.organicmaps.sdk.util.Utils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import org.chromium.base.ObserverList;
|
||||
|
||||
class PanelAnimator
|
||||
@@ -27,7 +26,7 @@ class PanelAnimator
|
||||
PanelAnimator(MwmActivity activity)
|
||||
{
|
||||
mActivity = activity;
|
||||
mWidth = Utils.dimen(activity.getApplicationContext(), R.dimen.panel_width);
|
||||
mWidth = UiUtils.dimen(activity.getApplicationContext(), R.dimen.panel_width);
|
||||
mPanel = mActivity.findViewById(R.id.fragment_container);
|
||||
mDuration = mActivity.getResources().getInteger(R.integer.anim_panel);
|
||||
}
|
||||
|
||||
@@ -60,10 +60,11 @@ public class SplashActivity extends AppCompatActivity
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
final String theme = Config.UiTheme.getCurrent();
|
||||
if (Config.UiTheme.isDefault(theme))
|
||||
final Context context = getApplicationContext();
|
||||
final String theme = Config.getCurrentUiTheme(context);
|
||||
if (ThemeUtils.isDefaultTheme(context, theme))
|
||||
setTheme(R.style.MwmTheme_Splash);
|
||||
else if (Config.UiTheme.isNight(theme))
|
||||
else if (ThemeUtils.isNightTheme(context, theme))
|
||||
setTheme(R.style.MwmTheme_Night_Splash);
|
||||
else
|
||||
throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme);
|
||||
|
||||
@@ -9,7 +9,7 @@ import android.webkit.WebView;
|
||||
import android.webkit.WebViewClient;
|
||||
import androidx.annotation.NonNull;
|
||||
import app.organicmaps.base.OnBackPressListener;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
|
||||
public abstract class WebContainerDelegate implements OnBackPressListener
|
||||
{
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package app.organicmaps.backup;
|
||||
|
||||
import static app.organicmaps.sdk.util.StorageUtils.isFolderWritable;
|
||||
import static app.organicmaps.sdk.util.Utils.dimen;
|
||||
import static app.organicmaps.settings.BackupSettingsFragment.MAX_BACKUPS_DEFAULT_COUNT;
|
||||
import static app.organicmaps.settings.BackupSettingsFragment.MAX_BACKUPS_KEY;
|
||||
|
||||
@@ -16,8 +15,8 @@ import android.text.style.AbsoluteSizeSpan;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.documentfile.provider.DocumentFile;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
@@ -51,14 +50,14 @@ public class BackupUtils
|
||||
|
||||
String volumeName;
|
||||
if ("primary".equalsIgnoreCase(volumeId))
|
||||
volumeName = context.getString(app.organicmaps.sdk.R.string.maps_storage_shared);
|
||||
volumeName = context.getString(R.string.maps_storage_shared);
|
||||
else
|
||||
volumeName = context.getString(app.organicmaps.sdk.R.string.maps_storage_removable);
|
||||
volumeName = context.getString(R.string.maps_storage_removable);
|
||||
|
||||
SpannableStringBuilder sb = new SpannableStringBuilder();
|
||||
sb.append(volumeName + ": \n", new AbsoluteSizeSpan(dimen(context, R.dimen.text_size_body_3)),
|
||||
sb.append(volumeName + ": \n", new AbsoluteSizeSpan(UiUtils.dimen(context, R.dimen.text_size_body_3)),
|
||||
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
sb.append("/" + subPath, new AbsoluteSizeSpan(dimen(context, R.dimen.text_size_body_4)),
|
||||
sb.append("/" + subPath, new AbsoluteSizeSpan(UiUtils.dimen(context, R.dimen.text_size_body_4)),
|
||||
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
return sb;
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ public class BaseMwmDialogFragment extends DialogFragment
|
||||
@StyleRes
|
||||
protected final int getFullscreenTheme()
|
||||
{
|
||||
return ThemeUtils.isNightTheme() ? getFullscreenDarkTheme() : getFullscreenLightTheme();
|
||||
return ThemeUtils.isNightTheme(requireContext()) ? getFullscreenDarkTheme() : getFullscreenLightTheme();
|
||||
}
|
||||
|
||||
protected int getStyle()
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package app.organicmaps.base;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.graphics.Color;
|
||||
import android.media.AudioManager;
|
||||
@@ -23,6 +24,7 @@ import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.concurrency.UiThread;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
import app.organicmaps.util.RtlUtils;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
import com.google.android.material.appbar.MaterialToolbar;
|
||||
import java.util.Objects;
|
||||
|
||||
@@ -38,10 +40,12 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity
|
||||
@StyleRes
|
||||
protected int getThemeResourceId(@NonNull String theme)
|
||||
{
|
||||
if (Config.UiTheme.isDefault(theme))
|
||||
Context context = getApplicationContext();
|
||||
|
||||
if (ThemeUtils.isDefaultTheme(context, theme))
|
||||
return R.style.MwmTheme;
|
||||
|
||||
if (Config.UiTheme.isNight(theme))
|
||||
if (ThemeUtils.isNightTheme(context, theme))
|
||||
return R.style.MwmTheme_Night;
|
||||
|
||||
throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme);
|
||||
@@ -58,7 +62,7 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity
|
||||
protected final void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
mThemeName = Config.UiTheme.getCurrent();
|
||||
mThemeName = Config.getCurrentUiTheme(getApplicationContext());
|
||||
setTheme(getThemeResourceId(mThemeName));
|
||||
EdgeToEdge.enable(this, SystemBarStyle.dark(Color.TRANSPARENT));
|
||||
RtlUtils.manageRtl(this);
|
||||
@@ -118,7 +122,7 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity
|
||||
public void onPostResume()
|
||||
{
|
||||
super.onPostResume();
|
||||
if (!mThemeName.equals(Config.UiTheme.getCurrent()))
|
||||
if (!mThemeName.equals(Config.getCurrentUiTheme(getApplicationContext())))
|
||||
{
|
||||
// Workaround described in https://code.google.com/p/android/issues/detail?id=93731
|
||||
UiThread.runLater(this::recreate);
|
||||
|
||||
@@ -14,7 +14,7 @@ import androidx.fragment.app.Fragment;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.WindowInsetUtils.ScrollableContentInsetsListener;
|
||||
import app.organicmaps.widget.PlaceholderView;
|
||||
|
||||
@@ -10,7 +10,7 @@ import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentFactory;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
||||
import com.google.android.material.appbar.MaterialToolbar;
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ public class BookmarkCategoriesActivity extends BaseToolbarActivity
|
||||
@StyleRes
|
||||
public int getThemeResourceId(@NonNull String theme)
|
||||
{
|
||||
return ThemeUtils.getWindowBgThemeResourceId(theme);
|
||||
return ThemeUtils.getWindowBgThemeResourceId(getApplicationContext(), theme);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -11,7 +11,7 @@ import app.organicmaps.R;
|
||||
import app.organicmaps.adapter.OnItemClickListener;
|
||||
import app.organicmaps.sdk.bookmarks.data.BookmarkCategory;
|
||||
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.util.List;
|
||||
|
||||
@@ -41,7 +41,7 @@ public class BookmarkListActivity extends BaseToolbarActivity
|
||||
@StyleRes
|
||||
public int getThemeResourceId(@NonNull String theme)
|
||||
{
|
||||
return ThemeUtils.getCardBgThemeResourceId(theme);
|
||||
return ThemeUtils.getCardBgThemeResourceId(getApplicationContext(), theme);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -33,15 +33,16 @@ import app.organicmaps.sdk.bookmarks.data.BookmarkInfo;
|
||||
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
||||
import app.organicmaps.sdk.bookmarks.data.BookmarkSharingResult;
|
||||
import app.organicmaps.sdk.bookmarks.data.CategoryDataSource;
|
||||
import app.organicmaps.sdk.bookmarks.data.Icon;
|
||||
import app.organicmaps.sdk.bookmarks.data.KmlFileType;
|
||||
import app.organicmaps.sdk.bookmarks.data.PredefinedColors;
|
||||
import app.organicmaps.sdk.bookmarks.data.SortedBlock;
|
||||
import app.organicmaps.sdk.bookmarks.data.Track;
|
||||
import app.organicmaps.sdk.search.BookmarkSearchListener;
|
||||
import app.organicmaps.sdk.search.SearchEngine;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.util.SharingUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.WindowInsetUtils;
|
||||
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
|
||||
|
||||
@@ -13,7 +13,7 @@ import androidx.fragment.app.FragmentManager;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmDialogFragment;
|
||||
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
|
||||
public class ChooseBookmarksSortingTypeFragment
|
||||
extends BaseMwmDialogFragment implements RadioGroup.OnCheckedChangeListener
|
||||
|
||||
@@ -18,8 +18,8 @@ import app.organicmaps.sdk.bookmarks.data.BookmarkInfo;
|
||||
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
||||
import app.organicmaps.sdk.bookmarks.data.IconClickListener;
|
||||
import app.organicmaps.sdk.bookmarks.data.Track;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.widget.recycler.RecyclerClickListener;
|
||||
import app.organicmaps.widget.recycler.RecyclerLongClickListener;
|
||||
|
||||
@@ -73,7 +73,8 @@ public class NavigationScreen extends BaseMapScreen implements RoutingController
|
||||
public Template onGetTemplate()
|
||||
{
|
||||
final NavigationTemplate.Builder builder = new NavigationTemplate.Builder();
|
||||
builder.setBackgroundColor(Colors.NAVIGATION_TEMPLATE_BACKGROUND);
|
||||
builder.setBackgroundColor(ThemeUtils.isNightMode(getCarContext()) ? Colors.NAVIGATION_TEMPLATE_BACKGROUND_NIGHT
|
||||
: Colors.NAVIGATION_TEMPLATE_BACKGROUND_DAY);
|
||||
builder.setActionStrip(createActionStrip());
|
||||
builder.setMapActionStrip(UiHelpers.createMapActionStrip(getCarContext(), getSurfaceRenderer()));
|
||||
|
||||
|
||||
@@ -12,7 +12,6 @@ import androidx.lifecycle.LifecycleOwner;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.car.screens.ErrorScreen;
|
||||
import app.organicmaps.car.screens.base.BaseScreen;
|
||||
import app.organicmaps.downloader.MapManagerHelper;
|
||||
import app.organicmaps.sdk.downloader.CountryItem;
|
||||
import app.organicmaps.sdk.downloader.MapManager;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
@@ -170,7 +169,7 @@ class DownloaderScreen extends BaseScreen
|
||||
mIsDownloadFailed = true;
|
||||
final ErrorScreen.Builder builder = new ErrorScreen.Builder(getCarContext())
|
||||
.setTitle(R.string.country_status_download_failed)
|
||||
.setErrorMessage(MapManagerHelper.getErrorCodeStrRes(data.errorCode))
|
||||
.setErrorMessage(MapManager.getErrorCodeStrRes(data.errorCode))
|
||||
.setPositiveButton(R.string.downloader_retry, null);
|
||||
if (!mIsCancelActionDisabled)
|
||||
builder.setNegativeButton(R.string.cancel, this::finish);
|
||||
|
||||
@@ -11,7 +11,8 @@ public final class Colors
|
||||
public static final CarColor OPENING_HOURS_CLOSES_SOON = CarColor.YELLOW;
|
||||
public static final CarColor OPENING_HOURS_CLOSED = CarColor.RED;
|
||||
public static final CarColor START_NAVIGATION = CarColor.GREEN;
|
||||
public static final CarColor NAVIGATION_TEMPLATE_BACKGROUND = CarColor.GREEN;
|
||||
public static final CarColor NAVIGATION_TEMPLATE_BACKGROUND_DAY = CarColor.GREEN;
|
||||
public static final CarColor NAVIGATION_TEMPLATE_BACKGROUND_NIGHT = CarColor.DEFAULT;
|
||||
public static final CarColor BUTTON_ACCEPT = CarColor.GREEN;
|
||||
|
||||
private Colors() {}
|
||||
|
||||
@@ -10,20 +10,19 @@ import androidx.car.app.CarContext;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.MapStyle;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
|
||||
public final class ThemeUtils
|
||||
{
|
||||
public enum ThemeMode
|
||||
{
|
||||
AUTO(R.string.auto, Config.UiTheme.AUTO),
|
||||
LIGHT(R.string.off, Config.UiTheme.DEFAULT),
|
||||
NIGHT(R.string.on, Config.UiTheme.NIGHT);
|
||||
AUTO(R.string.auto, R.string.theme_auto),
|
||||
LIGHT(R.string.off, R.string.theme_default),
|
||||
NIGHT(R.string.on, R.string.theme_night);
|
||||
|
||||
ThemeMode(@StringRes int titleId, @NonNull String config)
|
||||
ThemeMode(@StringRes int titleId, @StringRes int prefsKeyId)
|
||||
{
|
||||
mTitleId = titleId;
|
||||
mConfig = config;
|
||||
mPrefsKeyId = prefsKeyId;
|
||||
}
|
||||
|
||||
@StringRes
|
||||
@@ -32,16 +31,16 @@ public final class ThemeUtils
|
||||
return mTitleId;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public String getConfig()
|
||||
@StringRes
|
||||
public int getPrefsKeyId()
|
||||
{
|
||||
return mConfig;
|
||||
return mPrefsKeyId;
|
||||
}
|
||||
|
||||
@StringRes
|
||||
private final int mTitleId;
|
||||
@NonNull
|
||||
private final String mConfig;
|
||||
@StringRes
|
||||
private final int mPrefsKeyId;
|
||||
}
|
||||
|
||||
private static final String ANDROID_AUTO_PREFERENCES_FILE_KEY = "ANDROID_AUTO_PREFERENCES_FILE_KEY";
|
||||
@@ -80,20 +79,23 @@ public final class ThemeUtils
|
||||
@UiThread
|
||||
public static void setThemeMode(@NonNull CarContext context, @NonNull ThemeMode themeMode)
|
||||
{
|
||||
getSharedPreferences(context).edit().putString(THEME_KEY, themeMode.getConfig()).commit();
|
||||
getSharedPreferences(context).edit().putString(THEME_KEY, context.getString(themeMode.getPrefsKeyId())).commit();
|
||||
update(context, themeMode);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ThemeMode getThemeMode(@NonNull CarContext context)
|
||||
{
|
||||
final String themeMode = getSharedPreferences(context).getString(THEME_KEY, ThemeMode.AUTO.getConfig());
|
||||
final String autoTheme = context.getString(R.string.theme_auto);
|
||||
final String lightTheme = context.getString(R.string.theme_default);
|
||||
final String nightTheme = context.getString(R.string.theme_night);
|
||||
final String themeMode = getSharedPreferences(context).getString(THEME_KEY, autoTheme);
|
||||
|
||||
if (themeMode.equals(ThemeMode.AUTO.getConfig()))
|
||||
if (themeMode.equals(autoTheme))
|
||||
return ThemeMode.AUTO;
|
||||
else if (themeMode.equals(ThemeMode.LIGHT.getConfig()))
|
||||
else if (themeMode.equals(lightTheme))
|
||||
return ThemeMode.LIGHT;
|
||||
else if (themeMode.equals(ThemeMode.NIGHT.getConfig()))
|
||||
else if (themeMode.equals(nightTheme))
|
||||
return ThemeMode.NIGHT;
|
||||
else
|
||||
throw new IllegalArgumentException("Unsupported value");
|
||||
|
||||
@@ -15,7 +15,7 @@ import app.organicmaps.sdk.downloader.CountryItem;
|
||||
import app.organicmaps.sdk.downloader.MapManager;
|
||||
import app.organicmaps.sdk.downloader.UpdateInfo;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
|
||||
@@ -29,7 +29,7 @@ class BottomPanel
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
MapManagerHelper.warn3gAndDownload(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
|
||||
MapManager.warn3gAndDownload(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -38,10 +38,7 @@ class BottomPanel
|
||||
public void onClick(View v)
|
||||
{
|
||||
final String country = mFragment.getCurrentRoot();
|
||||
MapManagerHelper.warnOn3gUpdate(mFragment.requireActivity(), country, () -> {
|
||||
DownloaderService.startForegroundService();
|
||||
MapManagerHelper.startUpdate(country);
|
||||
});
|
||||
MapManager.warnOn3gUpdate(mFragment.requireActivity(), country, () -> MapManager.startUpdate(country));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -58,7 +55,7 @@ class BottomPanel
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
MapManagerHelper.warn3gAndRetry(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
|
||||
MapManager.warn3gAndRetry(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ import app.organicmaps.base.BaseMwmFragmentActivity;
|
||||
import app.organicmaps.sdk.downloader.CountryItem;
|
||||
import app.organicmaps.sdk.downloader.MapManager;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.widget.WheelProgressView;
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
@@ -198,8 +198,7 @@ public class CountrySuggestFragment extends BaseMwmFragment implements View.OnCl
|
||||
final int id = v.getId();
|
||||
if (id == R.id.btn__download_map)
|
||||
{
|
||||
MapManagerHelper.warn3gAndDownload(requireActivity(), mCurrentCountry.id,
|
||||
() -> mDownloadingCountry = mCurrentCountry);
|
||||
MapManager.warn3gAndDownload(requireActivity(), mCurrentCountry.id, () -> mDownloadingCountry = mCurrentCountry);
|
||||
}
|
||||
else if (id == R.id.btn__select_map)
|
||||
{
|
||||
|
||||
@@ -24,7 +24,7 @@ import app.organicmaps.sdk.downloader.CountryItem;
|
||||
import app.organicmaps.sdk.downloader.MapManager;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
|
||||
import app.organicmaps.util.bottomsheet.MenuBottomSheetItem;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
@@ -93,7 +93,7 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
||||
|
||||
private void onDownloadActionSelected(final CountryItem item, DownloaderAdapter adapter)
|
||||
{
|
||||
MapManagerHelper.warn3gAndDownload(adapter.mActivity, item.id, null);
|
||||
MapManager.warn3gAndDownload(adapter.mActivity, item.id, null);
|
||||
}
|
||||
|
||||
private void onUpdateActionSelected(final CountryItem item, DownloaderAdapter adapter)
|
||||
@@ -101,7 +101,7 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
||||
item.update();
|
||||
if (item.status != CountryItem.STATUS_UPDATABLE)
|
||||
return;
|
||||
MapManagerHelper.warnOn3gUpdate(adapter.mActivity, item.id, () -> MapManagerHelper.startUpdate(item.id));
|
||||
MapManager.warnOn3gUpdate(adapter.mActivity, item.id, () -> MapManager.startUpdate(item.id));
|
||||
}
|
||||
|
||||
private void onExploreActionSelected(CountryItem item, DownloaderAdapter adapter)
|
||||
@@ -206,7 +206,7 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
||||
{
|
||||
if (item.isLeafNode && item.newStatus == CountryItem.STATUS_FAILED)
|
||||
{
|
||||
MapManagerHelper.showError(mActivity, item, null);
|
||||
MapManager.showError(mActivity, item, null);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -382,12 +382,9 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
||||
else
|
||||
processLongClick();
|
||||
}
|
||||
case CountryItem.STATUS_FAILED ->
|
||||
{
|
||||
MapManagerHelper.warn3gAndRetry(mActivity, mItem.id, null);
|
||||
}
|
||||
case CountryItem.STATUS_FAILED -> MapManager.warn3gAndRetry(mActivity, mItem.id, null);
|
||||
case CountryItem.STATUS_UPDATABLE ->
|
||||
MapManagerHelper.warnOn3gUpdate(mActivity, mItem.id, () -> MapManagerHelper.startUpdate(mItem.id));
|
||||
MapManager.warnOn3gUpdate(mActivity, mItem.id, () -> MapManager.startUpdate(mItem.id));
|
||||
default -> throw new IllegalArgumentException("Inappropriate item status: " + mItem.status);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,8 +9,7 @@ import androidx.core.view.OnApplyWindowInsetsListener;
|
||||
import androidx.core.view.WindowInsetsCompat;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.util.Utils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.WindowInsetUtils;
|
||||
|
||||
final class DownloaderInsetsListener implements OnApplyWindowInsetsListener
|
||||
@@ -56,7 +55,7 @@ final class DownloaderInsetsListener implements OnApplyWindowInsetsListener
|
||||
|
||||
private void applyInsetsToButtons(Insets insets)
|
||||
{
|
||||
int baseMargin = Utils.dimen(mContext, R.dimen.margin_base);
|
||||
int baseMargin = UiUtils.dimen(mContext, R.dimen.margin_base);
|
||||
|
||||
ViewGroup.MarginLayoutParams fabParams = (ViewGroup.MarginLayoutParams) mFab.getLayoutParams();
|
||||
ViewGroup.MarginLayoutParams buttonParams = (ViewGroup.MarginLayoutParams) mButton.getLayoutParams();
|
||||
|
||||
@@ -20,7 +20,6 @@ import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.downloader.MapManager;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
import java.util.Objects;
|
||||
|
||||
public class DownloaderNotifier
|
||||
{
|
||||
@@ -30,8 +29,7 @@ public class DownloaderNotifier
|
||||
public static final int NOTIFICATION_ID = 1;
|
||||
|
||||
private final Context mContext;
|
||||
private NotificationCompat.Builder mProgressNotificationBuilder = null;
|
||||
private String mNotificationCountryId = null;
|
||||
private NotificationCompat.Builder mProgressNotificationBuilder;
|
||||
|
||||
public DownloaderNotifier(Context context)
|
||||
{
|
||||
@@ -47,7 +45,6 @@ public class DownloaderNotifier
|
||||
.setShowBadge(true)
|
||||
.setVibrationEnabled(false)
|
||||
.setLightsEnabled(false)
|
||||
.setSound(null, null)
|
||||
.build();
|
||||
notificationManager.createNotificationChannel(channel);
|
||||
}
|
||||
@@ -65,6 +62,8 @@ public class DownloaderNotifier
|
||||
final String countryName = MapManager.nativeGetName(countryId);
|
||||
final String content = mContext.getString(R.string.download_country_failed, countryName);
|
||||
|
||||
var contentPendingIntent = getNotificationPendingIntent(countryId);
|
||||
|
||||
final Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID)
|
||||
.setAutoCancel(true)
|
||||
.setCategory(NotificationCompat.CATEGORY_ERROR)
|
||||
@@ -75,7 +74,7 @@ public class DownloaderNotifier
|
||||
.setContentText(content)
|
||||
.setShowWhen(true)
|
||||
.setTicker(getTicker(mContext, title, content))
|
||||
.setContentIntent(getNotificationPendingIntent(countryId))
|
||||
.setContentIntent(contentPendingIntent)
|
||||
.setOnlyAlertOnce(true)
|
||||
.build();
|
||||
|
||||
@@ -111,41 +110,32 @@ public class DownloaderNotifier
|
||||
@NonNull
|
||||
public Notification buildProgressNotification(@Nullable String countryId, int maxProgress, int progress)
|
||||
{
|
||||
var builder = getNotificationBuilder(countryId);
|
||||
/// @todo Doesn't work properly .. Bad input sizes?
|
||||
// builder.setProgress(maxProgress, progress, maxProgress == 0);
|
||||
builder.setProgress(maxProgress, progress, true);
|
||||
var builder = startNotification(countryId);
|
||||
|
||||
builder.setProgress(maxProgress, progress, maxProgress == 0);
|
||||
builder.setContentText("Download in progress");
|
||||
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private NotificationCompat.Builder getNotificationBuilder(@Nullable String countryId)
|
||||
private NotificationCompat.Builder startNotification(@Nullable String countryId)
|
||||
{
|
||||
if (mProgressNotificationBuilder == null || !Objects.equals(countryId, mNotificationCountryId))
|
||||
{
|
||||
mNotificationCountryId = countryId;
|
||||
final String countryName = countryId != null ? MapManager.nativeGetName(countryId) : "";
|
||||
final String title = mContext.getString(R.string.app_name);
|
||||
|
||||
mProgressNotificationBuilder =
|
||||
new NotificationCompat.Builder(mContext, CHANNEL_ID)
|
||||
.setAutoCancel(true)
|
||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||
.setSmallIcon(R.drawable.ic_logo_small)
|
||||
.setColor(ContextCompat.getColor(mContext, R.color.notification))
|
||||
.setShowWhen(true)
|
||||
.setContentTitle(mContext.getString(R.string.app_name))
|
||||
.setContentIntent(getNotificationPendingIntent(countryId))
|
||||
.setContentText(mContext.getString(R.string.downloader_downloading) + " " + countryName)
|
||||
.setSound(null);
|
||||
}
|
||||
return mProgressNotificationBuilder;
|
||||
return new NotificationCompat.Builder(mContext, CHANNEL_ID)
|
||||
.setAutoCancel(true)
|
||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||
.setSmallIcon(R.drawable.ic_logo_small)
|
||||
.setColor(ContextCompat.getColor(mContext, R.color.notification))
|
||||
.setShowWhen(true)
|
||||
.setContentTitle(title)
|
||||
.setContentIntent(getNotificationPendingIntent(countryId));
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private PendingIntent getNotificationPendingIntent(@Nullable String countryId)
|
||||
{
|
||||
/// @todo Zooming to the countryId when tapping on the notification?
|
||||
/// Shows very low zoom level, need z=9/10, I suppose ...
|
||||
final int FLAG_IMMUTABLE = Build.VERSION.SDK_INT < Build.VERSION_CODES.M ? 0 : PendingIntent.FLAG_IMMUTABLE;
|
||||
final Intent contentIntent = MwmActivity.createShowMapIntent(mContext, countryId);
|
||||
contentIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
|
||||
@@ -97,7 +97,7 @@ public class DownloaderService extends Service implements MapManager.StorageCall
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onProgress(String countryId, long bytesDownloaded, long bytesTotal)
|
||||
public void onProgress(String countryId, long localSize, long remoteSize)
|
||||
{
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
|
||||
&& ContextCompat.checkSelfPermission(this, POST_NOTIFICATIONS) != PERMISSION_GRANTED)
|
||||
@@ -106,7 +106,8 @@ public class DownloaderService extends Service implements MapManager.StorageCall
|
||||
return;
|
||||
}
|
||||
|
||||
mNotifier.notifyProgress(countryId, (int) bytesTotal, (int) bytesDownloaded);
|
||||
// TODO: How to calculate progress?
|
||||
mNotifier.notifyProgress();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -6,8 +6,8 @@ import androidx.annotation.AttrRes;
|
||||
import androidx.annotation.DrawableRes;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.downloader.CountryItem;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.widget.WheelProgressView;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ import android.content.Intent;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.widget.SearchToolbarController;
|
||||
|
||||
class DownloaderToolbarController extends SearchToolbarController
|
||||
|
||||
@@ -1,223 +0,0 @@
|
||||
package app.organicmaps.downloader;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.text.TextUtils;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.core.util.Consumer;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.downloader.CountryItem;
|
||||
import app.organicmaps.sdk.downloader.ExpandRetryConfirmationListener;
|
||||
import app.organicmaps.sdk.downloader.MapManager;
|
||||
import app.organicmaps.sdk.util.ConnectionState;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import java.lang.ref.WeakReference;
|
||||
|
||||
public class MapManagerHelper
|
||||
{
|
||||
private static WeakReference<AlertDialog> sCurrentErrorDialog;
|
||||
|
||||
@StringRes
|
||||
public static int getErrorCodeStrRes(final int errorCode)
|
||||
{
|
||||
return switch (errorCode)
|
||||
{
|
||||
case CountryItem.ERROR_NO_INTERNET -> R.string.common_check_internet_connection_dialog;
|
||||
case CountryItem.ERROR_OOM -> R.string.downloader_no_space_title;
|
||||
default -> throw new IllegalArgumentException("Given error can not be displayed: " + errorCode);
|
||||
};
|
||||
}
|
||||
|
||||
public static void showError(final Activity activity, final MapManager.StorageCallbackData errorData,
|
||||
@Nullable final Consumer<Boolean> dialogClickListener)
|
||||
{
|
||||
if (!MapManager.nativeIsAutoretryFailed())
|
||||
return;
|
||||
|
||||
showErrorDialog(activity, errorData, dialogClickListener);
|
||||
}
|
||||
|
||||
public static void showErrorDialog(final Activity activity, final MapManager.StorageCallbackData errorData,
|
||||
@Nullable final Consumer<Boolean> dialogClickListener)
|
||||
{
|
||||
if (sCurrentErrorDialog != null)
|
||||
{
|
||||
AlertDialog dlg = sCurrentErrorDialog.get();
|
||||
if (dlg != null && dlg.isShowing())
|
||||
return;
|
||||
}
|
||||
|
||||
final AlertDialog dlg = new MaterialAlertDialogBuilder(activity, R.style.MwmTheme_AlertDialog)
|
||||
.setTitle(R.string.country_status_download_failed)
|
||||
.setMessage(getErrorCodeStrRes(errorData.errorCode))
|
||||
.setNegativeButton(R.string.cancel,
|
||||
(dialog, which) -> {
|
||||
sCurrentErrorDialog = null;
|
||||
if (dialogClickListener != null)
|
||||
dialogClickListener.accept(false);
|
||||
})
|
||||
.setPositiveButton(R.string.downloader_retry,
|
||||
(dialog, which) -> {
|
||||
ExpandRetryConfirmationListener listener =
|
||||
new ExpandRetryConfirmationListener(dialogClickListener);
|
||||
warn3gAndRetry(activity, errorData.countryId, listener);
|
||||
})
|
||||
.create();
|
||||
dlg.setCanceledOnTouchOutside(false);
|
||||
dlg.show();
|
||||
sCurrentErrorDialog = new WeakReference<>(dlg);
|
||||
}
|
||||
|
||||
private static void notifyNoSpaceInternal(Activity activity)
|
||||
{
|
||||
new MaterialAlertDialogBuilder(activity, R.style.MwmTheme_AlertDialog)
|
||||
.setTitle(R.string.downloader_no_space_title)
|
||||
.setMessage(R.string.downloader_no_space_message)
|
||||
.setPositiveButton(android.R.string.ok, null)
|
||||
.show();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if there is no space to update the given {@code root}, so the alert dialog will be shown.
|
||||
*/
|
||||
private static boolean notifyNoSpaceToUpdate(Activity activity, String root)
|
||||
{
|
||||
if (MapManager.nativeHasSpaceToUpdate(root))
|
||||
return false;
|
||||
|
||||
notifyNoSpaceInternal(activity);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if there is no space to download the given {@code root}, so the alert dialog will be shown.
|
||||
*/
|
||||
private static boolean notifyNoSpace(Activity activity, String root)
|
||||
{
|
||||
if (MapManager.nativeHasSpaceToDownloadCountry(root))
|
||||
return false;
|
||||
|
||||
notifyNoSpaceInternal(activity);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if there is no space to download {@code size} bytes, so the alert dialog will be shown.
|
||||
*/
|
||||
private static boolean notifyNoSpace(Activity activity, long size)
|
||||
{
|
||||
if (MapManager.nativeHasSpaceToDownloadAmount(size))
|
||||
return false;
|
||||
|
||||
notifyNoSpaceInternal(activity);
|
||||
return true;
|
||||
}
|
||||
|
||||
private static boolean warnOn3gInternal(Activity activity, @NonNull final Runnable onAcceptListener)
|
||||
{
|
||||
if (MapManager.nativeIsDownloadOn3gEnabled() || !ConnectionState.INSTANCE.isMobileConnected())
|
||||
{
|
||||
onAcceptListener.run();
|
||||
return false;
|
||||
}
|
||||
|
||||
new MaterialAlertDialogBuilder(activity, R.style.MwmTheme_AlertDialog)
|
||||
.setTitle(R.string.download_over_mobile_header)
|
||||
.setMessage(R.string.download_over_mobile_message)
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.setPositiveButton(R.string.ok,
|
||||
(dlg, which) -> {
|
||||
MapManager.nativeEnableDownloadOn3g();
|
||||
onAcceptListener.run();
|
||||
})
|
||||
.show();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean warnOn3gUpdate(Activity activity, @Nullable String countryId,
|
||||
@NonNull final Runnable onAcceptListener)
|
||||
{
|
||||
// noinspection SimplifiableIfStatement
|
||||
if (TextUtils.isEmpty(countryId) || !notifyNoSpaceToUpdate(activity, countryId))
|
||||
return warnOn3gInternal(activity, onAcceptListener);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean warnOn3g(Activity activity, @Nullable String countryId,
|
||||
@NonNull final Runnable onAcceptListener)
|
||||
{
|
||||
// noinspection SimplifiableIfStatement
|
||||
if (TextUtils.isEmpty(countryId) || !notifyNoSpace(activity, countryId))
|
||||
return warnOn3gInternal(activity, onAcceptListener);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean warnOn3g(Activity activity, long size, @NonNull Runnable onAcceptListener)
|
||||
{
|
||||
return !notifyNoSpace(activity, size) && warnOn3gInternal(activity, onAcceptListener);
|
||||
}
|
||||
|
||||
public static boolean warn3gAndDownload(Activity activity, final String countryId,
|
||||
@Nullable final Runnable onAcceptListener)
|
||||
{
|
||||
return warnOn3g(activity, countryId, () -> {
|
||||
if (onAcceptListener != null)
|
||||
onAcceptListener.run();
|
||||
startDownload(countryId);
|
||||
});
|
||||
}
|
||||
|
||||
public static boolean warn3gAndRetry(Activity activity, final String countryId,
|
||||
@Nullable final Runnable onAcceptListener)
|
||||
{
|
||||
return warnOn3g(activity, countryId, () -> {
|
||||
if (onAcceptListener != null)
|
||||
onAcceptListener.run();
|
||||
retryDownload(countryId);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueues failed items under given {@code root} node in downloader.
|
||||
*/
|
||||
public static void retryDownload(@NonNull String countryId)
|
||||
{
|
||||
DownloaderService.startForegroundService();
|
||||
MapManager.retryDownload(countryId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueues given {@code root} node with its children in downloader.
|
||||
*/
|
||||
public static void startUpdate(@NonNull String root)
|
||||
{
|
||||
DownloaderService.startForegroundService();
|
||||
MapManager.startUpdate(root);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueues the given list of nodes and its children in downloader.
|
||||
*/
|
||||
public static void startDownload(String... countries)
|
||||
{
|
||||
DownloaderService.startForegroundService();
|
||||
for (var countryId : countries)
|
||||
{
|
||||
MapManager.startDownload(countryId);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueues given {@code root} node and its children in downloader.
|
||||
*/
|
||||
public static void startDownload(@NonNull String countryId)
|
||||
{
|
||||
DownloaderService.startForegroundService();
|
||||
MapManager.startDownload(countryId);
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,7 @@ import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.ConnectionState;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
||||
import app.organicmaps.widget.WheelProgressView;
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
@@ -52,7 +52,7 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
|
||||
continue;
|
||||
|
||||
if (item.newStatus == CountryItem.STATUS_FAILED)
|
||||
MapManagerHelper.showError(mActivity, item, null);
|
||||
MapManager.showError(mActivity, item, null);
|
||||
|
||||
if (mCurrentCountry.id.equals(item.countryId))
|
||||
{
|
||||
@@ -163,7 +163,7 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
|
||||
if (TextUtils.equals(mCurrentCountry.id, country)
|
||||
&& MapManager.nativeHasSpaceToDownloadCountry(country))
|
||||
{
|
||||
MapManagerHelper.startDownload(mCurrentCountry.id);
|
||||
MapManager.startDownload(mCurrentCountry.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -199,18 +199,18 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
|
||||
setAutodownloadLocked(true);
|
||||
});
|
||||
mButton.setOnClickListener(
|
||||
v -> MapManagerHelper.warnOn3g(mActivity, mCurrentCountry == null ? null : mCurrentCountry.id, () -> {
|
||||
v -> MapManager.warnOn3g(mActivity, mCurrentCountry == null ? null : mCurrentCountry.id, () -> {
|
||||
if (mCurrentCountry == null)
|
||||
return;
|
||||
|
||||
boolean retry = (mCurrentCountry.status == CountryItem.STATUS_FAILED);
|
||||
if (retry)
|
||||
{
|
||||
MapManagerHelper.retryDownload(mCurrentCountry.id);
|
||||
MapManager.retryDownload(mCurrentCountry.id);
|
||||
}
|
||||
else
|
||||
{
|
||||
MapManagerHelper.startDownload(mCurrentCountry.id);
|
||||
MapManager.startDownload(mCurrentCountry.id);
|
||||
mActivity.requestPostNotificationsPermission();
|
||||
}
|
||||
}));
|
||||
|
||||
@@ -14,9 +14,9 @@ import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmFragment;
|
||||
import app.organicmaps.sdk.editor.OpeningHours;
|
||||
import app.organicmaps.sdk.util.Constants;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.util.InputUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
@@ -29,10 +29,10 @@ import app.organicmaps.sdk.editor.data.LocalizedName;
|
||||
import app.organicmaps.sdk.editor.data.LocalizedStreet;
|
||||
import app.organicmaps.sdk.editor.data.Timetable;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.Utils;
|
||||
import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.util.InputUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
@@ -287,8 +287,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
return validateNames();
|
||||
}
|
||||
|
||||
private boolean beforeSavingValidation()
|
||||
{
|
||||
private boolean beforeSavingValidation() {
|
||||
// Validation to make sure address features have a house number
|
||||
if (!Editor.nativeCheckHouseNumberWhenIsAddress())
|
||||
{
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package app.organicmaps.editor;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
@@ -24,7 +25,7 @@ import app.organicmaps.sdk.editor.data.Language;
|
||||
import app.organicmaps.sdk.editor.data.LocalizedName;
|
||||
import app.organicmaps.sdk.editor.data.LocalizedStreet;
|
||||
import app.organicmaps.sdk.editor.data.NamesDataSource;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
||||
import app.organicmaps.widget.SearchToolbarController;
|
||||
|
||||
@@ -10,7 +10,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.editor.data.FeatureCategory;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
|
||||
@@ -79,8 +79,8 @@ public class HoursMinutesPickerFragment extends BaseMwmDialogFragment
|
||||
mTabs.getTabAt(mSelectedTab).select();
|
||||
|
||||
@StyleRes
|
||||
final int theme = ThemeUtils.isNightTheme() ? R.style.MwmMain_DialogFragment_TimePicker_Night
|
||||
: R.style.MwmMain_DialogFragment_TimePicker;
|
||||
final int theme = ThemeUtils.isNightTheme(requireContext()) ? R.style.MwmMain_DialogFragment_TimePicker_Night
|
||||
: R.style.MwmMain_DialogFragment_TimePicker;
|
||||
final AlertDialog dialog = new MaterialAlertDialogBuilder(requireActivity(), theme)
|
||||
.setView(root)
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
@@ -141,8 +141,8 @@ public class HoursMinutesPickerFragment extends BaseMwmDialogFragment
|
||||
MaterialTextView tabView = (MaterialTextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);
|
||||
tabView.setText(getResources().getString(R.string.editor_time_from));
|
||||
final ColorStateList textColor = AppCompatResources.getColorStateList(
|
||||
requireContext(),
|
||||
ThemeUtils.isNightTheme() ? R.color.accent_color_selector_night : R.color.accent_color_selector);
|
||||
requireContext(), ThemeUtils.isNightTheme(requireContext()) ? R.color.accent_color_selector_night
|
||||
: R.color.accent_color_selector);
|
||||
tabView.setTextColor(textColor);
|
||||
mTabs.addTab(mTabs.newTab().setCustomView(tabView), true);
|
||||
tabView = (MaterialTextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);
|
||||
|
||||
@@ -10,7 +10,7 @@ import app.organicmaps.sdk.editor.Editor;
|
||||
import app.organicmaps.sdk.editor.data.Language;
|
||||
import app.organicmaps.sdk.editor.data.LocalizedName;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.organicmaps.sdk.editor;
|
||||
package app.organicmaps.editor;
|
||||
|
||||
import androidx.annotation.Keep;
|
||||
|
||||
@@ -15,11 +15,10 @@ import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmToolbarFragment;
|
||||
import app.organicmaps.sdk.editor.OsmOAuth;
|
||||
import app.organicmaps.sdk.util.Constants;
|
||||
import app.organicmaps.sdk.util.DateUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.concurrency.ThreadPool;
|
||||
import app.organicmaps.sdk.util.concurrency.UiThread;
|
||||
import app.organicmaps.util.InputUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.WindowInsetUtils.ScrollableContentInsetsListener;
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
|
||||
@@ -9,7 +9,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.editor.Editor;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
|
||||
@@ -11,17 +11,14 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.core.view.WindowInsetsCompat;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmToolbarFragment;
|
||||
import app.organicmaps.sdk.editor.OsmOAuth;
|
||||
import app.organicmaps.sdk.util.NetworkPolicy;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.concurrency.ThreadPool;
|
||||
import app.organicmaps.sdk.util.concurrency.UiThread;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.WindowInsetUtils;
|
||||
import app.organicmaps.widget.StackedButtonDialogFragment;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
@@ -29,24 +26,6 @@ import java.text.NumberFormat;
|
||||
|
||||
public class ProfileFragment extends BaseMwmToolbarFragment
|
||||
{
|
||||
@NonNull
|
||||
private static final NetworkPolicy.DialogPresenter mDialogPresenter = new NetworkPolicy.DialogPresenter() {
|
||||
@Override
|
||||
public void showDialogIfNeeded(@NonNull FragmentManager fragmentManager,
|
||||
@NonNull NetworkPolicy.NetworkPolicyListener listener, @NonNull NetworkPolicy policy,
|
||||
boolean isToday)
|
||||
{
|
||||
StackedButtonDialogFragment.showDialogIfNeeded(fragmentManager, listener, policy, isToday);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showDialog(@NonNull FragmentManager fragmentManager,
|
||||
@NonNull NetworkPolicy.NetworkPolicyListener listener)
|
||||
{
|
||||
StackedButtonDialogFragment.showDialog(fragmentManager, listener);
|
||||
}
|
||||
};
|
||||
|
||||
private View mUserInfoBlock;
|
||||
private MaterialTextView mEditsSent;
|
||||
private MaterialTextView mProfileName;
|
||||
@@ -105,7 +84,7 @@ public class ProfileFragment extends BaseMwmToolbarFragment
|
||||
UiUtils.show(mProfileInfoLoading);
|
||||
UiUtils.hide(mUserInfoBlock);
|
||||
}
|
||||
final int profileEditCount = OsmOAuth.getOsmChangesetsCount(mDialogPresenter, getParentFragmentManager());
|
||||
final int profileEditCount = OsmOAuth.getOsmChangesetsCount(getParentFragmentManager());
|
||||
final String profileUsername = OsmOAuth.getUsername();
|
||||
final Bitmap profilePicture = OsmOAuth.getProfilePicture();
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ import androidx.core.view.ViewCompat;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmToolbarFragment;
|
||||
import app.organicmaps.sdk.editor.Editor;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.WindowInsetUtils.ScrollableContentInsetsListener;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
|
||||
|
||||
@@ -18,8 +18,7 @@ import app.organicmaps.sdk.editor.OpeningHours;
|
||||
import app.organicmaps.sdk.editor.data.HoursMinutes;
|
||||
import app.organicmaps.sdk.editor.data.Timespan;
|
||||
import app.organicmaps.sdk.editor.data.Timetable;
|
||||
import app.organicmaps.sdk.util.Utils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.checkbox.MaterialCheckBox;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
@@ -225,7 +224,7 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
|
||||
LayoutInflater.from(itemView.getContext()).inflate(R.layout.item_timetable_closed_hours, closedHost, false);
|
||||
closedHost.addView(
|
||||
span, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
Utils.dimen(closedHost.getContext(), R.dimen.editor_height_closed)));
|
||||
UiUtils.dimen(closedHost.getContext(), R.dimen.editor_height_closed)));
|
||||
closedHours[i] = span;
|
||||
final int finalI = i;
|
||||
span.findViewById(R.id.iv__remove_closed)
|
||||
|
||||
@@ -10,7 +10,7 @@ import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.dialog.EditTextDialogFragment;
|
||||
import app.organicmaps.sdk.editor.data.LocalizedStreet;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import com.google.android.material.radiobutton.MaterialRadioButton;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ import androidx.fragment.app.FragmentActivity;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmFragment;
|
||||
import app.organicmaps.sdk.editor.OpeningHours;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
|
||||
@@ -24,8 +24,6 @@ import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.util.SharingUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.WindowInsetUtils.ScrollableContentInsetsListener;
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
public class HelpFragment extends BaseMwmFragment implements View.OnClickListener
|
||||
{
|
||||
@@ -43,15 +41,15 @@ public class HelpFragment extends BaseMwmFragment implements View.OnClickListene
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
|
||||
{
|
||||
mDonateUrl = Utils.getDonateUrl(requireContext());
|
||||
mDonateUrl = Config.getDonateUrl(requireContext());
|
||||
View root = inflater.inflate(R.layout.about, container, false);
|
||||
|
||||
((MaterialTextView) root.findViewById(R.id.version)).setText(BuildConfig.VERSION_NAME);
|
||||
((TextView) root.findViewById(R.id.version)).setText(BuildConfig.VERSION_NAME);
|
||||
|
||||
final boolean isLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
|
||||
|
||||
final String dataVersion = DateUtils.getShortDateFormatter().format(Framework.getDataVersion());
|
||||
final MaterialTextView osmPresentationView = root.findViewById(R.id.osm_presentation);
|
||||
final TextView osmPresentationView = root.findViewById(R.id.osm_presentation);
|
||||
if (osmPresentationView != null)
|
||||
{
|
||||
osmPresentationView.setText(getString(R.string.osm_presentation, dataVersion));
|
||||
@@ -73,13 +71,13 @@ public class HelpFragment extends BaseMwmFragment implements View.OnClickListene
|
||||
setupItem(R.id.report, isLandscape, root);
|
||||
setupItem(R.id.copyright, false, root);
|
||||
|
||||
final MaterialTextView supportUsView = root.findViewById(R.id.support_us);
|
||||
final TextView supportUsView = root.findViewById(R.id.support_us);
|
||||
if (BuildConfig.FLAVOR.equals("google") && !TextUtils.isEmpty(mDonateUrl))
|
||||
supportUsView.setVisibility(View.GONE);
|
||||
else
|
||||
setupItem(R.id.support_us, true, root);
|
||||
|
||||
final MaterialButton donateView = root.findViewById(R.id.donate);
|
||||
final TextView donateView = root.findViewById(R.id.donate);
|
||||
if (TextUtils.isEmpty(mDonateUrl))
|
||||
donateView.setVisibility(View.GONE);
|
||||
else
|
||||
|
||||
@@ -8,7 +8,7 @@ import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.util.SharedPropertiesUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import java.util.List;
|
||||
|
||||
public class LayersAdapter extends RecyclerView.Adapter<LayerHolder>
|
||||
|
||||
@@ -29,7 +29,7 @@ public class LayersButton extends FloatingActionButton
|
||||
{
|
||||
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
|
||||
if (mAreLayersActive)
|
||||
mergeDrawableStates(drawableState, new int[] {R.attr.layers_enabled});
|
||||
mergeDrawableStates(drawableState, new int[] {R.attr.state_layers_enabled});
|
||||
return drawableState;
|
||||
}
|
||||
|
||||
|
||||
@@ -36,9 +36,8 @@ import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
||||
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.WindowInsetUtils;
|
||||
import app.organicmaps.widget.menu.MyPositionButton;
|
||||
import app.organicmaps.widget.placepage.PlacePageViewModel;
|
||||
@@ -215,7 +214,7 @@ public class MapButtonsController extends Fragment
|
||||
// helpButton.setImageResource(R.drawable.ic_launcher);
|
||||
// }
|
||||
// // Keep this button colorful in normal theme.
|
||||
// if (!ThemeUtils.isNightTheme())
|
||||
// if (!ThemeUtils.isNightTheme(requireContext()))
|
||||
// helpButton.getDrawable().setTintList(null);
|
||||
}
|
||||
else if (leftButtonView != null)
|
||||
|
||||
@@ -16,9 +16,9 @@ import androidx.annotation.StringRes;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.search.SearchEngine;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.concurrency.UiThread;
|
||||
import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
|
||||
public class SearchWheel implements View.OnClickListener
|
||||
{
|
||||
|
||||
@@ -10,8 +10,8 @@ import android.widget.RelativeLayout;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.core.content.res.ResourcesCompat;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import java.util.Objects;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@@ -43,20 +43,22 @@ public class TrafficButton
|
||||
void turnOff()
|
||||
{
|
||||
stopWaitingAnimation();
|
||||
mButton.setImageResource(ThemeUtils.isNightTheme() ? R.drawable.ic_traffic_on_night : R.drawable.ic_traffic_on);
|
||||
mButton.setImageResource(ThemeUtils.isNightTheme(mButton.getContext()) ? R.drawable.ic_traffic_on_night
|
||||
: R.drawable.ic_traffic_on);
|
||||
}
|
||||
|
||||
void turnOn()
|
||||
{
|
||||
stopWaitingAnimation();
|
||||
mButton.setImageResource(ThemeUtils.isNightTheme() ? R.drawable.ic_traffic_on_night : R.drawable.ic_traffic_on);
|
||||
mButton.setImageResource(ThemeUtils.isNightTheme(mButton.getContext()) ? R.drawable.ic_traffic_on_night
|
||||
: R.drawable.ic_traffic_on);
|
||||
}
|
||||
|
||||
void markAsOutdated()
|
||||
{
|
||||
stopWaitingAnimation();
|
||||
mButton.setImageResource(ThemeUtils.isNightTheme() ? R.drawable.ic_traffic_outdated_night
|
||||
: R.drawable.ic_traffic_outdated);
|
||||
mButton.setImageResource(ThemeUtils.isNightTheme(mButton.getContext()) ? R.drawable.ic_traffic_outdated_night
|
||||
: R.drawable.ic_traffic_outdated);
|
||||
}
|
||||
|
||||
void startWaitingAnimation()
|
||||
|
||||
@@ -12,14 +12,14 @@ import android.widget.ExpandableListView;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.adapter.DisabledChildSimpleExpandableListAdapter;
|
||||
import app.organicmaps.base.BaseMwmDialogFragment;
|
||||
import app.organicmaps.sdk.downloader.CountryItem;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.sdk.util.Utils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
import java.util.ArrayList;
|
||||
@@ -128,7 +128,7 @@ abstract class BaseRoutingErrorDialogFragment extends BaseMwmDialogFragment
|
||||
|
||||
UiUtils.waitLayout(listView, () -> {
|
||||
final int width = listView.getWidth();
|
||||
final int indicatorWidth = Utils.dimen(requireContext(), R.dimen.margin_quadruple);
|
||||
final int indicatorWidth = UiUtils.dimen(requireContext(), R.dimen.margin_quadruple);
|
||||
listView.setIndicatorBounds(width - indicatorWidth, width);
|
||||
listView.setIndicatorBoundsRelative(width - indicatorWidth, width);
|
||||
});
|
||||
|
||||
@@ -16,7 +16,7 @@ import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||
import app.organicmaps.sdk.routing.RouteMarkData;
|
||||
import app.organicmaps.sdk.routing.RouteMarkType;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
import java.util.ArrayList;
|
||||
@@ -94,7 +94,7 @@ public class ManageRouteAdapter extends RecyclerView.Adapter<ManageRouteAdapter.
|
||||
if (mRoutePoints.get(position).mIsMyPosition)
|
||||
{
|
||||
// My position point.
|
||||
title = mContext.getString(app.organicmaps.sdk.R.string.core_my_position);
|
||||
title = mContext.getString(R.string.core_my_position);
|
||||
|
||||
if (mRoutePoints.get(position).mPointType != RouteMarkType.Start)
|
||||
subtitle = mRoutePoints.get(position).mTitle;
|
||||
|
||||
@@ -23,7 +23,7 @@ import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||
import app.organicmaps.sdk.routing.RouteMarkData;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import com.google.android.material.bottomsheet.BottomSheetBehavior;
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialog;
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
package app.organicmaps.routing;
|
||||
|
||||
import static app.organicmaps.sdk.util.Utils.dimen;
|
||||
|
||||
import android.location.Location;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
@@ -23,10 +21,9 @@ import app.organicmaps.sdk.routing.CarDirection;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.WindowInsetUtils;
|
||||
import app.organicmaps.widget.CurrentSpeedView;
|
||||
import app.organicmaps.widget.LanesView;
|
||||
import app.organicmaps.widget.SpeedLimitView;
|
||||
import app.organicmaps.widget.menu.NavMenu;
|
||||
@@ -52,8 +49,6 @@ public class NavigationController implements TrafficManager.TrafficCallback, Nav
|
||||
private final LanesView mLanesView;
|
||||
@NonNull
|
||||
private final SpeedLimitView mSpeedLimit;
|
||||
@NonNull
|
||||
private final CurrentSpeedView mCurrentSpeed;
|
||||
|
||||
private final MapButtonsViewModel mMapButtonsViewModel;
|
||||
|
||||
@@ -97,7 +92,6 @@ public class NavigationController implements TrafficManager.TrafficCallback, Nav
|
||||
mLanesView = topFrame.findViewById(R.id.lanes);
|
||||
|
||||
mSpeedLimit = topFrame.findViewById(R.id.nav_speed_limit);
|
||||
mCurrentSpeed = topFrame.findViewById(R.id.nav_current_speed);
|
||||
|
||||
// Show a blank view below the navbar to hide the menu content
|
||||
final View navigationBarBackground = mFrame.findViewById(R.id.nav_bottom_sheet_nav_bar);
|
||||
@@ -132,7 +126,7 @@ public class NavigationController implements TrafficManager.TrafficCallback, Nav
|
||||
|
||||
mLanesView.setLanes(info.lanes);
|
||||
|
||||
updateSpeedWidgets(info);
|
||||
updateSpeedLimit(info);
|
||||
}
|
||||
|
||||
private void updatePedestrian(@NonNull RoutingInfo info)
|
||||
@@ -140,7 +134,6 @@ public class NavigationController implements TrafficManager.TrafficCallback, Nav
|
||||
mNextTurnDistance.setText(Utils.formatDistance(mFrame.getContext(), info.distToTurn));
|
||||
|
||||
info.pedestrianTurnDirection.setTurnDrawable(mNextTurnImage);
|
||||
updateSpeedWidgets(info);
|
||||
}
|
||||
|
||||
public void updateNorth()
|
||||
@@ -173,7 +166,7 @@ public class NavigationController implements TrafficManager.TrafficCallback, Nav
|
||||
UiUtils.visibleIf(hasStreet, mStreetFrame);
|
||||
if (!TextUtils.isEmpty(info.nextStreet))
|
||||
mNextStreet.setText(info.nextStreet);
|
||||
int margin = dimen(mFrame.getContext(), R.dimen.nav_frame_padding);
|
||||
int margin = UiUtils.dimen(mFrame.getContext(), R.dimen.nav_frame_padding);
|
||||
if (hasStreet)
|
||||
margin += mStreetFrame.getHeight();
|
||||
mMapButtonsViewModel.setTopButtonsMarginTop(margin);
|
||||
@@ -266,18 +259,16 @@ public class NavigationController implements TrafficManager.TrafficCallback, Nav
|
||||
RoutingController.get().cancel();
|
||||
}
|
||||
|
||||
private void updateSpeedWidgets(@NonNull final RoutingInfo info)
|
||||
private void updateSpeedLimit(@NonNull final RoutingInfo info)
|
||||
{
|
||||
final Location location = MwmApplication.from(mFrame.getContext()).getLocationHelper().getSavedLocation();
|
||||
if (location == null)
|
||||
{
|
||||
mSpeedLimit.setSpeedLimit(-1, false);
|
||||
mCurrentSpeed.setCurrentSpeed(-1);
|
||||
mSpeedLimit.setSpeedLimit(0, false);
|
||||
return;
|
||||
}
|
||||
final int fSpeedLimit = StringUtils.nativeFormatSpeed(info.speedLimitMps);
|
||||
final boolean speedLimitExceeded = fSpeedLimit < StringUtils.nativeFormatSpeed(location.getSpeed());
|
||||
mSpeedLimit.setSpeedLimit(fSpeedLimit, speedLimitExceeded);
|
||||
mCurrentSpeed.setCurrentSpeed(location.getSpeed());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
package app.organicmaps.routing;
|
||||
|
||||
import static app.organicmaps.sdk.util.Utils.dimen;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
@@ -39,14 +37,12 @@ import app.organicmaps.sdk.routing.RoutingInfo;
|
||||
import app.organicmaps.sdk.routing.TransitRouteInfo;
|
||||
import app.organicmaps.sdk.routing.TransitStepInfo;
|
||||
import app.organicmaps.sdk.util.Distance;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.widget.recycler.DotDividerItemDecoration;
|
||||
import app.organicmaps.widget.recycler.MultilineLayoutManager;
|
||||
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
import java.util.LinkedList;
|
||||
@@ -155,10 +151,10 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
||||
mTransitViewDecorator =
|
||||
new DotDividerItemDecoration(dividerDrawable, res.getDimensionPixelSize(R.dimen.margin_base),
|
||||
res.getDimensionPixelSize(R.dimen.margin_half));
|
||||
MaterialButton manageRouteButton = altitudeChartFrame.findViewById(R.id.btn__manage_route);
|
||||
Button manageRouteButton = altitudeChartFrame.findViewById(R.id.btn__manage_route);
|
||||
manageRouteButton.setOnClickListener(this);
|
||||
|
||||
MaterialButton saveButton = altitudeChartFrame.findViewById(R.id.btn__save);
|
||||
Button saveButton = altitudeChartFrame.findViewById(R.id.btn__save);
|
||||
saveButton.setOnClickListener(this);
|
||||
}
|
||||
|
||||
@@ -170,7 +166,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
||||
showRouteAltitudeChart();
|
||||
showRoutingDetails();
|
||||
UiUtils.show(mAltitudeChartFrame);
|
||||
MaterialButton saveButton = mAltitudeChartFrame.findViewById(R.id.btn__save);
|
||||
Button saveButton = mAltitudeChartFrame.findViewById(R.id.btn__save);
|
||||
saveButton.setText(R.string.save);
|
||||
saveButton.setEnabled(true);
|
||||
}
|
||||
@@ -349,17 +345,16 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
||||
|
||||
UiUtils.hide(mTimeVehicle);
|
||||
|
||||
int chartWidth = dimen(mContext, R.dimen.altitude_chart_image_width);
|
||||
int chartHeight = dimen(mContext, R.dimen.altitude_chart_image_height);
|
||||
int chartWidth = UiUtils.dimen(mContext, R.dimen.altitude_chart_image_width);
|
||||
int chartHeight = UiUtils.dimen(mContext, R.dimen.altitude_chart_image_height);
|
||||
Framework.RouteAltitudeLimits limits = new Framework.RouteAltitudeLimits();
|
||||
Bitmap bm = Framework.generateRouteAltitudeChart(chartWidth, chartHeight, limits);
|
||||
if (bm != null)
|
||||
{
|
||||
mAltitudeChart.setImageBitmap(bm);
|
||||
UiUtils.show(mAltitudeChart);
|
||||
final String unit = limits.isMetricUnits
|
||||
? mAltitudeDifference.getResources().getString(app.organicmaps.sdk.R.string.m)
|
||||
: mAltitudeDifference.getResources().getString(app.organicmaps.sdk.R.string.ft);
|
||||
final String unit = limits.isMetricUnits ? mAltitudeDifference.getResources().getString(R.string.m)
|
||||
: mAltitudeDifference.getResources().getString(R.string.ft);
|
||||
mAltitudeDifference.setText("↗ " + limits.totalAscentString + " " + unit + " ↘ " + limits.totalDescentString + " "
|
||||
+ unit);
|
||||
UiUtils.show(mAltitudeDifference);
|
||||
|
||||
@@ -14,10 +14,9 @@ import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.fragment.app.FragmentFactory;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.downloader.MapManagerHelper;
|
||||
import app.organicmaps.sdk.downloader.CountryItem;
|
||||
import app.organicmaps.sdk.downloader.MapManager;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
public class RoutingErrorDialogFragment extends BaseRoutingErrorDialogFragment
|
||||
@@ -109,7 +108,7 @@ public class RoutingErrorDialogFragment extends BaseRoutingErrorDialogFragment
|
||||
}
|
||||
}
|
||||
|
||||
MapManagerHelper.warnOn3g(requireActivity(), size, () -> {
|
||||
MapManager.warnOn3g(requireActivity(), size, () -> {
|
||||
final FragmentManager manager = requireActivity().getSupportFragmentManager();
|
||||
RoutingMapsDownloadFragment downloader =
|
||||
RoutingMapsDownloadFragment.create(manager.getFragmentFactory(), getAppContextOrThrow(), mMapsArray);
|
||||
|
||||
@@ -9,11 +9,10 @@ import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.fragment.app.FragmentFactory;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.downloader.MapManagerHelper;
|
||||
import app.organicmaps.sdk.downloader.CountryItem;
|
||||
import app.organicmaps.sdk.downloader.MapManager;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.widget.WheelProgressView;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
@@ -41,7 +40,7 @@ public class RoutingMapsDownloadFragment extends BaseRoutingErrorDialogFragment
|
||||
mMapsArray[i] = item.id;
|
||||
}
|
||||
|
||||
MapManagerHelper.startDownload(mMapsArray);
|
||||
MapManager.startDownload(mMapsArray);
|
||||
}
|
||||
|
||||
private View setupFrame(View frame)
|
||||
|
||||
@@ -21,8 +21,8 @@ import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||
import app.organicmaps.sdk.routing.RoutingOptions;
|
||||
import app.organicmaps.sdk.routing.TransitRouteInfo;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.settings.DrivingOptionsActivity;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
||||
import app.organicmaps.widget.RoutingToolbarButton;
|
||||
import app.organicmaps.widget.ToolbarController;
|
||||
@@ -141,8 +141,7 @@ public class RoutingPlanController extends ToolbarController
|
||||
setupRouterButton(R.id.vehicle, R.drawable.ic_car, this::onVehicleModeSelected);
|
||||
setupRouterButton(R.id.pedestrian, R.drawable.ic_pedestrian, this::onPedestrianModeSelected);
|
||||
// setupRouterButton(R.id.taxi, R.drawable.ic_taxi, this::onTaxiModeSelected);
|
||||
setupRouterButton(R.id.transit, app.organicmaps.sdk.R.drawable.ic_route_planning_metro_40px,
|
||||
this::onTransitModeSelected);
|
||||
setupRouterButton(R.id.transit, R.drawable.ic_route_planning_metro_40px, this::onTransitModeSelected);
|
||||
setupRouterButton(R.id.bicycle, R.drawable.ic_bike, this::onBicycleModeSelected);
|
||||
setupRouterButton(R.id.ruler, app.organicmaps.sdk.R.drawable.ic_ruler_route, this::onRulerModeSelected);
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import app.organicmaps.MwmActivity;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
|
||||
public class RoutingPlanInplaceController extends RoutingPlanController
|
||||
{
|
||||
|
||||
@@ -90,7 +90,7 @@ public class TransitStepView extends View implements MultilineLayoutManager.Sque
|
||||
{
|
||||
mDrawable = null;
|
||||
mText = info.getDistance() + " " + info.getDistanceUnits();
|
||||
mTextPaint.setColor(ThemeUtils.isDefaultTheme() ? Color.BLACK : Color.WHITE);
|
||||
mTextPaint.setColor(ThemeUtils.isDefaultTheme(getContext()) ? Color.BLACK : Color.WHITE);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ public class DownloadResourcesLegacyActivity
|
||||
{
|
||||
// Called by JNI.
|
||||
@Keep
|
||||
void onProgress(int bytesDownloaded);
|
||||
void onProgress(int percent);
|
||||
|
||||
// Called by JNI.
|
||||
@Keep
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user