diff --git a/OsmAnd/res/values-be/strings.xml b/OsmAnd/res/values-be/strings.xml index 58c258c4f5..471ef2f5ea 100644 --- a/OsmAnd/res/values-be/strings.xml +++ b/OsmAnd/res/values-be/strings.xml @@ -1960,4 +1960,6 @@ OsmAnd мае адкрыты зыходны код і актыўна разві ПАКАЗАЦЬ УСЁ Каардынаты Бліжэйшая дарога не была знойдзена + Выкарыстоўваць OpenGL + Выкарыстоўваць апаратнае паскарэньне OpenGL (можа не працаваць на некаторых прыстасаваньнях) diff --git a/OsmAnd/res/values-ca/strings.xml b/OsmAnd/res/values-ca/strings.xml index 58e3effcb3..05b3d85f7f 100644 --- a/OsmAnd/res/values-ca/strings.xml +++ b/OsmAnd/res/values-ca/strings.xml @@ -1901,5 +1901,7 @@ La llista de països inclosos (bàsicament tot el món!): Afganistan, Albània, MOSTRA\'LS TOTS Coordenades Mapes - No s\'ha trobat cap ruta aprop + No s\'ha trobat cap ruta a prop + Ús de renderització OpenGL + Ús de renderitació OpenGL per accelerador gràfic (no funciona a tots els dispositius) diff --git a/OsmAnd/res/values-da/phrases.xml b/OsmAnd/res/values-da/phrases.xml index ebb1697b96..af5a6d2fef 100644 --- a/OsmAnd/res/values-da/phrases.xml +++ b/OsmAnd/res/values-da/phrases.xml @@ -66,7 +66,7 @@ Optiker Økologiske fødevarer Fritidsbeklædning - Maling + Malerværksted Dyrehandel Radiodele Genbrugsbutik diff --git a/OsmAnd/res/values-da/strings.xml b/OsmAnd/res/values-da/strings.xml index bf175ea0f1..b6411a7219 100644 --- a/OsmAnd/res/values-da/strings.xml +++ b/OsmAnd/res/values-da/strings.xml @@ -1851,4 +1851,6 @@ Koordinater Kort Nærmeste vej blev ikke fundet + Brug OpenGL optegning + Brug hardware accelereret OpenGL optegning (virker muligvis ikke på alle enheder) diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml index 3c027aead9..6f7cf174ed 100644 --- a/OsmAnd/res/values-de/strings.xml +++ b/OsmAnd/res/values-de/strings.xml @@ -1,4 +1,4 @@ - + Geschwindigkeitsbegrenzung Grenzkontrolle @@ -1950,7 +1950,7 @@ Afghanistan, Ägypten, Albanien, Algerien, Andorra, Angola, Anguilla, Antigua an GPX-Route umkehren Derzeitiges Ziel verwenden Gesamten Track durchlaufen - Keine GPX-Dateien gefunden in /tracks-Ordner + Keine GPX-Dateien gefunden im /tracks-Ordner GPX-Dateiname GPX-Datei erfolgreich gespeichert unter {0} Berechnen des ersten und letzten Abschnitts der OsmAnd-Route diff --git a/OsmAnd/res/values-es/strings.xml b/OsmAnd/res/values-es/strings.xml index f8f253523b..859f8461b7 100644 --- a/OsmAnd/res/values-es/strings.xml +++ b/OsmAnd/res/values-es/strings.xml @@ -1,4 +1,4 @@ - + Configura pantalla @@ -1884,4 +1884,7 @@ Afganistán, Albania, Alemania, Andorra, Angola, Anguila, Antigua y Barbuda, Ant MOSTRAR MAPA MOSTRAR TODO Coordenadas - + Usar renderizado opengl + Usar renderizado opengl acelerado por hardware (podría no funcionar en algunos dispositivos) + No se ha encontrado la carretera más cercana + diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index efd62d4ddf..4ae1905026 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -1867,4 +1867,6 @@ Afghanistan, Albanie, Algérie, Allemagne, Andorre, Angola, Anguilla, Antigua-et Coordonnées Cartes Aucune route n\'a été trouvée à proximité + Utiliser le rendu OpenGL + Utiliser le rendu matériel accéléré OpenGL (cette option peut être inefficace sur certains appareils) diff --git a/OsmAnd/res/values-hu/phrases.xml b/OsmAnd/res/values-hu/phrases.xml new file mode 100644 index 0000000000..2935ffbfca --- /dev/null +++ b/OsmAnd/res/values-hu/phrases.xml @@ -0,0 +1,235 @@ + +Régészeti lelőhely + + Pékség + Kisbolt + Bevásárlóközpont + Italbolt + Hentes + Delikatesz bolt + Farm bolt + Zöldséges + Halárus + Cukrászda + Fagyizó + Szupermarket + Teabolt + Tejtermék bolt + Árusító automata + + Könyvesbolt + Kerékpárbolt + Anime bolt + Antikvárius + Drogéria + Fénymásoló + Virágárus + Kertészet + Ajándékbolt + Háztartási bolt + Ékszerbolt + Motorkerékpár kereskedés + Sportbolt + Jegyárus + Dohánybolt + Játékbolt + 100 forintos bolt + Áruház + Autókereskedés + Autóalkatrész + Piac + Rendőrség + Tűzoltóság + Segélykérő telefon + Tűzcsap + Mentőállomás + Gázló + Hágó + Kapu + Városfal + Sorompó + Fizetőkapu + Határellenőrzés + Villanyrendőr + + Autószerviz + Autógumis + Autómosó + Benzinkút + Elektromos töltőállomás + Sűrített levegő + Parkoló + Motor parkoló + Parkolóház bejárat + Garázsok + + Tömegközlekedési megálló + Buszmegálló + Trolimegálló + Villamosmegálló + Metró lejárat + Metrómegálló + Taxidroszt + + Repülőtér + Kifutópálya + Utasterminál + Reptér kapu + + Sólya + Kompkikötő + Világítótorony + + Kerékpárkölcsönző + Kerékpárparkoló + + Alagút + Híd + + Traffipax + Autópálya csomópont + + Víztorony + Posta + Postaláda + Telefon + Távközlési torony + Hulladékgyűjtő + Szeméttelep + Móló + Szélmalom + Kőfejtő + Szőlős + Gyümölcsös + Sólepárló + Iskola + Óvoda + Egyetem + + Bíróság + Börtön + Nagykövetség + Nagyváros + Város + Falu + Falucska + Lakatlan hely + + Gyógyszertár + Kórház + Orvos + Klinika + Fogorvos + Állatorvos + Szanatórium + Városháza + Stadion + Sportközpont + Golfpálya + Műjégpálya + Pálya + Versenypálya + Múzeum + Turistalátványosság + Emlékmű + Műalkotás + Kastély + Városkapu + Erőd + Szökőkút + Romok + Műemlék + Állatkert + Vidámpark + + Hotel + Vendégház + Motel + Menedékház + Istentiszteleti hely + Istentiszteleti hely: keresztény + Istentiszteleti hely: zsidó + Istentiszteleti hely: muszlim + Istentiszteleti hely: szikh + Istentiszteleti hely: buddhista + Istentiszteleti hely: hindu + Istentiszteleti hely: sintoista + Istentiszteleti hely: taoista + Kolostor + Útmenti kereszt + Turistainformáció + Óra + Kilátóhely + Kemping + Lakóautó hely + Piknikezőhely + Forrás + Hőforrás + Gejzír + Temető + Sírkert + Menedék + Sikló + Könyvtár + Mozi + Kaszinó + Közösségi ház + Színház + Cirkusz + Strand + Vadászles + Kishajókikötő + Minigolf + Játszótér + Úszómedence + Park + + Kávézó + Sörkert + Étterem + Gyorsétterem + Bár + Kocsma + Ivóvíz + Méhész + Patkolókovács + Sörfőzde + Könyvkötő + Asztalos + Órás + Ruhakészítő + Villanyszerelő + Kertész + Ékszerész + Zárjavító + Kulcsmásoló + Fotográfus + Fotólabor + Vízvezeték szerelő + Tetőfedő + Cipész + Fodrász + Autókölcsönző + Bank + Bankautomata + Pénzváltó + Könyvelő + Barlangbejárat + Hegycsúcs + Nyereg + Vulkán + Kráter + Gerinc + Gleccser + Víznyelő + Vízesés + Folyó + Patak + Strand + Öböl + Fjord + Zátony + Láp + Természetvédelmi terület + Sziget + diff --git a/OsmAnd/res/values-hu/strings.xml b/OsmAnd/res/values-hu/strings.xml index 7283f229db..4e6ecfa853 100644 --- a/OsmAnd/res/values-hu/strings.xml +++ b/OsmAnd/res/values-hu/strings.xml @@ -1,4 +1,4 @@ - + "A 0.7.2 kiadás változásai: \n\t- Natív renderelő minden eszközre \n\t- Offline POI szerkesztés @@ -424,7 +424,7 @@ OsmAnd offline útvonaltervező használata nagy távolságokra is (kísérleti funkció) Az OsmAnd offline útvonaltervezője kísérleti funkció és nem működik 20 kilométernél nagyobb távolságban.\n\nÁtmenetileg átállítva online Cluodmade-re. Nem található a megadott könyvtár. - Tárolási könyvtár + Adatok tárolási helye OsmAnd verzió {0} sikeresen telepítve ({1}). Összeállítás letöltése… @@ -480,7 +480,7 @@ Hang Nincs betöltött vektoros térkép Útvonal GPX alapján - Nem található GPX fálj /osmand/tracks könyvtárban + Nem található GPX fálj a tracks könyvtárban GPX útvonal… GPX adat olvasási hiba Vektoros OSM térkép @@ -601,7 +601,7 @@ Épület: {0}, {1}, {2} Kedvenc Mindent töröl - Előzmény + Előzmények Adat feltöltése… Feltöltés… Semmi sem található @@ -616,7 +616,7 @@ Teljes távolság %1$s, utazási idő %2$d ó. %3$d p. Online vagy offline útvonaltervező szolgáltatás kiválasztása Útvonaltervező - Nem található könyvtár az SD kártyán mentésre + Az adattárolási könyvtár nem elérhető az SD kártyán Letöltés {0} - {1} ? >Már létezik indexadat {0} régióhoz ({1}). Szeretné frissíteni ({2})? Cím @@ -684,7 +684,7 @@ Jelenlegi útvonal mentése Válassz naplózási időközt a navigáció alatti útvonalrögzítéshez Rögzítési sűrűség navigáció közben - Az útvonalak navigáció közben kerülnek mentésre a track könyvtárba + Az útvonalak navigáció közben kerülnek mentésre a tracks könyvtárba Útvonal naplózása GPX fájlba navigáció közben Térkép frissítés Térképcsempe újraolvasása @@ -999,49 +999,8 @@ \n\nAz OsmAnd saját forrásokat is támogat. Globális mobil térkép és navigáció, offline és online OSM térképekkel - - OsmAnd (OSM Automated Navigation Directions) - - Az OsmAnd egy nyílt forráskódú navigációs alkalmazás az OpenStreetMap (OSM) adatainak széleskörű használatával. Bármelyik térképadat (vektoros és raszteres térképek) tárolható a készülék memóriakártyáján offline használatra. Az OsmAnd továbbá lehetővé teszi az offline és online útvonaltervezést is, részletes hangutasításokkal. - - Néhány fontosabb funkció: - - Teljesen offline működés (a letöltött vektoros és raszteres térképek választható könyvtárban tárolhatók) - - A kompakt, offline vektoros térképek az egész világhoz elérhetőek - - Az ország vagy régió térképei letölthetők közvetlenül az alkalmazásból - - Számos rávetíthető térképréteg, mint GPX-ek, navigációs útvonalak, POI-k (érdekes helyek), kedvencek, szintvonalak, tömegközlekedési megállók, további térképek beállítható átlátszósággal - - Címek és helyek offline kereshetősége - - Offline útvonaltervezés rövidebb távolságokra (kísérleti) - - Autós, kerékpáros és gyalogos módok: - - Opcionális automata nappali/éjszakai nézetváltással - - Opcionális sebességfüggő nagyítással - - Opcionális térképforgatással a mozgás vagy az iránytű alapján - - Az OsmAnd ingyenes változatának korlátozásai: - - Korlátozott számú vektoros térképletöltés - - Offline Wikipédia cikkek nem elérhetőek - - Az OsmAnd folyamatosan fejlesztés alatt áll és a projektünk nagyban függ a pénzügyi támogatásoktól, amiből finanszírozhatók a fejlesztések és az új funkciók tesztelése. Kérlek, fontold meg az OsmAnd+ megvásárlását, vagy egy-egy funkció támogatását az osmand.net oldalon - - - OsmAnd+ (OSM Automated Navigation Directions) - - Az OsmAnd+ egy nyílt forráskódú navigációs alkalmazás az OpenStreetMap (OSM) adatainak széleskörű használatával. Bármelyik térképadat (vektoros és raszteres térképek) tárolható a készülék memóriakártyáján offline használatra. Az OsmAnd továbbá lehetővé teszi az offline és online útvonaltervezést is, részletes hangutasításokkal. - - Az OsmAnd+ az alkalmazás fizetős változata, aminek megvásárlásával támogatod a projektet, az új funkciók fejlesztésének finanszírozását és megkapod a legújabb frissítéseket. - - Néhány fontosabb funkció: - - Teljesen offline működés (a letöltött vektoros és raszteres térképek választható könyvtárban tárolhatók) - - A kompakt, offline vektoros térképek az egész világhoz elérhetőek - - Az ország vagy régió térképei korlátlan számban letölthetők, közvetlenül az alkalmazásból - - Offline Wikipédia szócikkek letöltése, ami hasznos segítség városnézéshez - - Számos rávetíthető térképréteg, mint GPX-ek, navigációs útvonalak, POI-k (érdekes helyek), kedvencek, szintvonalak, tömegközlekedési megállók, további térképek beállítható átlátszósággal - - Címek és helyek offline kereshetősége - - Offline útvonaltervezés rövidebb távolságokra (kísérleti) - - Autós, kerékpáros és gyalogos módok: - - Opcionális automata nappali/éjszakai nézetváltással - - Opcionális sebességfüggő nagyítással - - Opcionális térképforgatással a mozgás vagy az iránytű alapján - +" OsmAnd (OSM Automated Navigation Directions) Az OsmAnd egy nyílt forráskódú navigációs alkalmazás az OpenStreetMap (OSM) adatainak széleskörű használatával. Bármelyik térképadat (vektoros és raszteres térképek) tárolható a készülék memóriakártyáján offline használatra. Az OsmAnd továbbá lehetővé teszi az offline és online útvonaltervezést is, részletes hangutasításokkal. Néhány fontosabb funkció: - Teljesen offline működés (a letöltött vektoros és raszteres térképek az eszközön tárolódnak) - A kompakt, offline vektoros térképek az egész világhoz elérhetőek - Az ország vagy régió térképei letölthetők közvetlenül az alkalmazásból - Számos rávetíthető térképréteg, mint GPX-ek, navigációs útvonalak, POI-k (érdekes helyek), kedvencek, szintvonalak, tömegközlekedési megállók, további térképek beállítható átlátszósággal - Címek és helyek offline kereshetősége - Offline útvonaltervezés rövidebb távolságokra (kísérleti) - Autós, kerékpáros és gyalogos módok: - Opcionális automata nappali/éjszakai nézetváltással - Opcionális sebességfüggő nagyítással - Opcionális térképforgatással a mozgás vagy az iránytű alapján Az OsmAnd ingyenes változatának korlátozásai: - Korlátozott számú vektoros térképletöltés - Offline Wikipédia cikkek nem elérhetőek Az OsmAnd folyamatosan fejlesztés alatt áll és a projektünk nagyban függ a pénzügyi támogatásoktól, amiből finanszírozhatók a fejlesztések és az új funkciók tesztelése. Kérlek, fontold meg az OsmAnd+ megvásárlását, vagy egy-egy funkció támogatását az osmand.net oldalon " +" OsmAnd+ (OSM Automated Navigation Directions) Az OsmAnd+ egy nyílt forráskódú navigációs alkalmazás az OpenStreetMap (OSM) adatainak széleskörű használatával. Bármelyik térképadat (vektoros és raszteres térképek) tárolható a készülék memóriakártyáján offline használatra. Az OsmAnd továbbá lehetővé teszi az offline és online útvonaltervezést is, részletes hangutasításokkal. Az OsmAnd+ az alkalmazás fizetős változata, aminek megvásárlásával támogatod a projektet, az új funkciók fejlesztésének finanszírozását és megkapod a legújabb frissítéseket. Néhány fontosabb funkció: - Teljesen offline működés (a letöltött vektoros és raszteres térképek az eszközön tárolódnak) - A kompakt, offline vektoros térképek az egész világhoz elérhetőek - Az ország vagy régió térképei korlátlan számban letölthetők, közvetlenül az alkalmazásból - Offline Wikipédia szócikkek letöltése, ami hasznos segítség városnézéshez - Számos rávetíthető térképréteg, mint GPX-ek, navigációs útvonalak, POI-k (érdekes helyek), kedvencek, szintvonalak, tömegközlekedési megállók, további térképek beállítható átlátszósággal - Címek és helyek offline kereshetősége - Offline útvonaltervezés rövidebb távolságokra (kísérleti) - Autós, kerékpáros és gyalogos módok: - Opcionális automata nappali/éjszakai nézetváltással - Opcionális sebességfüggő nagyítással - Opcionális térképforgatással a mozgás vagy az iránytű alapján " Globális mobil térkép és navigáció, offline és online OSM térképekkel Autópályák elkerülése "A 0.8.3 kiadás változásai: @@ -1435,10 +1394,10 @@ Az Android 4.4 KitKat verzió óta nem lehet térképet letölteni és frissíteni a korábbi helyre (%s). Szeretnéd az összes fájlt egy engedélyezett helyre másolni? \n Megjegyzés: a régi fájlok érintetlenül maradnak. \n Megjegyzés: nem lehetséges az OsmAnd és OsmAnd+ között fájlokat megosztani. - Az OsmAnd megpróbálja az adatokat új helyre másolni. Szeretnéd? - %s fájl másolás új helyre… - OsmAnd fájlok másolása új helyre (%s) - OsmAnd fájlok másolása + Szeretnéd, hogy az OsmAnd az adatokat az új helyre másolja? + %s fájl másolása az új helyre… + OsmAnd adatainak másolása új helyre (%s) + OsmAnd adatok másolása OsmAnd offline útvonal tervezése Teherautó Navigációs beállítások @@ -1812,4 +1771,14 @@ " Az OsmAnd (OSM Automated Navigation Directions) egy térkép és navigációs alkalmazás, ingyenes, világméretű és jó minőségű OpenStreetMap (OSM) térképpel. Az összes térképadat offline tárolható az eszköz memóriakártyáján. GPS használatával az OsmAnd képes útvonaltervezésre, vizuális és hangnavigációra, mindezt autós, kerékpáros és gyalogos módban. Az összes főbb funkció működik online és offline (internetkapcsolat nélkül) is.\n\nAz OsmAnd+ az alkalmazás fizetős változata. A megvételével támogatod a projektet, megalapozod új funkciók fejlesztését, és megkapod a legújabb frissítéseket. Ha vársárlás előtt kipróbálnád az alkalmazást, telepítsd az OsmAndot.\n\nNéhány főbb funkció:\n\nNavigáció\n- Működik online (gyorsabb) vagy offline (nincs internet roaming díj külföldön)\n- Turn-by-turn hangnavigáció felvett, vagy gépi hanggal (utóbbihoz TTS felolvasó szükséges)\n- Sávkijelzés, utcanévkijelzés, várható érkezési idő\n- Köztes útpontok megadásának lehetősége\n- Automatikus újratervezés, ha letértél az útról\n- Keresés helyekre cím alapján, típus szerint (étterem, hotel, benzinkút, múzeum), vagy koordináta alapján\n\nTérkép nézet\n- A pozíciód és irányod megjelenítése a térképen\n- A térkép forgatása választható iránytű, vagy mozgásirány alapján\n- Fontos helyek mentése Kedvencként\n- POI-k (érdekes helyek) megjelenítése a környékeden\n- Online (csempés) térképek megjelenítése\n- Műhold nézet (Bing)\n- Különféle rátét térképek állítható átlátszósággal, felvett GPX nyomvonalak\n- Helynevek megjelenítése saját nyelven, angolul, vagy fonetikus átírásban\n\nOpenStreetMap és Wikipédia adatok\n- Minőségi információk az egész világról a legjobb közösségi projektektől\n- OpenStreetMap térképek az egész földről országonkénti vagy régió szerinti bontásban\n- Wikipédia POI-k városnézéshez (nem elérhető az ingyenes verzióban)\n- Korlátlan ingyenes letöltés közvetlenül az alkalmazásból (az ingyenes verzióban 16 térképfájlra korlátozva)\n- Folyamatosan frissülő térképek (legalább havonta egyszer)\n- Kompakt offline vektoros térképek\n- Választható teljes térkép vagy csak úthálózat (például teljes Japán 700 MB, de az úthálózat csak 200 MB)\n- Támogatja az online vagy előre letárolt csempés térképeket\n\nBiztonsági funkciók\n- Választható automata nappal/éjjel nézet váltás\n- Választható sebességhatár kijelzés, túllépés esetén figyelmeztetéssel\n- Választható sebességfüggő nagyítás\n- Pozíciód megosztása, hogy a barátaid megtaláljanak\n\nKerékpáros és gyalogos funkciók\n- Szabadtéri tevékenységekhez a térképek tartalmazzák a gyalogos, túra, és kerékpáros ösvényeket\n- Külön gyalogos és kerékpáros tervezés és megjelenítés\n- Tömegközlekedési megállók vonalnevekkel\n- Utazás felvétele GPX fájlba vagy online szolgáltatásra\n- Sebesség és tengerszint feletti magasság megjelenítés\n- Szintvonalak és domborzatárnyékolás megjelenítése (plugin telepítése szükséges)\n\nKözvetlen OpenStreetMap közreműködés\n- Térképhibák jelentése\n- GPX nyomvonalak feltöltése OSM-re közvetlenül az alkalmazásból\n- POI-k felvétele és feltöltése közvetlenül OSM-be (vagy később offline)\n\nAz OsmAnd nyílt forráskódú és aktív fejlesztés alatt áll. Bárki közreműködhet hibák jelentésével, fordításokkal, vagy új funkciók fejlesztésével. A projekt haladása függ az anyagi hozzájárulásoktól is, megalapozva a fejlesztést, kódolást, és az új funkciók tesztelését. Az OsmAnd+ megvásárlásával segítheted, hogy az alkalmazás még szuperebb legyen! Az osmand.net-en lehetőség van konkrét funkció támogatására és általános adományozásra is.\n\nHozzávetőleges térképi lefedettség és minőség:\n- Nyugat-Európa: ****\n- Kelet-Európa: ***\n- Oroszország: ***\n- Észak-Amerika: ***\n- Dél-Amerika: **\n- Ázsia: **\n- Japán & Korea: ***\n- Közel-Kelet: **\n- Afrika: **\n- Antarktisz: *\n\nTámogatott országok listája (alapvetően az egész világ!):\nAfganisztán, Albánia, Algéria, Amerikai Egyesült Államok, Andorra, Anglia, Angola, Anguilla, Antigua és Barbuda, Argentína, Aruba, Ausztrália, Ausztria, Azerbajdzsán, Bahamák, Bahrein, Banglades, Barbados, Belgium, Belize, Benin, Bhután, Bissau-Guinea, Bolívia, Bonaire, Bosznia és Hercegovina, Botswana, Brazília, Brit Virgin-szigetek, Brunei, Bulgária, Burkina Faso, Burundi, Chile, Ciprus, Comore-szigetek, Costa Rica, Curaçao, Csád, Csehország, Dánia, Dél-afrikai Köztársaság, Déli-Georgia, Dél-Szudán, Dominika, Dominikai Köztársaság, Dzsibuti, Ecuador, Egyesült Arab Emírségek, Egyesült Királyság, Egyiptom, El Salvador, Elefántcsontpart, Egyenlítői-Guinea, Eritrea, Észtország, Etiópia, Fehéroroszország, Fiji-szigetek, Finnország, Franciaország, Francia Polinézia, Fülöp-szigetek, Gabon, Gambia, Ghána, Gibraltár, Görögország, Grenada, Grönland, Grúzia, Guadeloupe, Guam, Guatemala, Guernsey, Guinea, Guyana, Haiti, Hollandia, Holland Antillák, Honduras, Horvátország, Hongkong, India, Indonézia, Irak, Irán, Írország, Izland, Izrael, Jamaica, Japán, Jemen, Jersey, Jordánia, Kambodzsa, Kamerun, Kanada, Katar, Kazahsztán, Kelet-Timor, Kenya, Kína, Kiribati, Kirgizisztán, Észak Korea és Dél Korea, Kolumbia, Kongó, Koszovó, Közép-afrikai Köztársaság, Kuba, Kuvait, Laosz, Lengyelország, Lesotho, Lettország, Libanon, Libéria, Líbia, Lichtenstein, Litvánia, Luxemburg, Macedónia, Madagaszkár, Makaó, Magyarország, Malajzia, Malawi, Maldív-szigetek, Mali, Málta, Man-szigetek, Marokkó, Martinique, Mauritánia, Mauritius, Mayotte, Mexikó, Mianmar, Mikronézia, Moldova, Monaco, Mongólia, Montenegró, Monserrat, Mozambik, Namíbia, Nauru, Németország, Nepál, Nicaragua, Niger, Nigéria, Norvégia, Nyugat-Szahara, Olaszország, Omán, Oroszország, Örményország, Pakisztán, Palau, Palesztina, Panama, Pápua Új-Guinea, Paraguay, Peru, Portugália, Puerto Rico, Románia, Ruanda, Saint-Barthélemy, Szent Ilona, Saint Kitts és Nevis, Saint Lucia, Saint-Martin, Saint-Pierre és Miquelon, Saint Vincent és a Grenadine-szigetek, San Marino, Seychelle-szigetek, Sierra Leone, Spanyolország, Srí Lanka, Suriname, Svájc, Svédország, Szamoa, Szaúd-Arábia, Szenegál, Szerbia, Szingapúr, Szíria, Szlovákia, Szlovénia, Szomália, Szudán, Szváziföld, Tajvan, Tádzsikisztán, Tanzánia, Thaiföld, Tokelau-szigetek, Togo, Tonga, Törökország, Trinidad és Tobago, Tunézia, Tuvalu, Türkmenisztán, Uganda, Új-Kaledónia, Új-Zéland, Ukrajna, Uruguay, Üzbegisztán, Vanuatu, Vatikán, Venezuela, Vietnam, Wallis és Fortuna, Zambia, Zimbabwe, Zöld-foki Köztársaság " Az %1$s számára engedély szükséges a képernyő kikapcsolásához energiatakarékossági célból. Soha - + Nem található út a közelben + Kezdőlap + Biztonságos kapcsolat a szerverrel + https használata + Haladó + Térképek + Keresés + MUTASD A TÉRKÉPET + MUTASD MIND + Koordináták + diff --git a/OsmAnd/res/values-it/strings.xml b/OsmAnd/res/values-it/strings.xml index 86c6b6743f..f76837b919 100644 --- a/OsmAnd/res/values-it/strings.xml +++ b/OsmAnd/res/values-it/strings.xml @@ -2034,4 +2034,6 @@ Si consiglia di aggiungere uno o più punti intermedi per migliorarne le prestaz Cerca MOSTRA LA MAPPA Non è stata trovata una strada nelle vicinanze + Utilizzare il rendering opengl + Utilizzare il rendering opengl accelerato via hardware (potrebbe non funzionare in alcuni dispositivi) diff --git a/OsmAnd/res/values-ko/phrases.xml b/OsmAnd/res/values-ko/phrases.xml new file mode 100644 index 0000000000..a6b3daec93 --- /dev/null +++ b/OsmAnd/res/values-ko/phrases.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/OsmAnd/res/values-ko/strings.xml b/OsmAnd/res/values-ko/strings.xml index 8fa944d3b8..6dfb86e823 100644 --- a/OsmAnd/res/values-ko/strings.xml +++ b/OsmAnd/res/values-ko/strings.xml @@ -2090,4 +2090,6 @@ 모두 표시 좌표 가장 가까운 도로를 찾을 수 없습니다 + Opengl 렌더링 사용 + 하드웨어로 가속된 opengl 렌더링 사용 (일부 장치에는 작동 하지 않을 수 있습니다) diff --git a/OsmAnd/res/values-lt/strings.xml b/OsmAnd/res/values-lt/strings.xml index c41494bf06..559733bad1 100644 --- a/OsmAnd/res/values-lt/strings.xml +++ b/OsmAnd/res/values-lt/strings.xml @@ -1851,4 +1851,6 @@ RODYTI VISKĄ Koordinatės Nerastas trumpiausias kelias + Naudoti OpenGL vaizdavimą + Naudoti aparatinį OpenGL vaizdavimą (gali neveikti kai kurioje įrangoje) diff --git a/OsmAnd/res/values-nb/strings.xml b/OsmAnd/res/values-nb/strings.xml index 96e097cefa..c1d0be96a4 100644 --- a/OsmAnd/res/values-nb/strings.xml +++ b/OsmAnd/res/values-nb/strings.xml @@ -1,4 +1,4 @@ - + Velg fargeskjema for veier: Veifargeskjema Vis retning til målet @@ -1067,5 +1067,11 @@ Last ned Bruk sikker forbindelse med server Bruk https - Skal OsmAnd forsøke å kopiere datafilene til det nye stedet? - + Skal OsmAnd også kopiere datafilene til det nye stedet? + Nærmeste vei ble ikke funnet + Hjem + Kart + Søk etter + VIS KART + Koordinater + diff --git a/OsmAnd/res/values-ru/phrases.xml b/OsmAnd/res/values-ru/phrases.xml index b437d77a57..9653243fde 100644 --- a/OsmAnd/res/values-ru/phrases.xml +++ b/OsmAnd/res/values-ru/phrases.xml @@ -582,12 +582,12 @@ Причал - + Уведомление - + Радиостанция - + Сигнал опасности @@ -601,9 +601,9 @@ Военно-морская база Место ядерного взрыва Город - Город + Город (небольшой) Деревня - Деревня + Деревня (небольшая) Хутор Урочище @@ -619,4 +619,5 @@ Астрономическая обсерватория Горячий источник Гейзер + Спортивная дорожка diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index c760e4b43e..a75d2db58d 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -1,4 +1,4 @@ - + Использовать безопасное соединение с сервером Использовать https @@ -440,7 +440,7 @@ Экстренные службы Развлечения Финансы - Геокэшинг + Геокэшинг (игра) Здоровье Историческое Землепользование @@ -1411,7 +1411,7 @@ Укажите массу автомобиля разрешенную на маршрутах Отображение карты - Навигационный знак + Навигационные знаки (водоемы) Отключить сложную маршрутизацию Указать скорость произношения для TTS Установки навигации diff --git a/OsmAnd/res/values-sc/phrases.xml b/OsmAnd/res/values-sc/phrases.xml index 9ba02c7ead..6b139a21a0 100644 --- a/OsmAnd/res/values-sc/phrases.xml +++ b/OsmAnd/res/values-sc/phrases.xml @@ -134,4 +134,193 @@ Parchègiu bitzicletas Gondola + Istatzione sciovia + Funivia + Ascensore carrotzina + Sciovia a àncora + Sciovia a J + Sciovia a piatellu + Sciovia ammesturada + Sciovia + Sciovia a fune + Sciovia pro ogetos + Sciovia a tapete + + Galleria + Ponte + + Autovelox + Retunda pro furriada de martza + Putzu + Impiantu ìdricu + Depuradore de sas abbas + Turre ìdrica + Diga + Mulinu ad abba + + Trasformadore + Tzentrale elètrica + Ufìtziu postale + Telèfonu + Turre telecomunicatziones + Tzentralinu telefònicu + + Osservatòriu astronòmicu + Fraigada + Fàbrica + Intrada de una galleria minerària + Putzu petrolìferu + Puntu geodèticu + Mulinu a bentu + Cava + Bìngia + Fruttedu + Salina + Campu de cricket inghiriadu dae retzas + + Iscola de ghia + Iscola + Collègiu + Universidade + + Tribunale + Càrtzere + Anàgrafe + Ambassada + Ufìtziu pùblicu + Ufitziale giuditziàriu + Pùblicu ministeru + Ufìtziu migratzione + Guàrdia de finàntzia + Ufìtziu amministrativu + Tzitade cabu-de-logu de provìntzia + Tzitade + Bidda + Bidditzolu + Domo/os isolada/as + Apendìtziu + Bighinadu + Localidade + + Potecaria + Ospidale + Dutore + Clìnica + Dentista + Veterinàriu + Sanatòriu + Meighina alternativa + Banca de su sàmbene + Tzentru mèdicu + Levadora + Optometrista + Fisioterapista + Podòlogu + Psicoterapèuta + Riabilitassione + Logopedista + Istrutura mèdica + + Asseguratzione + Butega immobiliare + Abogadu + ONG + Munitzìpiu + Ufìtziu pro su traballu + Ufìtziu IT + Redatzione de giornale + Istùdiu de architetura + Agentzia de publitzidade + Istitudu iscolàsticu + Istùdiu de registratzione + Iscummissas + + Istàdiu + Tzentru isportìvu + Campu de golf + Pista pro patinare in astra + Pista pro cùrrere + Pista pro bitziclètas + Pista pro caddos + Atlètica + Football australianu + Baseball + Basket + Botzas + Canoa + Iscacos + Cricket + Croquet + Tziclismu + Cursa de sos canes + Equitassione + Golf + Ginnàstica + Hockey + Cursas de sos caddos + Patinàgiu in s\'astra + Korfbal + Prus isports + Paddle tènnis + Pelota + Racquetball + Patinàgiu a rodas + Canotàgiu + Rugby a 15 + Rugby a 13 + Patinàgiu + Skateboard + Fubalu + Piscina + Tennis + Toboga + Museu + Attràida turìstica + Memoriale + Opera d\'arte + Giassu/situ archeològicu + Campu de batalla + Pedra de làcana + Casteddu + Ghenna de intrada a sa tzitade + Forte + Funtana + Ruinas istòricas + Pedra rùnica + Nave istòrica + Cava istòrica + Monumentu + Zoo + Parcu a tema + + Albergo + Posada + Motel + Chalet + + Logu de cultu + Logu de cultu: cristianu + Logu de cultu: ebreu + Logu de cultu: musulmanu + Logu de cultu: sikh + Logu de cultu: buddista + Logu de cultu: induista + Logu de cultu: shintoista + Logu de cultu: taoista + Monastèriu/Muristene + Monastèriu/Muristene istòricu + Rughe istòrica + Tabernàculu istòricu + Informatziones turìsticas + Relògiu + Agentzia de biàgios + Puntu panoràmicu + Campègiu + Tretu pro caravan e camper + Logu atretzadu pro picnic + Mitza + Geyser + Campusantu + Campusantu + Funiculare diff --git a/OsmAnd/res/values-sc/strings.xml b/OsmAnd/res/values-sc/strings.xml index 311646a348..1d5053ba3b 100644 --- a/OsmAnd/res/values-sc/strings.xml +++ b/OsmAnd/res/values-sc/strings.xml @@ -1787,5 +1787,5 @@ Si cussigiat de annànghere unu o prus puntos intermedios pro megiorare sas pres AMMUSTRA TOTU Coordinatas Mapas - No est istada agatada peruna istada a curtzu + No est istada agatada peruna istrada a curtzu diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 01811347e1..b56277c5b0 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -10,6 +10,8 @@ PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy --> Everything up to date + Use opengl rendering + Use hardware accelerated opengl rendering (may not work on some device) Nearest road was not found Home Use secure connection with server @@ -73,8 +75,6 @@ Print route Favorite point name duplicate We changed your favorite point name to %1$s to avoid duplicated names. - Use native rendering - Use C++ rendering instead of Java Set the text size on the map. Text size Speed limit diff --git a/OsmAnd/src/net/osmand/core/android/MapRendererContext.java b/OsmAnd/src/net/osmand/core/android/MapRendererContext.java index 9719e523f6..287dd66e28 100644 --- a/OsmAnd/src/net/osmand/core/android/MapRendererContext.java +++ b/OsmAnd/src/net/osmand/core/android/MapRendererContext.java @@ -1,6 +1,5 @@ package net.osmand.core.android; -import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -10,48 +9,53 @@ import net.osmand.core.jni.IObfsCollection; import net.osmand.core.jni.IRasterMapLayerProvider; import net.osmand.core.jni.MapObjectsSymbolsProvider; import net.osmand.core.jni.MapPresentationEnvironment; +import net.osmand.core.jni.MapPresentationEnvironment.LanguagePreference; import net.osmand.core.jni.MapPrimitivesProvider; import net.osmand.core.jni.MapPrimitiviser; import net.osmand.core.jni.MapRasterLayerProvider_Software; +import net.osmand.core.jni.MapStylesCollection; import net.osmand.core.jni.ObfMapObjectsProvider; import net.osmand.core.jni.QStringStringHash; -import net.osmand.core.jni.MapPresentationEnvironment.LanguagePreference; import net.osmand.core.jni.ResolvedMapStyle; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.OsmandSettings; +import net.osmand.plus.OsmandSettings.CommonPreference; +import net.osmand.plus.render.RendererRegistry; +import net.osmand.render.RenderingRuleProperty; +import net.osmand.render.RenderingRulesStorage; +import net.osmand.util.Algorithms; /** * Context container and utility class for MapRendererView and derivatives. - * * @author Alexey Pelykh * */ public class MapRendererContext { - public MapRendererContext() { - } + private static final int OBF_RASTER_LAYER = 0; + private OsmandApplication app; - public MapRendererContext(MapRendererView mapRendererView) { - _mapRendererView = mapRendererView; - } + // input parameters + private MapStylesCollection mapStylesCollection; + private IObfsCollection obfsCollection; - /** - * Synchronisation object used to perform state changes atomically - */ - private final Object _syncObject = new Object(); + private boolean nightMode; + private final float density; - /** - * Reference to map renderer view that is currently managed by this - * context - */ - private MapRendererView _mapRendererView; + // ached objects + private Map mapStyles = new HashMap(); + private CachedMapPresentation presentationObjectParams; + private MapPresentationEnvironment mapPresentationEnvironment; - /** - * Get currently bound map renderer view - * @return Reference to MapRendererView - */ - public MapRendererView getMapRendererView() { - synchronized (_syncObject) { - return _mapRendererView; - } + private IMapTiledSymbolsProvider obfMapSymbolsProvider; + private IRasterMapLayerProvider obfMapRasterLayerProvider; + private MapRendererView mapRendererView; + + private float cachedReferenceTileSize; + + public MapRendererContext(OsmandApplication app, float density) { + this.app = app; + this.density = density; } /** @@ -59,419 +63,200 @@ public class MapRendererContext { * @param mapRendererView Reference to MapRendererView */ public void setMapRendererView(MapRendererView mapRendererView) { - synchronized (_syncObject) { - boolean update = (_mapRendererView != mapRendererView); - if (!update) - return; - - _mapRendererView = mapRendererView; - if (_mapRendererView != null) - apply(); + boolean update = (this.mapRendererView != mapRendererView); + if (!update) { + return; + } + this.mapRendererView = mapRendererView; + if (mapRendererView != null) { + applyCurrentContextToView(); } } - - /** - * Display density factor - */ - private float _displayDensityFactor = 1; - - /** - * Reference tile size on screen in pixels - */ - private float _referenceTileSize = 256; - - /** - * Raster tile size in texels - */ - private int _rasterTileSize = 256; - /** - * Get current display density factor - * @return Display density factor - */ - public float getDisplayDensityFactor() { - synchronized (_syncObject) { - return _displayDensityFactor; + public void setNightMode(boolean nightMode) { + if (nightMode != this.nightMode) { + this.nightMode = nightMode; + updateMapSettings(); } } - /** - * Set display density factor and update context (if needed) - * @param displayDensityFactor New display density factor - */ - public void setDisplayDensityFactor(float displayDensityFactor) { - synchronized (_syncObject) { - boolean update = (_displayDensityFactor != displayDensityFactor); - if (!update) - return; - - _displayDensityFactor = displayDensityFactor; - _referenceTileSize = 256.0f * _displayDensityFactor; - _rasterTileSize = Integer.highestOneBit((int)_referenceTileSize - 1) * 2; - - if (_mapRendererView instanceof AtlasMapRendererView) - ((AtlasMapRendererView)_mapRendererView).setReferenceTileSizeOnScreenInPixels(_referenceTileSize); - if (_mapPresentationEnvironment != null) - updateMapPresentationEnvironment(); + public void updateMapSettings() { + if (mapRendererView instanceof AtlasMapRendererView && cachedReferenceTileSize != getReferenceTileSize()) { + ((AtlasMapRendererView) mapRendererView).setReferenceTileSizeOnScreenInPixels(getReferenceTileSize()); } - } - - /** - * Reference to resolved map style (if used) - */ - private ResolvedMapStyle _mapStyle; - - /** - * Get current map style - * @return Reference to current map style - */ - public ResolvedMapStyle getMapStyle() { - synchronized (_syncObject) { - return _mapStyle; + if(mapPresentationEnvironment != null) { + updateMapPresentationEnvironment(); } } - /** - * Set map style and update context (if needed) - * @param mapStyle - */ - public void setMapStyle(ResolvedMapStyle mapStyle) { - synchronized (_syncObject) { - boolean update = (_mapStyle != mapStyle); - if (!update) - return; - - _mapStyle = mapStyle; - if (_mapPresentationEnvironment != null) - updateMapPresentationEnvironment(); - } - } - - /** - * Reference to map style settings (if present) - */ - private Map _mapStyleSettings; - - /** - * Get current map style settings - * @return - */ - public Map getMapStyleSettings() { - synchronized (_syncObject) { - if (_mapStyleSettings == null) - return null; - return Collections.unmodifiableMap(_mapStyleSettings); - } - } - - /** - * Set map style settings and update context (if needed) - * @param mapStyleSettings Map style settings - */ - public void setMapStyleSettings(Map mapStyleSettings) { - synchronized (_syncObject) { - boolean update = !_mapStyleSettings.equals(mapStyleSettings); - if (!update) - return; - - _mapStyleSettings = new HashMap(mapStyleSettings); - if (_mapPresentationEnvironment != null) - updateMapPresentationEnvironment(); - } - } - - /** - * Locale language - */ - private String _localeLanguageId = "en"; - - /** - * Get current locale language - * @return Locale language identifier - */ - public String getLocaleLanguageId() { - synchronized (_syncObject) { - return _localeLanguageId; - } - } - - /** - * Set current locale language and update context (if needed) - * @param localeLanguageId Locale language identifier - */ - public void setLocaleLanguageId(String localeLanguageId) { - synchronized (_syncObject) { - boolean update = !_localeLanguageId.equals(localeLanguageId); - if (!update) - return; - - _localeLanguageId = localeLanguageId; - if (_mapPresentationEnvironment != null) - updateMapPresentationEnvironment(); - } - } - - /** - * Language preference - */ - private LanguagePreference _languagePreference = LanguagePreference.LocalizedAndNative; - - /** - * Get current language preference - * @return Language preference - */ - public LanguagePreference getLanguagePreference() { - synchronized (_syncObject) { - return _languagePreference; - } - } - - /** - * Set language preference and update context (if needed) - * @param languagePreference - */ - public void setLanguagePreference(LanguagePreference languagePreference) { - synchronized (_syncObject) { - boolean update = (_languagePreference != languagePreference); - if (!update) - return; - - _languagePreference = languagePreference; - if (_mapPresentationEnvironment != null) - updateMapPresentationEnvironment(); - } - } - - /** - * Reference to OBFs collection (if present) - */ - private IObfsCollection _obfsCollection; - - /** - * Get current OBFs collection - * @return OBFs collection - */ - public IObfsCollection getObfsCollection() { - synchronized (_syncObject) { - return _obfsCollection; - } - } - - /** - * Set OBFs collection and update context (if needed) - * @param obfsCollection - */ - public void setObfsCollection(IObfsCollection obfsCollection) { - synchronized (_syncObject) { - boolean update = (_obfsCollection != obfsCollection); - if (!update) - return; - - _obfsCollection = obfsCollection; - if (_obfMapObjectsProvider != null) - updateObfMapObjectsProvider(); - } - } - - /** - * Reference to map presentation environment (if used) - */ - private MapPresentationEnvironment _mapPresentationEnvironment; - - /** - * Update map presentation environment and everything that depends on it - */ - private void updateMapPresentationEnvironment() { - // Create new map presentation environment - _mapPresentationEnvironment = new MapPresentationEnvironment( - _mapStyle, - _displayDensityFactor, - _localeLanguageId, - _languagePreference); - - // Apply map style settings - if (_mapStyleSettings != null) { - QStringStringHash convertedStyleSettings = new QStringStringHash(); - for (Iterator> itSetting = _mapStyleSettings - .entrySet().iterator(); itSetting.hasNext();) { - Map.Entry setting = itSetting.next(); - convertedStyleSettings.set(setting.getKey(), setting.getValue()); - } - _mapPresentationEnvironment.setSettings(convertedStyleSettings); - } - - // Update all dependencies - if (_mapPrimitiviser != null) - updateMapPrimitiviser(); - } - - /** - * Reference to map primitiviser (if used) - */ - private MapPrimitiviser _mapPrimitiviser; - - /** - * Update map primitiviser and everything that depends on it - */ - private void updateMapPrimitiviser() { - // Create new map primitiviser - _mapPrimitiviser = new MapPrimitiviser(_mapPresentationEnvironment); - - // Update all dependencies - if (_mapPrimitivesProvider != null) - updateMapPrimitivesProvider(); - } - - /** - * Reference to OBF map objects provider (if used) - */ - private ObfMapObjectsProvider _obfMapObjectsProvider; - - /** - * Update OBF map objects provider and everything that depends on it - */ - private void updateObfMapObjectsProvider() { - _obfMapObjectsProvider = new ObfMapObjectsProvider( - _obfsCollection); - - // Update all dependencies - if (_mapPrimitivesProvider != null) - updateMapPrimitivesProvider(); - } - - /** - * Reference to map primitives provider (if used) - */ - private MapPrimitivesProvider _mapPrimitivesProvider; - - /** - * Update map primitives provider and everything that depends on it - */ - private void updateMapPrimitivesProvider() { - // Create new map primitives provider - _mapPrimitivesProvider = new MapPrimitivesProvider( - _obfMapObjectsProvider, - _mapPrimitiviser, - _rasterTileSize); - - // Update all dependencies - if (_obfMapRasterLayerProvider != null) - updateObfMapRasterLayerProvider(); - if (_obfMapSymbolsProvider != null) - updateObfMapSymbolsProvider(); - } - - /** - * Reference to OBF map raster layer provider (if used) - */ - private IRasterMapLayerProvider _obfMapRasterLayerProvider; - - /** - * Index of OBF map raster layer in bound map renderer view (if set) - */ - private Integer _obfMapRasterLayer; - - /** - * Update OBF map raster layer provider and everything that depends on it - */ - private void updateObfMapRasterLayerProvider() { - // Create new OBF map raster layer provider - _obfMapRasterLayerProvider = new MapRasterLayerProvider_Software( - _mapPrimitivesProvider); - - // In case there's bound view and configured layer, perform setup - if(_mapRendererView != null && _obfMapRasterLayer != null) - _mapRendererView.setMapLayerProvider(_obfMapRasterLayer, _obfMapRasterLayerProvider); - } - - /** - * Reference to OBF map symbols provider (if used) - */ - private IMapTiledSymbolsProvider _obfMapSymbolsProvider; - - /** - * Update OBF map symbols provider and everything that depends on it - */ - private void updateObfMapSymbolsProvider() { - // If there's current provider and bound view, remove it - if (_obfMapSymbolsProvider != null && _mapRendererView != null) - _mapRendererView.removeSymbolsProvider(_obfMapSymbolsProvider); - - // Create new OBF map symbols provider - _obfMapSymbolsProvider = new MapObjectsSymbolsProvider( - _mapPrimitivesProvider, - _referenceTileSize); - - // If there's bound view, add new provider - if (_mapRendererView != null) - _mapRendererView.addSymbolsProvider(_obfMapSymbolsProvider); - } - - /** - * Apply current context to view - */ - private void apply() { - if (_mapRendererView instanceof AtlasMapRendererView) - ((AtlasMapRendererView)_mapRendererView).setReferenceTileSizeOnScreenInPixels(_referenceTileSize); - - // Layers - if (_obfMapRasterLayer != null && _obfMapRasterLayerProvider != null) - _mapRendererView.setMapLayerProvider(_obfMapRasterLayer, _obfMapRasterLayerProvider); - - // Symbols - if (_obfMapSymbolsProvider != null) - _mapRendererView.addSymbolsProvider(_obfMapSymbolsProvider); - } - /** * Setup OBF map on layer 0 with symbols * @param obfsCollection OBFs collection */ - public void setupObfMap(ResolvedMapStyle mapStyle, IObfsCollection obfsCollection) { - setupObfMap(mapStyle, obfsCollection, 0, true); + public void setupObfMap(MapStylesCollection mapStylesCollection, IObfsCollection obfsCollection) { + this.obfsCollection = obfsCollection; + this.mapStylesCollection = mapStylesCollection; + updateMapPresentationEnvironment(); + recreateRasterAndSymbolsProvider(); + } + + protected float getDisplayDensityFactor() { + return (float) Math.pow(2, Math.sqrt((app.getSettings().getSettingsZoomScale() + density))); + } + + protected int getRasterTileSize() { + return Integer.highestOneBit((int) getReferenceTileSize() - 1) * 2; + } + + private float getReferenceTileSize() { + return 256 * getDisplayDensityFactor(); } /** - * Setup OBF map on specified layer with optional symbols - * @param obfsCollection OBFs collection - * @param layer Layer index - * @param withSymbols True if with symbols, false otherwise + * Update map presentation environment and everything that depends on it */ - public void setupObfMap(ResolvedMapStyle mapStyle, - IObfsCollection obfsCollection, - int layer, - boolean withSymbols) { - synchronized (_syncObject) { - boolean update = false; - - if (_mapStyle != mapStyle) { - _mapStyle = mapStyle; - update = true; - } - - if (_obfsCollection != obfsCollection) { - _obfsCollection = obfsCollection; - update = true; - } - - if (_obfMapRasterLayer == null || _obfMapRasterLayer != layer) { - _obfMapRasterLayer = layer; - update = true; - } - - if (withSymbols != (_obfMapSymbolsProvider != null)) { - update = true; - } - - if (!update) - return; - - updateMapPresentationEnvironment(); - updateMapPrimitiviser(); - updateMapPrimitivesProvider(); - updateObfMapObjectsProvider(); - updateObfMapRasterLayerProvider(); - updateObfMapSymbolsProvider(); + private void updateMapPresentationEnvironment() { + float displayDensityFactor = getDisplayDensityFactor(); + // Create new map presentation environment + String langId = app.getSettings().MAP_PREFERRED_LOCALE.get(); + // TODO make setting + LanguagePreference langPref = LanguagePreference.LocalizedOrNative; + String rendName = app.getSettings().RENDERER.get(); + if (rendName.length() == 0 || rendName.equals(RendererRegistry.DEFAULT_RENDER)) { + rendName = "default"; + } + if (!mapStyles.containsKey(rendName)) { + mapStyles.put(rendName, mapStylesCollection.getResolvedStyleByName(rendName)); + } + ResolvedMapStyle mapStyle = mapStyles.get(rendName); + CachedMapPresentation pres = new CachedMapPresentation(langId, langPref, mapStyle, displayDensityFactor); + if (this.presentationObjectParams == null || !this.presentationObjectParams.equalsFields(pres)) { + this.presentationObjectParams = pres; + mapPresentationEnvironment = new MapPresentationEnvironment(mapStyle, displayDensityFactor, langId, + langPref); + } + + QStringStringHash convertedStyleSettings = getMapStyleSettings(); + mapPresentationEnvironment.setSettings(convertedStyleSettings); + + if (obfMapRasterLayerProvider != null || obfMapSymbolsProvider != null) { + recreateRasterAndSymbolsProvider(); } } + + protected QStringStringHash getMapStyleSettings() { + // Apply map style settings + OsmandSettings prefs = app.getSettings(); + RenderingRulesStorage storage = app.getRendererRegistry().getCurrentSelectedRenderer(); + Map props = new HashMap(); + for (RenderingRuleProperty customProp : storage.PROPS.getCustomRules()) { + if (customProp.isBoolean()) { + CommonPreference pref = prefs.getCustomRenderBooleanProperty(customProp.getAttrName()); + props.put(customProp.getAttrName(), pref.get() + ""); + } else { + CommonPreference settings = prefs.getCustomRenderProperty(customProp.getAttrName()); + String res = settings.get(); + if (!Algorithms.isEmpty(res)) { + props.put(customProp.getAttrName(), res); + } + } + } + + QStringStringHash convertedStyleSettings = new QStringStringHash(); + for (Iterator> itSetting = props.entrySet().iterator(); itSetting.hasNext();) { + Map.Entry setting = itSetting.next(); + convertedStyleSettings.set(setting.getKey(), setting.getValue()); + } + if (nightMode) { + convertedStyleSettings.set("nightMode", "true"); + } + return convertedStyleSettings; + } + + private void recreateRasterAndSymbolsProvider() { + // Create new map primitiviser + MapPrimitiviser mapPrimitiviser = new MapPrimitiviser(mapPresentationEnvironment); + ObfMapObjectsProvider obfMapObjectsProvider = new ObfMapObjectsProvider(obfsCollection); + // Create new map primitives provider + MapPrimitivesProvider mapPrimitivesProvider = new MapPrimitivesProvider(obfMapObjectsProvider, mapPrimitiviser, + getRasterTileSize()); + updateObfMapRasterLayerProvider(mapPrimitivesProvider); + updateObfMapSymbolsProvider(mapPrimitivesProvider); + } + + private void updateObfMapRasterLayerProvider(MapPrimitivesProvider mapPrimitivesProvider) { + // Create new OBF map raster layer provider + obfMapRasterLayerProvider = new MapRasterLayerProvider_Software(mapPrimitivesProvider); + // In case there's bound view and configured layer, perform setup + if (mapRendererView != null) { + mapRendererView.setMapLayerProvider(OBF_RASTER_LAYER, obfMapRasterLayerProvider); + } + } + + private void updateObfMapSymbolsProvider(MapPrimitivesProvider mapPrimitivesProvider) { + // If there's current provider and bound view, remove it + if (obfMapSymbolsProvider != null && mapRendererView != null) { + mapRendererView.removeSymbolsProvider(obfMapSymbolsProvider); + } + // Create new OBF map symbols provider + obfMapSymbolsProvider = new MapObjectsSymbolsProvider(mapPrimitivesProvider, getReferenceTileSize()); + // If there's bound view, add new provider + if (mapRendererView != null) { + mapRendererView.addSymbolsProvider(obfMapSymbolsProvider); + } + } + + private void applyCurrentContextToView() { + if (mapRendererView instanceof AtlasMapRendererView) { + cachedReferenceTileSize = getReferenceTileSize(); + ((AtlasMapRendererView)mapRendererView).setReferenceTileSizeOnScreenInPixels(cachedReferenceTileSize); + } + // Layers + if (obfMapRasterLayerProvider != null) { + mapRendererView.setMapLayerProvider(OBF_RASTER_LAYER, obfMapRasterLayerProvider); + } + // Symbols + if (obfMapSymbolsProvider != null) { + mapRendererView.addSymbolsProvider(obfMapSymbolsProvider); + } + } + + + private class CachedMapPresentation { + String langId ; + LanguagePreference langPref; + ResolvedMapStyle mapStyle; + double displayDensityFactor; + + public CachedMapPresentation(String langId, + LanguagePreference langPref, ResolvedMapStyle mapStyle, + double displayDensityFactor) { + this.langId = langId; + this.langPref = langPref; + this.mapStyle = mapStyle; + this.displayDensityFactor = displayDensityFactor; + } + + + public boolean equalsFields(CachedMapPresentation other ) { + if (Double.doubleToLongBits(displayDensityFactor) != Double + .doubleToLongBits(other.displayDensityFactor)) + return false; + if (langId == null) { + if (other.langId != null) + return false; + } else if (!langId.equals(other.langId)) + return false; + if (langPref != other.langPref) + return false; + if (mapStyle == null) { + if (other.mapStyle != null) + return false; + } else if (!mapStyle.equals(other.mapStyle)) + return false; + return true; + } + + } + } diff --git a/OsmAnd/src/net/osmand/plus/OsmandApplication.java b/OsmAnd/src/net/osmand/plus/OsmandApplication.java index 57e9d9c572..ee149efca1 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandApplication.java +++ b/OsmAnd/src/net/osmand/plus/OsmandApplication.java @@ -557,16 +557,16 @@ public class OsmandApplication extends Application { } if (!"qnx".equals(System.getProperty("os.name"))) { - if (osmandSettings.USE_NATIVE_RENDER.get()) { - if (!osmandSettings.CPP_RENDER_FAILED.get()) { - osmandSettings.CPP_RENDER_FAILED.set(true); + if (osmandSettings.USE_OPENGL_RENDER.get()) { + if (!osmandSettings.OPENGL_RENDER_FAILED.get()) { + osmandSettings.OPENGL_RENDER_FAILED.set(true); boolean success = NativeCoreContext.tryCatchInit(this); if (success) { - osmandSettings.CPP_RENDER_FAILED.set(false); + osmandSettings.OPENGL_RENDER_FAILED.set(false); } } else { // try next time once again ? - osmandSettings.CPP_RENDER_FAILED.set(false); + osmandSettings.OPENGL_RENDER_FAILED.set(false); warnings.add("Native OpenGL library is not supported. Please try again after exit"); } } diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java index 67fb16b20b..87848dcecf 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java @@ -1719,9 +1719,10 @@ public class OsmandSettings { public final OsmandPreference NATIVE_RENDERING_FAILED = new BooleanPreference("native_rendering_failed_init", false).makeGlobal(); - public final OsmandPreference USE_NATIVE_RENDER = new BooleanPreference("use_native_render", false).makeGlobal().cache(); + public final OsmandPreference USE_OPENGL_RENDER = new BooleanPreference("use_opengl_render", + Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH).makeGlobal().cache(); - public final OsmandPreference CPP_RENDER_FAILED = new BooleanPreference("cpp_render_failed", false).makeGlobal().cache(); + public final OsmandPreference OPENGL_RENDER_FAILED = new BooleanPreference("opengl_render_failed", false).makeGlobal().cache(); // this value string is synchronized with settings_pref.xml preference name diff --git a/OsmAnd/src/net/osmand/plus/activities/DashboardActivity.java b/OsmAnd/src/net/osmand/plus/activities/DashboardActivity.java index 70abdbc66e..6bf415c43a 100644 --- a/OsmAnd/src/net/osmand/plus/activities/DashboardActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/DashboardActivity.java @@ -12,6 +12,7 @@ import java.util.Random; import android.support.v4.app.FragmentManager; import net.osmand.access.AccessibleAlertBuilder; import net.osmand.plus.OsmAndAppCustomization; +import net.osmand.plus.OsmAndLocationProvider; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.Version; @@ -71,6 +72,7 @@ public class DashboardActivity extends BaseDownloadActivity { private static final int HELP_ID = 0; private static final int SETTINGS_ID = 1; private static final int EXIT_ID = 2; + private OsmAndLocationProvider lp; @Override protected void onCreate(Bundle savedInstanceState) { @@ -90,6 +92,7 @@ public class DashboardActivity extends BaseDownloadActivity { return; } setContentView(R.layout.dashboard); + lp = getMyApplication().getLocationProvider(); final String textVersion = Version.getFullVersion(getMyApplication()); getSupportActionBar().setTitle(textVersion); diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index 6e790a50f9..d08d08685c 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -37,6 +37,7 @@ import net.osmand.plus.activities.search.SearchActivity; import net.osmand.plus.base.FailSafeFuntions; import net.osmand.plus.base.MapViewTrackingUtilities; import net.osmand.plus.helpers.GpxImportHelper; +import net.osmand.plus.helpers.WakeLockHelper; import net.osmand.plus.render.RendererRegistry; import net.osmand.plus.resources.ResourceManager; import net.osmand.plus.routing.RoutingHelper; @@ -81,8 +82,7 @@ import android.widget.FrameLayout; import android.widget.ProgressBar; import android.widget.Toast; -public class MapActivity extends AccessibleActivity implements - VoiceRouter.VoiceMessageListener { +public class MapActivity extends AccessibleActivity { private static final int SHOW_POSITION_MSG_ID = OsmAndConstants.UI_HANDLER_MAP_VIEW + 1; private static final int LONG_KEYPRESS_MSG_ID = OsmAndConstants.UI_HANDLER_MAP_VIEW + 2; @@ -114,13 +114,9 @@ public class MapActivity extends AccessibleActivity implements private StateChangedListener applicationModeListener; private FrameLayout lockView; private GpxImportHelper gpxImportHelper; - private PowerManager.WakeLock wakeLock = null; - private ReleaseWakeLocksRunnable releaseWakeLocksRunnable = new ReleaseWakeLocksRunnable(); - private boolean active = false; + private WakeLockHelper wakeLockHelper ; private boolean intentLocation = false; - private DevicePolicyManager mDevicePolicyManager; - private ComponentName mDeviceAdmin; private Notification getNotification() { Intent notificationIndent = new Intent(this, getMyApplication().getAppCustomization().getMapActivity()); @@ -152,7 +148,7 @@ public class MapActivity extends AccessibleActivity implements app.checkApplicationIsBeingInitialized(this, startProgressDialog); parseLaunchIntentLocation(); - if(settings.USE_NATIVE_RENDER.get() && NativeCoreContext.isInit()) { + if(settings.USE_OPENGL_RENDER.get() && NativeCoreContext.isInit()) { ViewStub stub = (ViewStub) findViewById(R.id.atlasMapRendererViewStub); atlasMapRendererView = (AtlasMapRendererView) stub.inflate(); OsmAndMapLayersView ml = (OsmAndMapLayersView) findViewById(R.id.MapLayersView); @@ -229,9 +225,8 @@ public class MapActivity extends AccessibleActivity implements gpxImportHelper = new GpxImportHelper(this, getMyApplication(), getMapView()); mapActions.prepareStartOptionsMenu(); - - mDeviceAdmin = new ComponentName(getApplicationContext(), DeviceAdminRecv.class); - mDevicePolicyManager = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE); + + wakeLockHelper = new WakeLockHelper(getMyApplication()); } @@ -571,11 +566,7 @@ public class MapActivity extends AccessibleActivity implements @Override protected void onStart() { super.onStart(); - active = true; - if (wakeLock == null) { - VoiceRouter voiceRouter = app.getRoutingHelper().getVoiceRouter(); - voiceRouter.removeVoiceMessageListener(this); - } + wakeLockHelper.onStart(this); } protected void setProgressDlg(Dialog progressDlg) { @@ -598,11 +589,7 @@ public class MapActivity extends AccessibleActivity implements progressDlg.dismiss(); progressDlg = null; } - if (!isFinishing() && (settings.WAKE_ON_VOICE_INT.get() > 0)) { - VoiceRouter voiceRouter = app.getRoutingHelper().getVoiceRouter(); - voiceRouter.addVoiceMessageListener(this); - } - active = false; + wakeLockHelper.onStop(this); super.onStop(); } @@ -671,16 +658,7 @@ public class MapActivity extends AccessibleActivity implements public void updateApplicationModeSettings() { changeKeyguardFlags(); - // update vector renderer - RendererRegistry registry = app.getRendererRegistry(); - RenderingRulesStorage newRenderer = registry.getRenderer(settings.RENDERER.get()); - if (newRenderer == null) { - newRenderer = registry.defaultRender(); - } - if (registry.getCurrentSelectedRenderer() != newRenderer) { - registry.setCurrentSelectedRender(newRenderer); - app.getResourceManager().getRenderer().clearCache(); - } + updateMapSettings(); mapViewTrackingUtilities.updateSettings(); app.getRoutingHelper().setAppMode(settings.getApplicationMode()); if (mapLayers.getMapInfoLayer() != null) { @@ -697,6 +675,22 @@ public class MapActivity extends AccessibleActivity implements }); getMapView().refreshMap(true); } + + public void updateMapSettings() { + // update vector renderer + RendererRegistry registry = app.getRendererRegistry(); + RenderingRulesStorage newRenderer = registry.getRenderer(settings.RENDERER.get()); + if (newRenderer == null) { + newRenderer = registry.defaultRender(); + } + if(mapView.getMapRenderer() != null) { + NativeCoreContext.getMapRendererContext().updateMapSettings(); + } + if (registry.getCurrentSelectedRenderer() != newRenderer) { + registry.setCurrentSelectedRender(newRenderer); + app.getResourceManager().getRenderer().clearCache(); + } + } @Override @@ -825,54 +819,5 @@ public class MapActivity extends AccessibleActivity implements return getWindow().getDecorView().findViewById(android.R.id.content); } - @Override - public void onVoiceMessage() { - final Integer screenPowerSave = settings.WAKE_ON_VOICE_INT.get(); - if (screenPowerSave > 0) { - uiHandler.removeCallbacks(releaseWakeLocksRunnable); - if (!active && wakeLock == null) { - PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); - wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK - | PowerManager.ACQUIRE_CAUSES_WAKEUP, - "OsmAndOnVoiceWakeupTag"); - wakeLock.acquire(); - } - - uiHandler.postDelayed(releaseWakeLocksRunnable, - screenPowerSave * 1000L); - } - } - - private void releaseWakeLocks() { - if (wakeLock != null) { - wakeLock.release(); - wakeLock = null; - } - - if (mDevicePolicyManager != null && mDeviceAdmin != null) { - final Integer screenPowerSave = settings.WAKE_ON_VOICE_INT.get(); - if (screenPowerSave > 0 && settings.MAP_ACTIVITY_ENABLED.get()) { - if (mDevicePolicyManager.isAdminActive(mDeviceAdmin)) { - try { - mDevicePolicyManager.lockNow(); - } catch (SecurityException e) { -// Log.d(TAG, -// "SecurityException: No device admin permission to lock the screen!"); - } - } else { -// Log.d(TAG, -// "No device admin permission to lock the screen!"); - } - } - } - } - - private class ReleaseWakeLocksRunnable implements Runnable { - - @Override - public void run() { - releaseWakeLocks(); - } - } } diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityLayers.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityLayers.java index fec550a9cd..877d705065 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivityLayers.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityLayers.java @@ -58,8 +58,6 @@ import android.widget.Toast; * Object is responsible to maintain layers using by map activity */ public class MapActivityLayers { - - private final MapActivity activity; diff --git a/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java b/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java index 8b1e712e3d..8a204be7de 100644 --- a/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java @@ -24,7 +24,6 @@ import net.osmand.plus.Version; import net.osmand.plus.base.SuggestExternalDirectoryDialog; import net.osmand.plus.download.DownloadActivity; import net.osmand.plus.download.DownloadActivityType; -import net.osmand.plus.download.DownloadIndexFragment; import net.osmand.plus.helpers.FileNameTranslationHelper; import net.osmand.plus.render.NativeOsmandLibrary; import net.osmand.plus.voice.CommandPlayer; @@ -331,6 +330,9 @@ public class SettingsGeneralActivity extends SettingsBaseActivity { } misc.addPreference(nativeCheckbox); + final CheckBoxPreference openGlRender = createCheckBoxPreference(settings.USE_OPENGL_RENDER, R.string.use_opengl_render,R.string.use_opengl_render_descr); + misc.addPreference(openGlRender); + int nav = getResources().getConfiguration().navigation; if (nav == Configuration.NAVIGATION_DPAD || nav == Configuration.NAVIGATION_TRACKBALL || nav == Configuration.NAVIGATION_WHEEL || diff --git a/OsmAnd/src/net/osmand/plus/dashboard/DashBaseFragment.java b/OsmAnd/src/net/osmand/plus/dashboard/DashBaseFragment.java index 945619c13c..e137d983bc 100644 --- a/OsmAnd/src/net/osmand/plus/dashboard/DashBaseFragment.java +++ b/OsmAnd/src/net/osmand/plus/dashboard/DashBaseFragment.java @@ -11,4 +11,5 @@ public class DashBaseFragment extends SherlockFragment { public OsmandApplication getMyApplication(){ return (OsmandApplication) getActivity().getApplication(); } + } diff --git a/OsmAnd/src/net/osmand/plus/development/SettingsDevelopmentActivity.java b/OsmAnd/src/net/osmand/plus/development/SettingsDevelopmentActivity.java index 038ee7feaf..1d69db36bb 100644 --- a/OsmAnd/src/net/osmand/plus/development/SettingsDevelopmentActivity.java +++ b/OsmAnd/src/net/osmand/plus/development/SettingsDevelopmentActivity.java @@ -41,8 +41,6 @@ public class SettingsDevelopmentActivity extends SettingsBaseActivity { cat.addPreference(createCheckBoxPreference(settings.USE_MAGNETIC_FIELD_SENSOR_COMPASS, R.string.use_magnetic_sensor, R.string.use_magnetic_sensor_descr)); - cat.addPreference(createCheckBoxPreference(settings.USE_NATIVE_RENDER, R.string.use_native_render,R.string.use_native_render_descr)); - Preference pref = new Preference(this); pref.setTitle(R.string.test_voice_prompts); pref.setSummary(R.string.play_commands_of_currently_selected_voice); diff --git a/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java b/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java index 6d26e5696b..3c77b04d38 100644 --- a/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java +++ b/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java @@ -166,6 +166,7 @@ public class ConfigureMapMenu { protected void refreshMapComplete(final MapActivity activity) { activity.getMyApplication().getResourceManager().getRenderer().clearCache(); + activity.updateMapSettings(); activity.getMapView().refreshMap(true); } @@ -368,8 +369,7 @@ public class ConfigureMapMenu { @Override public void onClick(DialogInterface dialog, int which) { pref.set(p.getPossibleValues()[which]); - app.getResourceManager().getRenderer().clearCache(); - view.refreshMap(true); + refreshMapComplete(activity); adapter.setItemDescription(pos, SettingsActivity.getStringPropertyValue(activity, pref.get())); dialog.dismiss(); ad.notifyDataSetInvalidated(); diff --git a/OsmAnd/src/net/osmand/plus/helpers/WakeLockHelper.java b/OsmAnd/src/net/osmand/plus/helpers/WakeLockHelper.java new file mode 100755 index 0000000000..73c4c64463 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/helpers/WakeLockHelper.java @@ -0,0 +1,103 @@ +package net.osmand.plus.helpers; + +import net.osmand.plus.DeviceAdminRecv; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.OsmandSettings; +import net.osmand.plus.routing.VoiceRouter; +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.admin.DevicePolicyManager; +import android.content.ComponentName; +import android.content.Context; +import android.os.Handler; +import android.os.PowerManager; + +@SuppressLint("NewApi") +public class WakeLockHelper implements VoiceRouter.VoiceMessageListener { + + private PowerManager.WakeLock wakeLock = null; + private ReleaseWakeLocksRunnable releaseWakeLocksRunnable = new ReleaseWakeLocksRunnable(); + private DevicePolicyManager mDevicePolicyManager; + private ComponentName mDeviceAdmin; + private Handler uiHandler; + private OsmandApplication app; + private boolean active; + + public WakeLockHelper(OsmandApplication app){ + uiHandler = new Handler(); + this.app = app; + mDeviceAdmin = new ComponentName(app, DeviceAdminRecv.class); + mDevicePolicyManager = (DevicePolicyManager) app.getSystemService(Context.DEVICE_POLICY_SERVICE); + } + + private void releaseWakeLocks() { + if (wakeLock != null) { + wakeLock.release(); + wakeLock = null; + } + + if (mDevicePolicyManager != null && mDeviceAdmin != null) { + OsmandSettings settings = app.getSettings(); + final Integer screenPowerSave = settings.WAKE_ON_VOICE_INT.get(); + if (screenPowerSave > 0 && settings.MAP_ACTIVITY_ENABLED.get()) { + if (mDevicePolicyManager.isAdminActive(mDeviceAdmin)) { + try { + mDevicePolicyManager.lockNow(); + } catch (SecurityException e) { +// Log.d(TAG, +// "SecurityException: No device admin permission to lock the screen!"); + } + } else { +// Log.d(TAG, +// "No device admin permission to lock the screen!"); + } + } + } + } + + private class ReleaseWakeLocksRunnable implements Runnable { + + @Override + public void run() { + releaseWakeLocks(); + } + } + + public void onStart(Activity a) { + this.active = true; + if (wakeLock == null) { + VoiceRouter voiceRouter = app.getRoutingHelper().getVoiceRouter(); + voiceRouter.removeVoiceMessageListener(this); + } + } + + public void onStop(Activity a) { + this.active = false; + OsmandSettings settings = app.getSettings(); + if (!a.isFinishing() && (settings.WAKE_ON_VOICE_INT.get() > 0)) { + VoiceRouter voiceRouter = app.getRoutingHelper().getVoiceRouter(); + voiceRouter.addVoiceMessageListener(this); + } + } + + @Override + public void onVoiceMessage() { + OsmandSettings settings = app.getSettings(); + final Integer screenPowerSave = settings.WAKE_ON_VOICE_INT.get(); + if (screenPowerSave > 0) { + uiHandler.removeCallbacks(releaseWakeLocksRunnable); + + if (!active && wakeLock == null) { + PowerManager pm = (PowerManager) app.getSystemService(Context.POWER_SERVICE); + wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK + | PowerManager.ACQUIRE_CAUSES_WAKEUP, + "OsmAndOnVoiceWakeupTag"); + wakeLock.acquire(); + } + + uiHandler.postDelayed(releaseWakeLocksRunnable, + screenPowerSave * 1000L); + } + } + +} diff --git a/OsmAnd/src/net/osmand/plus/render/MapVectorLayer.java b/OsmAnd/src/net/osmand/plus/render/MapVectorLayer.java index 4a195a6b9f..a31e4371a2 100644 --- a/OsmAnd/src/net/osmand/plus/render/MapVectorLayer.java +++ b/OsmAnd/src/net/osmand/plus/render/MapVectorLayer.java @@ -9,11 +9,13 @@ import net.osmand.plus.resources.ResourceManager; import net.osmand.plus.views.BaseMapLayer; import net.osmand.plus.views.MapTileLayer; import net.osmand.plus.views.OsmandMapTileView; +import net.osmand.plus.views.corenative.NativeCoreContext; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PointF; import android.graphics.RectF; +import android.view.MotionEvent; public class MapVectorLayer extends BaseMapLayer { @@ -80,6 +82,7 @@ public class MapVectorLayer extends BaseMapLayer { } + @Override public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tilesRect, DrawSettings drawSettings) { @@ -92,6 +95,7 @@ public class MapVectorLayer extends BaseMapLayer { } else { final MapRendererView mapRenderer = view.getMapRenderer(); if (mapRenderer != null) { + NativeCoreContext.getMapRendererContext().setNightMode(drawSettings.isNightMode()); // opengl renderer mapRenderer.setTarget(new PointI(tilesRect.getCenter31X(), tilesRect.getCenter31Y())); mapRenderer.setAzimuth(-tilesRect.getRotate()); diff --git a/OsmAnd/src/net/osmand/plus/render/NativeCppLibrary.java b/OsmAnd/src/net/osmand/plus/render/NativeCppLibrary.java deleted file mode 100644 index 20cbb7662d..0000000000 --- a/OsmAnd/src/net/osmand/plus/render/NativeCppLibrary.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.osmand.plus.render; - -import net.osmand.NativeLibrary; - -/** - * Created by Denis on 02.10.2014. - */ -public class NativeCppLibrary extends NativeLibrary { - - public NativeCppLibrary(boolean newLibrary) { - super(newLibrary); - } - - public static void loadLibrary(String name) { - try { - System.out.println("Loading " + name); - System.loadLibrary(name); - } catch( UnsatisfiedLinkError e ) { - System.err.println("Failed to load '"+name + "':" + e); - throw e; - } - } -} diff --git a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java index f945cb4e43..0271fd28e1 100644 --- a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java +++ b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java @@ -4,6 +4,7 @@ package net.osmand.plus.routing; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ConcurrentHashMap; import net.osmand.Location; import net.osmand.binary.RouteDataObject; @@ -76,8 +77,7 @@ public class VoiceRouter { public interface VoiceMessageListener { void onVoiceMessage(); } - private List voiceMessageListeners; - private Handler handler; + private ConcurrentHashMap voiceMessageListeners; public VoiceRouter(RoutingHelper router, final OsmandSettings settings, CommandPlayer player) { this.router = router; @@ -85,12 +85,7 @@ public class VoiceRouter { this.settings = settings; empty = new Struct(""); - voiceMessageListeners = new ArrayList(); - Looper looper = Looper.myLooper(); - if (looper == null) { - looper = Looper.getMainLooper(); - } - handler = new Handler(looper); + voiceMessageListeners = new ConcurrentHashMap(); } public void setPlayer(CommandPlayer player) { @@ -847,46 +842,24 @@ public class VoiceRouter { } public void addVoiceMessageListener(VoiceMessageListener voiceMessageListener) { - synchronized (voiceMessageListeners) { - if (!voiceMessageListeners.contains(voiceMessageListener)) { - voiceMessageListeners.add(voiceMessageListener); - } - } + voiceMessageListeners.put(voiceMessageListener, null); } public void removeVoiceMessageListener(VoiceMessageListener voiceMessageListener) { - synchronized (voiceMessageListeners) { - if (voiceMessageListeners.contains(voiceMessageListener)) { - voiceMessageListeners.remove(voiceMessageListener); - } - } + voiceMessageListeners.remove(voiceMessageListener); } public void notifyOnVoiceMessage() { - handler.post(new Runnable() { - - @Override - public void run() { - synchronized (voiceMessageListeners) { - for (final VoiceMessageListener voiceMessageListener : voiceMessageListeners) { - Runnable closure = new Runnable() { - public void run() { - if (settings.WAKE_ON_VOICE_INT.get() > 0) { - synchronized (voiceMessageListeners) { - if (voiceMessageListeners - .contains(voiceMessageListener) - && (settings.WAKE_ON_VOICE_INT.get() > 0)) { - voiceMessageListener - .onVoiceMessage(); - } - } - } - } - }; - handler.post(closure); + if (settings.WAKE_ON_VOICE_INT.get() > 0) { + router.getApplication().runInUIThread(new Runnable() { + @Override + public void run() { + for (VoiceMessageListener lnt : voiceMessageListeners + .keySet()) { + lnt.onVoiceMessage(); } } - } - }); + }); + } } } diff --git a/OsmAnd/src/net/osmand/plus/views/AnimateDraggingMapThread.java b/OsmAnd/src/net/osmand/plus/views/AnimateDraggingMapThread.java index 53fdf2ed02..89de94d564 100644 --- a/OsmAnd/src/net/osmand/plus/views/AnimateDraggingMapThread.java +++ b/OsmAnd/src/net/osmand/plus/views/AnimateDraggingMapThread.java @@ -1,6 +1,7 @@ package net.osmand.plus.views; import net.osmand.PlatformUtil; +import net.osmand.core.android.MapRendererView; import net.osmand.data.RotatedTileBox; import net.osmand.util.MapUtils; @@ -8,6 +9,7 @@ import org.apache.commons.logging.Log; import android.os.SystemClock; import android.util.FloatMath; +import android.view.MotionEvent; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.view.animation.LinearInterpolator; @@ -103,10 +105,12 @@ public class AnimateDraggingMapThread { @Override public void run() { - try { + try { + suspendUpdate(); runnable.run(); } finally { currentThread = null; + resumeUpdate(); } } }, "Animating Thread"); @@ -305,6 +309,20 @@ public class AnimateDraggingMapThread { targetZoomScale = 0; } + private void suspendUpdate() { + final MapRendererView mapRenderer = tileView.getMapRenderer(); + if (mapRenderer != null) { + mapRenderer.suspendSymbolsUpdate(); + } + } + + private void resumeUpdate() { + final MapRendererView mapRenderer = tileView.getMapRenderer(); + if (mapRenderer != null) { + mapRenderer.resumeSymbolsUpdate(); + } + } + private void setTargetValues(int zoom, double zoomScale, double lat, double lon){ targetIntZoom = zoom; targetZoomScale = zoomScale; diff --git a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java index 00967d98dc..65f157a763 100644 --- a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java +++ b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java @@ -719,6 +719,14 @@ public class OsmandMapTileView implements IMapDownloaderCallback { } public boolean onTouchEvent(MotionEvent event) { + if (mapRenderer != null) { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + mapRenderer.suspendSymbolsUpdate(); + } else if (event.getAction() == MotionEvent.ACTION_UP + || event.getAction() == MotionEvent.ACTION_CANCEL) { + mapRenderer.resumeSymbolsUpdate(); + } + } if (twoFingerTapDetector.onTouchEvent(event)) { return true; } diff --git a/OsmAnd/src/net/osmand/plus/views/corenative/NativeCoreContext.java b/OsmAnd/src/net/osmand/plus/views/corenative/NativeCoreContext.java index 775ec8fad1..937f4208f9 100644 --- a/OsmAnd/src/net/osmand/plus/views/corenative/NativeCoreContext.java +++ b/OsmAnd/src/net/osmand/plus/views/corenative/NativeCoreContext.java @@ -6,6 +6,7 @@ import android.content.Context; import android.util.DisplayMetrics; import android.util.Log; import android.view.WindowManager; +import net.osmand.IndexConstants; import net.osmand.core.android.CoreResourcesFromAndroidAssetsCustom; import net.osmand.core.android.MapRendererContext; import net.osmand.core.android.NativeCore; @@ -23,6 +24,8 @@ public class NativeCoreContext { private static boolean init; + private static MapRendererContext mapRendererContext; + public static boolean isInit() { return init; } @@ -52,42 +55,42 @@ public class NativeCoreContext { WindowManager mgr = (WindowManager)app.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics dm = new DisplayMetrics(); mgr.getDefaultDisplay().getMetrics(dm); - - // Get device display density factor -// DisplayMetrics displayMetrics = new DisplayMetrics(); -// act.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); - DisplayMetrics displayMetrics = app.getResources().getDisplayMetrics(); - // TODO getSettings().getSettingsZoomScale() + Math.sqrt(Math.max(0, getDensity() - 1)) - float scaleCoefficient = displayMetrics.density; - if (Math.min(dm.widthPixels / (dm.density * 160), dm.heightPixels / (dm.density * 160)) > 2.5f) { - // large screen - scaleCoefficient *= 1.5f; - } - float displayDensityFactor = scaleCoefficient; + float density = Math.max(0, dm.density - 1); - _obfsCollection = new ObfsCollection(); - _obfsCollection.addDirectory(directory.getAbsolutePath(), false); - - _mapStylesCollection = new MapStylesCollection(); - - _mapRendererContext = new MapRendererContext(); - _mapRendererContext.setDisplayDensityFactor(displayDensityFactor); - _mapRendererContext.setupObfMap( - _mapStylesCollection.getResolvedStyleByName("default"), - _obfsCollection); + ObfsCollection obfsCollection = new ObfsCollection(); + obfsCollection.addDirectory(directory.getAbsolutePath(), false); + MapStylesCollection mapStylesCollection = setupMapStyleCollection(app); + mapRendererContext = new MapRendererContext(app, density); + mapRendererContext.setupObfMap(mapStylesCollection, obfsCollection); init = true; } } } - - private static MapStylesCollection _mapStylesCollection; - - private static ObfsCollection _obfsCollection; - - private static MapRendererContext _mapRendererContext; + + private static MapStylesCollection setupMapStyleCollection( + OsmandApplication app) { + MapStylesCollection mapStylesCollection = new MapStylesCollection(); + // Alexey TODO +// internalRenderers.put("Touring-view_(more-contrast-and-details)", "Touring-view_(more-contrast-and-details)" +".render.xml"); +// internalRenderers.put("UniRS", "UniRS" + ".render.xml"); +// internalRenderers.put("LightRS", "LightRS" + ".render.xml"); +// internalRenderers.put("High-contrast-roads", "High-contrast-roads" + ".render.xml"); +// internalRenderers.put("Winter-and-ski", "Winter-and-ski" + ".render.xml"); + File renderers = app.getAppPath(IndexConstants.RENDERERS_DIR); + File[] lf = renderers.listFiles(); + if(lf != null) { + for(File f : lf) { + if(f.getName().endsWith(IndexConstants.RENDERER_INDEX_EXT)) { + mapStylesCollection.addStyleFromFile(f.getAbsolutePath()); + } + } + } + return mapStylesCollection; + } + public static MapRendererContext getMapRendererContext() { - return _mapRendererContext; + return mapRendererContext; } }