Compare commits

...

80 Commits

Author SHA1 Message Date
Konstantin Pastbin
aea784ddd7 [ios] Format all Obj C code via clang-format
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-17 16:37:15 +07:00
Konstantin Pastbin
52e9ddc038 [ios] Enable clang-format for Obj C sources
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-17 16:29:41 +07:00
Konstantin Pastbin
bfffa1fff4 Format all C++ and Java code via clang-format
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-17 14:32:37 +07:00
Konstantin Pastbin
9f0290c0ec [ios] Disable clang-format temporary
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-17 14:28:44 +07:00
Andrei Shkrob
8a8a3c5a08 [ci] remove clang-format workflow
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-17 14:28:44 +07:00
Andrei Shkrob
518747d503 [ci] add code style check workflow
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-17 14:28:44 +07:00
Alexander Borsuk
5063b511ae tools/unix/clang-format.sh to format all necessary files in the repo
Signed-off-by: Alexander Borsuk <me@alex.bio>
2025-08-17 14:28:44 +07:00
Alexander Borsuk
fbe3f72fb1 .clang-format-ignore
Signed-off-by: Alexander Borsuk <me@alex.bio>
2025-08-17 14:28:44 +07:00
Alexander Borsuk
872c0d3e15 .clang-format rules
Signed-off-by: Alexander Borsuk <me@alex.bio>

.clang-format remove unnecessary semicolons

Signed-off-by: Alexander Borsuk <me@alex.bio>

[clang-format] Removed "AlignArrayOfStructures".

Signed-off-by: Viktor Govako <viktor.govako@gmail.com>
2025-08-17 14:28:44 +07:00
Andrei Shkrob
9833918aac [android][sdk] Refactoring
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-17 09:26:56 +02:00
renderexpert
0000ec149c Fix wrong texture setting for RouteMarker
Signed-off-by: renderexpert <expert@renderconsulting.co.uk>
2025-08-17 08:30:56 +02:00
renderexpert
da3053f5fc Make check more strict in ApplyTextures
Signed-off-by: renderexpert <expert@renderconsulting.co.uk>
2025-08-17 08:30:56 +02:00
renderexpert
5a0ff536a7 Regenerate Vulkan shaders
Signed-off-by: renderexpert <expert@renderconsulting.co.uk>
2025-08-17 08:30:56 +02:00
renderexpert
36f123ef25 Fix crash in CreateDescriptorSetGroup
Signed-off-by: renderexpert <expert@renderconsulting.co.uk>
2025-08-17 08:30:56 +02:00
renderexpert
01c2f02c86 Remove OpenGL ES2 leftovers that caused crash in Vulkan
Signed-off-by: renderexpert <expert@renderconsulting.co.uk>
2025-08-17 08:30:56 +02:00
renderexpert
4d702ec541 Set OpenGLES 3.0 as minimal version in Android manifest
Signed-off-by: renderexpert <expert@renderconsulting.co.uk>
2025-08-17 08:30:56 +02:00
renderexpert
344cf6d709 Fix OpenGL glUniform mismatch
Signed-off-by: renderexpert <expert@renderconsulting.co.uk>
2025-08-17 08:30:56 +02:00
renderexpert
14b3e8fc8f Fix shader tests on Linux
Signed-off-by: renderexpert <expert@renderconsulting.co.uk>
2025-08-17 08:30:56 +02:00
renderexpert
6d0daf6fe7 Rewrite shaders to use OpenGL ES3 syntax
Signed-off-by: renderexpert <expert@renderconsulting.co.uk>
2025-08-17 08:30:56 +02:00
renderexpert
9b3507211f Remove Tegra support hacks
Signed-off-by: renderexpert <expert@renderconsulting.co.uk>
2025-08-17 08:30:56 +02:00
renderexpert
a406462549 Remove Adreno 200 support hacks
Signed-off-by: renderexpert <expert@renderconsulting.co.uk>
2025-08-17 08:30:56 +02:00
renderexpert
897d7a253d Refactor shaders to use GLES3 syntax
Signed-off-by: renderexpert <expert@renderconsulting.co.uk>
2025-08-17 08:30:56 +02:00
renderexpert
b23c2ba3e3 [Drape] Remove GLES2-related code
Signed-off-by: renderexpert <expert@renderconsulting.co.uk>
2025-08-17 08:30:56 +02:00
hb0nd
705c715356 [docs] Make funding section sound less threatening
Currently, it sounds like a threat to make it paid etc unless people donate 😅

Signed-off-by: hb0nd <me@hbond.xyz>
2025-08-16 19:48:29 +02:00
Jean-Baptiste
826ddba26f [android] Use material properties in styles and themes
Signed-off-by: Jean-Baptiste Charron <jeanbaptiste.charron@outlook.fr>
2025-08-16 11:04:30 +02:00
hemanggs
2492e8bda4 [Android] Standalone Note UI in Category select screen
Signed-off-by: hemanggs <hemangmanhas@gmail.com>
2025-08-16 07:04:33 +02:00
hemanggs
9e494ed8a5 [core] Create Standalone Note core
Signed-off-by: hemanggs <hemangmanhas@gmail.com>
2025-08-16 07:04:33 +02:00
Andrei Shkrob
1c8ac1f32a [android] Show bookmark icon in color selector
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-16 07:04:33 +02:00
Andrei Shkrob
d0bb8c1c49 [android] Fix colors order
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-16 07:04:33 +02:00
Jean-Baptiste
6c4503b0db [android] Improve size of bookmark icons
Signed-off-by: Jean-Baptiste Charron <jeanbaptiste.charron@outlook.fr>
2025-08-16 07:04:33 +02:00
Viktor Govako
a39b3a9921 [android] Fixed getting drawable icons.
Signed-off-by: Viktor Govako <viktor.govako@gmail.com>
2025-08-16 07:04:33 +02:00
Andrei Shkrob
8493ed369a [android] Fix collor selector issue
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-16 07:04:33 +02:00
Andrei Shkrob
2ded7e5e2b [android] Load icon types from core
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-16 07:04:33 +02:00
Andrei Shkrob
d9335c0b6c [android] Load predefined colors from core
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-16 07:04:33 +02:00
Andrei Shkrob
ebc5370052 [android] Load TTS languages from core
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-16 07:04:33 +02:00
Konstantin Pastbin
0a96a23ca0 [desktop] Fix Mac icon file location
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-16 01:43:47 +07:00
Konstantin Pastbin
5b05a7ac71 [3party] Protobuf MSVC and C++23 fixes
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-16 01:15:07 +07:00
Kiryl Kaveryn
31104eed4d [ios] Remove fileCoordinator wrapping from downloading starting
And add check `isUbiquitousItem` before downloading start. This method returns false when the file doesn't exist.

Signed-off-by: Kiryl Kaveryn <kirylkaveryn@gmail.com>
2025-08-16 00:33:06 +07:00
Kiryl Kaveryn
0f2353aae6 [ios] Track the percentDownloaded for the downloaded from the cloud files
Signed-off-by: Kiryl Kaveryn <kirylkaveryn@gmail.com>
2025-08-16 00:32:58 +07:00
Kiryl Kaveryn
d01b8aaab4 [map] Remove zooming back on track deselection
Closes https://github.com/organicmaps/organicmaps/issues/10941

Signed-off-by: Kiryl Kaveryn <kirylkaveryn@gmail.com>
2025-08-16 00:27:55 +07:00
Alexander Borsuk
33f8e20f1b [Linux] Vulkan build fixes
Signed-off-by: Alexander Borsuk <me@alex.bio>
2025-08-16 00:23:24 +07:00
Alexander Borsuk
76d8396cb1 [3party] Updated Vulkan headers to v1.4.322
Signed-off-by: Alexander Borsuk <me@alex.bio>
2025-08-16 00:19:01 +07:00
Andrei Shkrob
0f744e7cf2 [desktop] Organize desktop resources
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
2025-08-16 00:12:24 +07:00
Konstantin Pastbin
5d990bdc19 [docs] Add ninja to MacOS deps
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-15 11:47:53 +07:00
Yannik Bloscheck
1f2d70c720 [xcode] Updated upgrade check version to latest value
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-08-14 18:22:40 +02:00
Alexander Borsuk
76ffc99abd New cpp folder structure
Signed-off-by: Alexander Borsuk <me@alex.bio>
2025-08-14 20:52:04 +07:00
x7z4w
c9cbb64f12 [search] Follow-up fix for synonyms
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-14 11:07:33 +02:00
x7z4w
c4722f7025 [ci] Fix Github CI
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-14 10:57:30 +02:00
Yannik Bloscheck
211e3fb4f0 [ios] Fixing ATM translation on place page
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-08-13 20:26:31 +02:00
Konstantin Pastbin
ab0c2e70d5 [planet] Update map data to 250804
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-13 20:25:04 +02:00
Konstantin Pastbin
3133b88346 Relnotes for 1st August release
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-13 20:18:00 +02:00
x7z4w
b1479127e7 [ci] Use self-hosted runner
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-13 20:05:43 +02:00
Yannik Bloscheck
18c3b8cda5 [styles] Made general area slightly less grey
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-08-13 20:03:44 +02:00
Codeberg Translate
38037c1174 [strings] Update from Codeberg Translate
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: jimkats <jimkats@noreply.codeberg.org>
Co-authored-by: patepelo <patepelo@noreply.codeberg.org>
Translation: CoMaps/Android - Map Feature Types
Translation: CoMaps/Countries and regions names
Translation: CoMaps/iOS - Map Feature Types
2025-08-13 17:36:51 +00:00
Konstantin Pastbin
593f2fd828 [tools] Change World maps download mirror
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-13 13:06:50 +07:00
Jean-Baptiste
066afe4aa8 [android] Improve alignment layout
Signed-off-by: Jean-Baptiste Charron <jeanbaptiste.charron@outlook.fr>
2025-08-12 17:57:50 +02:00
Jean-Baptiste
2df3e3557b [android] Migrate last themes to Material Components
Signed-off-by: Jean-Baptiste Charron <jeanbaptiste.charron@outlook.fr>
2025-08-12 17:57:50 +02:00
Codeberg Translate
f79e86dff6 [strings] Update from Codeberg Translate
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Translate-URL: https://translate.codeberg.org/projects/comaps/countries/
Translation: CoMaps/Countries and regions names
2025-08-12 15:11:24 +00:00
Konstantin Pastbin
244af5ea34 [core] Make DefaultLanguage arg const ref
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-12 19:35:51 +07:00
Yannik Bloscheck
185ae66101 [core] Fix local language not being used in some cases
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-08-12 12:36:56 +02:00
Konstantin Pastbin
f09b372590 [drape] Comment dummy assert firing in debug builds
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-12 16:23:43 +07:00
Konstantin Pastbin
de4ec645b6 [styles] Disable unused designer drules
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-12 10:14:53 +02:00
Konstantin Pastbin
b1710c0fd6 Revert "[android] Migrate last themes to Material Components"
This reverts commit b41bad5ea4.
2025-08-12 13:01:16 +07:00
Eivind Samseth
be0784e4ad [docs] Improve maps generator documentation
Add instructions for uv package managment and how to test on iOS

Signed-off-by: eisa01 <eisa01@gmail.com>
2025-08-11 21:00:50 +02:00
Henry Sternberg
78baadfe95 [core][drape] Making arrows smooth again
Signed-off-by: Henry Sternberg <dev@bluelightmaps.com>
2025-08-11 16:58:28 +02:00
Codeberg Translate
2dade5039a [strings] Update from Codeberg Translate
Co-authored-by: Artiman <artiman@noreply.codeberg.org>
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: N4ta <codeberg@n4ta.anonaddy.me>
Co-authored-by: ikanakova <ikanakova@noreply.codeberg.org>
Co-authored-by: patepelo <patepelo@noreply.codeberg.org>
Co-authored-by: sunsand <sunsand@noreply.codeberg.org>
Co-authored-by: sziatomi <sziatomi@noreply.codeberg.org>
Translation: CoMaps/Android - Map Feature Types
Translation: CoMaps/Android UI Strings
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 UI Strings
2025-08-11 13:58:51 +00:00
x7z4w
36ec212671 [strings] Remove internal types
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-11 15:58:12 +02:00
x7z4w
bdbbed6265 [strings] Consistent categories strings
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-11 15:25:35 +02:00
Jean-Baptiste
007aa818ff [android] Add support of Android 16 - First part
Signed-off-by: Jean-Baptiste Charron <jeanbaptiste.charron@outlook.fr>
2025-08-11 14:59:57 +02:00
Viktor Govako
001246fd10 [routing][tests] Updated integration tests.
Signed-off-by: Viktor Govako <viktor.govako@gmail.com>
2025-08-11 14:58:45 +02:00
Alexander Borsuk
76d7ef146c Removed SignedRound and replaced std::round with std::lround where needed
Also see https://clang.llvm.org/extra/clang-tidy/checks/bugprone/incorrect-roundings.html

