Compare commits

..

82 Commits

Author SHA1 Message Date
x7z4w
d36a0d8f0d [styles] Night mode bookmarks
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-24 20:59:28 +02:00
Yannik Bloscheck
68781adccb [ios] Stop overlap between last search results and home indicator
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-08-24 20:57:58 +02:00
Yannik Bloscheck
73cfd3a6dc [styles] Adjusting label colors to the new dark map style
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-08-24 20:57:34 +02:00
Yannik Bloscheck
439babe056 [styles] Improved dark map style
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-08-24 20:56:32 +02:00
Yannik Bloscheck
a69e68fb9f [styles] Improved dark map style icons
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-08-24 20:56:32 +02:00
x7z4w
c2bef3bd45 [styles] Colored labels
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-24 20:56:16 +02:00
eisa01
33ad35206f [drape] Enable shift+swipe to zoom on macOS Catalyst app\
\
Matches functionality in Apple Maps. Discovered while discussing issue #1509\
\
Tested that pinch to zoom still work in iPad Simulator

Signed-off-by: eisa01 <eisa01@gmail.com>
2025-08-24 20:37:12 +02:00
Codeberg Translate
234f13abcc [strings] Update from Codeberg Translate
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: sziatomi <sziatomi@noreply.codeberg.org>
Translate-URL: https://translate.codeberg.org/projects/comaps/appstore-description/
Translation: CoMaps/Android - Map Feature Types
Translation: CoMaps/Android UI Strings
Translation: CoMaps/Apple AppStore description
Translation: CoMaps/F-Droid app description
Translation: CoMaps/iOS - Map Feature Types
Translation: CoMaps/iOS UI Strings
2025-08-24 17:16:58 +00:00
x7z4w
5e7bc37fb5 Fix crash
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-24 19:12:32 +02:00
Harry Bond
08abddc7fc [android] Add support for check_date & check_date:opening_hours
Signed-off-by: Harry Bond <me@hbond.xyz>
2025-08-24 16:58:56 +00:00
Harry Bond
ef9f4ceb1e [android] fix preview in android studio for opening_hours fragment
Signed-off-by: Harry Bond <me@hbond.xyz>
2025-08-24 16:58:11 +00:00
map-per
6c75604c38 Remove bookmark category from subtitle
Signed-off-by: map-per <map-per@gmx.de>
2025-08-24 18:18:04 +02:00
map-per
5edaa05129 Keep category list and direction arrow on bookmark place page
Signed-off-by: map-per <map-per@gmx.de>
2025-08-24 18:00:24 +02:00
map-per
c4491563b7 fix padding in place page
Signed-off-by: map-per <map-per@gmx.de>
2025-08-24 17:03:36 +02:00
Jean-Baptiste
c3d8f948ce [android] Migrate NavMenu to Material components
Signed-off-by: jeanbaptisteC <jeanbaptiste.charron@outlook.fr>
2025-08-24 17:02:18 +02:00
Konstantin Pastbin
008387b0cf [android] Reformat code with clang-format
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-24 21:58:44 +07:00
Konstantin Pastbin
3d450433e7 [android][sdk] Move rest of types_strings.xml
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-24 21:58:44 +07:00
Konstantin Pastbin
58cb8ecd9d [android] Fix BackupUtils deps
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-24 21:58:44 +07:00
Konstantin Pastbin
3e9b507acd [android][sdk] Move transport type drawables to SDK
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-24 21:58:44 +07:00
Konstantin Pastbin
c9a261dee5 [android][sdk] Move OhState to SDK
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-24 21:58:44 +07:00
Konstantin Pastbin
d609876c2d [android][sdk] Move strings to sdk follow-up
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-24 21:58:42 +07:00
Andrei Shkrob
80b616daf2 [android][sdk] Move required strings to sdk
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-24 21:56:52 +07:00
Andrei Shkrob
4dca45f74a [android][sdk] Disable proguard
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-24 21:56:52 +07:00
Andrei Shkrob
f5037a5ee2 [android][sdk] Fix lint
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-24 21:56:52 +07:00
Andrei Shkrob
802f54494a [android][sdk] Fix location provider
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-24 21:56:52 +07:00
Andrei Shkrob
d4863643f7 [android][sdk] Fix MapManager
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-24 21:56:52 +07:00
Andrei Shkrob
431e305a48 [android][sdk] Move getDonateUrl outside sdk
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-24 21:56:52 +07:00
Andrei Shkrob
d3c64a262b [android][sdk] Move PrefsManager call outside sdk
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-24 21:56:52 +07:00
Andrei Shkrob
06c35e729f [android][sdk] Move types strings
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-24 21:56:52 +07:00
Andrei Shkrob
b2743ab2ad [android][sdk] Add prefs strings
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-24 21:56:52 +07:00
Andrei Shkrob
c004f2ed7e [android][sdk] Add missing dimens
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-24 21:56:52 +07:00
Andrei Shkrob
abcc95710d [android][sdk] Replace app.organicmaps.R with app.organicmaps.sdk.R
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-24 21:56:52 +07:00
Andrei Shkrob
3a90f9783d [android][sdk] Add build config to sdk module
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-24 21:56:52 +07:00
Konstantin Pastbin
a8353a6a80 [android] Replace direct SDK deps with libs refs
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-24 21:56:52 +07:00
Andrei Shkrob
dc8d4e7da9 [android][sdk] add missing dependencies
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-24 21:56:52 +07:00
Andrei Shkrob
6a85526ac9 [android][sdk] Move java files into sdk module
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-24 21:56:51 +07:00
Andrei Shkrob
447266c328 [android][sdk] Fix ThemeUtils usage in sdk
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-24 21:56:51 +07:00
Andrei Shkrob
886d569895 [android][sdk] Fix StackedButtonDialogFragment usage in sdk
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-24 21:56:51 +07:00
Viktor Govako
c6cd23fb24 [android] openUri, failMessage may be null.
pastk: includes changes from OM 33c4e22246 and 10be769f62

Signed-off-by: Viktor Govako <viktor.govako@gmail.com>
2025-08-24 21:56:51 +07:00
Viktor Govako
c6040d8ce6 [android] setSound(null, null) for the Downloader notification channel.
Signed-off-by: Viktor Govako <viktor.govako@gmail.com>
2025-08-24 21:56:51 +07:00
Andrei Shkrob
0f5125c61c [android][sdk] Move UiUtils outside sdk package
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-24 21:56:51 +07:00
Jean-Baptiste
512475ec5c [android] Switch add phone button to FAB
Signed-off-by: jeanbaptisteC <jeanbaptiste.charron@outlook.fr>
2025-08-24 16:12:32 +02:00
map-per
66d5306717 Move bookmark description text view to bookmark section
Signed-off-by: map-per <map-per@gmx.de>
2025-08-24 15:53:25 +02:00
gekeleda
265e94edc3 [core] Fix remove passed points
Signed-off-by: gekeleda <git@davidgekeler.eu>
2025-08-24 14:48:19 +02:00
Codeberg Translate
4d6cecd9ba [strings] Update from Codeberg Translate
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
Co-authored-by: Stephan-P <stephan-p@noreply.codeberg.org>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: phama <phama@noreply.codeberg.org>
Co-authored-by: sziatomi <sziatomi@noreply.codeberg.org>
Translation: CoMaps/Android - Map Feature Types
Translation: CoMaps/Android UI Strings
Translation: CoMaps/Apple AppStore description
Translation: CoMaps/iOS - Map Feature Types
Translation: CoMaps/iOS Plist
Translation: CoMaps/iOS Plurals
Translation: CoMaps/iOS UI Strings
2025-08-24 15:35:17 +07:00
Codeberg Translate
46c9a015e5 [strings] Update from Codeberg Translate
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
Co-authored-by: phama <phama@noreply.codeberg.org>
Co-authored-by: sziatomi <sziatomi@noreply.codeberg.org>
Translation: CoMaps/Android - Map Feature Types
Translation: CoMaps/Android UI Strings
Translation: CoMaps/Apple AppStore description
Translation: CoMaps/iOS - Map Feature Types
Translation: CoMaps/iOS Plurals
Translation: CoMaps/iOS UI Strings
2025-08-24 10:29:18 +02:00
x7z4w
2e3efc0597 [generator] Add toll booth penalty
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-24 09:24:50 +02:00
Yannik Bloscheck
0b65c2ebff [ios] Fixed CarPlay panning not working
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-08-23 21:42:07 +02:00
Yannik Bloscheck
96a7b31f4b [ios] Replaced some CarPlay images with system versions
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-08-23 21:42:07 +02:00
Yannik Bloscheck
c11f007012 [ios] Fix issue with opening urls
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-08-23 21:41:05 +02:00
Jean-Baptiste
977a3b6734 [android] Remove useless fontFamily property
Signed-off-by: jeanbaptisteC <jeanbaptiste.charron@outlook.fr>
2025-08-23 20:34:13 +02:00
Codeberg Translate
c27b0dc6fb [strings] Update from Codeberg Translate
Co-authored-by: B o d o <timtrek@noreply.codeberg.org>
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Prefill add-on <noreply-addon-prefill@weblate.org>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Co-authored-by: matheusgomesms <matheusgomesms@noreply.codeberg.org>
Co-authored-by: yannikbloscheck <yannikbloscheck@noreply.codeberg.org>
Translation: CoMaps/Android - Map Feature Types
Translation: CoMaps/Android UI Strings
Translation: CoMaps/iOS - Map Feature Types
Translation: CoMaps/iOS UI Strings
2025-08-23 17:02:59 +00:00
Harry Bond
e367fa6792 [android] Start LinearProgressBars at 1% to show initial dot
see https://m3.material.io/components/progress-indicators/guidelines#817a3dbd-9dd5-471f-a7d0-50eae6270ee0

Signed-off-by: Harry Bond <me@hbond.xyz>
2025-08-23 19:02:54 +02:00
mvglasow
06b6c3f794 [drape] Replace newline with space in StraightTextLayout and PathTextLayout
Signed-off-by: mvglasow <michael -at- vonglasow.com>
2025-08-23 18:39:24 +02:00
Jean-Baptiste
ca720d7712 [android] Move hint property to TextInputLayout
Signed-off-by: jeanbaptisteC <jeanbaptiste.charron@outlook.fr>
2025-08-23 17:37:37 +02:00
eisa01
661445a053 [ios] Fix shift+scroll wheel zooming out
When you press shift on macOS, the normal scroll wheel action on a mouse is changed to horizontal scroll instead of vertical

That meant this check never entered, and since translation.y = 0 you always zoom out

Signed-off-by: eisa01 <eisa01@gmail.com>
2025-08-23 12:14:07 +02:00
Yannik Bloscheck
c616e235a1 [ios] Update design of existence and opening hour confirmation for place page
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-08-23 10:37:18 +02:00
Eivind Samseth
d1f9806901 [iOS] Add Existence and Opening Hour confirmation to Place Page
Signed-off-by: eisa01 <your.email@example.com>
2025-08-23 10:37:18 +02:00
Codeberg Translate
795fe0ee09 [strings] Update from Codeberg Translate
Co-authored-by: Anonymous <anonymous@noreply.codeberg.org>
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: N4ta <codeberg@n4ta.anonaddy.me>
Co-authored-by: Prefill add-on <noreply-addon-prefill@weblate.org>
Co-authored-by: lihaisapossu <lihaisapossu@noreply.codeberg.org>
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/
Translation: CoMaps/Android - Map Feature Types
Translation: CoMaps/Android UI Strings
Translation: CoMaps/iOS - Map Feature Types
Translation: CoMaps/iOS UI Strings
2025-08-23 08:24:09 +00:00
Konstantin Pastbin
ea588e7ece [strings] Fix Wicket gate to upper case
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-23 14:22:57 +07:00
aoxa
053855bd97 Translated using Weblate (Persian)
Currently translated at 100.0% (106 of 106 strings)