Signed-off-by: Alexander Borsuk <me@alex.bio>
2025-08-11 14:58:45 +02:00
Alexander Borsuk
ae349462c6 Smoke test for std::round and std::lround
Signed-off-by: Alexander Borsuk <me@alex.bio>
2025-08-11 14:58:45 +02:00
Alexander Borsuk
972cefb074 Open in another app generates geo: URI with a q= query compatible with Google Maps
Signed-off-by: Alexander Borsuk <me@alex.bio>
2025-08-11 14:58:45 +02:00
Alexander Borsuk
30718e106e ADL for AlmostEqual* and use math:: instead of base:: (#9634)
* ADL for AlmostEqual* and use math:: instead of base::

Signed-off-by: Alexander Borsuk <me@alex.bio>
2025-08-11 14:58:45 +02:00
Alexander Borsuk
82133c5743 Fixed failing is_finite tests on the latest clang
Signed-off-by: Alexander Borsuk <me@alex.bio>
2025-08-11 14:58:45 +02:00
Alexander Borsuk
8fe788c98d Removed -Ofast to silence clang warning
Signed-off-by: Alexander Borsuk <me@alex.bio>
2025-08-11 14:58:45 +02:00
Konstantin Pastbin
684784c2b2 [drape] Increase colors texture size
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-11 14:56:51 +02:00
Eivind Samseth
492eab91fc [generator] Remove survey:date support
Indefinite behavior if both check_date and survey:date are set. Likely need its own metadata key

Signed-off-by: eisa01 <eisa01@gmail.com>
2025-08-11 12:24:46 +02:00
x7z4w
86ebbf6006 Remove us1
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-11 10:06:44 +02:00
Codeberg Translate
45e15e2edb [strings] Update from Codeberg Translate
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: ERYpTION <eryption@noreply.codeberg.org>
Co-authored-by: Mannivu <mannivu@noreply.codeberg.org>
Co-authored-by: patepelo <patepelo@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/Countries and regions names
Translation: CoMaps/F-Droid app description
Translation: CoMaps/Google Play and Huawei AppGallery descriptions
Translation: CoMaps/iOS - Map Feature Types
Translation: CoMaps/iOS Plurals
Translation: CoMaps/iOS UI Strings
2025-08-10 15:11:32 +00:00
3417 changed files with 76077 additions and 84388 deletions

View File

@@ -3,7 +3,6 @@ BasedOnStyle: Google
AccessModifierOffset: -2 AccessModifierOffset: -2
AlignAfterOpenBracket: Align AlignAfterOpenBracket: Align
AlignArrayOfStructures: Right
AlignConsecutiveMacros: AcrossEmptyLinesAndComments AlignConsecutiveMacros: AcrossEmptyLinesAndComments
AlignEscapedNewlines: LeftWithLastLine AlignEscapedNewlines: LeftWithLastLine
AlignOperands: AlignAfterOperator AlignOperands: AlignAfterOperator
@@ -40,8 +39,10 @@ ColumnLimit: 120
ConstructorInitializerIndentWidth: 2 ConstructorInitializerIndentWidth: 2
ContinuationIndentWidth: 4 ContinuationIndentWidth: 4
DerivePointerAlignment: false DerivePointerAlignment: false
EmptyLineBeforeAccessModifier: Always
IncludeBlocks: Preserve IncludeBlocks: Preserve
IndentAccessModifiers: false IndentAccessModifiers: false
IndentCaseLabels: false
IndentExternBlock: NoIndent IndentExternBlock: NoIndent
InsertBraces: false InsertBraces: false
InsertNewlineAtEOF: true InsertNewlineAtEOF: true
@@ -49,6 +50,7 @@ LambdaBodyIndentation: OuterScope
PackConstructorInitializers: CurrentLine PackConstructorInitializers: CurrentLine
PointerAlignment: Middle PointerAlignment: Middle
RemoveBracesLLVM: true RemoveBracesLLVM: true
RemoveSemicolon: true
QualifierAlignment: Right QualifierAlignment: Right
SpacesInContainerLiterals: false SpacesInContainerLiterals: false
Standard: Latest Standard: Latest

8
.clang-format-ignore Normal file
View File

@@ -0,0 +1,8 @@
# Files that should not be formatted.
./3party
# A patched copy of the https://registry.khronos.org/OpenGL/api/GLES3/gl3.h
./android/sdk/src/main/cpp/app/organicmaps/sdk/opengl/gl3stub.h
# Formatting it leads to crashes in runtime. Newer protobuf may fix it.
./libs/indexer/drules_struct.pb.cc
# No need to format this 3party tool.
tools/osmctools/*.c

View File

@@ -36,8 +36,6 @@ jobs:
android-google-beta: android-google-beta:
name: Android Google Beta name: Android Google Beta
runs-on: ubuntu-latest runs-on: ubuntu-latest
container:
image: runmymind/docker-android-sdk:latest
environment: beta environment: beta
steps: steps:
- name: Install build tools and dependencies - name: Install build tools and dependencies

View File

@@ -11,7 +11,7 @@ on:
jobs: jobs:
android-check-metadata: android-check-metadata:
name: Check app metadata name: Check app metadata
runs-on: codeberg-tiny runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4

View File

@@ -37,9 +37,7 @@ on:
jobs: jobs:
lint: lint:
name: Android Lint name: Android Lint
runs-on: codeberg-tiny runs-on: ubuntu-latest
container:
image: runmymind/docker-android-sdk:latest
steps: steps:
- name: Checkout sources - name: Checkout sources
uses: actions/checkout@v4 uses: actions/checkout@v4
@@ -58,8 +56,6 @@ jobs:
android-check: android-check:
name: Build Android Debug name: Build Android Debug
runs-on: ubuntu-latest runs-on: ubuntu-latest
container:
image: runmymind/docker-android-sdk:latest
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:

View File

@@ -6,7 +6,7 @@ on:
jobs: jobs:
precondition: precondition:
runs-on: codeberg-tiny runs-on: ubuntu-latest
name: Check preconditions name: Check preconditions
steps: steps:
- name: Checkout sources - name: Checkout sources
@@ -31,8 +31,6 @@ jobs:
android-google-beta: android-google-beta:
name: Android Google Beta name: Android Google Beta
runs-on: ubuntu-latest runs-on: ubuntu-latest
container:
image: runmymind/docker-android-sdk:latest
needs: precondition needs: precondition
if: ${{ needs.precondition.outputs.updated != '' }} if: ${{ needs.precondition.outputs.updated != '' }}
environment: beta environment: beta

View File

@@ -5,9 +5,7 @@ on:
jobs: jobs:
android-release-metadata: android-release-metadata:
name: Upload Google Play metadata name: Upload Google Play metadata
runs-on: codeberg-tiny runs-on: ubuntu-latest
container:
image: runmymind/docker-android-sdk:latest
environment: production environment: production
steps: steps:
- name: Checkout sources - name: Checkout sources

View File

@@ -10,8 +10,6 @@ jobs:
tag: tag:
name: Tag name: Tag
runs-on: ubuntu-latest runs-on: ubuntu-latest
container:
image: runmymind/docker-android-sdk:latest
environment: production environment: production
steps: steps:
- name: Checkout sources - name: Checkout sources

View File

@@ -9,7 +9,7 @@ on:
jobs: jobs:
validate-appstream: validate-appstream:
name: Validate appstream metadata xml name: Validate appstream metadata xml
runs-on: codeberg-tiny runs-on: ubuntu-latest
steps: steps:
- name: Checkout sources - name: Checkout sources
uses: actions/checkout@v4 uses: actions/checkout@v4

View File

@@ -33,7 +33,7 @@ concurrency:
jobs: jobs:
should-run-check: should-run-check:
name: Should run coverage name: Should run coverage
runs-on: codeberg-tiny runs-on: ubuntu-latest
outputs: outputs:
run-from-pr: ${{ steps.run-from-pr.outputs.run-from-pr }} run-from-pr: ${{ steps.run-from-pr.outputs.run-from-pr }}
manually-triggered: ${{ steps.manually-triggered.outputs.manually-triggered }} manually-triggered: ${{ steps.manually-triggered.outputs.manually-triggered }}

View File

@@ -3,20 +3,20 @@ on:
workflow_dispatch: # Manual trigger workflow_dispatch: # Manual trigger
pull_request: pull_request:
paths: paths:
- qt/res/app.comaps.comaps.desktop - qt/res/linux/app.comaps.comaps.desktop
- .forgejo/workflows/desktop-file-check.yaml # Run check on self change - .forgejo/workflows/desktop-file-check.yaml # Run check on self change
jobs: jobs:
validate-desktop-file: validate-desktop-file:
name: Validate .desktop file name: Validate .desktop file
runs-on: codeberg-tiny runs-on: ubuntu-latest
steps: steps:
- name: Checkout sources - name: Checkout sources
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
fetch-depth: 1 fetch-depth: 1
sparse-checkout: | sparse-checkout: |
qt/res/app.comaps.comaps.desktop qt/res/linux/app.comaps.comaps.desktop
- name: Install desktop-file-validate tool - name: Install desktop-file-validate tool
shell: bash shell: bash
@@ -27,4 +27,4 @@ jobs:
- name: Validate desktop file - name: Validate desktop file
shell: bash shell: bash
run: desktop-file-validate qt/res/app.comaps.comaps.desktop && echo "Successfully validated .desktop file" run: desktop-file-validate qt/res/linux/app.comaps.comaps.desktop && echo "Successfully validated .desktop file"

View File

@@ -10,7 +10,7 @@ on:
jobs: jobs:
ios-check-metadata: ios-check-metadata:
name: Check app metadata name: Check app metadata
runs-on: codeberg-tiny runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4

View File

@@ -23,6 +23,10 @@ jobs:
shell: bash shell: bash
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20)) run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
- name: Configure repository
shell: bash
run: SKIP_GENERATE_SYMBOLS=1 ./configure.sh
- name: Lint - name: Lint
shell: bash shell: bash
working-directory: android working-directory: android
@@ -62,6 +66,7 @@ jobs:
libxinerama-dev \ libxinerama-dev \
libxcursor-dev \ libxcursor-dev \
libxi-dev \ libxi-dev \
python3-protobuf \
zlib1g-dev zlib1g-dev
- name: Checkout sources - name: Checkout sources

View File

@@ -1,43 +0,0 @@
name: clang-format
on:
push:
branches: [ master ]
paths:
- 'android/app/src/**.java'
- '.clang-format'
- '.github/workflows/clang-format.yml'
pull_request:
branches: [ master ]
paths:
- 'android/app/src/**.java'
- '.clang-format'
- '.github/workflows/clang-format.yml'
jobs:
check-formatting:
runs-on: ubuntu-latest
continue-on-error: true # TODO(AB): Remove this line when ready to enforce formatting.
steps:
- uses: actions/checkout@v4
- name: Install clang-format
run: |
sudo apt-get update
sudo apt-get install -y clang-format-19
clang-format-19 --version
- name: Check Java formatting
run: |
JAVA_FILES=($(find android/app/src -name '*.java'))
FORMATTING_ISSUES=$(clang-format-19 --dry-run --Werror $JAVA_FILES 2>&1 || true)
if [ -n "$FORMATTING_ISSUES" ]; then
echo "$FORMATTING_ISSUES"
echo ""
echo "To fix formatting, please run:"
echo " clang-format -i <file>"
exit 1
fi

51
.github/workflows/code-style-check.yaml vendored Normal file
View File

@@ -0,0 +1,51 @@
name: Code style check
on:
pull_request:
branches: [ master ]
paths: # Should stay in sync with tools/unix/clang-format.sh
- '.github/workflows/code-style-check.yaml'
- 'android/app/src/**.java'
- 'android/sdk/src/**.java'
- 'android/sdk/src/main/cpp/**.[ch]pp'
- 'dev_sandbox/**.[ch]pp'
- 'generator/**.[ch]pp'
- 'iphone/**.[ch]pp'
- 'iphone/**.[hm]'
- 'iphone/**.mm'
- 'libs/**.[ch]pp'
- 'libs/**.[hm]'
- '!libs/indexer/drules_struct.pb.h'
- 'libs/**.mm'
- 'qt/**.[ch]pp'
- 'qt/**.h'
- 'tools/**.[ch]pp'
- '.clang-format'
- '.clang-format-ignore'
jobs:
code-style-check:
runs-on: ubuntu-latest
steps:
- name: Install clang-format
run: |
sudo apt purge -y clang-format-18 # Remove default old version of clang-format
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
echo 'deb http://apt.llvm.org/noble/ llvm-toolchain-noble-20 main' | sudo tee /etc/apt/sources.list.d/llvm-toolchain-noble-20.list
sudo apt-get update
sudo apt-get install -y clang-format-20
sudo update-alternatives --force --install /usr/bin/clang-format clang-format /usr/bin/clang-format-20 10
sudo update-alternatives --force --install /usr/bin/git-clang-format git-clang-format /usr/bin/git-clang-format-20 10
clang-format --version
- name: Checkout sources
uses: actions/checkout@v4
- name: Check code style
run: tools/unix/clang-format.sh
- name: Post clang-format comments
if: failure()
uses: reviewdog/action-suggester@v1.21.0
with:
tool_name: clang-format
fail_level: error

View File

@@ -30,6 +30,7 @@ jobs:
run: | run: |
brew install qt \ brew install qt \
optipng optipng
pip3 install "protobuf<3.21" --break-system-packages
- name: Checkout sources - name: Checkout sources
uses: actions/checkout@v4 uses: actions/checkout@v4

2
.gitignore vendored
View File

@@ -50,7 +50,7 @@ omim.sdf
*.suo *.suo
*.aps *.aps
*.rc *.rc
!qt/res/windows.rc !qt/res/windows/windows.rc
*.pdb *.pdb
out/ out/

View File

@@ -1,4 +1,5 @@
cmake_minimum_required(VERSION 3.22.1) cmake_minimum_required(VERSION 3.22.1)
project(omim C CXX) project(omim C CXX)
set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD 20)
@@ -105,7 +106,7 @@ if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")
elseif (${CMAKE_BUILD_TYPE} MATCHES "Rel") elseif (${CMAKE_BUILD_TYPE} MATCHES "Rel")
add_definitions(-DRELEASE) add_definitions(-DRELEASE)
if (NOT MSVC) if (NOT MSVC)
add_compile_options(-Ofast $<$<CXX_COMPILER_ID:GNU>:-flto=auto>) # Also enables -ffast-math add_compile_options(-O3 $<$<CXX_COMPILER_ID:GNU>:-flto=auto>)
endif() endif()
else() else()
message(FATAL_ERROR "Unknown build type: " ${CMAKE_BUILD_TYPE}) message(FATAL_ERROR "Unknown build type: " ${CMAKE_BUILD_TYPE})
@@ -184,7 +185,7 @@ if (NOT PLATFORM_IPHONE AND NOT PLATFORM_ANDROID)
endif() endif()
# To allow #include "base/file_name.hpp" in all sources. # To allow #include "base/file_name.hpp" in all sources.
include_directories(${CMAKE_HOME_DIRECTORY}) include_directories("${CMAKE_HOME_DIRECTORY}" "${CMAKE_HOME_DIRECTORY}/libs" "${CMAKE_HOME_DIRECTORY}/tools")
if (USE_PCH) if (USE_PCH)
message(STATUS "Precompiled headers are ON") message(STATUS "Precompiled headers are ON")
@@ -226,49 +227,22 @@ endif()
# Used in qt/ and shaders/ # Used in qt/ and shaders/
find_package(Python3 REQUIRED COMPONENTS Interpreter) find_package(Python3 REQUIRED COMPONENTS Interpreter)
add_subdirectory(base) add_subdirectory(libs)
add_subdirectory(coding)
add_subdirectory(descriptions)
add_subdirectory(drape)
add_subdirectory(drape_frontend)
add_subdirectory(editor)
add_subdirectory(ge0)
add_subdirectory(generator/mwm_diff)
add_subdirectory(geometry)
add_subdirectory(indexer)
add_subdirectory(kml)
add_subdirectory(map)
add_subdirectory(cppjansson)
add_subdirectory(platform)
add_subdirectory(routing)
add_subdirectory(routing_common)
add_subdirectory(search)
add_subdirectory(shaders)
add_subdirectory(storage)
add_subdirectory(tracking)
add_subdirectory(traffic)
add_subdirectory(transit)
if (PLATFORM_DESKTOP) if (PLATFORM_DESKTOP)
omim_add_tool_subdirectory(feature_list) add_subdirectory(dev_sandbox)
add_subdirectory(generator) add_subdirectory(generator)
add_subdirectory(openlr) add_subdirectory(tools)
add_subdirectory(poly_borders)
omim_add_tool_subdirectory(topography_generator)
add_subdirectory(track_analyzing)
omim_add_tool_subdirectory(track_generator)
if (NOT SKIP_QT_GUI) if (NOT SKIP_QT_GUI)
add_subdirectory(qt) add_subdirectory(qt)
omim_add_tool_subdirectory(skin_generator)
endif() endif()
if (GENERATOR_TOOL) if (GENERATOR_TOOL)
add_compile_options(-march=native -mtune=native) add_compile_options(-march=native -mtune=native)
message(STATUS "target CPU optimizations enabled, produced binaries will NOT work on a different CPU") message(STATUS "target CPU optimizations enabled, produced binaries will NOT work on a different CPU")
endif() endif()
add_subdirectory(dev_sandbox)
endif() endif()
omim_add_test_subdirectory(qt_tstfrm) omim_add_test_subdirectory(libs/qt_tstfrm)
if (PLATFORM_ANDROID) if (PLATFORM_ANDROID)
add_subdirectory(android/sdk/src/main/cpp) add_subdirectory(android/sdk/src/main/cpp)

View File

@@ -140,7 +140,7 @@ There is a dedicated [Zulip](https://codeberg.org/comaps/Governance/src/branch/m
## 💸 Funding ## 💸 Funding
CoMaps is free. To stay that way, it relies on your support. CoMaps is free. To fund development, we rely on your voluntary support ♥️
Donate via [OpenCollective](https://opencollective.com/comaps/donate) or [Liberapay](https://liberapay.com/CoMaps). Donate via [OpenCollective](https://opencollective.com/comaps/donate) or [Liberapay](https://liberapay.com/CoMaps).
The project's financial information is completely open and transparent at [our Open Collective](https://opencollective.com/comaps). The project's financial information is completely open and transparent at [our Open Collective](https://opencollective.com/comaps).

View File

@@ -0,0 +1,7 @@
• Data OpenStreetMap k 4. 8.
• vylepšené barvy mapy pro vodu, lesy, křoviny, různé vybavení, pěší zóny atd.
• přidány stanice lesní stráže, krytých parkovišť pro jízdní kola, únikových her, úschoven zavazadel, partnerských pošt
• vylepšeny výškové vrstevnice na 20 m pro některé oblíbené turistické oblasti
• podpora více zkratek a aliasů pro vyhledávání
• přidání ikon pro vyhledávání a záložky pro rychlé občerstvení, jízdní kola a dobíjecí stanice
• plynulejší pohyb šipky pro určení polohy

View File

@@ -1,9 +1,7 @@
Wir stellen vor: Das neue CoMaps-Logo! • OpenStreetMap-Daten vom 4. August
• Verbesserte Höhenlinien in vielen Regionen (Stufen von 20/50 m) • Verbesserte Farben für Wasser, Wälder, Gestrüpp, verschiedene Einrichtungen, Fussgängerbereiche etc.
Links zu Panoramax-Bildern für ausgewählte POIs Besucherstationen, überdachte Fahrradparkplätze, Escaperooms, Gepäckschließfächer, und Postpartner hinzugefügt
OpenStreetMap-Daten vom 13. Juli Konturhöhenlinien aktualisiert, bis zu 20m für beliebte Wanderregionen
Neue Farben für viele Objekte und Farben werden früher angezeigt Unterstützung für mehr Such-Abkürzungen und Synonyme
Öffnungszeiten werden beim Antippen eines POI angezeigt Such- und Lesezeichen-Symbole für Fast Food, Rad- und Lade-Stationen
Verschiedene Arten von Feuchtgebieten Der Positionspfeil bewegt sich gleichmässiger
• Neue Farben für Vegetation und andere Features; einige neue Icons
• Wandern: bessere Darstellung der Höhenlinien

View File

@@ -1,10 +1,7 @@
Introducing CoMaps logo! • OpenStreetMap data as of August 4
• improve map colors for water, forests, scrubs, various amenities, pedestrian areas etc.
upgrade altitude contour lines for many regions to 20 or 50 meters step add ranger stations, covered bicycle parkings, escape games, luggage lockers, post office partners
add Panoramax Picture links to selected POIs upgrade altitude contour lines to 20m step for some popular hiking regions
OpenStreetMap data as of July 13 support more search abbreviations and aliases
• add color fills to many features and display fills earlier for existing features • add search and bookmark icons for fast food, bicycle and charging stations
display opening hours state when selecting a POI more smooth position arrow movements
• split all wetlands into several distinct types
• update vegetation and other map colors, update some map icons
• outdoors: bolder altitude contour lines

View File

@@ -1,9 +1,7 @@
¡Presentamos el logo de CoMaps! • Datos de OpenStreetMap a fecha 2025.08.04
mejora de isolíneas con más detalle para muchas regiones Mejora de colores del mapa para agua, bosques, matorrales, servicios, zonas peatonales, etc.
añade enlaces de imágenes de Panoramax a POIs seleccionados Añadidas estaciones de guardabosques, aparcamientos cubiertos de bicis, juegos de escape, consignas y oficinas de correo
datos de OpenStreetMap a 13 de julio Nuevas curvas de nivel (20 m) en regiones populares para senderismo
añadidos rellenos de color a muchas características Más abreviaturas y alias de búsqueda
se muestra el estado de horarios de apertura al seleccionar un POI Iconos de búsqueda y marcadores para comida rápida, bicicletas y estaciones de recarga
se dividen los humedales en tipos distintos Más fluidez de la flecha de posición
• se actualiza la vegetación y otros colores del mapa, así como otros iconos
• exteriores: líneas de contorno de altitud más gruesas

View File

@@ -0,0 +1 @@
ناوبری آسان نقشه - کشف بیشتر از سفر شما - توسط جامعه

View File

@@ -0,0 +1 @@
CoMaps - کوه نوردی، دوچرخه سواری و رانندگی افلاین و خصوصی

View File

@@ -1,7 +0,0 @@
Présentation du logo CoMaps !
• Amélioration des courbes daltitude à une précision de 20 ou 50 mètres pour de nombreuses régions
• Ajout d'un lien vers les images Panoramax des POI
• Données OpenStreetMap du 13 juillet
• Affichage de létat des heures douverture lors de la sélection dun POI
• Mise à jour du style(végétation et zones humides), mise à jour de certaines icônes de la carte
• Outdoors: Améliorations de la visibilité des courbes d'altitude

View File

@@ -1 +1 @@
Navigation cartographique facile - Vivez de grands voyages - Propulsé par la communauté Navigation de cartes facile - Découvrez le monde - Propulsé par la communauté

View File

@@ -0,0 +1 @@
Könnyű térképes navigáció - Fedezz fel többet az útjaidról - A közösség erejével

View File

@@ -0,0 +1,7 @@
• Dati di OpenStreetMap aggiornati al 4 Agosto
• Migliorati i colori per acqua, foreste, servizi etc
• Aggiunte le stazioni delle guardie forestali, i parcheggi coperti per bici, gli escape games e altri servizi
• Aggiornato l'intervallo delle isolinee a 20 m per le zone escursionistiche più popolari
• Aggiunto il supporto per un maggior numero di alias
• Aggiunte le icone per i fast food, i punti di ricarica e le biciclette
• Resi più fluidi i movimenti della freccia di posizione

View File

@@ -1,9 +0,0 @@
Wprowadzamy logo CoMaps!
• zwiększenie dokładności izolinii w wielu regionach w krokach 20 do 50 metrów
• dodanie linków do zdjęć z Panoramax do wybranych POI
• aktualizacja danych OpenStreetMap z 13 lipca
• dodanie wypełnienia kolorem dla wielu typów obiektów
• wyświetlanie stanu godzin otwarcia przy wyborze POI
• podział mokradeł na kilka typów
• aktualizacja koloru roślinności i innych kolorów, aktualizacja części ikon na mapie
• tryb outdoorowy: pogrubione warstwice wysokości

View File

@@ -1,9 +1,7 @@
Apresentamos o logo do CoMaps! • Dados OSM de 4/08
Curvas de nível mais detalhadas em muitas regiões Melhoria nas cores para água, florestas, matagais, serviços, áreas de pedestres, etc.
• Adicionados links de imagens do Panoramax para pontos de interesse selecionados • Adição de guarda-florestais, estacionamentos cobertos para bicicletas, jogos de fuga, armários para bagagem e parceiros postais
Dados OSM de 13/07 Melhoria na precisão de curvas de nível para 20 m em algumas regiões populares
Adicionados preenchimentos de cor a muitos elementos Suporte a mais abreviações para busca
Exibição de horário de funcionamento ao selecionar um ponto de interesse Adição de ícones de pesquisa e favoritos para fast food, bicicletas e estações de recarga
Divididas áreas úmidas em vários tipos distintos Movimentos mais suaves para seta de posição
• Atualizada cores/ícones para vegetação e outros elementos
• Ar livre: curvas de nível de altitude mais destacadas

View File

@@ -1,9 +1,7 @@
Представляем логотип CoMaps! • Карты OpenStreetMap от 4 августа
Линии высот для многих регионов с шагом 20м или 50м Улучшен цвет воды, леса, кустарников, различных объектов инфраструктуры, пешеходных зон и т.д.
Ссылки на изображения Panoramax к выбранным POI Добавлены лесничества, крытые велопарковки, квесты, камеры хранения
Карты OpenStreetMap от 13 июля Для некоторых популярных туристических регионов добавлены линии высот 20м
Заливки цветом ко многим объектам и более ранняя заливка для существующих объектов Поддержка дополнительных поисковых сокращений и синонимов
Показ часов работы при выборе POI Добавлены иконки меток и результатов поиска для фастфуда, велопарковок и зарядных станций
Разные водно-болотные угодья отличаются цветом Более плавное движение стрелки местоположения
• Обновлены цвета растительности и другие цвета на карте, изменены некоторые иконки
В стиле "Активный отдых" более четкие линии высот

View File

@@ -1,9 +1,7 @@
Представљамо CoMaps лого! • подаци из OpenStreetMap-а од 4. августа
ажуриране изохипсе за многе регионе на кораке од 20 или 50 метара побољшане боје на мапи за воду, шуме, жбуње, разне објекте, пешачке зоне итд.
• додате везе ка Panoramax сликама за изабране тачке интересовања (POI) • додате станице ренџера, наткривена паркинг места за бицикле, escape room-ови, ормарићи за пртљаг
подаци са OpenStreetMap-а од 13. јула унапређене изохипсе на кораке од 20 м за популарне планинарске регионе
додате боје за многе елементе и раније приказивање постојећих површина подршка за више скраћеница и алтернативних назива у претрази
приказ стања радног времена при избору POI-ја додате иконе за претрагу и обележавање за брзу храну, бицикле и станице за пуњење
мочваре подељене на неколико различитих типова равномерније кретање стрелице која приказује позицију
• ажуриране боје вегетације и других елемената на мапи, ажуриране поједине иконе
• на отвореном: наглашеније изохипсе

View File

@@ -0,0 +1 @@
Könnyű térképes navigáció - Fedezz fel többet az útjaidról - A közösség erejével

View File

@@ -0,0 +1 @@
CoMaps - Az adatvédő navigáció

View File

@@ -6,7 +6,7 @@
<!-- Requiring "android.hardware.touchscreen" here breaks DeX mode --> <!-- Requiring "android.hardware.touchscreen" here breaks DeX mode -->
<uses-feature <uses-feature
android:glEsVersion="0x00020000" android:glEsVersion="0x00030000"
android:required="true"/> android:required="true"/>
<uses-feature <uses-feature
android:name="android.hardware.wifi" android:name="android.hardware.wifi"

View File

@@ -155,9 +155,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
showMap(); showMap();
return; return;
case CountryItem.STATUS_FAILED: case CountryItem.STATUS_FAILED: MapManager.showError(DownloadResourcesLegacyActivity.this, item, null); return;
MapManager.showError(DownloadResourcesLegacyActivity.this, item, null);
return;
} }
} }
} }

View File

@@ -23,7 +23,10 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
public class MapFragment extends BaseMwmFragment implements View.OnTouchListener, SurfaceHolder.Callback public class MapFragment extends BaseMwmFragment implements View.OnTouchListener, SurfaceHolder.Callback
{ {
private static final String TAG = MapFragment.class.getSimpleName(); private static final String TAG = MapFragment.class.getSimpleName();
private final Map mMap = new Map(DisplayType.Device);
@SuppressWarnings("NonNullFieldNotInitialized")
@NonNull
private Map mMap;
public void updateCompassOffset(int offsetX, int offsetY) public void updateCompassOffset(int offsetX, int offsetY)
{ {
@@ -84,6 +87,7 @@ public class MapFragment extends BaseMwmFragment implements View.OnTouchListener
{ {
Logger.d(TAG); Logger.d(TAG);
super.onAttach(context); super.onAttach(context);
mMap = new Map(DisplayType.Device, MwmApplication.from(requireContext()).getLocationHelper());
mMap.setMapRenderingListener((MapRenderingListener) context); mMap.setMapRenderingListener((MapRenderingListener) context);
mMap.setCallbackUnsupported(this::reportUnsupported); mMap.setCallbackUnsupported(this::reportUnsupported);
} }

View File

@@ -82,7 +82,6 @@ import app.organicmaps.routing.ManageRouteBottomSheet;
import app.organicmaps.routing.NavigationController; import app.organicmaps.routing.NavigationController;
import app.organicmaps.routing.NavigationService; import app.organicmaps.routing.NavigationService;
import app.organicmaps.routing.RoutingBottomMenuListener; import app.organicmaps.routing.RoutingBottomMenuListener;
import app.organicmaps.routing.RoutingController;
import app.organicmaps.routing.RoutingErrorDialogFragment; import app.organicmaps.routing.RoutingErrorDialogFragment;
import app.organicmaps.routing.RoutingPlanFragment; import app.organicmaps.routing.RoutingPlanFragment;
import app.organicmaps.routing.RoutingPlanInplaceController; import app.organicmaps.routing.RoutingPlanInplaceController;
@@ -108,6 +107,7 @@ import app.organicmaps.sdk.location.SensorListener;
import app.organicmaps.sdk.location.TrackRecorder; import app.organicmaps.sdk.location.TrackRecorder;
import app.organicmaps.sdk.maplayer.isolines.IsolinesState; import app.organicmaps.sdk.maplayer.isolines.IsolinesState;
import app.organicmaps.sdk.routing.RouteMarkType; import app.organicmaps.sdk.routing.RouteMarkType;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.routing.RoutingOptions; import app.organicmaps.sdk.routing.RoutingOptions;
import app.organicmaps.sdk.search.SearchEngine; import app.organicmaps.sdk.search.SearchEngine;
import app.organicmaps.sdk.settings.RoadType; import app.organicmaps.sdk.settings.RoadType;
@@ -115,7 +115,6 @@ import app.organicmaps.sdk.settings.UnitLocale;
import app.organicmaps.sdk.util.Config; import app.organicmaps.sdk.util.Config;
import app.organicmaps.sdk.util.LocationUtils; import app.organicmaps.sdk.util.LocationUtils;
import app.organicmaps.sdk.util.PowerManagment; import app.organicmaps.sdk.util.PowerManagment;
import app.organicmaps.sdk.util.ThemeSwitcher;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.sdk.util.log.Logger; import app.organicmaps.sdk.util.log.Logger;
import app.organicmaps.sdk.widget.placepage.PlacePageData; import app.organicmaps.sdk.widget.placepage.PlacePageData;
@@ -125,6 +124,7 @@ import app.organicmaps.search.SearchFragment;
import app.organicmaps.settings.DrivingOptionsActivity; import app.organicmaps.settings.DrivingOptionsActivity;
import app.organicmaps.settings.SettingsActivity; import app.organicmaps.settings.SettingsActivity;
import app.organicmaps.util.SharingUtils; import app.organicmaps.util.SharingUtils;
import app.organicmaps.util.ThemeSwitcher;
import app.organicmaps.util.ThemeUtils; import app.organicmaps.util.ThemeUtils;
import app.organicmaps.util.Utils; import app.organicmaps.util.Utils;
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment; import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
@@ -1223,22 +1223,23 @@ public class MwmActivity extends BaseMwmFragmentActivity
private void onIsolinesStateChanged(@NonNull IsolinesState type) private void onIsolinesStateChanged(@NonNull IsolinesState type)
{ {
if (type != IsolinesState.EXPIREDDATA) if (type == IsolinesState.NODATA)
{ {
type.activate(this, findViewById(R.id.coordinator), findViewById(R.id.menu_frame)); Toast.makeText(this, R.string.isolines_location_error_dialog, Toast.LENGTH_SHORT).show();
return;
} }
dismissAlertDialog(); if (type == IsolinesState.EXPIREDDATA)
{
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog) mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.downloader_update_maps) .setTitle(R.string.downloader_update_maps)
.setMessage(R.string.isolines_activation_error_dialog) .setMessage(R.string.isolines_activation_error_dialog)
.setPositiveButton(R.string.ok, .setPositiveButton(
(dialog, which) -> startActivity(new Intent(this, DownloaderActivity.class))) R.string.ok, (dialog, which) -> startActivity(new Intent(this, DownloaderActivity.class)))
.setNegativeButton(R.string.cancel, null) .setNegativeButton(R.string.cancel, null)
.setOnDismissListener(dialog -> mAlertDialog = null) .setOnDismissListener(dialog -> mAlertDialog = null)
.show(); .show();
} }
}
@Override @Override
protected void onNewIntent(Intent intent) protected void onNewIntent(Intent intent)

View File

@@ -18,7 +18,6 @@ import app.organicmaps.background.OsmUploadWork;
import app.organicmaps.downloader.DownloaderNotifier; import app.organicmaps.downloader.DownloaderNotifier;
import app.organicmaps.location.TrackRecordingService; import app.organicmaps.location.TrackRecordingService;
import app.organicmaps.routing.NavigationService; import app.organicmaps.routing.NavigationService;
import app.organicmaps.routing.RoutingController;
import app.organicmaps.sdk.Map; import app.organicmaps.sdk.Map;
import app.organicmaps.sdk.OrganicMaps; import app.organicmaps.sdk.OrganicMaps;
import app.organicmaps.sdk.display.DisplayManager; import app.organicmaps.sdk.display.DisplayManager;
@@ -28,9 +27,11 @@ import app.organicmaps.sdk.location.SensorHelper;
import app.organicmaps.sdk.location.TrackRecorder; import app.organicmaps.sdk.location.TrackRecorder;
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager; import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
import app.organicmaps.sdk.maplayer.subway.SubwayManager; import app.organicmaps.sdk.maplayer.subway.SubwayManager;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.util.Config; import app.organicmaps.sdk.util.Config;
import app.organicmaps.sdk.util.ConnectionState; import app.organicmaps.sdk.util.ConnectionState;
import app.organicmaps.sdk.util.log.Logger; import app.organicmaps.sdk.util.log.Logger;
import app.organicmaps.util.ThemeSwitcher;
import app.organicmaps.util.Utils; import app.organicmaps.util.Utils;
import java.io.IOException; import java.io.IOException;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
@@ -133,6 +134,8 @@ public class MwmApplication extends Application implements Application.ActivityL
public boolean initOrganicMaps(@NonNull Runnable onComplete) throws IOException public boolean initOrganicMaps(@NonNull Runnable onComplete) throws IOException
{ {
return mOrganicMaps.init(() -> { return mOrganicMaps.init(() -> {
ThemeSwitcher.INSTANCE.initialize(this);
ThemeSwitcher.INSTANCE.restart(false);
ProcessLifecycleOwner.get().getLifecycle().addObserver(mProcessLifecycleObserver); ProcessLifecycleOwner.get().getLifecycle().addObserver(mProcessLifecycleObserver);
onComplete.run(); onComplete.run();
}); });

View File

@@ -35,6 +35,7 @@ import app.organicmaps.sdk.bookmarks.data.BookmarkSharingResult;
import app.organicmaps.sdk.bookmarks.data.CategoryDataSource; import app.organicmaps.sdk.bookmarks.data.CategoryDataSource;
import app.organicmaps.sdk.bookmarks.data.Icon; import app.organicmaps.sdk.bookmarks.data.Icon;
import app.organicmaps.sdk.bookmarks.data.KmlFileType; 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.SortedBlock;
import app.organicmaps.sdk.bookmarks.data.Track; import app.organicmaps.sdk.bookmarks.data.Track;
import app.organicmaps.sdk.search.BookmarkSearchListener; import app.organicmaps.sdk.search.BookmarkSearchListener;
@@ -592,7 +593,7 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
if (mTrack == null) if (mTrack == null)
return; return;
final Bundle args = new Bundle(); final Bundle args = new Bundle();
args.putInt(BookmarkColorDialogFragment.ICON_TYPE, Icon.getColorPosition(mTrack.getColor())); args.putInt(BookmarkColorDialogFragment.ICON_COLOR, PredefinedColors.getPredefinedColorIndex(mTrack.getColor()));
final FragmentManager manager = getChildFragmentManager(); final FragmentManager manager = getChildFragmentManager();
String className = BookmarkColorDialogFragment.class.getName(); String className = BookmarkColorDialogFragment.class.getName();
final FragmentFactory factory = manager.getFragmentFactory(); final FragmentFactory factory = manager.getFragmentFactory();
@@ -601,7 +602,7 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
dialogFragment.setArguments(args); dialogFragment.setArguments(args);
dialogFragment.setOnColorSetListener((colorPos) -> { dialogFragment.setOnColorSetListener((colorPos) -> {
int from = mTrack.getColor(); int from = mTrack.getColor();
int to = BookmarkManager.ICONS.get(colorPos).argb(); int to = PredefinedColors.getColor(colorPos);
if (from == to) if (from == to)
return; return;
BookmarkManager.INSTANCE.changeTrackColor(mTrack.getTrackId(), to); BookmarkManager.INSTANCE.changeTrackColor(mTrack.getTrackId(), to);

View File

@@ -6,19 +6,26 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import androidx.annotation.DrawableRes;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.sdk.bookmarks.data.Icon; import app.organicmaps.sdk.bookmarks.data.PredefinedColors;
import app.organicmaps.util.Graphics; import app.organicmaps.util.Graphics;
import com.google.android.material.imageview.ShapeableImageView; import com.google.android.material.imageview.ShapeableImageView;
import java.util.List; import java.util.List;
import java.util.Objects;
public class IconsAdapter extends ArrayAdapter<Icon> public class ColorsAdapter extends ArrayAdapter<Integer>
{ {
@PredefinedColors.Color
private int mCheckedIconColor; private int mCheckedIconColor;
public IconsAdapter(Context context, List<Icon> list) @DrawableRes
private final int mIconResId;
public ColorsAdapter(Context context, List<Integer> list, @DrawableRes int iconResId)
{ {
super(context, 0, 0, list); super(context, 0, 0, list);
mIconResId = iconResId;
} }
@Override @Override
@@ -35,19 +42,19 @@ public class IconsAdapter extends ArrayAdapter<Icon>
else else
holder = (SpinnerViewHolder) convertView.getTag(); holder = (SpinnerViewHolder) convertView.getTag();
final Icon icon = getItem(position); @PredefinedColors.Color
final int color = Objects.requireNonNull(getItem(position));
Drawable circle; Drawable circle;
if (icon.getColor() == mCheckedIconColor) if (color == mCheckedIconColor)
{ {
circle = Graphics.drawCircleAndImage(getItem(position).argb(), R.dimen.track_circle_size, circle = Graphics.drawCircleAndImage(PredefinedColors.getColor(mCheckedIconColor), R.dimen.track_circle_size,
app.organicmaps.sdk.R.drawable.ic_bookmark_none, R.dimen.bookmark_icon_size, mIconResId, R.dimen.bookmark_icon_size, getContext());
getContext());
} }
else else
{ {
circle = circle = Graphics.drawCircle(PredefinedColors.getColor(color), R.dimen.select_color_circle_size,
Graphics.drawCircle(getItem(position).argb(), R.dimen.select_color_circle_size, getContext().getResources()); getContext().getResources());
} }
holder.icon.setImageDrawable(circle); holder.icon.setImageDrawable(circle);
return convertView; return convertView;

View File

@@ -26,7 +26,6 @@ import app.organicmaps.car.util.CurrentCountryChangedListener;
import app.organicmaps.car.util.IntentUtils; import app.organicmaps.car.util.IntentUtils;
import app.organicmaps.car.util.ThemeUtils; import app.organicmaps.car.util.ThemeUtils;
import app.organicmaps.car.util.UserActionRequired; import app.organicmaps.car.util.UserActionRequired;
import app.organicmaps.routing.RoutingController;
import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.PlacePageActivationListener; import app.organicmaps.sdk.PlacePageActivationListener;
import app.organicmaps.sdk.bookmarks.data.MapObject; import app.organicmaps.sdk.bookmarks.data.MapObject;
@@ -34,6 +33,7 @@ import app.organicmaps.sdk.display.DisplayChangedListener;
import app.organicmaps.sdk.display.DisplayManager; import app.organicmaps.sdk.display.DisplayManager;
import app.organicmaps.sdk.display.DisplayType; import app.organicmaps.sdk.display.DisplayType;
import app.organicmaps.sdk.location.LocationState; import app.organicmaps.sdk.location.LocationState;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.util.Config; import app.organicmaps.sdk.util.Config;
import app.organicmaps.sdk.util.LocationUtils; import app.organicmaps.sdk.util.LocationUtils;
import app.organicmaps.sdk.util.log.Logger; import app.organicmaps.sdk.util.log.Logger;

View File

@@ -27,8 +27,11 @@ public class SurfaceRenderer implements DefaultLifecycleObserver, SurfaceCallbac
{ {
private static final String TAG = SurfaceRenderer.class.getSimpleName(); private static final String TAG = SurfaceRenderer.class.getSimpleName();
@NonNull
private final CarContext mCarContext; private final CarContext mCarContext;
private final Map mMap = new Map(Car);
@NonNull
private final Map mMap;
@NonNull @NonNull
private Rect mVisibleArea = new Rect(); private Rect mVisibleArea = new Rect();
@@ -42,6 +45,7 @@ public class SurfaceRenderer implements DefaultLifecycleObserver, SurfaceCallbac
{ {
Logger.d(TAG, "SurfaceRenderer()"); Logger.d(TAG, "SurfaceRenderer()");
mCarContext = carContext; mCarContext = carContext;
mMap = new Map(Car, MwmApplication.from(mCarContext).getLocationHelper());
mIsRunning = true; mIsRunning = true;
lifecycle.addObserver(this); lifecycle.addObserver(this);
mMap.setMapRenderingListener(this); mMap.setMapRenderingListener(this);

View File

@@ -28,11 +28,11 @@ import app.organicmaps.car.util.RoutingUtils;
import app.organicmaps.car.util.ThemeUtils; import app.organicmaps.car.util.ThemeUtils;
import app.organicmaps.car.util.UiHelpers; import app.organicmaps.car.util.UiHelpers;
import app.organicmaps.routing.NavigationService; import app.organicmaps.routing.NavigationService;
import app.organicmaps.routing.RoutingController;
import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.location.LocationHelper; import app.organicmaps.sdk.location.LocationHelper;
import app.organicmaps.sdk.location.LocationListener; import app.organicmaps.sdk.location.LocationListener;
import app.organicmaps.sdk.routing.JunctionInfo; import app.organicmaps.sdk.routing.JunctionInfo;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.routing.RoutingInfo; import app.organicmaps.sdk.routing.RoutingInfo;
import app.organicmaps.sdk.sound.TtsPlayer; import app.organicmaps.sdk.sound.TtsPlayer;
import app.organicmaps.sdk.util.LocationUtils; import app.organicmaps.sdk.util.LocationUtils;

View File

@@ -35,11 +35,11 @@ import app.organicmaps.car.util.OnBackPressedCallback;
import app.organicmaps.car.util.RoutingHelpers; import app.organicmaps.car.util.RoutingHelpers;
import app.organicmaps.car.util.UiHelpers; import app.organicmaps.car.util.UiHelpers;
import app.organicmaps.routing.ResultCodesHelper; import app.organicmaps.routing.ResultCodesHelper;
import app.organicmaps.routing.RoutingController;
import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.Router; import app.organicmaps.sdk.Router;
import app.organicmaps.sdk.bookmarks.data.MapObject; import app.organicmaps.sdk.bookmarks.data.MapObject;
import app.organicmaps.sdk.bookmarks.data.Metadata; import app.organicmaps.sdk.bookmarks.data.Metadata;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.routing.RoutingInfo; import app.organicmaps.sdk.routing.RoutingInfo;
import app.organicmaps.sdk.util.Config; import app.organicmaps.sdk.util.Config;
import java.util.Objects; import java.util.Objects;

View File

@@ -7,9 +7,9 @@ import androidx.car.app.CarContext;
import androidx.car.app.ScreenManager; import androidx.car.app.ScreenManager;
import app.organicmaps.car.screens.download.DownloadMapsScreen; import app.organicmaps.car.screens.download.DownloadMapsScreen;
import app.organicmaps.car.screens.download.DownloadMapsScreenBuilder; import app.organicmaps.car.screens.download.DownloadMapsScreenBuilder;
import app.organicmaps.routing.RoutingController;
import app.organicmaps.sdk.downloader.CountryItem; import app.organicmaps.sdk.downloader.CountryItem;
import app.organicmaps.sdk.downloader.MapManager; import app.organicmaps.sdk.downloader.MapManager;
import app.organicmaps.sdk.routing.RoutingController;
public class CurrentCountryChangedListener implements MapManager.CurrentCountryChangedListener public class CurrentCountryChangedListener implements MapManager.CurrentCountryChangedListener
{ {

View File

@@ -15,13 +15,13 @@ import app.organicmaps.car.CarAppService;
import app.organicmaps.car.SurfaceRenderer; import app.organicmaps.car.SurfaceRenderer;
import app.organicmaps.car.screens.NavigationScreen; import app.organicmaps.car.screens.NavigationScreen;
import app.organicmaps.car.screens.search.SearchScreen; import app.organicmaps.car.screens.search.SearchScreen;
import app.organicmaps.routing.RoutingController;
import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.Map; import app.organicmaps.sdk.Map;
import app.organicmaps.sdk.api.ParsedSearchRequest; import app.organicmaps.sdk.api.ParsedSearchRequest;
import app.organicmaps.sdk.api.RequestType; import app.organicmaps.sdk.api.RequestType;
import app.organicmaps.sdk.display.DisplayManager; import app.organicmaps.sdk.display.DisplayManager;
import app.organicmaps.sdk.display.DisplayType; import app.organicmaps.sdk.display.DisplayType;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.util.log.Logger; import app.organicmaps.sdk.util.log.Logger;
public final class IntentUtils public final class IntentUtils

View File

@@ -8,8 +8,8 @@ import androidx.annotation.StringRes;
import androidx.annotation.UiThread; import androidx.annotation.UiThread;
import androidx.car.app.CarContext; import androidx.car.app.CarContext;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.routing.RoutingController;
import app.organicmaps.sdk.MapStyle; import app.organicmaps.sdk.MapStyle;
import app.organicmaps.sdk.routing.RoutingController;
public final class ThemeUtils public final class ThemeUtils
{ {

View File

@@ -20,9 +20,9 @@ import androidx.recyclerview.widget.RecyclerView;
import app.organicmaps.MwmActivity; import app.organicmaps.MwmActivity;
import app.organicmaps.MwmApplication; import app.organicmaps.MwmApplication;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.routing.RoutingController;
import app.organicmaps.sdk.downloader.CountryItem; import app.organicmaps.sdk.downloader.CountryItem;
import app.organicmaps.sdk.downloader.MapManager; import app.organicmaps.sdk.downloader.MapManager;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.util.StringUtils; import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment; import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;

View File

@@ -24,8 +24,8 @@ import app.organicmaps.widget.PlaceholderView;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class DownloaderFragment extends BaseMwmRecyclerFragment<DownloaderAdapter> public class DownloaderFragment
implements MenuBottomSheetFragment.MenuBottomSheetInterface extends BaseMwmRecyclerFragment<DownloaderAdapter> implements MenuBottomSheetFragment.MenuBottomSheetInterface
{ {
private DownloaderToolbarController mToolbarController; private DownloaderToolbarController mToolbarController;
@@ -153,7 +153,8 @@ public class DownloaderFragment extends BaseMwmRecyclerFragment<DownloaderAdapte
mBottomPanel = new BottomPanel(this, view); mBottomPanel = new BottomPanel(this, view);
mToolbarController = new DownloaderToolbarController(view, requireActivity(), this); mToolbarController = new DownloaderToolbarController(view, requireActivity(), this);
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), mToolbarController.getBackPressedCallback()); requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(),
mToolbarController.getBackPressedCallback());
update(); update();
} }
@@ -195,7 +196,8 @@ public class DownloaderFragment extends BaseMwmRecyclerFragment<DownloaderAdapte
{ {
if (mAdapter == null) if (mAdapter == null)
mAdapter = new DownloaderAdapter(this); mAdapter = new DownloaderAdapter(this);
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), mAdapter.getBackPressedCallback()); requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(),
mAdapter.getBackPressedCallback());
return mAdapter; return mAdapter;
} }

View File

@@ -9,9 +9,9 @@ import androidx.core.view.ViewCompat;
import app.organicmaps.MwmActivity; import app.organicmaps.MwmActivity;
import app.organicmaps.MwmApplication; import app.organicmaps.MwmApplication;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.routing.RoutingController;
import app.organicmaps.sdk.downloader.CountryItem; import app.organicmaps.sdk.downloader.CountryItem;
import app.organicmaps.sdk.downloader.MapManager; import app.organicmaps.sdk.downloader.MapManager;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.util.Config; import app.organicmaps.sdk.util.Config;
import app.organicmaps.sdk.util.ConnectionState; import app.organicmaps.sdk.util.ConnectionState;
import app.organicmaps.sdk.util.StringUtils; import app.organicmaps.sdk.util.StringUtils;

View File

@@ -87,8 +87,8 @@ public class AdvancedTimetableFragment extends BaseMwmFragment implements View.O
private void setExampleDrawables(@DrawableRes int left, @DrawableRes int right) private void setExampleDrawables(@DrawableRes int left, @DrawableRes int right)
{ {
mExamplesTitle.setCompoundDrawablesRelativeWithIntrinsicBounds( mExamplesTitle.setCompoundDrawablesRelativeWithIntrinsicBounds(
Graphics.tint(requireActivity(), left, androidx.appcompat.R.attr.colorAccent), null, Graphics.tint(requireActivity(), left, com.google.android.material.R.attr.colorSecondary), null,
Graphics.tint(requireActivity(), right, androidx.appcompat.R.attr.colorAccent), null); Graphics.tint(requireActivity(), right, com.google.android.material.R.attr.colorSecondary), null);
} }
@Override @Override

View File

@@ -20,13 +20,13 @@ import androidx.recyclerview.widget.RecyclerView;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.base.BaseMwmFragment; import app.organicmaps.base.BaseMwmFragment;
import app.organicmaps.dialog.EditTextDialogFragment; import app.organicmaps.dialog.EditTextDialogFragment;
import app.organicmaps.editor.data.TimeFormatUtils;
import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.bookmarks.data.Metadata; import app.organicmaps.sdk.bookmarks.data.Metadata;
import app.organicmaps.sdk.editor.Editor; import app.organicmaps.sdk.editor.Editor;
import app.organicmaps.sdk.editor.OpeningHours; import app.organicmaps.sdk.editor.OpeningHours;
import app.organicmaps.sdk.editor.data.LocalizedName; import app.organicmaps.sdk.editor.data.LocalizedName;
import app.organicmaps.sdk.editor.data.LocalizedStreet; import app.organicmaps.sdk.editor.data.LocalizedStreet;
import app.organicmaps.editor.data.TimeFormatUtils;
import app.organicmaps.sdk.editor.data.Timetable; import app.organicmaps.sdk.editor.data.Timetable;
import app.organicmaps.sdk.util.StringUtils; import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;

View File

@@ -292,8 +292,8 @@ public class EditorHostFragment
editMapObject(); editMapObject();
} }
case STREET -> case STREET ->
setStreet(((StreetFragment) getChildFragmentManager().findFragmentByTag(StreetFragment.class.getName())) setStreet(
.getStreet()); ((StreetFragment) getChildFragmentManager().findFragmentByTag(StreetFragment.class.getName())).getStreet());
case CUISINE -> case CUISINE ->
{ {
String[] cuisines = String[] cuisines =

View File

@@ -9,7 +9,9 @@ import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.sdk.editor.data.FeatureCategory; import app.organicmaps.sdk.editor.data.FeatureCategory;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textview.MaterialTextView; import com.google.android.material.textview.MaterialTextView;
public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
@@ -21,6 +23,12 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
private final FeatureCategoryFragment mFragment; private final FeatureCategoryFragment mFragment;
private final FeatureCategory mSelectedCategory; private final FeatureCategory mSelectedCategory;
public interface FooterListener
{
void onNoteTextChanged(String newText);
void onSendNoteClicked();
}
public FeatureCategoryAdapter(@NonNull FeatureCategoryFragment host, @NonNull FeatureCategory[] categories, public FeatureCategoryAdapter(@NonNull FeatureCategoryFragment host, @NonNull FeatureCategory[] categories,
@Nullable FeatureCategory category) @Nullable FeatureCategory category)
{ {
@@ -57,7 +65,8 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
case TYPE_FOOTER -> case TYPE_FOOTER ->
{ {
return new FooterViewHolder( return new FooterViewHolder(
LayoutInflater.from(parent.getContext()).inflate(R.layout.item_feature_category_footer, parent, false)); LayoutInflater.from(parent.getContext()).inflate(R.layout.item_feature_category_footer, parent, false),
(FooterListener) mFragment);
} }
default -> throw new IllegalArgumentException("Unsupported"); default -> throw new IllegalArgumentException("Unsupported");
} }
@@ -70,6 +79,10 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
{ {
((FeatureViewHolder) holder).bind(position); ((FeatureViewHolder) holder).bind(position);
} }
else if (holder instanceof FooterViewHolder)
{
((FooterViewHolder) holder).bind(mFragment.getPendingNoteText());
}
} }
@Override @Override
@@ -105,11 +118,36 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
protected static class FooterViewHolder extends RecyclerView.ViewHolder protected static class FooterViewHolder extends RecyclerView.ViewHolder
{ {
FooterViewHolder(@NonNull View itemView) private final TextInputEditText mNoteEditText;
private final View mSendNoteButton;
FooterViewHolder(@NonNull View itemView, @NonNull FooterListener listener)
{ {
super(itemView); super(itemView);
MaterialTextView categoryUnsuitableText = itemView.findViewById(R.id.editor_category_unsuitable_text); MaterialTextView categoryUnsuitableText = itemView.findViewById(R.id.editor_category_unsuitable_text);
categoryUnsuitableText.setMovementMethod(LinkMovementMethod.getInstance()); categoryUnsuitableText.setMovementMethod(LinkMovementMethod.getInstance());
mNoteEditText = itemView.findViewById(R.id.note_edit_text);
mSendNoteButton = itemView.findViewById(R.id.send_note_button);
mSendNoteButton.setOnClickListener(v -> listener.onSendNoteClicked());
mNoteEditText.addTextChangedListener(new StringUtils.SimpleTextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
final String str = s.toString();
listener.onNoteTextChanged(str);
mSendNoteButton.setEnabled(!str.trim().isEmpty());
}
});
}
public void bind(String pendingNoteText)
{
if (!mNoteEditText.getText().toString().equals(pendingNoteText))
{
mNoteEditText.setText(pendingNoteText);
if (pendingNoteText != null)
mNoteEditText.setSelection(pendingNoteText.length());
}
mSendNoteButton.setEnabled(pendingNoteText != null && !pendingNoteText.trim().isEmpty());
} }
} }

View File

@@ -2,28 +2,39 @@ package app.organicmaps.editor;
import static app.organicmaps.sdk.util.Utils.getLocalizedFeatureType; import static app.organicmaps.sdk.util.Utils.getLocalizedFeatureType;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.CallSuper; import androidx.annotation.CallSuper;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import app.organicmaps.MwmApplication;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.base.BaseMwmRecyclerFragment; import app.organicmaps.base.BaseMwmRecyclerFragment;
import app.organicmaps.dialog.EditTextDialogFragment;
import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.editor.Editor; import app.organicmaps.sdk.editor.Editor;
import app.organicmaps.sdk.editor.OsmOAuth;
import app.organicmaps.sdk.editor.data.FeatureCategory; import app.organicmaps.sdk.editor.data.FeatureCategory;
import app.organicmaps.sdk.util.Language; import app.organicmaps.sdk.util.Language;
import app.organicmaps.util.Utils; import app.organicmaps.util.Utils;
import app.organicmaps.widget.SearchToolbarController; import app.organicmaps.widget.SearchToolbarController;
import app.organicmaps.widget.ToolbarController; import app.organicmaps.widget.ToolbarController;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.Arrays; import java.util.Arrays;
import java.util.Comparator; import java.util.Comparator;
public class FeatureCategoryFragment extends BaseMwmRecyclerFragment<FeatureCategoryAdapter> public class FeatureCategoryFragment
extends BaseMwmRecyclerFragment<FeatureCategoryAdapter> implements FeatureCategoryAdapter.FooterListener
{ {
private FeatureCategory mSelectedCategory; private FeatureCategory mSelectedCategory;
protected ToolbarController mToolbarController; protected ToolbarController mToolbarController;
private static final String NOTE_CONFIRMATION_SHOWN = "NoteConfirmationAlertWasShown";
private static String mPendingNoteText = "";
public interface FeatureCategoryListener public interface FeatureCategoryListener
{ {
@@ -104,4 +115,64 @@ public class FeatureCategoryFragment extends BaseMwmRecyclerFragment<FeatureCate
else if (getParentFragment() instanceof FeatureCategoryListener) else if (getParentFragment() instanceof FeatureCategoryListener)
((FeatureCategoryListener) getParentFragment()).onFeatureCategorySelected(category); ((FeatureCategoryListener) getParentFragment()).onFeatureCategorySelected(category);
} }
public String getPendingNoteText()
{
return mPendingNoteText;
}
@Override
public void onNoteTextChanged(String newText)
{
mPendingNoteText = newText;
}
@Override
public void onSendNoteClicked()
{
if (!OsmOAuth.isAuthorized())
{
final Intent intent = new Intent(requireActivity(), OsmLoginActivity.class);
startActivity(intent);
return;
}
final double[] center = Framework.nativeGetScreenRectCenter();
final double lat = center[0];
final double lon = center[1];
if (!MwmApplication.prefs(requireContext().getApplicationContext()).contains(NOTE_CONFIRMATION_SHOWN))
{
showNoteConfirmationDialog(lat, lon, mPendingNoteText);
}
else
{
Editor.nativeCreateStandaloneNote(lat, lon, mPendingNoteText);
mPendingNoteText = "";
Toast.makeText(requireContext(), R.string.osm_note_toast, Toast.LENGTH_SHORT).show();
requireActivity().finish();
}
}
// Duplicate of showNoobDialog()
private void showNoteConfirmationDialog(double lat, double lon, String noteText)
{
new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog)
.setTitle(R.string.editor_share_to_all_dialog_title)
.setMessage(getString(R.string.editor_share_to_all_dialog_message_1) + " "
+ getString(R.string.editor_share_to_all_dialog_message_2))
.setPositiveButton(android.R.string.ok,
(dlg, which) -> {
MwmApplication.prefs(requireContext().getApplicationContext())
.edit()
.putBoolean(NOTE_CONFIRMATION_SHOWN, true)
.apply();
Editor.nativeCreateStandaloneNote(lat, lon, noteText);
mPendingNoteText = "";
Toast.makeText(requireContext(), R.string.osm_note_toast, Toast.LENGTH_SHORT).show();
requireActivity().finish();
})
.setNegativeButton(R.string.cancel, null)
.show();
}
} }

View File

@@ -13,9 +13,9 @@ import androidx.appcompat.widget.SwitchCompat;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.editor.data.TimeFormatUtils;
import app.organicmaps.sdk.editor.OpeningHours; import app.organicmaps.sdk.editor.OpeningHours;
import app.organicmaps.sdk.editor.data.HoursMinutes; import app.organicmaps.sdk.editor.data.HoursMinutes;
import app.organicmaps.editor.data.TimeFormatUtils;
import app.organicmaps.sdk.editor.data.Timespan; import app.organicmaps.sdk.editor.data.Timespan;
import app.organicmaps.sdk.editor.data.Timetable; import app.organicmaps.sdk.editor.data.Timetable;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;

View File

@@ -10,7 +10,6 @@ import androidx.core.content.IntentCompat;
import app.organicmaps.MwmActivity; import app.organicmaps.MwmActivity;
import app.organicmaps.MwmApplication; import app.organicmaps.MwmApplication;
import app.organicmaps.editor.OsmLoginActivity; import app.organicmaps.editor.OsmLoginActivity;
import app.organicmaps.routing.RoutingController;
import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.Map; import app.organicmaps.sdk.Map;
import app.organicmaps.sdk.api.ParsedRoutingData; import app.organicmaps.sdk.api.ParsedRoutingData;
@@ -20,6 +19,7 @@ import app.organicmaps.sdk.api.RoutePoint;
import app.organicmaps.sdk.bookmarks.data.BookmarkManager; import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
import app.organicmaps.sdk.bookmarks.data.FeatureId; import app.organicmaps.sdk.bookmarks.data.FeatureId;
import app.organicmaps.sdk.bookmarks.data.MapObject; import app.organicmaps.sdk.bookmarks.data.MapObject;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.search.SearchEngine; import app.organicmaps.sdk.search.SearchEngine;
import app.organicmaps.sdk.util.StorageUtils; import app.organicmaps.sdk.util.StorageUtils;
import app.organicmaps.sdk.util.concurrency.ThreadPool; import app.organicmaps.sdk.util.concurrency.ThreadPool;

View File

@@ -26,7 +26,6 @@ import app.organicmaps.MwmActivity;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.leftbutton.LeftButton; import app.organicmaps.leftbutton.LeftButton;
import app.organicmaps.leftbutton.LeftToggleButton; import app.organicmaps.leftbutton.LeftToggleButton;
import app.organicmaps.routing.RoutingController;
import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.downloader.MapManager; import app.organicmaps.sdk.downloader.MapManager;
import app.organicmaps.sdk.downloader.UpdateInfo; import app.organicmaps.sdk.downloader.UpdateInfo;
@@ -34,6 +33,7 @@ import app.organicmaps.sdk.location.TrackRecorder;
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager; import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
import app.organicmaps.sdk.maplayer.subway.SubwayManager; import app.organicmaps.sdk.maplayer.subway.SubwayManager;
import app.organicmaps.sdk.maplayer.traffic.TrafficManager; import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.util.Config; import app.organicmaps.sdk.util.Config;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.ThemeUtils; import app.organicmaps.util.ThemeUtils;

View File

@@ -14,7 +14,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.StringRes; import androidx.annotation.StringRes;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.routing.RoutingController; import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.search.SearchEngine; import app.organicmaps.sdk.search.SearchEngine;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.sdk.util.concurrency.UiThread; import app.organicmaps.sdk.util.concurrency.UiThread;
@@ -215,7 +215,7 @@ public class SearchWheel implements View.OnClickListener
final SearchOption searchOption = mMapButtonsViewModel.getSearchOption().getValue(); final SearchOption searchOption = mMapButtonsViewModel.getSearchOption().getValue();
mSearchButton.setImageDrawable(Graphics.tint( mSearchButton.setImageDrawable(Graphics.tint(
mSearchButton.getContext(), searchOption == null ? R.drawable.ic_routing_search_off : searchOption.mDrawableOff, mSearchButton.getContext(), searchOption == null ? R.drawable.ic_routing_search_off : searchOption.mDrawableOff,
androidx.appcompat.R.attr.colorAccent)); com.google.android.material.R.attr.colorSecondary));
} }
@Override @Override

View File

@@ -14,6 +14,7 @@ import app.organicmaps.MwmApplication;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.sdk.maplayer.Mode; import app.organicmaps.sdk.maplayer.Mode;
import app.organicmaps.sdk.util.SharedPropertiesUtils; import app.organicmaps.sdk.util.SharedPropertiesUtils;
import app.organicmaps.util.ThemeSwitcher;
import app.organicmaps.util.Utils; import app.organicmaps.util.Utils;
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment; import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
import app.organicmaps.widget.recycler.SpanningLinearLayoutManager; import app.organicmaps.widget.recycler.SpanningLinearLayoutManager;
@@ -72,6 +73,9 @@ public class ToggleMapLayerFragment extends Fragment
Context context = v.getContext(); Context context = v.getContext();
SharedPropertiesUtils.setLayerMarkerShownForLayerMode(mode); SharedPropertiesUtils.setLayerMarkerShownForLayerMode(mode);
mode.setEnabled(context, !mode.isEnabled(context)); mode.setEnabled(context, !mode.isEnabled(context));
// TODO: dirty hack :(
if (mode == Mode.OUTDOORS)
ThemeSwitcher.INSTANCE.restart(true);
mAdapter.notifyDataSetChanged(); mAdapter.notifyDataSetChanged();
mMapButtonsController.updateLayerButton(); mMapButtonsController.updateLayerButton();
if (MwmApplication.from(context).getIsolinesManager().shouldShowNotification()) if (MwmApplication.from(context).getIsolinesManager().shouldShowNotification())

View File

@@ -15,6 +15,7 @@ import app.organicmaps.R;
import app.organicmaps.adapter.DisabledChildSimpleExpandableListAdapter; import app.organicmaps.adapter.DisabledChildSimpleExpandableListAdapter;
import app.organicmaps.base.BaseMwmDialogFragment; import app.organicmaps.base.BaseMwmDialogFragment;
import app.organicmaps.sdk.downloader.CountryItem; import app.organicmaps.sdk.downloader.CountryItem;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.util.StringUtils; import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;

View File

@@ -11,14 +11,14 @@ import android.view.ViewGroup;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.content.res.AppCompatResources; import androidx.appcompat.content.res.AppCompatResources;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.sdk.bookmarks.data.MapObject; import app.organicmaps.sdk.bookmarks.data.MapObject;
import app.organicmaps.sdk.routing.RouteMarkData; import app.organicmaps.sdk.routing.RouteMarkData;
import app.organicmaps.sdk.routing.RouteMarkType; import app.organicmaps.sdk.routing.RouteMarkType;
import app.organicmaps.sdk.util.StringUtils; import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textview.MaterialTextView;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;

View File

@@ -22,6 +22,7 @@ import app.organicmaps.R;
import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.bookmarks.data.MapObject; import app.organicmaps.sdk.bookmarks.data.MapObject;
import app.organicmaps.sdk.routing.RouteMarkData; import app.organicmaps.sdk.routing.RouteMarkData;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.android.material.bottomsheet.BottomSheetDialog;

View File

@@ -18,6 +18,7 @@ import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.Router; import app.organicmaps.sdk.Router;
import app.organicmaps.sdk.maplayer.traffic.TrafficManager; import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
import app.organicmaps.sdk.routing.CarDirection; import app.organicmaps.sdk.routing.CarDirection;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.routing.RoutingInfo; import app.organicmaps.sdk.routing.RoutingInfo;
import app.organicmaps.sdk.util.StringUtils; import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;

View File

@@ -35,6 +35,7 @@ import app.organicmaps.R;
import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.location.LocationHelper; import app.organicmaps.sdk.location.LocationHelper;
import app.organicmaps.sdk.location.LocationListener; import app.organicmaps.sdk.location.LocationListener;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.routing.RoutingInfo; import app.organicmaps.sdk.routing.RoutingInfo;
import app.organicmaps.sdk.sound.MediaPlayerWrapper; import app.organicmaps.sdk.sound.MediaPlayerWrapper;
import app.organicmaps.sdk.sound.TtsPlayer; import app.organicmaps.sdk.sound.TtsPlayer;

View File

@@ -32,6 +32,7 @@ import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.bookmarks.data.DistanceAndAzimut; import app.organicmaps.sdk.bookmarks.data.DistanceAndAzimut;
import app.organicmaps.sdk.routing.RouteMarkData; import app.organicmaps.sdk.routing.RouteMarkData;
import app.organicmaps.sdk.routing.RouteMarkType; import app.organicmaps.sdk.routing.RouteMarkType;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.routing.RoutingInfo; import app.organicmaps.sdk.routing.RoutingInfo;
import app.organicmaps.sdk.routing.TransitRouteInfo; import app.organicmaps.sdk.routing.TransitRouteInfo;
import app.organicmaps.sdk.routing.TransitStepInfo; import app.organicmaps.sdk.routing.TransitStepInfo;
@@ -39,6 +40,7 @@ import app.organicmaps.sdk.util.Distance;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.Graphics; import app.organicmaps.util.Graphics;
import app.organicmaps.util.ThemeUtils; import app.organicmaps.util.ThemeUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.widget.recycler.DotDividerItemDecoration; import app.organicmaps.widget.recycler.DotDividerItemDecoration;
import app.organicmaps.widget.recycler.MultilineLayoutManager; import app.organicmaps.widget.recycler.MultilineLayoutManager;
import com.google.android.material.imageview.ShapeableImageView; import com.google.android.material.imageview.ShapeableImageView;
@@ -117,10 +119,11 @@ final class RoutingBottomMenuController implements View.OnClickListener
private RoutingBottomMenuController(@NonNull Activity context, @NonNull View altitudeChartFrame, private RoutingBottomMenuController(@NonNull Activity context, @NonNull View altitudeChartFrame,
@NonNull View timeElevationLine, @NonNull View transitFrame, @NonNull View timeElevationLine, @NonNull View transitFrame,
@NonNull MaterialTextView error, @NonNull Button start, @NonNull ImageView altitudeChart, @NonNull MaterialTextView error, @NonNull Button start,
@NonNull MaterialTextView time, @NonNull MaterialTextView altitudeDifference, @NonNull ImageView altitudeChart, @NonNull MaterialTextView time,
@NonNull TextView timeVehicle, @Nullable MaterialTextView arrival, @NonNull MaterialTextView altitudeDifference, @NonNull TextView timeVehicle,
@NonNull View actionFrame, @Nullable RoutingBottomMenuListener listener) @Nullable MaterialTextView arrival, @NonNull View actionFrame,
@Nullable RoutingBottomMenuListener listener)
{ {
mContext = context; mContext = context;
mAltitudeChartFrame = altitudeChartFrame; mAltitudeChartFrame = altitudeChartFrame;
@@ -191,8 +194,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
scrollToBottom(rv); scrollToBottom(rv);
MaterialTextView totalTimeView = mTransitFrame.findViewById(R.id.total_time); MaterialTextView totalTimeView = mTransitFrame.findViewById(R.id.total_time);
totalTimeView.setText( totalTimeView.setText(Utils.formatRoutingTime(mContext, info.getTotalTime(), R.dimen.text_size_routing_number));
RoutingController.formatRoutingTime(mContext, info.getTotalTime(), R.dimen.text_size_routing_number));
View dotView = mTransitFrame.findViewById(R.id.dot); View dotView = mTransitFrame.findViewById(R.id.dot);
View pedestrianIcon = mTransitFrame.findViewById(R.id.pedestrian_icon); View pedestrianIcon = mTransitFrame.findViewById(R.id.pedestrian_icon);
MaterialTextView distanceView = mTransitFrame.findViewById(R.id.total_distance); MaterialTextView distanceView = mTransitFrame.findViewById(R.id.total_distance);
@@ -261,9 +263,9 @@ final class RoutingBottomMenuController implements View.OnClickListener
{ {
UiUtils.show(mActionButton); UiUtils.show(mActionButton);
Drawable icon = ContextCompat.getDrawable(mContext, R.drawable.ic_location_crosshair); Drawable icon = ContextCompat.getDrawable(mContext, R.drawable.ic_location_crosshair);
int colorAccent = ContextCompat.getColor( int colorSecondary = ContextCompat.getColor(
mContext, UiUtils.getStyledResourceId(mContext, androidx.appcompat.R.attr.colorAccent)); mContext, UiUtils.getStyledResourceId(mContext, com.google.android.material.R.attr.colorSecondary));
mActionIcon.setImageDrawable(Graphics.tint(icon, colorAccent)); mActionIcon.setImageDrawable(Graphics.tint(icon, colorSecondary));
} }
else else
{ {
@@ -382,7 +384,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
if (mArrival != null) if (mArrival != null)
{ {
String arrivalTime = RoutingController.formatArrivalTime(rinfo.totalTimeInSeconds); String arrivalTime = Utils.formatArrivalTime(rinfo.totalTimeInSeconds);
mArrival.setText(arrivalTime); mArrival.setText(arrivalTime);
} }
} }
@@ -400,7 +402,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
{ {
CharSequence time = CharSequence time =
RoutingController.formatRoutingTime(context, routingInfo.totalTimeInSeconds, R.dimen.text_size_routing_number); Utils.formatRoutingTime(context, routingInfo.totalTimeInSeconds, R.dimen.text_size_routing_number);
SpannableStringBuilder builder = new SpannableStringBuilder(); SpannableStringBuilder builder = new SpannableStringBuilder();
initTimeBuilderSequence(context, time, builder); initTimeBuilderSequence(context, time, builder);

View File

@@ -13,11 +13,11 @@ import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.FragmentFactory; import androidx.fragment.app.FragmentFactory;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.sdk.downloader.CountryItem; import app.organicmaps.sdk.downloader.CountryItem;
import app.organicmaps.sdk.downloader.MapManager; import app.organicmaps.sdk.downloader.MapManager;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.textview.MaterialTextView;
public class RoutingErrorDialogFragment extends BaseRoutingErrorDialogFragment public class RoutingErrorDialogFragment extends BaseRoutingErrorDialogFragment
{ {

View File

@@ -11,6 +11,7 @@ import androidx.fragment.app.FragmentFactory;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.sdk.downloader.CountryItem; import app.organicmaps.sdk.downloader.CountryItem;
import app.organicmaps.sdk.downloader.MapManager; import app.organicmaps.sdk.downloader.MapManager;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.widget.WheelProgressView; import app.organicmaps.widget.WheelProgressView;
import java.util.HashSet; import java.util.HashSet;

View File

@@ -17,6 +17,7 @@ import app.organicmaps.MwmApplication;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.Router; import app.organicmaps.sdk.Router;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.routing.RoutingInfo; import app.organicmaps.sdk.routing.RoutingInfo;
import app.organicmaps.sdk.routing.RoutingOptions; import app.organicmaps.sdk.routing.RoutingOptions;
import app.organicmaps.sdk.routing.TransitRouteInfo; import app.organicmaps.sdk.routing.TransitRouteInfo;

View File

@@ -10,6 +10,7 @@ import app.organicmaps.MwmActivity;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.base.BaseMwmFragment; import app.organicmaps.base.BaseMwmFragment;
import app.organicmaps.sdk.Router; import app.organicmaps.sdk.Router;
import app.organicmaps.sdk.routing.RoutingController;
public class RoutingPlanFragment extends BaseMwmFragment public class RoutingPlanFragment extends BaseMwmFragment
{ {

View File

@@ -4,9 +4,9 @@ import android.content.Context;
import android.graphics.Rect; import android.graphics.Rect;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.Surface; import android.view.Surface;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import app.organicmaps.BuildConfig; import app.organicmaps.BuildConfig;
import app.organicmaps.MwmApplication;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.sdk.display.DisplayType; import app.organicmaps.sdk.display.DisplayType;
import app.organicmaps.sdk.location.LocationHelper; import app.organicmaps.sdk.location.LocationHelper;
@@ -53,8 +53,12 @@ public final class Map
public static final int INVALID_POINTER_MASK = 0xFF; public static final int INVALID_POINTER_MASK = 0xFF;
public static final int INVALID_TOUCH_ID = -1; public static final int INVALID_TOUCH_ID = -1;
@NonNull
private final DisplayType mDisplayType; private final DisplayType mDisplayType;
@NonNull
private final LocationHelper mLocationHelper;
private int mCurrentCompassOffsetX; private int mCurrentCompassOffsetX;
private int mCurrentCompassOffsetY; private int mCurrentCompassOffsetY;
private int mBottomWidgetOffsetX; private int mBottomWidgetOffsetX;
@@ -75,9 +79,10 @@ public final class Map
private static int sCurrentDpi = 0; private static int sCurrentDpi = 0;
public Map(DisplayType mapType) public Map(@NonNull DisplayType mapType, @NonNull LocationHelper locationHelper)
{ {
mDisplayType = mapType; mDisplayType = mapType;
mLocationHelper = locationHelper;
onCreate(false); onCreate(false);
} }
@@ -169,9 +174,7 @@ public final class Map
mRequireResize = false; mRequireResize = false;
setupWidgets(context, surfaceFrame.width(), surfaceFrame.height()); setupWidgets(context, surfaceFrame.width(), surfaceFrame.height());
final LocationHelper locationHelper = MwmApplication.from(context).getLocationHelper(); final boolean firstStart = mLocationHelper.isInFirstRun();
final boolean firstStart = locationHelper.isInFirstRun();
if (!nativeCreateEngine(surface, surfaceDpi, firstStart, mLaunchByDeepLink, BuildConfig.VERSION_CODE, if (!nativeCreateEngine(surface, surfaceDpi, firstStart, mLaunchByDeepLink, BuildConfig.VERSION_CODE,
ROMUtils.isCustomROM())) ROMUtils.isCustomROM()))
{ {
@@ -182,7 +185,7 @@ public final class Map
sCurrentDpi = surfaceDpi; sCurrentDpi = surfaceDpi;
if (firstStart) if (firstStart)
UiThread.runLater(locationHelper::onExitFromFirstRun); UiThread.runLater(mLocationHelper::onExitFromFirstRun);
mSurfaceCreated = true; mSurfaceCreated = true;
mSurfaceAttached = true; mSurfaceAttached = true;

View File

@@ -7,8 +7,8 @@ import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.ProcessLifecycleOwner; import androidx.lifecycle.ProcessLifecycleOwner;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.routing.RoutingController;
import app.organicmaps.sdk.bookmarks.data.BookmarkManager; import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
import app.organicmaps.sdk.bookmarks.data.Icon;
import app.organicmaps.sdk.downloader.Android7RootCertificateWorkaround; import app.organicmaps.sdk.downloader.Android7RootCertificateWorkaround;
import app.organicmaps.sdk.editor.OsmOAuth; import app.organicmaps.sdk.editor.OsmOAuth;
import app.organicmaps.sdk.location.LocationHelper; import app.organicmaps.sdk.location.LocationHelper;
@@ -16,16 +16,16 @@ import app.organicmaps.sdk.location.SensorHelper;
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager; import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
import app.organicmaps.sdk.maplayer.subway.SubwayManager; import app.organicmaps.sdk.maplayer.subway.SubwayManager;
import app.organicmaps.sdk.maplayer.traffic.TrafficManager; import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.search.SearchEngine; import app.organicmaps.sdk.search.SearchEngine;
import app.organicmaps.sdk.settings.StoragePathManager;
import app.organicmaps.sdk.sound.TtsPlayer; import app.organicmaps.sdk.sound.TtsPlayer;
import app.organicmaps.sdk.util.Config; import app.organicmaps.sdk.util.Config;
import app.organicmaps.sdk.util.SharedPropertiesUtils; import app.organicmaps.sdk.util.SharedPropertiesUtils;
import app.organicmaps.sdk.util.StorageUtils; import app.organicmaps.sdk.util.StorageUtils;
import app.organicmaps.sdk.util.ThemeSwitcher;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.sdk.util.log.Logger; import app.organicmaps.sdk.util.log.Logger;
import app.organicmaps.sdk.util.log.LogsManager; import app.organicmaps.sdk.util.log.LogsManager;
import app.organicmaps.settings.StoragePathManager;
import java.io.IOException; import java.io.IOException;
public final class OrganicMaps implements DefaultLifecycleObserver public final class OrganicMaps implements DefaultLifecycleObserver
@@ -96,9 +96,11 @@ public final class OrganicMaps implements DefaultLifecycleObserver
Android7RootCertificateWorkaround.initializeIfNeeded(mContext); Android7RootCertificateWorkaround.initializeIfNeeded(mContext);
Icon.loadDefaultIcons(mContext.getResources(), mContext.getPackageName());
mSensorHelper = new SensorHelper(mContext); mSensorHelper = new SensorHelper(mContext);
mLocationHelper = new LocationHelper(mContext, mSensorHelper); mLocationHelper = new LocationHelper(mContext, mSensorHelper);
mIsolinesManager = new IsolinesManager(mContext); mIsolinesManager = new IsolinesManager();
mSubwayManager = new SubwayManager(mContext); mSubwayManager = new SubwayManager(mContext);
} }
@@ -174,12 +176,10 @@ public final class OrganicMaps implements DefaultLifecycleObserver
nativeInitFramework(onComplete); nativeInitFramework(onComplete);
initNativeStrings(); initNativeStrings();
ThemeSwitcher.INSTANCE.initialize(mContext);
SearchEngine.INSTANCE.initialize(); SearchEngine.INSTANCE.initialize();
BookmarkManager.loadBookmarks(); BookmarkManager.loadBookmarks();
TtsPlayer.INSTANCE.initialize(mContext); TtsPlayer.INSTANCE.initialize(mContext);
ThemeSwitcher.INSTANCE.restart(false); RoutingController.get().initialize(mLocationHelper);
RoutingController.get().initialize(mContext);
TrafficManager.INSTANCE.initialize(); TrafficManager.INSTANCE.initialize();
mSubwayManager.initialize(); mSubwayManager.initialize();
mIsolinesManager.initialize(); mIsolinesManager.initialize();

View File

@@ -10,12 +10,12 @@ import java.lang.annotation.RetentionPolicy;
public @interface RequestType public @interface RequestType
{ {
// Represents url_scheme::ParsedMapApi::UrlType from c++ part. // Represents url_scheme::ParsedMapApi::UrlType from c++ part.
public static final int INCORRECT = 0; int INCORRECT = 0;
public static final int MAP = 1; int MAP = 1;
public static final int ROUTE = 2; int ROUTE = 2;
public static final int SEARCH = 3; int SEARCH = 3;
public static final int CROSSHAIR = 4; int CROSSHAIR = 4;
public static final int OAUTH2 = 5; int OAUTH2 = 5;
public static final int MENU = 6; int MENU = 6;
public static final int SETTINGS = 7; int SETTINGS = 7;
} }

View File

@@ -41,8 +41,6 @@ public enum BookmarkManager {
// These values have to match the values of kml::CompilationType from kml/types.hpp // These values have to match the values of kml::CompilationType from kml/types.hpp
public static final int CATEGORY = 0; public static final int CATEGORY = 0;
public static final List<Icon> ICONS = new ArrayList<>();
private static final String[] BOOKMARKS_EXTENSIONS = Framework.nativeGetBookmarksFilesExts(); private static final String[] BOOKMARKS_EXTENSIONS = Framework.nativeGetBookmarksFilesExts();
private static final String TAG = BookmarkManager.class.getSimpleName(); private static final String TAG = BookmarkManager.class.getSimpleName();
@@ -70,26 +68,6 @@ public enum BookmarkManager {
@Nullable @Nullable
private OnElevationActivePointChangedListener mOnElevationActivePointChangedListener; private OnElevationActivePointChangedListener mOnElevationActivePointChangedListener;
static
{
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_RED, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_PINK, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_PURPLE, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_DEEPPURPLE, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_BLUE, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_LIGHTBLUE, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_CYAN, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_TEAL, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_GREEN, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_LIME, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_YELLOW, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_ORANGE, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_DEEPORANGE, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_BROWN, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_GRAY, Icon.BOOKMARK_ICON_TYPE_NONE));
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_BLUEGRAY, Icon.BOOKMARK_ICON_TYPE_NONE));
}
public void toggleCategoryVisibility(@NonNull BookmarkCategory category) public void toggleCategoryVisibility(@NonNull BookmarkCategory category)
{ {
boolean isVisible = isVisible(category.getId()); boolean isVisible = isVisible(category.getId());
@@ -342,7 +320,7 @@ public enum BookmarkManager {
nativeShowBookmarkCategoryOnMap(catId); nativeShowBookmarkCategoryOnMap(catId);
} }
@Icon.PredefinedColor @PredefinedColors.Color
public int getLastEditedColor() public int getLastEditedColor()
{ {
return nativeGetLastEditedColor(); return nativeGetLastEditedColor();
@@ -618,7 +596,7 @@ public enum BookmarkManager {
return nativeGetBookmarkXY(bookmarkId); return nativeGetBookmarkXY(bookmarkId);
} }
@Icon.PredefinedColor @PredefinedColors.Color
public int getBookmarkColor(@IntRange(from = 0) long bookmarkId) public int getBookmarkColor(@IntRange(from = 0) long bookmarkId)
{ {
return nativeGetBookmarkColor(bookmarkId); return nativeGetBookmarkColor(bookmarkId);
@@ -652,7 +630,7 @@ public enum BookmarkManager {
} }
public void setBookmarkParams(@IntRange(from = 0) long bookmarkId, @NonNull String name, public void setBookmarkParams(@IntRange(from = 0) long bookmarkId, @NonNull String name,
@Icon.PredefinedColor int color, @NonNull String descr) @PredefinedColors.Color int color, @NonNull String descr)
{ {
nativeSetBookmarkParams(bookmarkId, name, color, descr); nativeSetBookmarkParams(bookmarkId, name, color, descr);
} }
@@ -808,7 +786,7 @@ public enum BookmarkManager {
@Nullable @Nullable
private native Bookmark nativeAddBookmarkToLastEditedCategory(double lat, double lon); private native Bookmark nativeAddBookmarkToLastEditedCategory(double lat, double lon);
@Icon.PredefinedColor @PredefinedColors.Color
private native int nativeGetLastEditedColor(); private native int nativeGetLastEditedColor();
private static native void nativeLoadBookmarksFile(@NonNull String path, boolean isTemporaryFile); private static native void nativeLoadBookmarksFile(@NonNull String path, boolean isTemporaryFile);
@@ -874,7 +852,7 @@ public enum BookmarkManager {
@NonNull @NonNull
private static native ParcelablePointD nativeGetBookmarkXY(@IntRange(from = 0) long bookmarkId); private static native ParcelablePointD nativeGetBookmarkXY(@IntRange(from = 0) long bookmarkId);
@Icon.PredefinedColor @PredefinedColors.Color
private static native int nativeGetBookmarkColor(@IntRange(from = 0) long bookmarkId); private static native int nativeGetBookmarkColor(@IntRange(from = 0) long bookmarkId);
private static native int nativeGetBookmarkIcon(@IntRange(from = 0) long bookmarkId); private static native int nativeGetBookmarkIcon(@IntRange(from = 0) long bookmarkId);
@@ -889,12 +867,13 @@ public enum BookmarkManager {
private static native String nativeEncode2Ge0Url(@IntRange(from = 0) long bookmarkId, boolean addName); private static native String nativeEncode2Ge0Url(@IntRange(from = 0) long bookmarkId, boolean addName);
private static native void nativeSetBookmarkParams(@IntRange(from = 0) long bookmarkId, @NonNull String name, private static native void nativeSetBookmarkParams(@IntRange(from = 0) long bookmarkId, @NonNull String name,
@Icon.PredefinedColor int color, @NonNull String descr); @PredefinedColors.Color int color, @NonNull String descr);
private static native void nativeChangeTrackColor(@IntRange(from = 0) long trackId, @Icon.PredefinedColor int color); private static native void nativeChangeTrackColor(@IntRange(from = 0) long trackId,
@PredefinedColors.Color int color);
private static native void nativeSetTrackParams(@IntRange(from = 0) long trackId, @NonNull String name, private static native void nativeSetTrackParams(@IntRange(from = 0) long trackId, @NonNull String name,
@Icon.PredefinedColor int color, @NonNull String descr); @PredefinedColors.Color int color, @NonNull String descr);
private static native void nativeChangeBookmarkCategory(@IntRange(from = 0) long oldCatId, private static native void nativeChangeBookmarkCategory(@IntRange(from = 0) long oldCatId,
@IntRange(from = 0) long newCatId, @IntRange(from = 0) long newCatId,

View File

@@ -1,108 +1,29 @@
package app.organicmaps.sdk.bookmarks.data; package app.organicmaps.sdk.bookmarks.data;
import android.content.res.Resources;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import androidx.annotation.ColorInt;
import androidx.annotation.DrawableRes; import androidx.annotation.DrawableRes;
import androidx.annotation.IntDef; import androidx.annotation.NonNull;
import app.organicmaps.sdk.R; import app.organicmaps.BuildConfig;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.log.Logger;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import java.lang.annotation.Retention; import dalvik.annotation.optimization.FastNative;
import java.lang.annotation.RetentionPolicy;
public class Icon implements Parcelable public class Icon implements Parcelable
{ {
@Retention(RetentionPolicy.SOURCE) private static final String TAG = Icon.class.getSimpleName();
@IntDef({PREDEFINED_COLOR_NONE, PREDEFINED_COLOR_RED, PREDEFINED_COLOR_BLUE, PREDEFINED_COLOR_PURPLE,
PREDEFINED_COLOR_YELLOW, PREDEFINED_COLOR_PINK, PREDEFINED_COLOR_BROWN, PREDEFINED_COLOR_GREEN,
PREDEFINED_COLOR_ORANGE, PREDEFINED_COLOR_DEEPPURPLE, PREDEFINED_COLOR_LIGHTBLUE, PREDEFINED_COLOR_CYAN,
PREDEFINED_COLOR_TEAL, PREDEFINED_COLOR_LIME, PREDEFINED_COLOR_DEEPORANGE, PREDEFINED_COLOR_GRAY,
PREDEFINED_COLOR_BLUEGRAY})
@interface PredefinedColor
{}
static final int PREDEFINED_COLOR_NONE = 0;
static final int PREDEFINED_COLOR_RED = 1;
static final int PREDEFINED_COLOR_BLUE = 2;
static final int PREDEFINED_COLOR_PURPLE = 3;
static final int PREDEFINED_COLOR_YELLOW = 4;
static final int PREDEFINED_COLOR_PINK = 5;
static final int PREDEFINED_COLOR_BROWN = 6;
static final int PREDEFINED_COLOR_GREEN = 7;
static final int PREDEFINED_COLOR_ORANGE = 8;
static final int PREDEFINED_COLOR_DEEPPURPLE = 9;
static final int PREDEFINED_COLOR_LIGHTBLUE = 10;
static final int PREDEFINED_COLOR_CYAN = 11;
static final int PREDEFINED_COLOR_TEAL = 12;
static final int PREDEFINED_COLOR_LIME = 13;
static final int PREDEFINED_COLOR_DEEPORANGE = 14;
static final int PREDEFINED_COLOR_GRAY = 15;
static final int PREDEFINED_COLOR_BLUEGRAY = 16;
private static int shift(int v, int bitCount)
{
return v << bitCount;
}
private static int toARGB(int r, int g, int b)
{
return shift(255, 24) + shift(r, 16) + shift(g, 8) + b;
}
/// @note Important! Should be synced with kml/types.hpp/PredefinedColor
/// @todo Values can be taken from Core.
private static final int[] ARGB_COLORS = {toARGB(229, 27, 35), // none
toARGB(229, 27, 35), // red
toARGB(0, 110, 199), // blue
toARGB(156, 39, 176), // purple
toARGB(255, 200, 0), // yellow
toARGB(255, 65, 130), // pink
toARGB(121, 85, 72), // brown
toARGB(56, 142, 60), // green
toARGB(255, 160, 0), // orange
toARGB(102, 57, 191), // deeppurple
toARGB(36, 156, 242), // lightblue
toARGB(20, 190, 205), // cyan
toARGB(0, 165, 140), // teal
toARGB(147, 191, 57), // lime
toARGB(240, 100, 50), // deeporange
toARGB(115, 115, 115), // gray
toARGB(89, 115, 128)}; // bluegray
static final int BOOKMARK_ICON_TYPE_NONE = 0;
/// @note Important! Should be synced with kml/types.hpp/BookmarkIcon
/// @todo Can make better: take name-by-type from Core and make a concat: "R.drawable.ic_bookmark_" + name.
// First icon should be "none" <-> BOOKMARK_ICON_TYPE_NONE.
@DrawableRes @DrawableRes
private static final int[] TYPE_ICONS = { private static int[] sTypeIcons = null;
R.drawable.ic_bookmark_none, R.drawable.ic_bookmark_hotel, R.drawable.ic_bookmark_animals,
R.drawable.ic_bookmark_buddhism, R.drawable.ic_bookmark_building, R.drawable.ic_bookmark_christianity,
R.drawable.ic_bookmark_entertainment, R.drawable.ic_bookmark_money, R.drawable.ic_bookmark_food,
R.drawable.ic_bookmark_gas, R.drawable.ic_bookmark_judaism, R.drawable.ic_bookmark_medicine,
R.drawable.ic_bookmark_mountain, R.drawable.ic_bookmark_museum, R.drawable.ic_bookmark_islam,
R.drawable.ic_bookmark_park, R.drawable.ic_bookmark_parking, R.drawable.ic_bookmark_shop,
R.drawable.ic_bookmark_sights, R.drawable.ic_bookmark_swim, R.drawable.ic_bookmark_water,
R.drawable.ic_bookmark_bar, R.drawable.ic_bookmark_transport, R.drawable.ic_bookmark_viewpoint,
R.drawable.ic_bookmark_sport,
R.drawable.ic_bookmark_none, // pub
R.drawable.ic_bookmark_none, // art
R.drawable.ic_bookmark_none, // bank
R.drawable.ic_bookmark_none, // cafe
R.drawable.ic_bookmark_none, // pharmacy
R.drawable.ic_bookmark_none, // stadium
R.drawable.ic_bookmark_none, // theatre
R.drawable.ic_bookmark_none, // information
R.drawable.ic_bookmark_none, // ChargingStation
R.drawable.ic_bookmark_none, // BicycleParking
R.drawable.ic_bookmark_none, // BicycleParkingCovered
R.drawable.ic_bookmark_none, // BicycleRental
R.drawable.ic_bookmark_none // FastFood
};
@PredefinedColor @PredefinedColors.Color
private final int mColor; private final int mColor;
private final int mType; private final int mType;
public Icon(@PredefinedColor int color, int type) public Icon(@PredefinedColors.Color int color, int type)
{ {
mColor = color; mColor = color;
mType = type; mType = type;
@@ -127,31 +48,29 @@ public class Icon implements Parcelable
mType = in.readInt(); mType = in.readInt();
} }
@PredefinedColor @PredefinedColors.Color
public int getColor() public int getColor()
{ {
return mColor; return mColor;
} }
@ColorInt
public int argb() public int argb()
{ {
return ARGB_COLORS[mColor]; return PredefinedColors.getColor(mColor);
}
public static int getColorPosition(int color)
{
for (int index = 1; index < ARGB_COLORS.length; index++)
{
if (ARGB_COLORS[index] == color)
return index;
}
return -1;
} }
@DrawableRes @DrawableRes
public int getResId() public int getResId()
{ {
return TYPE_ICONS[mType]; // loadDefaultIcons should be called
assert (sTypeIcons != null);
return sTypeIcons[mType];
}
public int getType()
{
return mType;
} }
@Override @Override
@@ -181,4 +100,29 @@ public class Icon implements Parcelable
return new Icon[size]; return new Icon[size];
} }
}; };
static public void loadDefaultIcons(@NonNull Resources resources, @NonNull String packageName)
{
final String[] names = nativeGetBookmarkIconNames();
int[] icons = new int[names.length];
for (int i = 0; i < names.length; i++)
{
final String name = StringUtils.toSnakeCase(names[i]);
icons[i] = resources.getIdentifier("ic_bookmark_" + name, "drawable", packageName);
if (icons[i] == 0)
{
Logger.e(TAG, "Error getting icon for " + name);
// Force devs to add an icon for each bookmark type.
if (BuildConfig.DEBUG)
throw new RuntimeException("Error getting icon for " + name);
icons[i] = app.organicmaps.sdk.R.drawable.ic_bookmark_none; // Fallback icon
}
}
sTypeIcons = icons;
}
@FastNative
@NonNull
private static native String[] nativeGetBookmarkIconNames();
} }

View File

@@ -0,0 +1,50 @@
package app.organicmaps.sdk.bookmarks.data;
import androidx.annotation.ColorInt;
import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
import dalvik.annotation.optimization.FastNative;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
import java.util.stream.IntStream;
public class PredefinedColors
{
@Retention(RetentionPolicy.SOURCE)
@IntRange(from = 0)
public @interface Color
{}
/// @note Color format: ARGB
@ColorInt
private static final int[] PREDEFINED_COLORS = nativeGetPredefinedColors();
@ColorInt
public static int getColor(int index)
{
return PREDEFINED_COLORS[index];
}
@PredefinedColors.Color
public static List<Integer> getAllPredefinedColors()
{
// 0 is reserved for "no color" option.
return IntStream.range(1, PREDEFINED_COLORS.length).boxed().toList();
}
public static int getPredefinedColorIndex(@ColorInt int color)
{
// 0 is reserved for "no color" option.
for (int index = 1; index < PREDEFINED_COLORS.length; index++)
{
if (PREDEFINED_COLORS[index] == color)
return index;
}
return -1;
}
@FastNative
@NonNull
private static native int[] nativeGetPredefinedColors();
}

View File

@@ -161,6 +161,7 @@ public final class Editor
public static native void nativeCreateNote(String text); public static native void nativeCreateNote(String text);
public static native void nativePlaceDoesNotExist(@NonNull String comment); public static native void nativePlaceDoesNotExist(@NonNull String comment);
public static native void nativeRollbackMapObject(); public static native void nativeRollbackMapObject();
public static native void nativeCreateStandaloneNote(double lat, double lon, String text);
/** /**
* @return all cuisines keys. * @return all cuisines keys.

View File

@@ -16,13 +16,12 @@ import androidx.annotation.UiThread;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.core.location.GnssStatusCompat; import androidx.core.location.GnssStatusCompat;
import androidx.core.location.LocationManagerCompat; import androidx.core.location.LocationManagerCompat;
import app.organicmaps.MwmApplication;
import app.organicmaps.routing.RoutingController;
import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.Map; import app.organicmaps.sdk.Map;
import app.organicmaps.sdk.bookmarks.data.FeatureId; import app.organicmaps.sdk.bookmarks.data.FeatureId;
import app.organicmaps.sdk.bookmarks.data.MapObject; import app.organicmaps.sdk.bookmarks.data.MapObject;
import app.organicmaps.sdk.routing.JunctionInfo; import app.organicmaps.sdk.routing.JunctionInfo;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.util.Config; import app.organicmaps.sdk.util.Config;
import app.organicmaps.sdk.util.LocationUtils; import app.organicmaps.sdk.util.LocationUtils;
import app.organicmaps.sdk.util.NetworkPolicy; import app.organicmaps.sdk.util.NetworkPolicy;

View File

@@ -6,7 +6,6 @@ import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager; import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
import app.organicmaps.sdk.maplayer.subway.SubwayManager; import app.organicmaps.sdk.maplayer.subway.SubwayManager;
import app.organicmaps.sdk.maplayer.traffic.TrafficManager; import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
import app.organicmaps.sdk.util.ThemeSwitcher;
public enum Mode public enum Mode
{ {
@@ -61,7 +60,8 @@ public enum Mode
public void setEnabled(@NonNull Context context, boolean isEnabled) public void setEnabled(@NonNull Context context, boolean isEnabled)
{ {
Framework.nativeSetOutdoorsLayerEnabled(isEnabled); Framework.nativeSetOutdoorsLayerEnabled(isEnabled);
ThemeSwitcher.INSTANCE.restart(true); // TODO: ThemeSwitcher is outside sdk package. Properly fix dependencies
// ThemeSwitcher.INSTANCE.restart(true);
} }
}; };

View File

@@ -1,18 +1,12 @@
package app.organicmaps.sdk.maplayer.isolines; package app.organicmaps.sdk.maplayer.isolines;
import android.content.Context;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.Framework;
public class IsolinesManager public class IsolinesManager
{ {
@NonNull @NonNull
private final OnIsolinesChangedListener mListener; private final OnIsolinesChangedListener mListener = new OnIsolinesChangedListener();
public IsolinesManager(@NonNull Context context)
{
mListener = new OnIsolinesChangedListener(context);
}
static public boolean isEnabled() static public boolean isEnabled()
{ {

View File

@@ -1,40 +1,9 @@
package app.organicmaps.sdk.maplayer.isolines; package app.organicmaps.sdk.maplayer.isolines;
import android.content.Context;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import app.organicmaps.R;
import app.organicmaps.util.Utils;
public enum IsolinesState public enum IsolinesState
{ {
DISABLED, DISABLED,
ENABLED, ENABLED,
EXPIREDDATA { EXPIREDDATA,
@Override NODATA;
public void activate(@NonNull Context context, @Nullable View view, @Nullable View viewAbove)
{
if (view != null)
Utils.showSnackbar(context, view, viewAbove, R.string.isolines_activation_error_dialog);
else
Toast.makeText(context, R.string.isolines_activation_error_dialog, Toast.LENGTH_SHORT).show();
}
},
NODATA {
@Override
public void activate(@NonNull Context context, @Nullable View view, @Nullable View viewAbove)
{
if (view != null)
Utils.showSnackbar(context, view, viewAbove, R.string.isolines_location_error_dialog);
else
Toast.makeText(context, R.string.isolines_location_error_dialog, Toast.LENGTH_SHORT).show();
}
};
public void activate(@NonNull Context context, @Nullable View viewAbove, @Nullable View view)
{
/* Do nothing by default */
}
} }