Translation: CoMaps/Voice announcements for navigation (TTS)
2025-08-23 09:00:02 +02:00
Codeberg Translate
f485830c51 [strings] Update from Codeberg Translate
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: alexgabi <alexgabi@noreply.codeberg.org>
Co-authored-by: aoxa <aoxa@noreply.codeberg.org>
Co-authored-by: giopera <giopera@noreply.codeberg.org>
Co-authored-by: loscati <loscati@noreply.codeberg.org>
Translation: CoMaps/Android - Map Feature Types
Translation: CoMaps/Android UI Strings
Translation: CoMaps/Apple AppStore description
Translation: CoMaps/Countries and regions names
Translation: CoMaps/F-Droid app description
Translation: CoMaps/Voice announcements for navigation (TTS)
Translation: CoMaps/iOS - Map Feature Types
Translation: CoMaps/iOS Plist
Translation: CoMaps/iOS Plurals
Translation: CoMaps/iOS UI Strings
2025-08-23 09:00:02 +02:00
Jean-Baptiste
debea83908 [android] Keep AppCompat theme for radio button
Signed-off-by: jeanbaptisteC <jeanbaptiste.charron@outlook.fr>
2025-08-23 08:50:03 +02:00
Konstantin Pastbin
729808fd14 [core] Re-add MwmValue::GetRegionData()
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-23 08:32:06 +02:00
Viktor Govako
b85c11ea5a [feature] Added RouteRelation and linked it with FeatureType.
Signed-off-by: Viktor Govako <viktor.govako@gmail.com>
2025-08-23 08:32:06 +02:00
Viktor Govako
315bba2a22 Include fix.
Signed-off-by: Viktor Govako <viktor.govako@gmail.com>
2025-08-23 08:32:06 +02:00
Viktor Govako
550455a14a [feature] Added Feature V1 version with free Header2 bits.
Signed-off-by: Viktor Govako <viktor.govako@gmail.com>
2025-08-23 08:32:06 +02:00
Viktor Govako
588028c9eb [feature] Put m_metaDeserializer into SharedLoadInfo.
Signed-off-by: Viktor Govako <viktor.govako@gmail.com>
2025-08-23 08:32:06 +02:00
Viktor Govako
6beabb2fe1 [feature] Removed IndexFactory class.
Signed-off-by: Viktor Govako <viktor.govako@gmail.com>

^ Conflicts:
^	libs/indexer/data_source.cpp
^	libs/indexer/feature.cpp
^	libs/indexer/features_vector.cpp
^	libs/indexer/mwm_set.hpp
2025-08-23 08:32:06 +02:00
Viktor Govako
25a4a3b76f [coding] Added varint short arrays ser/des.
Signed-off-by: Viktor Govako <viktor.govako@gmail.com>

# Conflicts:
#	libs/coding/coding_tests/varint_test.cpp
2025-08-23 08:32:06 +02:00
Codeberg Translate
111e913478 [strings] Update from Codeberg Translate
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: giopera <giopera@noreply.codeberg.org>
Translation: CoMaps/Android - Map Feature Types
Translation: CoMaps/Android UI Strings
Translation: CoMaps/Countries and regions names
Translation: CoMaps/Voice announcements for navigation (TTS)
Translation: CoMaps/iOS - Map Feature Types
Translation: CoMaps/iOS Plist
Translation: CoMaps/iOS Plurals
Translation: CoMaps/iOS UI Strings
2025-08-23 08:31:18 +02:00
map-per
632d9c0d1d New icon and text for 'Volunteer and improve CoMaps'
Signed-off-by: map-per <map-per@gmx.de>
2025-08-23 08:18:03 +02:00
Jean-Baptiste
1e729e980d [android] Add default value for progress bar
Signed-off-by: jeanbaptisteC <jeanbaptiste.charron@outlook.fr>
2025-08-23 07:49:57 +02:00
Jean-Baptiste
339eca0bca [android] Simplify logic to change items color on the about screen
Signed-off-by: jeanbaptisteC <jeanbaptiste.charron@outlook.fr>
2025-08-23 07:48:04 +02:00
Andrei Shkrob
ac453e36ac [android] Fix predefined colors again
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-23 07:44:46 +02:00
kavikhalique
4052f0481e Hide PP category for other map objects other than track and bookmark
Signed-off-by: kavikhalique <kavikhalique3@gmail.com>
2025-08-23 07:44:46 +02:00
Andrei Shkrob
89d82be2b9 [android] Fix bookmark icon in place plage
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-23 07:44:46 +02:00
Konstantin Pastbin
e98ecce375 [android] Fix PlacePageView components OM mismatches
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-23 07:44:46 +02:00
Konstantin Pastbin
0eee3c4bf4 [android] Fix unity jni build issue
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-23 07:44:46 +02:00
kavikhalique
2684e2b278 Removed animated slow rendering and Nit picks
Signed-off-by: kavikhalique <kavikhalique3@gmail.com>
2025-08-23 07:44:46 +02:00
Konstantin Pastbin
bb88861256 [android] Add ppFloatingMarkerIconColor to material themes
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-23 07:44:46 +02:00
kavikhalique
f1628c70bc Implement Track Selection and elevation info display on PP
Signed-off-by: kavikhalique <kavikhalique3@gmail.com>
2025-08-23 07:44:46 +02:00
677 changed files with 5543 additions and 3637 deletions

View File

@@ -0,0 +1 @@
../../../../google/java/app/organicmaps/location

View File

@@ -1 +0,0 @@
../../../../../google/java/app/organicmaps/sdk/location

View File

@@ -0,0 +1,32 @@
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!

View File

@@ -1,4 +1,4 @@
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.
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.
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 altro evidenziati
• Modalità Outdoor con percorsi escursionistici, campeggi, sorgenti d'acqua, picchi, dislivelli ed altri punti d'interesse 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

View File

@@ -1 +1 @@
Navigazione semplice - Immergiti nella tua avventura - Sviluppato dalla comunità
Navigazione semplice - Immergiti nella tua avventura - Realizzato dalla comunità

View File

@@ -1,4 +1,4 @@
package app.organicmaps.sdk.location;
package app.organicmaps.location;
import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
import static android.Manifest.permission.ACCESS_FINE_LOCATION;
@@ -10,6 +10,7 @@ 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;

View File

@@ -1,23 +1,25 @@
package app.organicmaps.sdk.location;
package app.organicmaps.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 LocationProviderFactory
public class LocationProviderFactoryImpl implements LocationProviderFactory
{
private static final String TAG = LocationProviderFactory.class.getSimpleName();
private static final String TAG = LocationProviderFactoryImpl.class.getSimpleName();
public static boolean isGoogleLocationAvailable(@NonNull Context context)
public boolean isGoogleLocationAvailable(@NonNull Context context)
{
return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context) == ConnectionResult.SUCCESS;
}
public static BaseLocationProvider getProvider(@NonNull Context context,
@NonNull BaseLocationProvider.Listener listener)
public BaseLocationProvider getProvider(@NonNull Context context, @NonNull BaseLocationProvider.Listener listener)
{
if (isGoogleLocationAvailable(context) && Config.useGoogleServices())
{

View File

@@ -0,0 +1 @@
../../../../google/java/app/organicmaps/location

View File

@@ -1 +0,0 @@
../../../../../google/java/app/organicmaps/sdk/location

View File

@@ -10,6 +10,8 @@ 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;
@@ -31,17 +33,16 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class ChartController implements OnChartValueSelectedListener,
BookmarkManager.OnElevationActivePointChangedListener,
BookmarkManager.OnElevationCurrentPositionChangedListener
public class ChartController implements OnChartValueSelectedListener
{
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 = 1500;
private static final int CHART_ANIMATION_DURATION = 0;
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
@@ -62,6 +63,7 @@ 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)
{
@@ -70,8 +72,6 @@ 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,13 +101,6 @@ 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()),
@@ -142,15 +135,17 @@ public class ChartController implements OnChartValueSelectedListener,
mChart.getAxisRight().setEnabled(false);
}
public void setData(@NonNull ElevationInfo info)
public void setData(Track track)
{
mTrackId = info.getId();
mTrackId = track.getTrackId();
ElevationInfo info = track.getElevationInfo();
TrackStatistics stats = track.getTrackStatistics();
List<Entry> values = new ArrayList<>();
for (ElevationInfo.Point point : info.getPoints())
values.add(new Entry((float) point.getDistance(), point.getAltitude()));
values.add(new Entry((float) point.getDistance(), point.getAltitude(), point));
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);
@@ -173,8 +168,8 @@ public class ChartController implements OnChartValueSelectedListener,
mChart.setData(data);
mChart.animateX(CHART_ANIMATION_DURATION);
mMinAltitude.setText(Framework.nativeFormatAltitude(info.getMinAltitude()));
mMaxAltitude.setText(Framework.nativeFormatAltitude(info.getMaxAltitude()));
mMinAltitude.setText(Framework.nativeFormatAltitude(stats.getMinElevation()));
mMaxAltitude.setText(Framework.nativeFormatAltitude(stats.getMaxElevation()));
highlightActivePointManually();
}
@@ -192,7 +187,9 @@ public class ChartController implements OnChartValueSelectedListener,
if (mTrackId == Utils.INVALID_ID)
return;
BookmarkManager.INSTANCE.setElevationActivePoint(mTrackId, e.getX());
if (mInformSelectedActivePointToCore)
BookmarkManager.INSTANCE.setElevationActivePoint(mTrackId, e.getX(), (ElevationInfo.Point) e.getData());
mInformSelectedActivePointToCore = true;
}
@NonNull
@@ -211,7 +208,6 @@ public class ChartController implements OnChartValueSelectedListener,
highlightChartCurrentLocation();
}
@Override
public void onCurrentPositionChanged()
{
if (mTrackId == Utils.INVALID_ID)
@@ -222,7 +218,6 @@ public class ChartController implements OnChartValueSelectedListener,
highlightActivePointManually();
}
@Override
public void onElevationActivePointChanged()
{
if (mTrackId == Utils.INVALID_ID)
@@ -234,6 +229,7 @@ public class ChartController implements OnChartValueSelectedListener,
private void highlightActivePointManually()
{
Highlight highlight = getActivePoint();
mInformSelectedActivePointToCore = false;
mChart.highlightValue(highlight, true);
}

View File

@@ -27,6 +27,7 @@ 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;
@@ -35,7 +36,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.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
import com.google.android.material.button.MaterialButton;
@@ -116,10 +117,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 percent)
public void onProgress(final int bytesDownloaded)
{
if (!isFinishing())
mProgress.setProgressCompat(percent, true);
mProgress.setProgressCompat(bytesDownloaded, true);
}
@Override
@@ -155,7 +156,9 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
showMap();
return;
case CountryItem.STATUS_FAILED: MapManager.showError(DownloadResourcesLegacyActivity.this, item, null); return;
case CountryItem.STATUS_FAILED:
MapManagerHelper.showError(DownloadResourcesLegacyActivity.this, item, null);
return;
}
}
}
@@ -250,7 +253,8 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
setDownloadMessage(bytes);
mProgress.setMax(bytes);
mProgress.setProgressCompat(0, true);
// Start progress at 1% according to M3 guidelines
mProgress.setProgressCompat(bytes/100, true);
}
else
finishFilesDownload(bytes);
@@ -368,10 +372,11 @@ 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);
mProgress.setProgressCompat(0, true);
// Start progress at 1% according to M3 guidelines
mProgress.setProgressCompat((int) (item.totalSize/100), true);
mCountryDownloadListenerSlot = MapManager.nativeSubscribe(mCountryDownloadListener);
MapManager.startDownload(mCurrentCountry);
MapManagerHelper.startDownload(mCurrentCountry);
setAction(PROCEED_TO_MAP);
}
else