View File

@@ -1,33 +1,22 @@
package app.organicmaps.sdk.maplayer.isolines; package app.organicmaps.sdk.maplayer.isolines;
import android.content.Context;
import androidx.annotation.Keep; import androidx.annotation.Keep;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
class OnIsolinesChangedListener class OnIsolinesChangedListener
{ {
@NonNull @Nullable
private final Context mContext;
private IsolinesErrorDialogListener mListener; private IsolinesErrorDialogListener mListener;
OnIsolinesChangedListener(@NonNull Context app)
{
mContext = app;
}
// Called from JNI. // Called from JNI.
@Keep @Keep
@SuppressWarnings("unused") @SuppressWarnings("unused")
public void onStateChanged(int type) public void onStateChanged(int type)
{ {
IsolinesState state = IsolinesState.values()[type];
if (mListener == null) if (mListener == null)
{
state.activate(mContext, null, null);
return; return;
} mListener.onStateChanged(IsolinesState.values()[type]);
mListener.onStateChanged(state);
} }
public void attach(@NonNull IsolinesErrorDialogListener listener) public void attach(@NonNull IsolinesErrorDialogListener listener)

View File

@@ -1,38 +1,19 @@
package app.organicmaps.routing; package app.organicmaps.sdk.routing;
import android.content.Context;
import android.text.SpannableStringBuilder;
import android.text.TextUtils; import android.text.TextUtils;
import androidx.annotation.DimenRes;
import androidx.annotation.IntRange; import androidx.annotation.IntRange;
import androidx.annotation.MainThread; import androidx.annotation.MainThread;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.util.Pair; import androidx.core.util.Pair;
import app.organicmaps.MwmApplication;
import app.organicmaps.R;
import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.Router; import app.organicmaps.sdk.Router;
import app.organicmaps.sdk.bookmarks.data.FeatureId; import app.organicmaps.sdk.bookmarks.data.FeatureId;
import app.organicmaps.sdk.bookmarks.data.MapObject; import app.organicmaps.sdk.bookmarks.data.MapObject;
import app.organicmaps.sdk.routing.ResultCodes; import app.organicmaps.sdk.location.LocationHelper;
import app.organicmaps.sdk.routing.RouteMarkData;
import app.organicmaps.sdk.routing.RouteMarkType;
import app.organicmaps.sdk.routing.RoutePointInfo;
import app.organicmaps.sdk.routing.RouteRecommendationType;
import app.organicmaps.sdk.routing.RoutingInfo;
import app.organicmaps.sdk.routing.RoutingListener;
import app.organicmaps.sdk.routing.RoutingLoadPointsListener;
import app.organicmaps.sdk.routing.RoutingOptions;
import app.organicmaps.sdk.routing.RoutingProgressListener;
import app.organicmaps.sdk.routing.TransitRouteInfo;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.concurrency.UiThread; import app.organicmaps.sdk.util.concurrency.UiThread;
import app.organicmaps.sdk.util.log.Logger; import app.organicmaps.sdk.util.log.Logger;
import app.organicmaps.util.Utils; import app.organicmaps.sdk.widget.placepage.CoordinatesFormat;
import app.organicmaps.widget.placepage.CoordinatesFormat;
import java.time.LocalTime;
import java.util.concurrent.TimeUnit;
@androidx.annotation.UiThread @androidx.annotation.UiThread
public class RoutingController public class RoutingController
@@ -114,7 +95,7 @@ public class RoutingController
mLastMissingMaps = missingMaps; mLastMissingMaps = missingMaps;
mContainsCachedResult = true; mContainsCachedResult = true;
if (mLastResultCode == ResultCodes.NO_ERROR || ResultCodesHelper.isMoreMapsNeeded(mLastResultCode)) if (mLastResultCode == ResultCodes.NO_ERROR || resultCode == ResultCodes.NEED_MORE_MAPS)
{ {
onBuiltRoute(); onBuiltRoute();
} }
@@ -180,7 +161,7 @@ public class RoutingController
return; return;
} }
if (!ResultCodesHelper.isMoreMapsNeeded(mLastResultCode)) if (mLastResultCode != ResultCodes.NEED_MORE_MAPS)
{ {
setBuildState(BuildState.ERROR); setBuildState(BuildState.ERROR);
mLastBuildProgress = 0; mLastBuildProgress = 0;
@@ -195,8 +176,7 @@ public class RoutingController
private boolean isDrivingOptionsBuildError() private boolean isDrivingOptionsBuildError()
{ {
return !ResultCodesHelper.isMoreMapsNeeded(mLastResultCode) && RoutingOptions.hasAnyOptions() return mLastResultCode != ResultCodes.NEED_MORE_MAPS && RoutingOptions.hasAnyOptions() && !isRulerRouterType();
&& !isRulerRouterType();
} }
private void setState(State newState) private void setState(State newState)
@@ -250,7 +230,7 @@ public class RoutingController
mContainer = container; mContainer = container;
} }
public void initialize(@NonNull Context context) public void initialize(@NonNull LocationHelper locationHelper)
{ {
mLastRouterType = Router.getLastUsed(); mLastRouterType = Router.getLastUsed();
mInvalidRoutePointsTransactionId = Framework.nativeInvalidRoutePointsTransactionId(); mInvalidRoutePointsTransactionId = Framework.nativeInvalidRoutePointsTransactionId();
@@ -260,7 +240,7 @@ public class RoutingController
Framework.nativeSetRouteProgressListener(mRoutingProgressListener); Framework.nativeSetRouteProgressListener(mRoutingProgressListener);
Framework.nativeSetRoutingRecommendationListener(recommendation -> UiThread.run(() -> { Framework.nativeSetRoutingRecommendationListener(recommendation -> UiThread.run(() -> {
if (recommendation == RouteRecommendationType.RebuildAfterPointsLoading) if (recommendation == RouteRecommendationType.RebuildAfterPointsLoading)
setStartPoint(MwmApplication.from(context).getLocationHelper().getMyPosition()); setStartPoint(locationHelper.getMyPosition());
})); }));
Framework.nativeSetRoutingLoadPointsListener(mRoutingLoadPointsListener); Framework.nativeSetRoutingLoadPointsListener(mRoutingLoadPointsListener);
} }
@@ -557,7 +537,7 @@ public class RoutingController
return mLastRouterType == Router.Vehicle; return mLastRouterType == Router.Vehicle;
} }
boolean isRulerRouterType() public boolean isRulerRouterType()
{ {
return mLastRouterType == Router.Ruler; return mLastRouterType == Router.Ruler;
} }
@@ -883,26 +863,4 @@ public class RoutingController
mWaitingPoiPickType = null; mWaitingPoiPickType = null;
} }
public static CharSequence formatRoutingTime(Context context, int seconds, @DimenRes int unitsSize)
{
return formatRoutingTime(context, seconds, unitsSize, R.dimen.text_size_routing_number);
}
public static CharSequence formatRoutingTime(Context context, int seconds, @DimenRes int unitsSize,
@DimenRes int textSize)
{
long minutes = TimeUnit.SECONDS.toMinutes(seconds) % 60;
long hours = TimeUnit.SECONDS.toHours(seconds);
String min = context.getString(R.string.minute);
String hour = context.getString(R.string.hour);
SpannableStringBuilder displayedH = Utils.formatTime(context, textSize, unitsSize, String.valueOf(hours), hour);
SpannableStringBuilder displayedM = Utils.formatTime(context, textSize, unitsSize, String.valueOf(minutes), min);
return hours == 0 ? displayedM : TextUtils.concat(displayedH + "\u00A0", displayedM);
}
static String formatArrivalTime(int seconds)
{
final LocalTime time = LocalTime.now().plusSeconds(seconds);
return StringUtils.formatUsingUsLocale("%d:%02d", time.getHour(), time.getMinute());
}
} }