View File

@@ -12,6 +12,7 @@ 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;
@@ -111,7 +112,6 @@ 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,6 +122,7 @@ 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;
@@ -457,12 +458,10 @@ public class MwmActivity extends BaseMwmFragmentActivity
@StyleRes
protected int getThemeResourceId(@NonNull String theme)
{
Context context = getApplicationContext();
if (ThemeUtils.isDefaultTheme(context, theme))
if (Config.UiTheme.isDefault(theme))
return R.style.MwmTheme_MainActivity;
if (ThemeUtils.isNightTheme(context, theme))
if (Config.UiTheme.isNight(theme))
return R.style.MwmTheme_Night_MainActivity;
return super.getThemeResourceId(theme);
@@ -584,7 +583,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
private void refreshLightStatusBar()
{
UiUtils.setLightStatusBar(this, !(ThemeUtils.isNightTheme(this) || RoutingController.get().isPlanning()
UiUtils.setLightStatusBar(this, !(ThemeUtils.isNightTheme() || RoutingController.get().isPlanning()
|| ChoosePositionMode.get() != ChoosePositionMode.None));
}
@@ -594,7 +593,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
UiUtils.setViewInsetsPaddingBottom(mPointChooser, windowInsets);
UiUtils.setViewInsetsPaddingNoBottom(mPointChooserToolbar, windowInsets);
final int trackRecorderOffset =
TrackRecorder.nativeIsTrackRecordingEnabled() ? UiUtils.dimen(this, R.dimen.map_button_size) : 0;
TrackRecorder.nativeIsTrackRecordingEnabled() ? 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
@@ -1648,17 +1647,17 @@ public class MwmActivity extends BaseMwmFragmentActivity
final int orientation = getResources().getConfiguration().orientation;
final boolean isTrackRecordingEnabled = TrackRecorder.nativeIsTrackRecordingEnabled();
if (isTrackRecordingEnabled && (orientation != Configuration.ORIENTATION_LANDSCAPE))
offsetY += UiUtils.dimen(this, R.dimen.map_button_size);
offsetY += dimen(this, R.dimen.map_button_size);
if (orientation == Configuration.ORIENTATION_LANDSCAPE)
{
if (show)
{
final boolean isSmallScreen = UiUtils.getDisplayTotalHeight(this) < UiUtils.dimen(this, R.dimen.dp_400);
final boolean isSmallScreen = UiUtils.getDisplayTotalHeight(this) < dimen(this, R.dimen.dp_400);
if (!isSmallScreen || TrackRecorder.nativeIsTrackRecordingEnabled())
offsetX += UiUtils.dimen(this, R.dimen.map_button_size);
offsetX += dimen(this, R.dimen.map_button_size);
}
else if (isTrackRecordingEnabled)
offsetY += UiUtils.dimen(this, R.dimen.map_button_size);
offsetY += dimen(this, R.dimen.map_button_size);
}
updateCompassOffset(offsetY, offsetX);
}
@@ -2457,7 +2456,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
if (mCurrentWindowInsets != null)
{
final int offset = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top;
updateCompassOffset(offset + UiUtils.dimen(this, R.dimen.map_button_size));
updateCompassOffset(offset + dimen(this, R.dimen.map_button_size));
}
Toast.makeText(this, R.string.track_recording, Toast.LENGTH_SHORT).show();
TrackRecordingService.startForegroundService(getApplicationContext());
@@ -2550,7 +2549,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
items.add(new MenuBottomSheetItem(R.string.download_maps, R.drawable.ic_download, getDownloadMapsCounter(),
this::onDownloadMapsOptionSelected));
mDonatesUrl = Config.getDonateUrl(getApplicationContext());
mDonatesUrl = Utils.getDonateUrl(getApplicationContext());
if (!mDonatesUrl.isEmpty())
items.add(new MenuBottomSheetItem(R.string.donate, R.drawable.ic_donate, this::onDonateOptionSelected));

View File

@@ -14,8 +14,10 @@ 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;
@@ -41,6 +43,9 @@ 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;
@@ -99,6 +104,12 @@ public class MwmApplication extends Application implements Application.ActivityL
return mOrganicMaps;
}
@NonNull
public LocationProviderFactoryImpl getLocationProviderFactory()
{
return mLocationProviderFactory;
}
@NonNull
public static MwmApplication from(@NonNull Context context)
{
@@ -119,7 +130,10 @@ public class MwmApplication extends Application implements Application.ActivityL
sInstance = this;
mOrganicMaps = new OrganicMaps(getApplicationContext());
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);
ConnectionState.INSTANCE.initialize(this);

View File

@@ -9,7 +9,8 @@ import androidx.annotation.IntegerRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.sdk.util.Utils;
import app.organicmaps.util.UiUtils;
import org.chromium.base.ObserverList;
class PanelAnimator
@@ -26,7 +27,7 @@ class PanelAnimator
PanelAnimator(MwmActivity activity)
{
mActivity = activity;
mWidth = UiUtils.dimen(activity.getApplicationContext(), R.dimen.panel_width);
mWidth = Utils.dimen(activity.getApplicationContext(), R.dimen.panel_width);
mPanel = mActivity.findViewById(R.id.fragment_container);
mDuration = mActivity.getResources().getInteger(R.integer.anim_panel);
}

View File

@@ -60,11 +60,10 @@ public class SplashActivity extends AppCompatActivity
{
super.onCreate(savedInstanceState);
final Context context = getApplicationContext();
final String theme = Config.getCurrentUiTheme(context);
if (ThemeUtils.isDefaultTheme(context, theme))
final String theme = Config.UiTheme.getCurrent();
if (Config.UiTheme.isDefault(theme))
setTheme(R.style.MwmTheme_Splash);
else if (ThemeUtils.isNightTheme(context, theme))
else if (Config.UiTheme.isNight(theme))
setTheme(R.style.MwmTheme_Night_Splash);
else
throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme);

View File

@@ -9,7 +9,7 @@ import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.annotation.NonNull;
import app.organicmaps.base.OnBackPressListener;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
public abstract class WebContainerDelegate implements OnBackPressListener
{

View File

@@ -1,6 +1,7 @@
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;
@@ -15,8 +16,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;
@@ -50,14 +51,14 @@ public class BackupUtils
String volumeName;
if ("primary".equalsIgnoreCase(volumeId))
volumeName = context.getString(R.string.maps_storage_shared);
volumeName = context.getString(app.organicmaps.sdk.R.string.maps_storage_shared);
else
volumeName = context.getString(R.string.maps_storage_removable);
volumeName = context.getString(app.organicmaps.sdk.R.string.maps_storage_removable);
SpannableStringBuilder sb = new SpannableStringBuilder();
sb.append(volumeName + ": \n", new AbsoluteSizeSpan(UiUtils.dimen(context, R.dimen.text_size_body_3)),
sb.append(volumeName + ": \n", new AbsoluteSizeSpan(dimen(context, R.dimen.text_size_body_3)),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
sb.append("/" + subPath, new AbsoluteSizeSpan(UiUtils.dimen(context, R.dimen.text_size_body_4)),
sb.append("/" + subPath, new AbsoluteSizeSpan(dimen(context, R.dimen.text_size_body_4)),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return sb;
}

View File

@@ -15,7 +15,7 @@ public class BaseMwmDialogFragment extends DialogFragment
@StyleRes
protected final int getFullscreenTheme()
{
return ThemeUtils.isNightTheme(requireContext()) ? getFullscreenDarkTheme() : getFullscreenLightTheme();
return ThemeUtils.isNightTheme() ? getFullscreenDarkTheme() : getFullscreenLightTheme();
}
protected int getStyle()

View File

@@ -1,7 +1,6 @@
package app.organicmaps.base;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.media.AudioManager;
@@ -24,7 +23,6 @@ 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;
@@ -40,12 +38,10 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity
@StyleRes
protected int getThemeResourceId(@NonNull String theme)
{
Context context = getApplicationContext();
if (ThemeUtils.isDefaultTheme(context, theme))
if (Config.UiTheme.isDefault(theme))
return R.style.MwmTheme;
if (ThemeUtils.isNightTheme(context, theme))
if (Config.UiTheme.isNight(theme))
return R.style.MwmTheme_Night;
throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme);
@@ -62,7 +58,7 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity
protected final void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
mThemeName = Config.getCurrentUiTheme(getApplicationContext());
mThemeName = Config.UiTheme.getCurrent();
setTheme(getThemeResourceId(mThemeName));
EdgeToEdge.enable(this, SystemBarStyle.dark(Color.TRANSPARENT));
RtlUtils.manageRtl(this);
@@ -122,7 +118,7 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity
public void onPostResume()
{
super.onPostResume();
if (!mThemeName.equals(Config.getCurrentUiTheme(getApplicationContext())))
if (!mThemeName.equals(Config.UiTheme.getCurrent()))
{
// Workaround described in https://code.google.com/p/android/issues/detail?id=93731
UiThread.runLater(this::recreate);

View File

@@ -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.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.util.WindowInsetUtils.ScrollableContentInsetsListener;
import app.organicmaps.widget.PlaceholderView;

View File

@@ -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.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
import com.google.android.material.appbar.MaterialToolbar;

View File

@@ -42,7 +42,7 @@ public class BookmarkCategoriesActivity extends BaseToolbarActivity
@StyleRes
public int getThemeResourceId(@NonNull String theme)
{
return ThemeUtils.getWindowBgThemeResourceId(getApplicationContext(), theme);
return ThemeUtils.getWindowBgThemeResourceId(theme);
}
@Override

View File

@@ -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.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;

View File

@@ -41,7 +41,7 @@ public class BookmarkListActivity extends BaseToolbarActivity
@StyleRes
public int getThemeResourceId(@NonNull String theme)
{
return ThemeUtils.getCardBgThemeResourceId(getApplicationContext(), theme);
return ThemeUtils.getCardBgThemeResourceId(theme);
}
@Override

View File

@@ -33,16 +33,15 @@ 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;

View File

@@ -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.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
public class ChooseBookmarksSortingTypeFragment
extends BaseMwmDialogFragment implements RadioGroup.OnCheckedChangeListener

View File

@@ -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;

View File

@@ -12,6 +12,7 @@ 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;
@@ -169,7 +170,7 @@ class DownloaderScreen extends BaseScreen
mIsDownloadFailed = true;
final ErrorScreen.Builder builder = new ErrorScreen.Builder(getCarContext())
.setTitle(R.string.country_status_download_failed)
.setErrorMessage(MapManager.getErrorCodeStrRes(data.errorCode))
.setErrorMessage(MapManagerHelper.getErrorCodeStrRes(data.errorCode))
.setPositiveButton(R.string.downloader_retry, null);
if (!mIsCancelActionDisabled)
builder.setNegativeButton(R.string.cancel, this::finish);

View File

@@ -10,19 +10,20 @@ 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, R.string.theme_auto),
LIGHT(R.string.off, R.string.theme_default),
NIGHT(R.string.on, R.string.theme_night);
AUTO(R.string.auto, Config.UiTheme.AUTO),
LIGHT(R.string.off, Config.UiTheme.DEFAULT),
NIGHT(R.string.on, Config.UiTheme.NIGHT);
ThemeMode(@StringRes int titleId, @StringRes int prefsKeyId)
ThemeMode(@StringRes int titleId, @NonNull String config)
{
mTitleId = titleId;
mPrefsKeyId = prefsKeyId;
mConfig = config;
}
@StringRes
@@ -31,16 +32,16 @@ public final class ThemeUtils
return mTitleId;
}
@StringRes
public int getPrefsKeyId()
@NonNull
public String getConfig()
{
return mPrefsKeyId;
return mConfig;
}
@StringRes
private final int mTitleId;
@StringRes
private final int mPrefsKeyId;
@NonNull
private final String mConfig;
}
private static final String ANDROID_AUTO_PREFERENCES_FILE_KEY = "ANDROID_AUTO_PREFERENCES_FILE_KEY";
@@ -79,23 +80,20 @@ public final class ThemeUtils
@UiThread
public static void setThemeMode(@NonNull CarContext context, @NonNull ThemeMode themeMode)
{
getSharedPreferences(context).edit().putString(THEME_KEY, context.getString(themeMode.getPrefsKeyId())).commit();
getSharedPreferences(context).edit().putString(THEME_KEY, themeMode.getConfig()).commit();
update(context, themeMode);
}
@NonNull
public static ThemeMode getThemeMode(@NonNull CarContext context)
{
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);
final String themeMode = getSharedPreferences(context).getString(THEME_KEY, ThemeMode.AUTO.getConfig());
if (themeMode.equals(autoTheme))
if (themeMode.equals(ThemeMode.AUTO.getConfig()))
return ThemeMode.AUTO;
else if (themeMode.equals(lightTheme))
else if (themeMode.equals(ThemeMode.LIGHT.getConfig()))
return ThemeMode.LIGHT;
else if (themeMode.equals(nightTheme))
else if (themeMode.equals(ThemeMode.NIGHT.getConfig()))
return ThemeMode.NIGHT;
else
throw new IllegalArgumentException("Unsupported value");

View File

@@ -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.sdk.util.UiUtils;
import app.organicmaps.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)
{
MapManager.warn3gAndDownload(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
MapManagerHelper.warn3gAndDownload(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
}
};
@@ -38,7 +38,10 @@ class BottomPanel
public void onClick(View v)
{
final String country = mFragment.getCurrentRoot();
MapManager.warnOn3gUpdate(mFragment.requireActivity(), country, () -> MapManager.startUpdate(country));
MapManagerHelper.warnOn3gUpdate(mFragment.requireActivity(), country, () -> {
DownloaderService.startForegroundService();
MapManagerHelper.startUpdate(country);
});
}
};
@@ -55,7 +58,7 @@ class BottomPanel
@Override
public void onClick(View v)
{
MapManager.warn3gAndRetry(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
MapManagerHelper.warn3gAndRetry(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
}
};

View File

@@ -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.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.widget.WheelProgressView;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.textview.MaterialTextView;
@@ -198,7 +198,8 @@ public class CountrySuggestFragment extends BaseMwmFragment implements View.OnCl
final int id = v.getId();
if (id == R.id.btn__download_map)
{
MapManager.warn3gAndDownload(requireActivity(), mCurrentCountry.id, () -> mDownloadingCountry = mCurrentCountry);
MapManagerHelper.warn3gAndDownload(requireActivity(), mCurrentCountry.id,
() -> mDownloadingCountry = mCurrentCountry);
}
else if (id == R.id.btn__select_map)
{

View File

@@ -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.sdk.util.UiUtils;
import app.organicmaps.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)
{
MapManager.warn3gAndDownload(adapter.mActivity, item.id, null);
MapManagerHelper.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;
MapManager.warnOn3gUpdate(adapter.mActivity, item.id, () -> MapManager.startUpdate(item.id));
MapManagerHelper.warnOn3gUpdate(adapter.mActivity, item.id, () -> MapManagerHelper.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)
{
MapManager.showError(mActivity, item, null);
MapManagerHelper.showError(mActivity, item, null);
break;
}
}
@@ -382,9 +382,12 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
else
processLongClick();
}
case CountryItem.STATUS_FAILED -> MapManager.warn3gAndRetry(mActivity, mItem.id, null);
case CountryItem.STATUS_FAILED ->
{
MapManagerHelper.warn3gAndRetry(mActivity, mItem.id, null);
}
case CountryItem.STATUS_UPDATABLE ->
MapManager.warnOn3gUpdate(mActivity, mItem.id, () -> MapManager.startUpdate(mItem.id));
MapManagerHelper.warnOn3gUpdate(mActivity, mItem.id, () -> MapManagerHelper.startUpdate(mItem.id));
default -> throw new IllegalArgumentException("Inappropriate item status: " + mItem.status);
}
}

View File

@@ -9,7 +9,8 @@ import androidx.core.view.OnApplyWindowInsetsListener;
import androidx.core.view.WindowInsetsCompat;
import androidx.recyclerview.widget.RecyclerView;
import app.organicmaps.R;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.sdk.util.Utils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.WindowInsetUtils;
final class DownloaderInsetsListener implements OnApplyWindowInsetsListener
@@ -55,7 +56,7 @@ final class DownloaderInsetsListener implements OnApplyWindowInsetsListener
private void applyInsetsToButtons(Insets insets)
{
int baseMargin = UiUtils.dimen(mContext, R.dimen.margin_base);
int baseMargin = Utils.dimen(mContext, R.dimen.margin_base);
ViewGroup.MarginLayoutParams fabParams = (ViewGroup.MarginLayoutParams) mFab.getLayoutParams();
ViewGroup.MarginLayoutParams buttonParams = (ViewGroup.MarginLayoutParams) mButton.getLayoutParams();

View File

@@ -20,6 +20,7 @@ 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
{
@@ -29,7 +30,8 @@ public class DownloaderNotifier
public static final int NOTIFICATION_ID = 1;
private final Context mContext;
private NotificationCompat.Builder mProgressNotificationBuilder;
private NotificationCompat.Builder mProgressNotificationBuilder = null;
private String mNotificationCountryId = null;
public DownloaderNotifier(Context context)
{
@@ -45,6 +47,7 @@ public class DownloaderNotifier
.setShowBadge(true)
.setVibrationEnabled(false)
.setLightsEnabled(false)
.setSound(null, null)
.build();
notificationManager.createNotificationChannel(channel);
}
@@ -62,8 +65,6 @@ 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)
@@ -74,7 +75,7 @@ public class DownloaderNotifier
.setContentText(content)
.setShowWhen(true)
.setTicker(getTicker(mContext, title, content))
.setContentIntent(contentPendingIntent)
.setContentIntent(getNotificationPendingIntent(countryId))
.setOnlyAlertOnce(true)
.build();
@@ -110,32 +111,41 @@ public class DownloaderNotifier
@NonNull
public Notification buildProgressNotification(@Nullable String countryId, int maxProgress, int progress)
{
var builder = startNotification(countryId);
builder.setProgress(maxProgress, progress, maxProgress == 0);
builder.setContentText("Download in progress");
var builder = getNotificationBuilder(countryId);
/// @todo Doesn't work properly .. Bad input sizes?
// builder.setProgress(maxProgress, progress, maxProgress == 0);
builder.setProgress(maxProgress, progress, true);
return builder.build();
}
@NonNull
private NotificationCompat.Builder startNotification(@Nullable String countryId)
private NotificationCompat.Builder getNotificationBuilder(@Nullable String countryId)
{
final String title = mContext.getString(R.string.app_name);
if (mProgressNotificationBuilder == null || !Objects.equals(countryId, mNotificationCountryId))
{
mNotificationCountryId = countryId;
final String countryName = countryId != null ? MapManager.nativeGetName(countryId) : "";
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));
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;
}
@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);

View File

@@ -97,7 +97,7 @@ public class DownloaderService extends Service implements MapManager.StorageCall
}
@Override
public void onProgress(String countryId, long localSize, long remoteSize)
public void onProgress(String countryId, long bytesDownloaded, long bytesTotal)
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
&& ContextCompat.checkSelfPermission(this, POST_NOTIFICATIONS) != PERMISSION_GRANTED)
@@ -106,8 +106,7 @@ public class DownloaderService extends Service implements MapManager.StorageCall
return;
}
// TODO: How to calculate progress?
mNotifier.notifyProgress();
mNotifier.notifyProgress(countryId, (int) bytesTotal, (int) bytesDownloaded);
}
@Override

View File

@@ -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;

View File

@@ -5,7 +5,7 @@ import android.content.Intent;
import android.text.TextUtils;
import android.view.View;
import app.organicmaps.R;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.widget.SearchToolbarController;
class DownloaderToolbarController extends SearchToolbarController

View File

@@ -0,0 +1,223 @@
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);
}
}

View File

@@ -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.sdk.util.UiUtils;
import app.organicmaps.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)
MapManager.showError(mActivity, item, null);
MapManagerHelper.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))
{
MapManager.startDownload(mCurrentCountry.id);
MapManagerHelper.startDownload(mCurrentCountry.id);
}
}
}
@@ -199,18 +199,18 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
setAutodownloadLocked(true);
});
mButton.setOnClickListener(
v -> MapManager.warnOn3g(mActivity, mCurrentCountry == null ? null : mCurrentCountry.id, () -> {
v -> MapManagerHelper.warnOn3g(mActivity, mCurrentCountry == null ? null : mCurrentCountry.id, () -> {
if (mCurrentCountry == null)
return;
boolean retry = (mCurrentCountry.status == CountryItem.STATUS_FAILED);
if (retry)
{
MapManager.retryDownload(mCurrentCountry.id);
MapManagerHelper.retryDownload(mCurrentCountry.id);
}
else
{
MapManager.startDownload(mCurrentCountry.id);
MapManagerHelper.startDownload(mCurrentCountry.id);
mActivity.requestPostNotificationsPermission();
}
}));

View File

@@ -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;

View File

@@ -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,7 +287,8 @@ 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())
{

View File

@@ -1,6 +1,5 @@
package app.organicmaps.editor;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
@@ -25,7 +24,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.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
import app.organicmaps.widget.SearchToolbarController;

View File

@@ -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.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textview.MaterialTextView;

View File

@@ -79,8 +79,8 @@ public class HoursMinutesPickerFragment extends BaseMwmDialogFragment
mTabs.getTabAt(mSelectedTab).select();
@StyleRes
final int theme = ThemeUtils.isNightTheme(requireContext()) ? R.style.MwmMain_DialogFragment_TimePicker_Night
: R.style.MwmMain_DialogFragment_TimePicker;
final int theme = ThemeUtils.isNightTheme() ? 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(requireContext()) ? R.color.accent_color_selector_night
: R.color.accent_color_selector);
requireContext(),
ThemeUtils.isNightTheme() ? 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);

View File

@@ -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.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;

View File

@@ -15,10 +15,11 @@ 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.UiUtils;
import app.organicmaps.sdk.util.DateUtils;
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;

View File

@@ -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.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;

View File

@@ -11,14 +11,17 @@ 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.UiUtils;
import app.organicmaps.sdk.util.NetworkPolicy;
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;
@@ -26,6 +29,24 @@ 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;
@@ -84,7 +105,7 @@ public class ProfileFragment extends BaseMwmToolbarFragment
UiUtils.show(mProfileInfoLoading);
UiUtils.hide(mUserInfoBlock);
}
final int profileEditCount = OsmOAuth.getOsmChangesetsCount(getParentFragmentManager());
final int profileEditCount = OsmOAuth.getOsmChangesetsCount(mDialogPresenter, getParentFragmentManager());
final String profileUsername = OsmOAuth.getUsername();
final Bitmap profilePicture = OsmOAuth.getProfilePicture();

View File

@@ -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.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.WindowInsetUtils.ScrollableContentInsetsListener;
import com.google.android.material.textfield.TextInputEditText;

View File

@@ -18,7 +18,8 @@ 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.UiUtils;
import app.organicmaps.sdk.util.Utils;
import app.organicmaps.util.UiUtils;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.checkbox.MaterialCheckBox;
import com.google.android.material.textview.MaterialTextView;
@@ -224,7 +225,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,
UiUtils.dimen(closedHost.getContext(), R.dimen.editor_height_closed)));
Utils.dimen(closedHost.getContext(), R.dimen.editor_height_closed)));
closedHours[i] = span;
final int finalI = i;
span.findViewById(R.id.iv__remove_closed)

View File