View File

@@ -1,4 +1,4 @@
package app.organicmaps.settings; package app.organicmaps.sdk.settings;
/** /**
* Represents storage option. * Represents storage option.

View File

@@ -1,4 +1,4 @@
package app.organicmaps.settings; package app.organicmaps.sdk.settings;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.ContentResolver; import android.content.ContentResolver;
@@ -28,7 +28,7 @@ public class StoragePathManager
private static final String TAG = StoragePathManager.class.getSimpleName(); private static final String TAG = StoragePathManager.class.getSimpleName();
private static final String DATA_FILE_EXT = Framework.nativeGetDataFileExt(); private static final String DATA_FILE_EXT = Framework.nativeGetDataFileExt();
private static final String[] MOVABLE_EXTS = Framework.nativeGetMovableFilesExts(); private static final String[] MOVABLE_EXTS = Framework.nativeGetMovableFilesExts();
static final FilenameFilter MOVABLE_FILES_FILTER = (dir, filename) -> public static final FilenameFilter MOVABLE_FILES_FILTER = (dir, filename) ->
{ {
for (String ext : MOVABLE_EXTS) for (String ext : MOVABLE_EXTS)
if (filename.endsWith(ext)) if (filename.endsWith(ext))
@@ -37,7 +37,7 @@ public class StoragePathManager
return false; return false;
}; };
interface OnStorageListChangedListener public interface OnStorageListChangedListener
{ {
void onStorageListChanged(List<StorageItem> storageItems, int currentStorageIndex); void onStorageListChanged(List<StorageItem> storageItems, int currentStorageIndex);
} }

View File

@@ -1,7 +1,6 @@
package app.organicmaps.sdk.sound; package app.organicmaps.sdk.sound;
import android.content.Context; import android.content.Context;
import android.content.res.Resources;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
@@ -10,9 +9,9 @@ import android.provider.Settings;
import android.speech.tts.TextToSpeech; import android.speech.tts.TextToSpeech;
import android.speech.tts.UtteranceProgressListener; import android.speech.tts.UtteranceProgressListener;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Pair;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import app.organicmaps.R;
import app.organicmaps.sdk.util.Config; import app.organicmaps.sdk.util.Config;
import app.organicmaps.sdk.util.concurrency.UiThread; import app.organicmaps.sdk.util.concurrency.UiThread;
import app.organicmaps.sdk.util.log.Logger; import app.organicmaps.sdk.util.log.Logger;
@@ -43,6 +42,9 @@ public enum TtsPlayer
private static final float SPEECH_RATE = 1.0f; private static final float SPEECH_RATE = 1.0f;
private static final int TTS_SPEAK_DELAY_MILLIS = 50; private static final int TTS_SPEAK_DELAY_MILLIS = 50;
@Nullable
private static List<Pair<String, String>> sSupportedLanguages = null;
public static Runnable sOnReloadCallback = null; public static Runnable sOnReloadCallback = null;
private ContentObserver mTtsEngineObserver; private ContentObserver mTtsEngineObserver;
@@ -286,19 +288,15 @@ public enum TtsPlayer
private boolean getUsableLanguages(List<LanguageData> outList) private boolean getUsableLanguages(List<LanguageData> outList)
{ {
Resources resources = mContext.getResources(); for (final Pair<String, String> langNamePair : getSupportedLanguages())
String[] codes = resources.getStringArray(R.array.tts_languages_supported);
String[] names = resources.getStringArray(R.array.tts_language_names);
for (int i = 0; i < codes.length; i++)
{ {
try try
{ {
outList.add(new LanguageData(codes[i], names[i], mTts)); outList.add(new LanguageData(langNamePair.first, langNamePair.second, mTts));
} }
catch (LanguageData.NotAvailableException ignored) catch (LanguageData.NotAvailableException ex)
{ {
Logger.w(TAG, "Failed to get usable languages " + ignored.getMessage()); Logger.w(TAG, "Failed to get usable languages " + ex.getMessage());
} }
catch (IllegalArgumentException e) catch (IllegalArgumentException e)
{ {
@@ -351,8 +349,20 @@ public enum TtsPlayer
return res; return res;
} }
@NonNull
private List<Pair<String, String>> getSupportedLanguages()
{
if (sSupportedLanguages == null)
{
sSupportedLanguages = nativeGetSupportedLanguages();
}
return sSupportedLanguages;
}
private native static void nativeEnableTurnNotifications(boolean enable); private native static void nativeEnableTurnNotifications(boolean enable);
private native static boolean nativeAreTurnNotificationsEnabled(); private native static boolean nativeAreTurnNotificationsEnabled();
private native static void nativeSetTurnNotificationsLocale(String code); private native static void nativeSetTurnNotificationsLocale(String code);
private native static String nativeGetTurnNotificationsLocale(); private native static String nativeGetTurnNotificationsLocale();
@NonNull
private native static List<Pair<String, String>> nativeGetSupportedLanguages();
} }

View File

@@ -231,7 +231,7 @@ public final class Config
return defaultTheme; return defaultTheme;
} }
static void setCurrentUiTheme(@NonNull Context context, @NonNull String theme) public static void setCurrentUiTheme(@NonNull Context context, @NonNull String theme)
{ {
if (getCurrentUiTheme(context).equals(theme)) if (getCurrentUiTheme(context).equals(theme))
return; return;

View File

@@ -1,7 +1,5 @@
package app.organicmaps.sdk.util; package app.organicmaps.sdk.util;
import app.organicmaps.BuildConfig;
public final class Constants public final class Constants
{ {
public static final int KB = 1024; public static final int KB = 1024;
@@ -36,13 +34,6 @@ public final class Constants
private Url() {} private Url() {}
} }
public static class Email
{
public static final String SUPPORT = BuildConfig.SUPPORT_MAIL;
private Email() {}
}
public static class Package public static class Package
{ {
public static final String FB_PACKAGE = "com.facebook.katana"; public static final String FB_PACKAGE = "com.facebook.katana";

View File

@@ -11,6 +11,10 @@ import java.util.Locale;
public class StringUtils public class StringUtils
{ {
public static String toSnakeCase(String input)
{
return input.replaceAll("([a-z])([A-Z]+)", "$1_$2").toLowerCase();
}
public static String formatUsingUsLocale(String pattern, Object... args) public static String formatUsingUsLocale(String pattern, Object... args)
{ {
return String.format(Locale.US, pattern, args); return String.format(Locale.US, pattern, args);

View File

@@ -1,4 +1,4 @@
package app.organicmaps.widget.placepage; package app.organicmaps.sdk.widget.placepage;
public enum CoordinatesFormat public enum CoordinatesFormat
{ {

View File

@@ -65,7 +65,7 @@ class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.SearchDataViewHol
@AttrRes @AttrRes
int getTintAttr() int getTintAttr()
{ {
return androidx.appcompat.R.attr.colorAccent; return com.google.android.material.R.attr.colorSecondary;
} }
abstract TextView getTitleView(); abstract TextView getTitleView();

View File

@@ -26,12 +26,12 @@ import app.organicmaps.MwmApplication;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.base.BaseMwmFragment; import app.organicmaps.base.BaseMwmFragment;
import app.organicmaps.downloader.CountrySuggestFragment; import app.organicmaps.downloader.CountrySuggestFragment;
import app.organicmaps.routing.RoutingController;
import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.bookmarks.data.FeatureId; import app.organicmaps.sdk.bookmarks.data.FeatureId;
import app.organicmaps.sdk.bookmarks.data.MapObject; import app.organicmaps.sdk.bookmarks.data.MapObject;
import app.organicmaps.sdk.downloader.MapManager; import app.organicmaps.sdk.downloader.MapManager;
import app.organicmaps.sdk.location.LocationListener; import app.organicmaps.sdk.location.LocationListener;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.search.SearchEngine; import app.organicmaps.sdk.search.SearchEngine;
import app.organicmaps.sdk.search.SearchListener; import app.organicmaps.sdk.search.SearchListener;
import app.organicmaps.sdk.search.SearchRecents; import app.organicmaps.sdk.search.SearchRecents;

View File

@@ -8,7 +8,7 @@ import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import app.organicmaps.MwmApplication; import app.organicmaps.MwmApplication;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.routing.RoutingController; import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.search.SearchRecents; import app.organicmaps.sdk.search.SearchRecents;
import app.organicmaps.util.Graphics; import app.organicmaps.util.Graphics;
import app.organicmaps.widget.SearchToolbarController; import app.organicmaps.widget.SearchToolbarController;

View File

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

View File

@@ -92,7 +92,7 @@ class TabAdapter extends FragmentPagerAdapter
editor.putInt(Config.KEY_PREF_LAST_SEARCHED_TAB, tab.getPosition()); editor.putInt(Config.KEY_PREF_LAST_SEARCHED_TAB, tab.getPosition());
editor.apply(); editor.apply();
super.onTabSelected(tab); super.onTabSelected(tab);
Graphics.tint(mContext, tab.getIcon(), androidx.appcompat.R.attr.colorAccent); Graphics.tint(mContext, tab.getIcon(), com.google.android.material.R.attr.colorSecondary);
} }
@Override @Override

View File

@@ -11,7 +11,7 @@ import androidx.annotation.Nullable;
import androidx.appcompat.widget.SwitchCompat; import androidx.appcompat.widget.SwitchCompat;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.base.BaseMwmToolbarFragment; import app.organicmaps.base.BaseMwmToolbarFragment;
import app.organicmaps.routing.RoutingController; import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.routing.RoutingOptions; import app.organicmaps.sdk.routing.RoutingOptions;
import app.organicmaps.sdk.settings.RoadType; import app.organicmaps.sdk.settings.RoadType;
import java.util.ArrayList; import java.util.ArrayList;

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