@@ -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.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import com.google.android.material.radiobutton.MaterialRadioButton;
import com.google.android.material.textview.MaterialTextView;

View File

@@ -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.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.textview.MaterialTextView;

View File

@@ -7,15 +7,12 @@ import android.text.util.Linkify;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.activity.result.ActivityResultLauncher;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.ViewCompat;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.BuildConfig;
import app.organicmaps.R;
import app.organicmaps.base.BaseMwmFragment;
@@ -27,6 +24,8 @@ 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
{
@@ -35,15 +34,7 @@ public class HelpFragment extends BaseMwmFragment implements View.OnClickListene
private void setupItem(@IdRes int id, boolean tint, @NonNull View frame)
{
final MaterialTextView view = frame.findViewById(id);
view.setOnClickListener(this);
if (tint)
Graphics.tint(view);
}
private void setupButton(@IdRes int id, boolean tint, @NonNull View frame)
{
final MaterialButton view = frame.findViewById(id);
final TextView view = frame.findViewById(id);
view.setOnClickListener(this);
if (tint)
Graphics.tint(view);
@@ -52,7 +43,7 @@ public class HelpFragment extends BaseMwmFragment implements View.OnClickListene
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
mDonateUrl = Config.getDonateUrl(requireContext());
mDonateUrl = Utils.getDonateUrl(requireContext());
View root = inflater.inflate(R.layout.about, container, false);
((MaterialTextView) root.findViewById(R.id.version)).setText(BuildConfig.VERSION_NAME);
@@ -79,7 +70,7 @@ public class HelpFragment extends BaseMwmFragment implements View.OnClickListene
setupItem(R.id.mastodon, false, root);
setupItem(R.id.openstreetmap, true, root);
setupItem(R.id.faq, true, root);
setupButton(R.id.report, isLandscape, root);
setupItem(R.id.report, isLandscape, root);
setupItem(R.id.copyright, false, root);
final MaterialTextView supportUsView = root.findViewById(R.id.support_us);
@@ -95,7 +86,7 @@ public class HelpFragment extends BaseMwmFragment implements View.OnClickListene
{
/*donateView.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_donate, 0,
R.drawable.ic_donate, 0);*/
setupButton(R.id.donate, isLandscape, root);
setupItem(R.id.donate, isLandscape, root);
}
if (BuildConfig.REVIEW_URL.isEmpty())

View File

@@ -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.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import java.util.List;
public class LayersAdapter extends RecyclerView.Adapter<LayerHolder>

View File

@@ -36,8 +36,9 @@ 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;
@@ -214,7 +215,7 @@ public class MapButtonsController extends Fragment
// helpButton.setImageResource(R.drawable.ic_launcher);
// }
// // Keep this button colorful in normal theme.
// if (!ThemeUtils.isNightTheme(requireContext()))
// if (!ThemeUtils.isNightTheme())
// helpButton.getDrawable().setTintList(null);
}
else if (leftButtonView != null)

View File

@@ -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
{

View File

@@ -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,22 +43,20 @@ public class TrafficButton
void turnOff()
{
stopWaitingAnimation();
mButton.setImageResource(ThemeUtils.isNightTheme(mButton.getContext()) ? R.drawable.ic_traffic_on_night
: R.drawable.ic_traffic_on);
mButton.setImageResource(ThemeUtils.isNightTheme() ? R.drawable.ic_traffic_on_night : R.drawable.ic_traffic_on);
}
void turnOn()
{
stopWaitingAnimation();
mButton.setImageResource(ThemeUtils.isNightTheme(mButton.getContext()) ? R.drawable.ic_traffic_on_night
: R.drawable.ic_traffic_on);
mButton.setImageResource(ThemeUtils.isNightTheme() ? R.drawable.ic_traffic_on_night : R.drawable.ic_traffic_on);
}
void markAsOutdated()
{
stopWaitingAnimation();
mButton.setImageResource(ThemeUtils.isNightTheme(mButton.getContext()) ? R.drawable.ic_traffic_outdated_night
: R.drawable.ic_traffic_outdated);
mButton.setImageResource(ThemeUtils.isNightTheme() ? R.drawable.ic_traffic_outdated_night
: R.drawable.ic_traffic_outdated);
}
void startWaitingAnimation()

View File

@@ -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.UiUtils;
import app.organicmaps.sdk.util.Utils;
import app.organicmaps.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 = UiUtils.dimen(requireContext(), R.dimen.margin_quadruple);
final int indicatorWidth = Utils.dimen(requireContext(), R.dimen.margin_quadruple);
listView.setIndicatorBounds(width - indicatorWidth, width);
listView.setIndicatorBoundsRelative(width - indicatorWidth, width);
});

View File

@@ -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.sdk.util.UiUtils;
import app.organicmaps.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(R.string.core_my_position);
title = mContext.getString(app.organicmaps.sdk.R.string.core_my_position);
if (mRoutePoints.get(position).mPointType != RouteMarkType.Start)
subtitle = mRoutePoints.get(position).mTitle;

View File

@@ -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.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;

View File

@@ -1,5 +1,7 @@
package app.organicmaps.routing;
import static app.organicmaps.sdk.util.Utils.dimen;
import android.location.Location;
import android.text.TextUtils;
import android.view.View;
@@ -21,7 +23,7 @@ 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.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.util.WindowInsetUtils;
import app.organicmaps.widget.LanesView;
@@ -166,7 +168,7 @@ public class NavigationController implements TrafficManager.TrafficCallback, Nav
UiUtils.visibleIf(hasStreet, mStreetFrame);
if (!TextUtils.isEmpty(info.nextStreet))
mNextStreet.setText(info.nextStreet);
int margin = UiUtils.dimen(mFrame.getContext(), R.dimen.nav_frame_padding);
int margin = dimen(mFrame.getContext(), R.dimen.nav_frame_padding);
if (hasStreet)
margin += mStreetFrame.getHeight();
mMapButtonsViewModel.setTopButtonsMarginTop(margin);

View File

@@ -1,5 +1,7 @@
package app.organicmaps.routing;
import static app.organicmaps.sdk.util.Utils.dimen;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
@@ -37,9 +39,9 @@ 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;
@@ -345,16 +347,17 @@ final class RoutingBottomMenuController implements View.OnClickListener
UiUtils.hide(mTimeVehicle);
int chartWidth = UiUtils.dimen(mContext, R.dimen.altitude_chart_image_width);
int chartHeight = UiUtils.dimen(mContext, R.dimen.altitude_chart_image_height);
int chartWidth = dimen(mContext, R.dimen.altitude_chart_image_width);
int chartHeight = 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(R.string.m)
: mAltitudeDifference.getResources().getString(R.string.ft);
final String unit = limits.isMetricUnits
? mAltitudeDifference.getResources().getString(app.organicmaps.sdk.R.string.m)
: mAltitudeDifference.getResources().getString(app.organicmaps.sdk.R.string.ft);
mAltitudeDifference.setText("" + limits.totalAscentString + " " + unit + "" + limits.totalDescentString + " "
+ unit);
UiUtils.show(mAltitudeDifference);

View File

@@ -14,9 +14,10 @@ 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.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import com.google.android.material.textview.MaterialTextView;
public class RoutingErrorDialogFragment extends BaseRoutingErrorDialogFragment
@@ -108,7 +109,7 @@ public class RoutingErrorDialogFragment extends BaseRoutingErrorDialogFragment
}
}
MapManager.warnOn3g(requireActivity(), size, () -> {
MapManagerHelper.warnOn3g(requireActivity(), size, () -> {
final FragmentManager manager = requireActivity().getSupportFragmentManager();
RoutingMapsDownloadFragment downloader =
RoutingMapsDownloadFragment.create(manager.getFragmentFactory(), getAppContextOrThrow(), mMapsArray);

View File

@@ -9,10 +9,11 @@ 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.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.widget.WheelProgressView;
import java.util.HashSet;
import java.util.List;
@@ -40,7 +41,7 @@ public class RoutingMapsDownloadFragment extends BaseRoutingErrorDialogFragment
mMapsArray[i] = item.id;
}
MapManager.startDownload(mMapsArray);
MapManagerHelper.startDownload(mMapsArray);
}
private View setupFrame(View frame)

View File

@@ -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,7 +141,8 @@ 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, R.drawable.ic_route_planning_metro_40px, this::onTransitModeSelected);
setupRouterButton(R.id.transit, app.organicmaps.sdk.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);
}

View File

@@ -9,7 +9,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import app.organicmaps.MwmActivity;
import app.organicmaps.R;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
public class RoutingPlanInplaceController extends RoutingPlanController
{

View File

@@ -90,7 +90,7 @@ public class TransitStepView extends View implements MultilineLayoutManager.Sque
{
mDrawable = null;
mText = info.getDistance() + " " + info.getDistanceUnits();
mTextPaint.setColor(ThemeUtils.isDefaultTheme(getContext()) ? Color.BLACK : Color.WHITE);
mTextPaint.setColor(ThemeUtils.isDefaultTheme() ? Color.BLACK : Color.WHITE);
}
else
{

View File

@@ -1,55 +0,0 @@
package app.organicmaps.sdk.bookmarks.data;
import androidx.annotation.Keep;
import app.organicmaps.sdk.util.Distance;
// Called from JNI.
@Keep
@SuppressWarnings("unused")
public class Track
{
private final long mTrackId;
private final long mCategoryId;
private final String mName;
private final Distance mLength;
private final int mColor;
Track(long trackId, long categoryId, String name, Distance length, int color)
{
mTrackId = trackId;
mCategoryId = categoryId;
mName = name;
mLength = length;
mColor = color;
}
public String getName()
{
return mName;
}
public Distance getLength()
{
return mLength;
}
public int getColor()
{
return mColor;
}
public long getTrackId()
{
return mTrackId;
}
public long getCategoryId()
{
return mCategoryId;
}
public String getTrackDescription()
{
return BookmarkManager.INSTANCE.getTrackDescription(mTrackId);
}
}

View File

@@ -1,26 +0,0 @@
package app.organicmaps.sdk.util;
import android.content.Context;
import androidx.annotation.Keep;
import androidx.annotation.NonNull;
import java.text.DateFormat;
import java.util.Locale;
public final class DateUtils
{
private DateUtils() {}
@NonNull
public static DateFormat getShortDateFormatter()
{
return DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault());
}
// Called from JNI.
@Keep
@SuppressWarnings("unused")
public static boolean is24HourFormat(@NonNull Context context)
{
return android.text.format.DateFormat.is24HourFormat(context);
}
}

View File

@@ -89,7 +89,7 @@ class CategoriesAdapter extends RecyclerView.Adapter<CategoriesAdapter.ViewHolde
@DrawableRes
private static int getDrawableResIdByKey(@NonNull Context context, @NonNull String packageName, @NonNull String key)
{
final boolean isNightTheme = ThemeUtils.isNightTheme(context);
final boolean isNightTheme = ThemeUtils.isNightTheme();
String iconId = "ic_" + key;
if (isNightTheme)
iconId = iconId + "_night";

View File

@@ -5,7 +5,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.ViewCompat;
import app.organicmaps.sdk.search.SearchEngine;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
import app.organicmaps.widget.SearchToolbarController;

View File

@@ -37,7 +37,7 @@ public class SearchActivity extends BaseMwmFragmentActivity
@StyleRes
public int getThemeResourceId(@NonNull String theme)
{
return ThemeUtils.getCardBgThemeResourceId(getApplicationContext(), theme);
return ThemeUtils.getCardBgThemeResourceId(theme);
}
@Override

View File

@@ -13,9 +13,9 @@ import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
import app.organicmaps.R;
import app.organicmaps.sdk.search.SearchResult;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.Graphics;
import app.organicmaps.util.ThemeUtils;
import app.organicmaps.util.UiUtils;
class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.SearchDataViewHolder>
{

View File

@@ -39,7 +39,7 @@ import app.organicmaps.sdk.search.SearchResult;
import app.organicmaps.sdk.util.Config;
import app.organicmaps.sdk.util.Language;
import app.organicmaps.sdk.util.SharedPropertiesUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.util.WindowInsetUtils;
import app.organicmaps.widget.PlaceholderView;

View File

@@ -11,7 +11,7 @@ import app.organicmaps.MwmApplication;
import app.organicmaps.R;
import app.organicmaps.base.BaseMwmRecyclerFragment;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.widget.PlaceholderView;
import app.organicmaps.widget.SearchToolbarController;

View File

@@ -47,7 +47,7 @@ abstract class BaseXmlSettingsFragment extends PreferenceFragmentCompat
super.onViewCreated(view, savedInstanceState);
int color;
if (ThemeUtils.isDefaultTheme(requireContext()))
if (ThemeUtils.isDefaultTheme())
color = ContextCompat.getColor(requireContext(), R.color.bg_cards);
else
color = ContextCompat.getColor(requireContext(), R.color.bg_cards_night);

View File

@@ -3,13 +3,11 @@ package app.organicmaps.settings;
import static app.organicmaps.leftbutton.LeftButtonsHolder.DISABLE_BUTTON_CODE;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
@@ -26,7 +24,6 @@ import app.organicmaps.sdk.downloader.MapManager;
import app.organicmaps.sdk.editor.OsmOAuth;
import app.organicmaps.sdk.editor.data.Language;
import app.organicmaps.sdk.location.LocationHelper;
import app.organicmaps.sdk.location.LocationProviderFactory;
import app.organicmaps.sdk.routing.RoutingOptions;
import app.organicmaps.sdk.search.SearchRecents;
import app.organicmaps.sdk.settings.MapLanguageCode;
@@ -309,7 +306,9 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
if (pref == null)
return;
if (!LocationProviderFactory.isGoogleLocationAvailable(requireActivity().getApplicationContext()))
if (!MwmApplication.from(requireContext())
.getLocationProviderFactory()
.isGoogleLocationAvailable(requireActivity().getApplicationContext()))
removePreference(getString(R.string.pref_privacy), pref);
else
{
@@ -441,19 +440,19 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
private void initMapStylePrefsCallbacks()
{
final ListPreference pref = getPreference(getString(R.string.pref_map_style));
String curTheme = Config.getUiThemeSettings(requireContext());
pref.setValue(curTheme);
pref.setEntryValues(new CharSequence[] {Config.UiTheme.DEFAULT, Config.UiTheme.NIGHT, Config.UiTheme.AUTO,
Config.UiTheme.NAV_AUTO});
pref.setValue(Config.UiTheme.getUiThemeSettings());
pref.setSummary(pref.getEntry());
pref.setOnPreferenceChangeListener((preference, newValue) -> {
final String themeName = (String) newValue;
if (!Config.setUiThemeSettings(requireContext(), themeName))
if (!Config.UiTheme.setUiThemeSettings(themeName))
return true;
ThemeSwitcher.INSTANCE.restart(false);
ThemeMode mode = ThemeMode.getInstance(requireContext().getApplicationContext(), themeName);
CharSequence summary = pref.getEntries()[mode.ordinal()];
final ThemeMode mode = ThemeMode.getInstance(themeName);
final CharSequence summary = pref.getEntries()[mode.ordinal()];
pref.setSummary(summary);
return true;
});
@@ -552,24 +551,25 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
enum ThemeMode
{
DEFAULT(R.string.theme_default),
NIGHT(R.string.theme_night),
AUTO(R.string.theme_auto),
NAV_AUTO(R.string.theme_nav_auto);
DEFAULT(Config.UiTheme.DEFAULT),
NIGHT(Config.UiTheme.NIGHT),
AUTO(Config.UiTheme.AUTO),
NAV_AUTO(Config.UiTheme.NAV_AUTO);
private final int mModeStringId;
@NonNull
private final String mMode;
ThemeMode(@StringRes int modeStringId)
ThemeMode(@NonNull String mode)
{
mModeStringId = modeStringId;
mMode = mode;
}
@NonNull
public static ThemeMode getInstance(@NonNull Context context, @NonNull String src)
public static ThemeMode getInstance(@NonNull String src)
{
for (ThemeMode each : values())
{
if (context.getResources().getString(each.mModeStringId).equals(src))
if (each.mMode.equals(src))
return each;
}
return AUTO;

View File

@@ -13,7 +13,7 @@ import android.widget.CheckedTextView;
import app.organicmaps.R;
import app.organicmaps.sdk.settings.StorageItem;
import app.organicmaps.sdk.settings.StoragePathManager;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.sdk.util.Utils;
import app.organicmaps.util.ThemeUtils;
class StoragePathAdapter extends BaseAdapter
@@ -65,14 +65,14 @@ class StoragePathAdapter extends BaseAdapter
SpannableStringBuilder sb = new SpannableStringBuilder(item.mLabel + "\n" + size);
sb.setSpan(new ForegroundColorSpan(ThemeUtils.getColor(mActivity, android.R.attr.textColorSecondary)),
sb.length() - size.length(), sb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
sb.setSpan(new AbsoluteSizeSpan(UiUtils.dimen(mActivity, R.dimen.text_size_body_3)), sb.length() - size.length(),
sb.setSpan(new AbsoluteSizeSpan(Utils.dimen(mActivity, R.dimen.text_size_body_3)), sb.length() - size.length(),
sb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
final String path = item.mPath + (item.mIsReadonly ? " (read-only)" : "");
sb.append("\n").append(path);
sb.setSpan(new ForegroundColorSpan(ThemeUtils.getColor(mActivity, android.R.attr.textColorSecondary)),
sb.length() - path.length(), sb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
sb.setSpan(new AbsoluteSizeSpan(UiUtils.dimen(mActivity, R.dimen.text_size_body_4)), sb.length() - path.length(),
sb.setSpan(new AbsoluteSizeSpan(Utils.dimen(mActivity, R.dimen.text_size_body_4)), sb.length() - path.length(),
sb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
checkedView.setText(sb);

View File

@@ -26,7 +26,7 @@ import app.organicmaps.sdk.settings.SpeedCameraMode;
import app.organicmaps.sdk.sound.LanguageData;
import app.organicmaps.sdk.sound.TtsPlayer;
import app.organicmaps.sdk.util.Config;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import java.util.Arrays;
import java.util.Collections;

View File

@@ -22,7 +22,6 @@ import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.bookmarks.data.BookmarkInfo;
import app.organicmaps.sdk.bookmarks.data.MapObject;
import app.organicmaps.sdk.util.StorageUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.sdk.util.log.Logger;
import java.io.IOException;
import java.util.ArrayList;

View File

@@ -8,7 +8,6 @@ import android.os.Build;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatDelegate;
import app.organicmaps.MwmApplication;
import app.organicmaps.R;
import app.organicmaps.downloader.DownloaderStatusIcon;
import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.MapStyle;
@@ -28,17 +27,23 @@ public enum ThemeSwitcher
@Override
public void run()
{
boolean isNavAuto = RoutingController.get().isNavigating() && ThemeUtils.isNavAutoTheme(mContext);
boolean navAuto = RoutingController.get().isNavigating() && ThemeUtils.isNavAutoTheme();
// Cancel old checker
UiThread.cancelDelayedTasks(mAutoThemeChecker);
if (isNavAuto || ThemeUtils.isAutoTheme(mContext))
String theme;
if (navAuto || ThemeUtils.isAutoTheme())
{
UiThread.runLater(mAutoThemeChecker, CHECK_INTERVAL_MS);
setThemeAndMapStyle(calcAutoTheme());
theme = calcAutoTheme();
}
else // Only reached when an auto mode should be light
setThemeAndMapStyle(mContext.getResources().getString(R.string.theme_default));
else
{
// Happens when exiting the Navigation mode. Should restore the light.
theme = Config.UiTheme.DEFAULT;
}
setThemeAndMapStyle(theme);
}
};
@@ -64,8 +69,8 @@ public enum ThemeSwitcher
public void restart(boolean isRendererActive)
{
mRendererActive = isRendererActive;
String theme = Config.getUiThemeSettings(mContext);
if (ThemeUtils.isAutoTheme(mContext, theme) || ThemeUtils.isNavAutoTheme(mContext, theme))
String theme = Config.UiTheme.getUiThemeSettings();
if (ThemeUtils.isAutoTheme() || ThemeUtils.isNavAutoTheme())
{
mAutoThemeChecker.run();
return;
@@ -78,10 +83,10 @@ public enum ThemeSwitcher
private void setThemeAndMapStyle(@NonNull String theme)
{
UiModeManager uiModeManager = (UiModeManager) mContext.getSystemService(Context.UI_MODE_SERVICE);
String oldTheme = Config.getCurrentUiTheme(mContext);
String oldTheme = Config.UiTheme.getCurrent();
MapStyle style;
if (ThemeUtils.isNightTheme(mContext, theme))
if (ThemeUtils.isNightTheme())
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
uiModeManager.setApplicationNightMode(UiModeManager.MODE_NIGHT_YES);
@@ -112,7 +117,7 @@ public enum ThemeSwitcher
if (!theme.equals(oldTheme))
{
Config.setCurrentUiTheme(mContext, theme);
Config.UiTheme.setCurrent(theme);
DownloaderStatusIcon.clearCache();
final Activity a = MwmApplication.from(mContext).getTopActivity();
@@ -152,9 +157,7 @@ public enum ThemeSwitcher
@NonNull
private String calcAutoTheme()
{
String defaultTheme = mContext.getResources().getString(R.string.theme_default);
String nightTheme = mContext.getResources().getString(R.string.theme_night);
Location last = MwmApplication.from(mContext).getLocationHelper().getSavedLocation();
final Location last = MwmApplication.from(mContext).getLocationHelper().getSavedLocation();
boolean day;
if (last != null)
@@ -168,6 +171,6 @@ public enum ThemeSwitcher
day = (currentHour < 18 && currentHour > 6);
}
return (day ? defaultTheme : nightTheme);
return (day ? Config.UiTheme.DEFAULT : Config.UiTheme.NIGHT);
}
}

View File

@@ -16,7 +16,8 @@ public final class ThemeUtils
private ThemeUtils() {}
public static @ColorInt int getColor(@NonNull Context context, @AttrRes int attr)
@ColorInt
public static int getColor(@NonNull Context context, @AttrRes int attr)
{
if (!context.getTheme().resolveAttribute(attr, VALUE_BUFFER, true))
throw new IllegalArgumentException("Failed to resolve color theme attribute");
@@ -44,76 +45,45 @@ public final class ThemeUtils
return VALUE_BUFFER.resourceId;
}
public static boolean isDefaultTheme(@NonNull Context context)
public static boolean isDefaultTheme()
{
return isDefaultTheme(context, Config.getCurrentUiTheme(context));
return Config.UiTheme.isDefault(Config.UiTheme.getCurrent());
}
public static boolean isDefaultTheme(@NonNull Context context, String theme)
public static boolean isNightTheme()
{
String defaultTheme = context.getString(R.string.theme_default);
return defaultTheme.equals(theme);
return Config.UiTheme.isNight(Config.UiTheme.getCurrent());
}
public static boolean isNightTheme(@NonNull Context context)
public static boolean isAutoTheme()
{
return isNightTheme(context, Config.getCurrentUiTheme(context));
return Config.UiTheme.isAuto(Config.UiTheme.getUiThemeSettings());
}
public static boolean isNightTheme(@NonNull Context context, String theme)
public static boolean isNavAutoTheme()
{
String nightTheme = context.getString(R.string.theme_night);
return nightTheme.equals(theme);
}
public static boolean isAutoTheme(@NonNull Context context)
{
return isAutoTheme(context, Config.getUiThemeSettings(context));
}
public static boolean isAutoTheme(@NonNull Context context, String theme)
{
String autoTheme = context.getString(R.string.theme_auto);
return autoTheme.equals(theme);
}
public static boolean isNavAutoTheme(@NonNull Context context)
{
return isNavAutoTheme(context, Config.getUiThemeSettings(context));
}
public static boolean isNavAutoTheme(@NonNull Context context, String theme)
{
String navAutoTheme = context.getString(R.string.theme_nav_auto);
return navAutoTheme.equals(theme);
}
public static boolean isValidTheme(@NonNull Context context, String theme)
{
String defaultTheme = context.getString(R.string.theme_default);
String nightTheme = context.getString(R.string.theme_night);
return (defaultTheme.equals(theme) || nightTheme.equals(theme));
return Config.UiTheme.isNavAuto(Config.UiTheme.getUiThemeSettings());
}
@StyleRes
public static int getCardBgThemeResourceId(@NonNull Context context, @NonNull String theme)
public static int getCardBgThemeResourceId(@NonNull String theme)
{
if (isDefaultTheme(context, theme))
if (Config.UiTheme.isDefault(theme))
return R.style.MwmTheme_CardBg;
if (isNightTheme(context, theme))
if (Config.UiTheme.isNight(theme))
return R.style.MwmTheme_Night_CardBg;
throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme);
}
@StyleRes
public static int getWindowBgThemeResourceId(@NonNull Context context, @NonNull String theme)
public static int getWindowBgThemeResourceId(@NonNull String theme)
{
if (isDefaultTheme(context, theme))
if (Config.UiTheme.isDefault(theme))
return R.style.MwmTheme_WindowBg;
if (isNightTheme(context, theme))
if (Config.UiTheme.isNight(theme))
return R.style.MwmTheme_Night_WindowBg;
throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme);

View File

@@ -1,4 +1,4 @@
package app.organicmaps.sdk.util;
package app.organicmaps.util;
import android.animation.Animator;
import android.app.Activity;
@@ -16,13 +16,11 @@ import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
import androidx.activity.result.ActivityResultLauncher;
import androidx.annotation.AnyRes;
import androidx.annotation.AttrRes;
import androidx.annotation.ColorInt;
import androidx.annotation.DimenRes;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
@@ -34,8 +32,6 @@ import androidx.core.view.WindowInsetsCompat;
import androidx.core.view.WindowInsetsControllerCompat;
import androidx.recyclerview.widget.RecyclerView;
import app.organicmaps.R;
import app.organicmaps.util.ThemeUtils;
import app.organicmaps.util.WindowInsetUtils;
import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.textfield.TextInputLayout;
import java.util.Objects;
@@ -203,16 +199,6 @@ public final class UiUtils
ThemeUtils.getResource(toolbar.getContext(), androidx.appcompat.R.attr.homeAsUpIndicator));
}
public static boolean isTablet(@NonNull Context context)
{
return context.getResources().getBoolean(R.bool.tabletLayout);
}
public static int dimen(@NonNull Context context, @DimenRes int id)
{
return context.getResources().getDimensionPixelSize(id);
}
// this method returns the total height of the display (in pixels) including notch and other touchable areas
public static int getDisplayTotalHeight(Context context)
{
@@ -221,13 +207,6 @@ public final class UiUtils
windowManager.getDefaultDisplay().getRealMetrics(metrics);
return metrics.heightPixels;
}
public static void updateRedButton(Button button)
{
button.setTextColor(ThemeUtils.getColor(
button.getContext(), button.isEnabled() ? R.attr.redButtonTextColor : R.attr.redButtonTextColorDisabled));
}
public static void setInputError(@NonNull TextInputLayout layout, @StringRes int error)
{
setInputError(layout, error == 0 ? null : layout.getContext().getString(error));

View File

@@ -1,5 +1,6 @@
package app.organicmaps.util;
import static app.organicmaps.sdk.util.Utils.dimen;
import static app.organicmaps.sdk.util.Utils.isIntentSupported;
import android.app.Activity;
@@ -7,7 +8,6 @@ import android.content.ActivityNotFoundException;
import android.content.ClipData;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
@@ -39,10 +39,10 @@ import app.organicmaps.BuildConfig;
import app.organicmaps.MwmActivity;
import app.organicmaps.MwmApplication;
import app.organicmaps.R;
import app.organicmaps.sdk.util.Config;
import app.organicmaps.sdk.util.Constants;
import app.organicmaps.sdk.util.Distance;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.sdk.util.concurrency.UiThread;
import app.organicmaps.sdk.util.log.Logger;
import app.organicmaps.sdk.util.log.LogsManager;
@@ -203,17 +203,33 @@ public class Utils
if (TextUtils.isEmpty(url))
return;
final Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri =
isHttpOrHttpsScheme(url) ? Uri.parse(url) : new Uri.Builder().scheme("http").appendEncodedPath(url).build();
Utils.openUri(context, uri, R.string.browser_not_available);
}
/**
* Attempts to open a URI in another app via the system app chooser.
* @param context the app context
* @param uri the URI to open.
* @param failMessage string id: message to show in a toast when the system can't find an app to open with.
*/
public static void openUri(@NonNull Context context, @NonNull Uri uri, @Nullable Integer failMessage)
{
final Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
try
{
context.startActivity(intent);
}
catch (ActivityNotFoundException e)
{
Toast.makeText(context, context.getString(R.string.browser_not_available), Toast.LENGTH_LONG).show();
if (failMessage != null)
Toast.makeText(context, context.getString(failMessage), Toast.LENGTH_LONG).show();
Logger.e(TAG, "ActivityNotFoundException", e);
}
catch (AndroidRuntimeException e)
@@ -224,28 +240,6 @@ public class Utils
}
}
/**
* Attempts to open a URI in another app via the system app chooser.
* @param context the app context
* @param uri the URI to open.
* @param failMessage string id: message to show in a toast when the system can't find an app to open with.
* @param action (optional) the Intent action to use. If none is provided, defaults to Intent.ACTION_VIEW.
*/
public static void openUri(@NonNull Context context, @NonNull Uri uri, Integer failMessage, @NonNull String... action)
{
final String act = (action != null && action.length > 0 && action[0] != null) ? action[0] : Intent.ACTION_VIEW;
final Intent intent = new Intent(act);
intent.setData(uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// https://developer.android.com/guide/components/intents-common
// check that an app exists to open with, otherwise it'll crash
if (intent.resolveActivity(context.getPackageManager()) != null)
context.startActivity(intent);
else
Toast.makeText(context, failMessage, Toast.LENGTH_SHORT).show();
}
private static boolean isHttpOrHttpsScheme(@NonNull String url)
{
return url.startsWith("http://") || url.startsWith("https://");
@@ -286,9 +280,9 @@ public class Utils
String dimension, String unitText)
{
final SpannableStringBuilder res = new SpannableStringBuilder(dimension).append("\u00A0").append(unitText);
res.setSpan(new AbsoluteSizeSpan(UiUtils.dimen(context, size), false), 0, dimension.length(),
res.setSpan(new AbsoluteSizeSpan(dimen(context, size), false), 0, dimension.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
res.setSpan(new AbsoluteSizeSpan(UiUtils.dimen(context, units), false), dimension.length(), res.length(),
res.setSpan(new AbsoluteSizeSpan(dimen(context, units), false), dimension.length(), res.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return res;
}
@@ -297,9 +291,9 @@ public class Utils
public static Spannable formatDistance(Context context, @NonNull Distance distance)
{
final SpannableStringBuilder res = new SpannableStringBuilder(distance.toString(context));
res.setSpan(new AbsoluteSizeSpan(UiUtils.dimen(context, R.dimen.text_size_nav_number), false), 0,
res.setSpan(new AbsoluteSizeSpan(dimen(context, R.dimen.text_size_nav_number), false), 0,
distance.mDistanceStr.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
res.setSpan(new AbsoluteSizeSpan(UiUtils.dimen(context, R.dimen.text_size_nav_dimension), false),
res.setSpan(new AbsoluteSizeSpan(dimen(context, R.dimen.text_size_nav_dimension), false),
distance.mDistanceStr.length(), res.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return res;
}
@@ -489,4 +483,15 @@ public class Utils
final LocalTime time = LocalTime.now().plusSeconds(seconds);
return StringUtils.formatUsingUsLocale("%d:%02d", time.getHour(), time.getMinute());
}
@NonNull
public static String getDonateUrl(@NonNull Context context)
{
final String url = Config.getDonateUrl();
// Enable donations by default if not Google or Huawei. Replace comaps.app/donate/ with localized page.
if ((url.isEmpty() && !BuildConfig.FLAVOR.equals("google") && !BuildConfig.FLAVOR.equals("huawei"))
|| url.endsWith("comaps.app/donate/"))
return context.getString(R.string.app_site_url) + "donate/";
return url;
}
}

View File

@@ -8,7 +8,7 @@ import androidx.core.graphics.Insets;
import androidx.core.view.OnApplyWindowInsetsListener;
import androidx.core.view.WindowInsetsCompat;
import app.organicmaps.R;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.sdk.util.Utils;
public final class WindowInsetUtils
{
@@ -79,7 +79,7 @@ public final class WindowInsetUtils
if (mFloatingActionButton != null)
{
int spacing = UiUtils.dimen(v.getContext(), R.dimen.margin_base);
int spacing = Utils.dimen(v.getContext(), R.dimen.margin_base);
int buttonMarginBottom = insets.bottom + spacing;
ViewGroup.MarginLayoutParams buttonLayoutParams =

View File

@@ -15,7 +15,7 @@ import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import app.organicmaps.R;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;

View File

@@ -14,7 +14,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import app.organicmaps.R;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
public class PlaceholderView extends LinearLayout
{

View File

@@ -35,10 +35,9 @@ public class RoutingToolbarButton extends AppCompatRadioButton
private void initView()
{
setBackgroundResource(ThemeUtils.isNightTheme(getContext()) ? R.drawable.routing_toolbar_button_night
: R.drawable.routing_toolbar_button);
setButtonTintList(ThemeUtils.isNightTheme(getContext()) ? R.color.routing_toolbar_icon_tint_night
: R.color.routing_toolbar_icon_tint);
final boolean isNightTheme = ThemeUtils.isNightTheme();
setBackgroundResource(isNightTheme ? R.drawable.routing_toolbar_button_night : R.drawable.routing_toolbar_button);
setButtonTintList(isNightTheme ? R.color.routing_toolbar_icon_tint_night : R.color.routing_toolbar_icon_tint);
}
public void progress()

View File

@@ -16,8 +16,8 @@ import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import app.organicmaps.R;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.InputUtils;
import app.organicmaps.util.UiUtils;
import com.google.android.material.textfield.TextInputEditText;
public class SearchToolbarController extends ToolbarController implements View.OnClickListener

View File

@@ -13,6 +13,8 @@ import app.organicmaps.sdk.util.NetworkPolicy;
public class StackedButtonDialogFragment extends DialogFragment
{
private static final String TAG_NETWORK_POLICY = "network_policy";
@Nullable
private NetworkPolicy.NetworkPolicyListener mListener;
@@ -43,7 +45,7 @@ public class StackedButtonDialogFragment extends DialogFragment
{
Config.setUseMobileDataSettings(type);
if (mListener != null)
mListener.onResult(NetworkPolicy.newInstance(canUse));
mListener.onResult(new NetworkPolicy(canUse));
}
@Override
@@ -58,4 +60,29 @@ public class StackedButtonDialogFragment extends DialogFragment
{
mListener = listener;
}
public static void showDialogIfNeeded(@NonNull FragmentManager fragmentManager,
@NonNull NetworkPolicy.NetworkPolicyListener listener,
@NonNull NetworkPolicy policy, boolean isToday)
{
if (isToday)
{
listener.onResult(policy);
return;
}
showDialog(fragmentManager, listener);
}
public static void showDialog(@NonNull FragmentManager fragmentManager,
@NonNull NetworkPolicy.NetworkPolicyListener listener)
{
StackedButtonDialogFragment dialog =
(StackedButtonDialogFragment) fragmentManager.findFragmentByTag(TAG_NETWORK_POLICY);
if (dialog != null)
dialog.dismiss();
dialog = new StackedButtonDialogFragment();
dialog.setListener(listener);
dialog.show(fragmentManager, TAG_NETWORK_POLICY);
}
}

View File

@@ -10,7 +10,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AppCompatDialog;
import app.organicmaps.R;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
public class StackedButtonsDialog extends AppCompatDialog implements View.OnClickListener
{

View File

@@ -10,7 +10,7 @@ import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.ViewCompat;
import app.organicmaps.R;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.util.WindowInsetUtils;
import com.google.android.material.appbar.MaterialToolbar;

View File

@@ -1,7 +1,7 @@
package app.organicmaps.widget.menu;
import android.view.View;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
public class MainMenu
{

View File

@@ -18,8 +18,8 @@ import androidx.core.widget.ImageViewCompat;
import app.organicmaps.R;
import app.organicmaps.sdk.Map;
import app.organicmaps.sdk.location.LocationState;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.ThemeUtils;
import app.organicmaps.util.UiUtils;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
public class MyPositionButton

View File

@@ -3,8 +3,6 @@ package app.organicmaps.widget.menu;
import android.location.Location;
import android.util.Pair;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
@@ -13,10 +11,12 @@ import app.organicmaps.R;
import app.organicmaps.sdk.routing.RoutingInfo;
import app.organicmaps.sdk.sound.TtsPlayer;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.Graphics;
import app.organicmaps.util.ThemeUtils;
import app.organicmaps.util.UiUtils;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.progressindicator.LinearProgressIndicator;
import com.google.android.material.textview.MaterialTextView;
import java.time.LocalTime;
@@ -29,7 +29,7 @@ public class NavMenu
private final View mBottomSheetBackground;
private final View mHeaderFrame;
private final ImageView mTts;
private final ShapeableImageView mTts;
private final View mSpeedViewContainer;
private final MaterialTextView mSpeedValue;
private final MaterialTextView mSpeedUnits;
@@ -105,13 +105,12 @@ public class NavMenu
mRouteProgress = bottomFrame.findViewById(R.id.navigation_progress);
// Bottom frame buttons
ImageView mSettings = bottomFrame.findViewById(R.id.settings);
ShapeableImageView mSettings = bottomFrame.findViewById(R.id.settings);
mSettings.setOnClickListener(v -> onSettingsClicked());
mTts = bottomFrame.findViewById(R.id.tts_volume);
mTts.setOnClickListener(v -> onTtsClicked());
Button stop = bottomFrame.findViewById(R.id.stop);
MaterialButton stop = bottomFrame.findViewById(R.id.stop);
stop.setOnClickListener(v -> onStopClicked());
UiUtils.updateRedButton(stop);
}
private void onStopClicked()
@@ -231,7 +230,9 @@ public class NavMenu
updateTime(info.totalTimeInSeconds);
mDistanceValue.setText(info.distToTarget.mDistanceStr);
mDistanceUnits.setText(info.distToTarget.getUnitsStr(mActivity.getApplicationContext()));
mRouteProgress.setProgressCompat((int) info.completionPercent, true);
// Start progress at 1% according to M3 guidelines
final int completionPercent = (info.completionPercent < 1) ? 1 : (int) info.completionPercent;
mRouteProgress.setProgressCompat(completionPercent, true);
}
public interface NavMenuListener

View File

@@ -1,7 +1,7 @@
package app.organicmaps.widget.placepage;
import androidx.annotation.NonNull;
import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.util.StringUtils;
import com.github.mikephil.charting.charts.BarLineChartBase;
import com.github.mikephil.charting.formatter.DefaultValueFormatter;
@@ -20,6 +20,6 @@ public class AxisValueFormatter extends DefaultValueFormatter
@Override
public String getFormattedValue(float value)
{
return Framework.nativeFormatAltitude(value);
return StringUtils.nativeFormatDistance(value).toString(mChart.getContext());
}
}

View File

@@ -17,7 +17,7 @@ import app.organicmaps.sdk.bookmarks.data.MapObject;
import app.organicmaps.sdk.location.LocationListener;
import app.organicmaps.sdk.location.SensorListener;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.widget.ArrowView;
import com.google.android.material.textview.MaterialTextView;

View File

@@ -26,9 +26,9 @@ import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
import app.organicmaps.sdk.bookmarks.data.Icon;
import app.organicmaps.sdk.bookmarks.data.PredefinedColors;
import app.organicmaps.sdk.bookmarks.data.Track;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.Graphics;
import app.organicmaps.util.InputUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.imageview.ShapeableImageView;
@@ -183,7 +183,8 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
super.onStart();
// Focus name and show keyboard for "Unknown Place" bookmarks
if (mBookmark != null && mBookmark.getName().equals(getString(R.string.core_placepage_unknown_place)))
if (mBookmark != null
&& mBookmark.getName().equals(getString(app.organicmaps.sdk.R.string.core_placepage_unknown_place)))
{
mEtName.requestFocus();
mEtName.selectAll();

View File

@@ -1,7 +1,6 @@
package app.organicmaps.widget.placepage;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
@@ -12,18 +11,19 @@ import app.organicmaps.ChartController;
import app.organicmaps.R;
import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.bookmarks.data.ElevationInfo;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.sdk.widget.placepage.PlacePageData;
import app.organicmaps.sdk.bookmarks.data.Track;
import app.organicmaps.sdk.bookmarks.data.TrackStatistics;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import java.util.Objects;
@SuppressWarnings("unused") // https://github.com/organicmaps/organicmaps/issues/2829
public class ElevationProfileViewRenderer implements PlacePageStateListener
{
// Must be correspond to map/elevation_info.hpp constants.
private static final int MAX_DIFFICULTY_LEVEL = 3;
private static final int UNKNOWN_DIFFICULTY = 0;
@NonNull
private final View[] mDifficultyLevels = new View[MAX_DIFFICULTY_LEVEL];
@SuppressWarnings("NullableProblems")
@NonNull
private NestedScrollView mScrollView;
@@ -45,8 +45,6 @@ public class ElevationProfileViewRenderer implements PlacePageStateListener
@SuppressWarnings("NullableProblems")
@NonNull
private TextView mTime;
@NonNull
private final View[] mDifficultyLevels = new View[MAX_DIFFICULTY_LEVEL];
@SuppressWarnings("NullableProblems")
@NonNull
private ChartController mChartController;
@@ -58,22 +56,24 @@ public class ElevationProfileViewRenderer implements PlacePageStateListener
@SuppressWarnings("NullableProblems")
@NonNull
private View mTimeContainer;
private View mTitleContainer;
public void render(@NonNull PlacePageData data)
public void render(@NonNull Track track)
{
final Context context = mAscent.getContext();
TrackStatistics stats = track.getTrackStatistics();
mElevationInfo = (ElevationInfo) data;
mChartController.setData(mElevationInfo);
mTitle.setText(mElevationInfo.getName());
mElevationInfo = track.getElevationInfo();
mChartController.setData(track);
UiUtils.hide(mTitleContainer);
mTitle.setText(track.getName());
setDifficulty(mElevationInfo.getDifficulty());
mAscent.setText(formatDistance(context, mElevationInfo.getAscent()));
mDescent.setText(formatDistance(context, mElevationInfo.getDescent()));
mMaxAltitude.setText(formatDistance(context, mElevationInfo.getMaxAltitude()));
mMinAltitude.setText(formatDistance(context, mElevationInfo.getMinAltitude()));
UiUtils.hideIf(mElevationInfo.getDuration() == 0, mTimeContainer);
mTime.setText(
Utils.formatRoutingTime(mTitle.getContext(), (int) mElevationInfo.getDuration(), R.dimen.text_size_body_2));
mAscent.setText(formatDistance(context, (int) stats.getAscent()));
mDescent.setText(formatDistance(context, (int) stats.getDescent()));
mMaxAltitude.setText(formatDistance(context, stats.getMaxElevation()));
mMinAltitude.setText(formatDistance(context, stats.getMinElevation()));
UiUtils.hide(mTimeContainer);
mTime.setText(Utils.formatRoutingTime(mAscent.getContext(), (int) stats.getDuration(), R.dimen.text_size_body_2));
}
@NonNull
@@ -89,6 +89,7 @@ public class ElevationProfileViewRenderer implements PlacePageStateListener
mChartController.initialize(view);
mScrollView = (NestedScrollView) view;
mTitle = view.findViewById(R.id.title);
mTitleContainer = view.findViewById(R.id.title_container);
mAscent = view.findViewById(R.id.ascent);
mDescent = view.findViewById(R.id.descent);
mMaxAltitude = view.findViewById(R.id.max_altitude);
@@ -123,21 +124,13 @@ public class ElevationProfileViewRenderer implements PlacePageStateListener
mDifficultyLevels[i].setEnabled(true);
}
public void onSave(@NonNull Bundle outState)
public void onChartElevationActivePointChanged()
{
// outState.putParcelable(PlacePageUtils.EXTRA_PLACE_PAGE_DATA, mElevationInfo);
mChartController.onElevationActivePointChanged();
}
public void onRestore(@NonNull Bundle inState)
public void onChartCurrentPositionChanged()
{
// mElevationInfo = BundleCompat.getParcelable(inState, PlacePageUtils.EXTRA_PLACE_PAGE_DATA,
// ElevationInfo.class); if (mElevationInfo != null)
// render(mElevationInfo);
}
public void onHide()
{
mScrollView.scrollTo(0, 0);
mChartController.onHide();
mChartController.onCurrentPositionChanged();
}
}

View File

@@ -37,9 +37,6 @@ public class FloatingMarkerView extends RelativeLayout implements IMarker
private TextView mAltitudeView;
@SuppressWarnings("NullableProblems")
@NonNull
private TextView mDistanceTextView;
@SuppressWarnings("NullableProblems")
@NonNull
private TextView mDistanceValueView;
@SuppressWarnings("NullableProblems")
@NonNull
@@ -93,7 +90,6 @@ public class FloatingMarkerView extends RelativeLayout implements IMarker
mTextContentContainer = findViewById(R.id.floating_text_container);
mFloatingTriangle = findViewById(R.id.floating_triangle);
mImage = findViewById(R.id.image);
mDistanceTextView = findViewById(R.id.distance_text);
mAltitudeView = findViewById(R.id.altitude);
mDistanceValueView = findViewById(R.id.distance_value);
}
@@ -125,7 +121,7 @@ public class FloatingMarkerView extends RelativeLayout implements IMarker
public void updateOffsets(@NonNull Entry entry, @NonNull Highlight highlight)
{
updateVertical(entry);
final float halfImg = Math.abs(mImage.getWidth()) / 2f;
final float halfImg = mImage.getResources().getDimensionPixelSize(R.dimen.elevation_profile_marker_width) / 2f;
boolean isLeftToRightDirection = isInvertedOrder(highlight);
mOffset = isLeftToRightDirection ? -getWidth() + halfImg : -halfImg;
updateHorizontal(highlight);
@@ -184,7 +180,6 @@ public class FloatingMarkerView extends RelativeLayout implements IMarker
private void updatePointValues(@NonNull Entry entry)
{
mDistanceTextView.setText(R.string.elevation_profile_distance);
mDistanceValueView.setText(
StringUtils.nativeFormatDistance(entry.getX()).toString(mDistanceValueView.getContext()));
mAltitudeView.setText(Framework.nativeFormatAltitude(entry.getY()));

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