Compare commits

..

19 Commits

Author SHA1 Message Date
x7z4w
62fb50e95c try github actions
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-03 19:38:32 +00:00
x7z4w
664a156cc6 fix forgejo
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-03 19:34:01 +00:00
x7z4w
08b773dfa8 fix node
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-03 19:30:20 +00:00
x7z4w
c31d3b6926 node
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-03 19:29:11 +00:00
x7z4w
7469b0ecb4 Revert "docker2"
This reverts commit 5b3e327ff8.
2025-08-03 19:26:56 +00:00
x7z4w
2b78118310 Revert "docker3"
This reverts commit 70622bdca0.
2025-08-03 19:26:04 +00:00
x7z4w
70622bdca0 docker3
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-03 18:51:07 +00:00
x7z4w
5b3e327ff8 docker2
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-03 18:45:51 +00:00
x7z4w
8395e8d9a9 forgejo
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-03 18:37:36 +00:00
x7z4w
b7971b5cc0 docker
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-03 18:32:42 +00:00
x7z4w
8fb8be6a00 Revert "fix"
This reverts commit 273afe052a.
2025-08-03 18:15:57 +00:00
x7z4w
273afe052a fix
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-03 18:13:30 +00:00
x7z4w
9b5419b6d4 try
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-03 17:45:01 +00:00
x7z4w
835ee4ab8d update
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-03 17:31:35 +00:00
x7z4w
5bc8aae623 auto
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-03 17:05:15 +00:00
x7z4w
72439bd6d7 Revert "Enable automatic jobs"
This reverts commit ffcaf3640b.
2025-08-03 17:03:04 +00:00
x7z4w
a3db039232 fix
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-03 16:54:30 +00:00
x7z4w
ffcaf3640b Enable automatic jobs
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-03 16:45:09 +00:00
x7z4w
289f4c4343 [ci] Fix ci
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-03 16:24:08 +00:00
3627 changed files with 939136 additions and 79705 deletions

View File

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

View File

@@ -1,8 +0,0 @@
# 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

@@ -3,7 +3,7 @@ on:
workflow_dispatch: # Manual trigger
push:
branches:
- main
- fix-ci
paths-ignore:
- .gitignore
- .forgejo/**
@@ -41,11 +41,11 @@ jobs:
- name: Install build tools and dependencies
shell: bash
run: |
sudo apt-get update -y
sudo apt-get install -y ninja-build
apt-get update -y
apt-get install -y cmake ninja-build
- name: Checkout sources
uses: actions/checkout@v4
uses: https://github.com/actions/checkout@v4
with:
fetch-depth: 100 # enough to get all commits for the current day
@@ -69,6 +69,8 @@ jobs:
RELEASE_KEYSTORE: ${{ secrets.RELEASE_KEYSTORE }}
- name: Compile
container:
image: runmymind/docker-android-sdk:latest
shell: bash
working-directory: android
run: |

View File

@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: https://github.com/actions/checkout@v4
with:
fetch-depth: 1
sparse-checkout: |

View File

@@ -3,7 +3,7 @@ on:
workflow_dispatch: # Manual trigger
push:
branches:
- main
- fix-ci
pull_request:
paths-ignore:
- .gitignore
@@ -38,9 +38,17 @@ jobs:
lint:
name: Android Lint
runs-on: ubuntu-latest
container:
image: runmymind/docker-android-sdk:latest
steps:
- name: Install Node.JS
shell: bash
run: |
apt-get update -y
apt-get install -y nodejs
- name: Checkout sources
uses: actions/checkout@v4
uses: https://github.com/actions/checkout@v4
with:
fetch-depth: 1
@@ -56,6 +64,8 @@ jobs:
android-check:
name: Build Android Debug
runs-on: ubuntu-latest
container:
image: runmymind/docker-android-sdk:latest
strategy:
fail-fast: false
matrix:
@@ -74,11 +84,11 @@ jobs:
- name: Install build tools and dependencies
shell: bash
run: |
sudo apt-get update -y
sudo apt-get install -y ninja-build
apt-get update -y
apt-get install -y cmake ninja-build nodejs
- name: Checkout sources
uses: actions/checkout@v4
uses: httpa://github.com/actions/checkout@v4
with:
fetch-depth: 200 # enough to get all commits for the current day
@@ -87,7 +97,7 @@ jobs:
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
- name: Configure ccache
uses: hendrikmuhs/ccache-action@v1.2
uses: https://github.com/hendrikmuhs/ccache-action@v1.2
with:
key: ${{ github.workflow }}-${{ matrix.flavor }}
@@ -106,5 +116,5 @@ jobs:
uses: actions/upload-artifact@v4
with:
name: android-${{ matrix.flavor }}
path: android/app/build/outputs/apk/**/OrganicMaps-*.apk
path: android/app/build/outputs/apk/**/CoMaps-*.apk
if-no-files-found: error

View File

@@ -10,7 +10,7 @@ jobs:
name: Check preconditions
steps:
- name: Checkout sources
uses: actions/checkout@v4
uses: https://github.com/actions/checkout@v4
with:
fetch-depth: 1000 # fetch month or so
@@ -31,6 +31,8 @@ jobs:
android-google-beta:
name: Android Google Beta
runs-on: ubuntu-latest
container:
image: runmymind/docker-android-sdk:latest
needs: precondition
if: ${{ needs.precondition.outputs.updated != '' }}
environment: beta
@@ -38,14 +40,14 @@ jobs:
- name: Install build tools and dependencies
shell: bash
run: |
sudo apt-get update -y
sudo apt-get install -y ninja-build
apt-get update -y
apt-get install -y ninja-build
- name: Install Google SDK
uses: google-github-actions/setup-gcloud@v0
- name: Checkout sources
uses: actions/checkout@v4
uses: https://github.com/actions/checkout@v4
with:
fetch-depth: 100 # enough to get all commits for the current day
@@ -82,7 +84,7 @@ jobs:
run: |
gcloud auth activate-service-account --key-file android/app/firebase-test-lab.json
gcloud config set project omapsapp
gcloud firebase test android run --app ./android/app/build/outputs/apk/google/beta/OrganicMaps-*-google-beta.apk \
gcloud firebase test android run --app ./android/app/build/outputs/apk/google/beta/CoMaps-*-google-beta.apk \
--device model=husky,version=34 \
--device model=tangorpro,version=33,orientation=landscape \
--device model=bluejay,version=32 \

View File

@@ -6,11 +6,13 @@ jobs:
android-release-metadata:
name: Upload Google Play metadata
runs-on: ubuntu-latest
container:
image: runmymind/docker-android-sdk:latest
environment: production
steps:
- name: Checkout sources
# TODO: use shallow (and sparse?) checkout
uses: actions/checkout@v4
uses: https://github.com/actions/checkout@v4
# - name: Parallel submodules checkout
# shell: bash

View File

@@ -13,7 +13,7 @@ jobs:
environment: production
steps:
- name: Checkout sources
uses: actions/checkout@v4
uses: https://github.com/actions/checkout@v4
with:
fetch-depth: 100 # Enough to get all commits for the last day.
ssh-key: ${{ secrets.RELEASE_SSH_KEY }}
@@ -71,11 +71,11 @@ jobs:
- name: Install build tools and dependencies
shell: bash
run: |
sudo apt-get update -y
sudo apt-get install -y ninja-build
apt-get update -y
apt-get install -y cmake ninja-build
- name: Checkout sources
uses: actions/checkout@v4
uses: https://github.com/actions/checkout@v4
with:
fetch-depth: 100 # enough to get all commits for the current day
ref: 'refs/tags/${{ needs.tag.outputs.tag }}'
@@ -92,7 +92,7 @@ jobs:
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
- name: Checkout screenshots
uses: actions/checkout@v4
uses: https://github.com/actions/checkout@v4
with:
repository: ${{ secrets.SCREENSHOTS_REPO }}
ssh-key: ${{ secrets.SCREENSHOTS_SSH_KEY }}
@@ -121,6 +121,8 @@ jobs:
run: echo "sdk.dir=$ANDROID_SDK_ROOT" > android/local.properties
- name: Compile and upload to Google Play
container:
image: runmymind/docker-android-sdk:latest
shell: bash
working-directory: android
run: |
@@ -128,6 +130,8 @@ jobs:
if: ${{ matrix.flavor == 'google' }}
- name: Compile and upload to Huawei AppGallery
container:
image: runmymind/docker-android-sdk:latest
shell: bash
working-directory: android
run: |
@@ -136,6 +140,8 @@ jobs:
if: ${{ matrix.flavor == 'huawei' }}
- name: Compile universal APK
container:
image: runmymind/docker-android-sdk:latest
shell: bash
working-directory: android
run: |
@@ -146,16 +152,16 @@ jobs:
if: ${{ matrix.flavor == 'web' }}
shell: bash
run: |
(cd ./android/app/build/outputs/apk/web/release/ && sha256sum OrganicMaps-${{ needs.tag.outputs.code }}-web-release.apk > OrganicMaps-${{ needs.tag.outputs.code }}-web-release.apk.sha256sum)
(cd ./android/app/build/outputs/apk/web/release/ && sha256sum CoMaps-${{ needs.tag.outputs.code }}-web-release.apk > CoMaps-${{ needs.tag.outputs.code }}-web-release.apk.sha256sum)
{
cat ${{ env.RELEASE_NOTES }}
echo ""
echo "See [a detailed announce](https://organicmaps.app/news/) on our website when app updates are published in all stores."
echo "You can get automatic app updates from Codeberg [using Obtainium](https://codeberg.org/comaps/comaps/wiki/Installing-Organic-Maps-from-GitHub-using-Obtainium)."
echo "See [a detailed announce](https://comaps.app/news/) on our website when app updates are published in all stores."
echo "You can get automatic app updates from Codeberg [using Obtainium](https://apps.obtainium.imranr.dev/redirect?r=obtainium://add/https://codeberg.org/comaps/comaps)."
echo ""
echo "sha256sum:"
echo -e '\n```'
tr -d '\n' < ./android/app/build/outputs/apk/web/release/OrganicMaps-${{ needs.tag.outputs.code }}-web-release.apk.sha256sum
tr -d '\n' < ./android/app/build/outputs/apk/web/release/CoMaps-${{ needs.tag.outputs.code }}-web-release.apk.sha256sum
echo -e '\n```'
} > ${{ runner.temp }}/release-notes.txt
@@ -170,6 +176,6 @@ jobs:
discussion_category_name: 'Announcements'
prerelease: true
files: |
./android/app/build/outputs/apk/web/release/OrganicMaps-${{ needs.tag.outputs.code }}-web-release.apk
./android/app/build/outputs/apk/web/release/OrganicMaps-${{ needs.tag.outputs.code }}-web-release.apk.sha256sum
./android/app/build/outputs/apk/web/release/CoMaps-${{ needs.tag.outputs.code }}-web-release.apk
./android/app/build/outputs/apk/web/release/CoMaps-${{ needs.tag.outputs.code }}-web-release.apk.sha256sum
fail_on_unmatched_files: true

View File

@@ -3,7 +3,7 @@ on:
workflow_dispatch: # Manual trigger
pull_request:
paths:
- packaging/app.comaps.comaps.metainfo.xml
- packaging/app.comaps.desktop.metainfo.xml
- .forgejo/workflows/appstream-check.yaml # Run check on self change
jobs:
@@ -12,25 +12,25 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v4
uses: https://github.com/actions/checkout@v4
with:
fetch-depth: 1
sparse-checkout: |
packaging/app.comaps.comaps.metainfo.xml
packaging/app.comaps.desktop.metainfo.xml
- name: Install appstream validator and flatpak Builder
shell: bash
run: |
sudo apt update -y
sudo apt install -y \
apt update -y
apt install -y \
flatpak
sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
sudo flatpak install -y org.flatpak.Builder
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak install -y org.flatpak.Builder
- name: Lint appstream data with flatpak Builder
shell: bash
run: flatpak run --command=flatpak-builder-lint org.flatpak.Builder appstream packaging/app.comaps.comaps.metainfo.xml
run: flatpak run --command=flatpak-builder-lint org.flatpak.Builder appstream packaging/app.comaps.desktop.metainfo.xml
- name: Run appstreamcli in pedantic mode
shell: bash
run: flatpak run --command=appstreamcli org.flatpak.Builder validate --pedantic packaging/app.comaps.comaps.metainfo.xml
run: flatpak run --command=appstreamcli org.flatpak.Builder validate --pedantic packaging/app.comaps.desktop.metainfo.xml

View File

@@ -63,7 +63,7 @@ jobs:
if: ${{ needs.should-run-check.outputs.run-from-pr == 'true' || needs.should-run-check.outputs.manually-triggered == 'true'}}
steps:
- name: Checkout sources
uses: actions/checkout@v4
uses: https://github.com/actions/checkout@v4
with:
fetch-depth: 100 # enough to get all commits for the current day
@@ -74,8 +74,8 @@ jobs:
- name: Install build tools and dependencies
shell: bash
run: |
sudo apt update -y
sudo apt install -y \
apt update -y
apt install -y \
ninja-build \
libgl1-mesa-dev \
libglvnd-dev \
@@ -90,7 +90,7 @@ jobs:
gcovr
- name: Configure ccache
uses: hendrikmuhs/ccache-action@v1.2
uses: https://github.com/hendrikmuhs/ccache-action@v1.2
with:
key: ${{ github.workflow }}-coverage
@@ -124,15 +124,15 @@ jobs:
# world_feed_integration_tests - https://github.com/organicmaps/organicmaps/issues/215
CTEST_EXCLUDE_REGEX: "generator_integration_tests|opening_hours_integration_tests|opening_hours_supported_features_tests|routing_benchmarks|routing_integration_tests|routing_quality_tests|search_quality_tests|storage_integration_tests|shaders_tests|world_feed_integration_tests"
run: |
sudo locale-gen en_US
sudo locale-gen en_US.UTF-8
sudo locale-gen es_ES
sudo locale-gen es_ES.UTF-8
sudo locale-gen fr_FR
sudo locale-gen fr_FR.UTF-8
sudo locale-gen ru_RU
sudo locale-gen ru_RU.UTF-8
sudo update-locale
locale-gen en_US
locale-gen en_US.UTF-8
locale-gen es_ES
locale-gen es_ES.UTF-8
locale-gen fr_FR
locale-gen fr_FR.UTF-8
locale-gen ru_RU
locale-gen ru_RU.UTF-8
update-locale
ctest -L "omim-test" -E "$CTEST_EXCLUDE_REGEX" --output-on-failure
- name: Run coverage report generation

View File

@@ -3,6 +3,6 @@ on: [pull_request]
jobs:
check:
runs-on: codeberg-tiny
runs-on: ubuntu-latest
steps:
- uses: https://github.com/KineticCafe/actions-dco@v1

View File

@@ -3,7 +3,7 @@ on:
workflow_dispatch: # Manual trigger
pull_request:
paths:
- qt/res/linux/app.comaps.comaps.desktop
- qt/res/app.comaps.desktop.desktop
- .forgejo/workflows/desktop-file-check.yaml # Run check on self change
jobs:
@@ -12,19 +12,19 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v4
uses: https://github.com/actions/checkout@v4
with:
fetch-depth: 1
sparse-checkout: |
qt/res/linux/app.comaps.comaps.desktop
qt/res/app.comaps.desktop.desktop
- name: Install desktop-file-validate tool
shell: bash
run: |
sudo apt update -y
sudo apt install -y \
apt update -y
apt install -y \
desktop-file-utils
- name: Validate desktop file
shell: bash
run: desktop-file-validate qt/res/linux/app.comaps.comaps.desktop && echo "Successfully validated .desktop file"
run: desktop-file-validate qt/res/app.comaps.desktop.desktop && echo "Successfully validated .desktop file"

View File

@@ -3,7 +3,7 @@ on:
workflow_dispatch: # Manual trigger
push:
branches:
- main
- fix-ci
paths-ignore:
- .gitignore
- .forgejo/**
@@ -45,7 +45,7 @@ jobs:
shell: bash
steps:
- name: Checkout sources
uses: actions/checkout@v4
uses: https://github.com/actions/checkout@v4
with:
fetch-depth: 100 # enough to get all commits for the current day
@@ -66,10 +66,6 @@ jobs:
CERTIFICATES_DEV_P12: ${{ secrets.CERTIFICATES_DEV_P12 }}
CERTIFICATES_DISTR_P12: ${{ secrets.CERTIFICATES_DISTR_P12 }}
- name: Configure repository
shell: bash
run: ./configure.sh
- name: Compile and upload to TestFlight
run: |
echo "IOS_VERSION=$(../tools/unix/version.sh ios_version)-$(../tools/unix/version.sh ios_build)" >> "$GITHUB_ENV"

View File

@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: https://github.com/actions/checkout@v4
with:
fetch-depth: 1
sparse-checkout: |

View File

@@ -3,7 +3,7 @@ on:
workflow_dispatch: # Manual trigger
push:
branches:
- main
- fix-ci
pull_request:
paths-ignore:
- .gitignore
@@ -53,16 +53,12 @@ jobs:
steps:
- name: Checkout sources
uses: actions/checkout@v4
uses: https://github.com/actions/checkout@v4
- name: Parallel submodules checkout
shell: bash
run: git submodule update --depth 1 --init --recursive --jobs=$(($(sysctl -n hw.logicalcpu) * 20))
- name: Configure repository
shell: bash
run: ./configure.sh
- name: Configure XCode cache
uses: irgaly/xcode-cache@v1
with:

View File

@@ -14,7 +14,7 @@ jobs:
environment: production
steps:
- name: Checkout
uses: actions/checkout@v4
uses: https://github.com/actions/checkout@v4
- name: Restore release keys
shell: bash
@@ -25,7 +25,7 @@ jobs:
APPSTORE_JSON: ${{ secrets.APPSTORE_JSON }}
- name: Checkout screenshots
uses: actions/checkout@v4
uses: https://github.com/actions/checkout@v4
with:
repository: ${{ secrets.SCREENSHOTS_REPO }}
ssh-key: ${{ secrets.SCREENSHOTS_SSH_KEY }}
@@ -33,7 +33,7 @@ jobs:
path: screenshots
- name: Checkout keywords
uses: actions/checkout@v4
uses: https://github.com/actions/checkout@v4
with:
repository: ${{ secrets.KEYWORDS_REPO }}
ssh-key: ${{ secrets.KEYWORDS_SSH_KEY }}

View File

@@ -3,7 +3,7 @@ on:
workflow_dispatch: # Manual trigger
push:
branches:
- main
- fix-ci
pull_request:
paths-ignore:
- .gitignore
@@ -39,7 +39,7 @@ jobs:
steps:
- name: Checkout sources
uses: actions/checkout@v4
uses: https://github.com/actions/checkout@v4
with:
fetch-depth: 100 # enough to get all commits for the current day
@@ -50,9 +50,10 @@ jobs:
- name: Install build tools and dependencies
shell: bash
run: |
sudo apt update -y
sudo apt install -y \
apt update -y
apt install -y \
ninja-build \
cmake \
libgl1-mesa-dev \
libglvnd-dev \
libharfbuzz-dev \
@@ -67,7 +68,7 @@ jobs:
libqt6positioning6
- name: Configure ccache
uses: hendrikmuhs/ccache-action@v1.2
uses: https://github.com/hendrikmuhs/ccache-action@v1.2
with:
key: ${{ github.workflow }}-no-unity
@@ -103,7 +104,7 @@ jobs:
steps:
- name: Checkout sources
uses: actions/checkout@v4
uses: https://github.com/actions/checkout@v4
- name: Parallel submodules checkout
shell: bash
@@ -112,8 +113,8 @@ jobs:
- name: Install build tools and dependencies
shell: bash
run: |
sudo apt update -y
sudo apt install -y \
apt update -y
apt install -y \
ninja-build \
libgl1-mesa-dev \
libglvnd-dev \
@@ -129,7 +130,7 @@ jobs:
libqt6positioning6
- name: Configure ccache
uses: hendrikmuhs/ccache-action@v1.2
uses: https://github.com/hendrikmuhs/ccache-action@v1.2
with:
key: ${{ github.workflow }}-unity-${{ matrix.compiler.CC }}-${{ matrix.CMAKE_BUILD_TYPE }}
@@ -164,13 +165,13 @@ jobs:
# world_feed_integration_tests - https://github.com/organicmaps/organicmaps/issues/215
CTEST_EXCLUDE_REGEX: "generator_integration_tests|opening_hours_integration_tests|opening_hours_supported_features_tests|routing_benchmarks|routing_integration_tests|routing_quality_tests|search_quality_tests|storage_integration_tests|shaders_tests|world_feed_integration_tests"
run: |
sudo locale-gen en_US
sudo locale-gen en_US.UTF-8
sudo locale-gen es_ES
sudo locale-gen es_ES.UTF-8
sudo locale-gen fr_FR
sudo locale-gen fr_FR.UTF-8
sudo locale-gen ru_RU
sudo locale-gen ru_RU.UTF-8
sudo update-locale
locale-gen en_US
locale-gen en_US.UTF-8
locale-gen es_ES
locale-gen es_ES.UTF-8
locale-gen fr_FR
locale-gen fr_FR.UTF-8
locale-gen ru_RU
locale-gen ru_RU.UTF-8
update-locale
ctest -L "omim-test" -E "$CTEST_EXCLUDE_REGEX" --output-on-failure

View File

@@ -3,7 +3,7 @@ on:
workflow_dispatch: # Manual trigger
push:
branches:
- main
- fix-ci
pull_request:
paths-ignore:
- .gitignore
@@ -46,7 +46,7 @@ jobs:
steps:
- name: Checkout sources
uses: actions/checkout@v4
uses: https://github.com/actions/checkout@v4
- name: Parallel submodules checkout
shell: bash

View File

@@ -23,10 +23,6 @@ jobs:
shell: bash
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
shell: bash
working-directory: android
@@ -66,7 +62,6 @@ jobs:
libxinerama-dev \
libxcursor-dev \
libxi-dev \
python3-protobuf \
zlib1g-dev
- name: Checkout sources

43
.github/workflows/clang-format.yaml vendored Normal file
View File

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

View File

@@ -1,51 +0,0 @@
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,7 +30,6 @@ jobs:
run: |
brew install qt \
optipng
pip3 install "protobuf<3.21" --break-system-packages
- name: Checkout sources
uses: actions/checkout@v4
@@ -38,10 +37,6 @@ jobs:
shell: bash
run: git submodule update --depth 1 --init --recursive --jobs=$(($(sysctl -n hw.logicalcpu) * 20))
- name: Configure repository
shell: bash
run: ./configure.sh
- name: Configure XCode cache
uses: irgaly/xcode-cache@v1
with:

19
.gitignore vendored
View File

@@ -14,10 +14,12 @@ stxxl.errlog
stxxl.log
screenlog.0
data/symbols/*/design/
data/styles/*/*/out/*
data/resources-*_design/*
# symbols png/sdf are now generated at build
data/symbols/**/symbols.png
data/symbols/**/symbols.sdf
data/resources-*_*/symbols.png
data/resources-*_*/symbols.sdf
data/drules_proto_default_design.bin
data/colors_design.txt
data/patterns_design.txt
data/bookmarks
@@ -26,12 +28,6 @@ data/World.mwm
data/WorldCoasts.mwm
data/world_mwm/*
data/*_hash
data/drules_proto*
data/classificator.txt
data/types.txt
data/visibility.txt
data/colors.txt
data/patterns.txt
# Compiled Python
*.pyc
@@ -50,9 +46,10 @@ omim.sdf
*.suo
*.aps
*.rc
!qt/res/windows/windows.rc
!qt/res/windows.rc
*.pdb
out/
out/*
qt/mapswithme.log
# XCode
xcode/keys/*

View File

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

View File

@@ -125,8 +125,10 @@ You can help by donating, contributing code, translating, or by telling others a
- Build instructions: [docs/INSTALL.md](docs/INSTALL.md)
- Contribution guide: [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md)
> [!NOTE]
> Some docs might be outdated, contain broken links or old references to Organic Maps, etc. Its a work in progress and help is much appreciated!
There is a dedicated [Zulip](https://codeberg.org/comaps/Governance/src/branch/main/contribute.md#3-team-messaging) chat for active contributors.
There is a dedicated Zulip chat for active contributors: [Zulip](https://comaps.zulipchat.com)
---
@@ -140,7 +142,7 @@ There is a dedicated [Zulip](https://codeberg.org/comaps/Governance/src/branch/m
## 💸 Funding
CoMaps is free. To fund development, we rely on your voluntary support ♥️
CoMaps is free. To stay that way, it relies on your support.
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).

View File

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

View File

@@ -1,7 +1,10 @@
• OpenStreetMap data as of August 4
• improve map colors for water, forests, scrubs, various amenities, pedestrian areas etc.
add ranger stations, covered bicycle parkings, escape games, luggage lockers, post office partners
upgrade altitude contour lines to 20m step for some popular hiking regions
support more search abbreviations and aliases
• add search and bookmark icons for fast food, bicycle and charging stations
more smooth position arrow movements
Introducing CoMaps logo!
upgrade altitude contour lines for many regions to 20 or 50 meters step
add Panoramax Picture links to selected POIs
OpenStreetMap data as of July 13
• add color fills to many features and display fills earlier for existing features
display opening hours state when selecting a POI
• 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,7 +1,9 @@
• Datos de OpenStreetMap a fecha 2025.08.04
Mejora de colores del mapa para agua, bosques, matorrales, servicios, zonas peatonales, etc.
Añadidas estaciones de guardabosques, aparcamientos cubiertos de bicis, juegos de escape, consignas y oficinas de correo
Nuevas curvas de nivel (20 m) en regiones populares para senderismo
Más abreviaturas y alias de búsqueda
Iconos de búsqueda y marcadores para comida rápida, bicicletas y estaciones de recarga
Más fluidez de la flecha de posición
¡Presentamos el logo de CoMaps!
mejora de isolíneas con más detalle para muchas regiones
añade enlaces de imágenes de Panoramax a POIs seleccionados
datos de OpenStreetMap a 13 de julio
añadidos rellenos de color a muchas características
se muestra el estado de horarios de apertura al seleccionar un POI
se dividen los humedales en tipos distintos
• 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

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

View File

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

View File

@@ -0,0 +1,7 @@
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 de cartes facile - Découvrez le monde - Propulsé par la communauté
Navigation cartographique facile - Découvrez davantage de votre voyage - Propulsé par la communauté

View File

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

View File

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

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

View File

@@ -1 +0,0 @@
Navegação fácil nos mapas - Descubra mais sobre o seu percurso - Feito por todos

View File

@@ -1 +0,0 @@
CoMaps - Mapas e Navegação - Offline e Privada

View File

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

View File

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

View File

@@ -1 +1 @@
Navigation cartographique facile - Vivez de grands voyages - Propulsé par la communauté
Navigation cartographique facile - Découvrez davantage de votre voyage - Propulsé par la communauté

View File

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

View File

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

View File

@@ -1 +0,0 @@
കോമാപ്പ്സ് - സ്വകാര്യതയോടെ സഞ്ചരിക്കൂ

View File

@@ -1 +0,0 @@
CoMaps - Nawigacja szanująca prywatność

View File

@@ -7,12 +7,12 @@ Topluluğa katılın ve en iyi harita uygulamasını oluşturmamıza yardım edi
<i>Geri bildirimleriniz ve 5 yıldızlı yorumlarınız bizim için en iyi destektir!</i>
‣ <b>Basit ve Temiz</b>: Sadece temel, kullanımı basit ve işe yarayan özellikler.
‣ <b>Basit ve Temiz</b>: Sadece temel, kullanımı basit, işe yarayan özellikler.
‣ <b>Çevrimdışı Odaklı</b>: Mobil veriye ihtiyaç duymadan yurt dışı seyahatinizi planlayın ve gezin, uzun bir yürüyüş sırasında rotanızdaki noktaları bulun ve daha fazlası . Tüm özellikler çevrimdışı çalışmak üzere tasarlanmıştır.
‣ <b>Gizliliğe Saygılı</b>: Uygulama gizliliğe saygılı olarak tasarlanmıştır. Kullanıcı profilinizi çıkarmaz, sizi takip etmez ve kişisel bilgi toplamaz. Üstelik tamamen reklamsızdır.
‣ <b>Pil ve Depolamanızdan Tasarruf Eder</b>: Diğer navigasyon uygulamaları gibi pilinizi sömürmez. Kompakt harita dosyaları, değerli depolama alanınızdan tasarruf eder.
‣ <b>Ücretsizdir ve Gücünü Topluluktan Alır</b>: Sizin gibi insanlar OpenStreetMap'e yer ekleyerek, yeni özellikleri test ederek, geri bildirimde bulunarak, program geliştirme becerileri ve bağışlarla katkıda bulunarak bu uygulamanın oluşturulmasına yardımcı oldular.
‣ <b>Açık ve Şeffaf Bir Şekilde Yürütülen Karar Alma ve Fonlama Süreçlerine Sahip, Kâr Amacı Gütmeyen ve Tamamen Açık Kaynaklı Bir Uygulama.</b>
‣ <b>Pil ve Depolamanızdan Tasarruf Eder</b>: Diğer navigasyon uygulamaları gibi pilinizi sömürmez. Compact maps değerli depolama alanınızdan tasarruf eder.
‣ <b>Ücretsizdir ve Gücünü Topluluktan Alır</b>: Sizin gibi insanlar OpenStreetMap'e yer ekleyerek, yeni özellikleri test ederek, geri bildirimde bulunarak, program geliştirme becerileri ve bağışlarla katkıda bulunarak uygulamanın oluşturulmasına yardımcı oldu.
‣ <b>Açık ve Şeffaf Şekilde Yürütülen Karar Alma ve Fonlama Süreçleri, Kâr Amacı Gütmez ve Tamamen Açık Kaynaklı.</b>
<b>Ana Özellikler</b>:
• Google Haritalar'da bulunmayan yerleri içeren, çevrimdışı detaylı haritalar

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -27,11 +27,8 @@ public class SurfaceRenderer implements DefaultLifecycleObserver, SurfaceCallbac
{
private static final String TAG = SurfaceRenderer.class.getSimpleName();
@NonNull
private final CarContext mCarContext;
@NonNull
private final Map mMap;
private final Map mMap = new Map(Car);
@NonNull
private Rect mVisibleArea = new Rect();
@@ -45,7 +42,6 @@ public class SurfaceRenderer implements DefaultLifecycleObserver, SurfaceCallbac
{
Logger.d(TAG, "SurfaceRenderer()");
mCarContext = carContext;
mMap = new Map(Car, MwmApplication.from(mCarContext).getLocationHelper());
mIsRunning = true;
lifecycle.addObserver(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.UiHelpers;
import app.organicmaps.routing.NavigationService;
import app.organicmaps.routing.RoutingController;
import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.location.LocationHelper;
import app.organicmaps.sdk.location.LocationListener;
import app.organicmaps.sdk.routing.JunctionInfo;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.routing.RoutingInfo;
import app.organicmaps.sdk.sound.TtsPlayer;
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.UiHelpers;
import app.organicmaps.routing.ResultCodesHelper;
import app.organicmaps.routing.RoutingController;
import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.Router;
import app.organicmaps.sdk.bookmarks.data.MapObject;
import app.organicmaps.sdk.bookmarks.data.Metadata;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.routing.RoutingInfo;
import app.organicmaps.sdk.util.Config;
import java.util.Objects;

View File

@@ -7,9 +7,9 @@ import androidx.car.app.CarContext;
import androidx.car.app.ScreenManager;
import app.organicmaps.car.screens.download.DownloadMapsScreen;
import app.organicmaps.car.screens.download.DownloadMapsScreenBuilder;
import app.organicmaps.routing.RoutingController;
import app.organicmaps.sdk.downloader.CountryItem;
import app.organicmaps.sdk.downloader.MapManager;
import app.organicmaps.sdk.routing.RoutingController;
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.screens.NavigationScreen;
import app.organicmaps.car.screens.search.SearchScreen;
import app.organicmaps.routing.RoutingController;
import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.Map;
import app.organicmaps.sdk.api.ParsedSearchRequest;
import app.organicmaps.sdk.api.RequestType;
import app.organicmaps.sdk.display.DisplayManager;
import app.organicmaps.sdk.display.DisplayType;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.util.log.Logger;
public final class IntentUtils

View File

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

View File

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

View File

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

View File

@@ -9,9 +9,9 @@ import androidx.core.view.ViewCompat;
import app.organicmaps.MwmActivity;
import app.organicmaps.MwmApplication;
import app.organicmaps.R;
import app.organicmaps.routing.RoutingController;
import app.organicmaps.sdk.downloader.CountryItem;
import app.organicmaps.sdk.downloader.MapManager;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.util.Config;
import app.organicmaps.sdk.util.ConnectionState;
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)
{
mExamplesTitle.setCompoundDrawablesRelativeWithIntrinsicBounds(
Graphics.tint(requireActivity(), left, com.google.android.material.R.attr.colorSecondary), null,
Graphics.tint(requireActivity(), right, com.google.android.material.R.attr.colorSecondary), null);
Graphics.tint(requireActivity(), left, androidx.appcompat.R.attr.colorAccent), null,
Graphics.tint(requireActivity(), right, androidx.appcompat.R.attr.colorAccent), null);
}
@Override

View File

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

View File

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

View File

@@ -9,9 +9,7 @@ import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import app.organicmaps.R;
import app.organicmaps.sdk.editor.data.FeatureCategory;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textview.MaterialTextView;
public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
@@ -23,12 +21,6 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
private final FeatureCategoryFragment mFragment;
private final FeatureCategory mSelectedCategory;
public interface FooterListener
{
void onNoteTextChanged(String newText);
void onSendNoteClicked();
}
public FeatureCategoryAdapter(@NonNull FeatureCategoryFragment host, @NonNull FeatureCategory[] categories,
@Nullable FeatureCategory category)
{
@@ -65,8 +57,7 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
case TYPE_FOOTER ->
{
return new FooterViewHolder(
LayoutInflater.from(parent.getContext()).inflate(R.layout.item_feature_category_footer, parent, false),
(FooterListener) mFragment);
LayoutInflater.from(parent.getContext()).inflate(R.layout.item_feature_category_footer, parent, false));
}
default -> throw new IllegalArgumentException("Unsupported");
}
@@ -79,10 +70,6 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
{
((FeatureViewHolder) holder).bind(position);
}
else if (holder instanceof FooterViewHolder)
{
((FooterViewHolder) holder).bind(mFragment.getPendingNoteText());
}
}
@Override
@@ -118,36 +105,11 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
protected static class FooterViewHolder extends RecyclerView.ViewHolder
{
private final TextInputEditText mNoteEditText;
private final View mSendNoteButton;
FooterViewHolder(@NonNull View itemView, @NonNull FooterListener listener)
FooterViewHolder(@NonNull View itemView)
{
super(itemView);
MaterialTextView categoryUnsuitableText = itemView.findViewById(R.id.editor_category_unsuitable_text);
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,39 +2,28 @@ package app.organicmaps.editor;
import static app.organicmaps.sdk.util.Utils.getLocalizedFeatureType;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.CallSuper;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import app.organicmaps.MwmApplication;
import app.organicmaps.R;
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.OsmOAuth;
import app.organicmaps.sdk.editor.data.FeatureCategory;
import app.organicmaps.sdk.util.Language;
import app.organicmaps.util.Utils;
import app.organicmaps.widget.SearchToolbarController;
import app.organicmaps.widget.ToolbarController;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.Arrays;
import java.util.Comparator;
public class FeatureCategoryFragment
extends BaseMwmRecyclerFragment<FeatureCategoryAdapter> implements FeatureCategoryAdapter.FooterListener
public class FeatureCategoryFragment extends BaseMwmRecyclerFragment<FeatureCategoryAdapter>
{
private FeatureCategory mSelectedCategory;
protected ToolbarController mToolbarController;
private static final String NOTE_CONFIRMATION_SHOWN = "NoteConfirmationAlertWasShown";
private static String mPendingNoteText = "";
public interface FeatureCategoryListener
{
@@ -115,64 +104,4 @@ public class FeatureCategoryFragment
else if (getParentFragment() instanceof FeatureCategoryListener)
((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.recyclerview.widget.RecyclerView;
import app.organicmaps.R;
import app.organicmaps.editor.data.TimeFormatUtils;
import app.organicmaps.sdk.editor.OpeningHours;
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.Timetable;
import app.organicmaps.sdk.util.UiUtils;

View File

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

View File

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

View File

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

View File

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

View File

@@ -9,17 +9,16 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import app.organicmaps.R;
import app.organicmaps.adapter.DisabledChildSimpleExpandableListAdapter;
import app.organicmaps.base.BaseMwmDialogFragment;
import app.organicmaps.sdk.downloader.CountryItem;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.textview.MaterialTextView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -94,9 +93,9 @@ abstract class BaseRoutingErrorDialogFragment extends BaseMwmDialogFragment
{
@SuppressLint("InflateParams")
final View countryView = View.inflate(requireActivity(), R.layout.dialog_missed_map, null);
((MaterialTextView) countryView.findViewById(R.id.tv__title)).setText(map.name);
((TextView) countryView.findViewById(R.id.tv__title)).setText(map.name);
final MaterialTextView szView = countryView.findViewById(R.id.tv__size);
final TextView szView = countryView.findViewById(R.id.tv__size);
szView.setText(StringUtils.getFileSizeString(requireContext(), map.totalSize));
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) szView.getLayoutParams();
lp.rightMargin = 0;

View File

@@ -8,6 +8,8 @@ import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.recyclerview.widget.RecyclerView;
@@ -17,8 +19,6 @@ import app.organicmaps.sdk.routing.RouteMarkData;
import app.organicmaps.sdk.routing.RouteMarkType;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textview.MaterialTextView;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -232,16 +232,16 @@ public class ManageRouteAdapter extends RecyclerView.Adapter<ManageRouteAdapter.
public final View mItemView;
@NonNull
public final ShapeableImageView mImageViewIcon;
public final ImageView mImageViewIcon;
@NonNull
public final MaterialTextView mTextViewTitle;
public final TextView mTextViewTitle;
@NonNull
public final MaterialTextView mTextViewSubtitle;
public final TextView mTextViewSubtitle;
@NonNull
public final ShapeableImageView mImageViewDelete;
public final ImageView mImageViewDelete;
ManageRouteViewHolder(@NonNull View itemView)
{

View File

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

View File

@@ -4,6 +4,7 @@ import android.location.Location;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
@@ -18,7 +19,6 @@ import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.Router;
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
import app.organicmaps.sdk.routing.CarDirection;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.routing.RoutingInfo;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.UiUtils;
@@ -28,22 +28,20 @@ import app.organicmaps.widget.LanesView;
import app.organicmaps.widget.SpeedLimitView;
import app.organicmaps.widget.menu.NavMenu;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textview.MaterialTextView;
public class NavigationController implements TrafficManager.TrafficCallback, NavMenu.NavMenuListener
{
private final View mFrame;
private final ImageView mNextTurnImage;
private final MaterialTextView mNextTurnDistance;
private final MaterialTextView mCircleExit;
private final TextView mNextTurnDistance;
private final TextView mCircleExit;
private final View mNextNextTurnFrame;
private final ImageView mNextNextTurnImage;
private final View mStreetFrame;
private final MaterialTextView mNextStreet;
private final TextView mNextStreet;
@NonNull
private final LanesView mLanesView;

View File

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

View File

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

View File

@@ -1,19 +1,38 @@
package app.organicmaps.sdk.routing;
package app.organicmaps.routing;
import android.content.Context;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import androidx.annotation.DimenRes;
import androidx.annotation.IntRange;
import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.util.Pair;
import app.organicmaps.MwmApplication;
import app.organicmaps.R;
import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.Router;
import app.organicmaps.sdk.bookmarks.data.FeatureId;
import app.organicmaps.sdk.bookmarks.data.MapObject;
import app.organicmaps.sdk.location.LocationHelper;
import app.organicmaps.sdk.routing.ResultCodes;
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.log.Logger;
import app.organicmaps.sdk.widget.placepage.CoordinatesFormat;
import app.organicmaps.util.Utils;
import app.organicmaps.widget.placepage.CoordinatesFormat;
import java.time.LocalTime;
import java.util.concurrent.TimeUnit;
@androidx.annotation.UiThread
public class RoutingController
@@ -95,7 +114,7 @@ public class RoutingController
mLastMissingMaps = missingMaps;
mContainsCachedResult = true;
if (mLastResultCode == ResultCodes.NO_ERROR || resultCode == ResultCodes.NEED_MORE_MAPS)
if (mLastResultCode == ResultCodes.NO_ERROR || ResultCodesHelper.isMoreMapsNeeded(mLastResultCode))
{
onBuiltRoute();
}
@@ -161,7 +180,7 @@ public class RoutingController
return;
}
if (mLastResultCode != ResultCodes.NEED_MORE_MAPS)
if (!ResultCodesHelper.isMoreMapsNeeded(mLastResultCode))
{
setBuildState(BuildState.ERROR);
mLastBuildProgress = 0;
@@ -176,7 +195,8 @@ public class RoutingController
private boolean isDrivingOptionsBuildError()
{
return mLastResultCode != ResultCodes.NEED_MORE_MAPS && RoutingOptions.hasAnyOptions() && !isRulerRouterType();
return !ResultCodesHelper.isMoreMapsNeeded(mLastResultCode) && RoutingOptions.hasAnyOptions()
&& !isRulerRouterType();
}
private void setState(State newState)
@@ -230,7 +250,7 @@ public class RoutingController
mContainer = container;
}
public void initialize(@NonNull LocationHelper locationHelper)
public void initialize(@NonNull Context context)
{
mLastRouterType = Router.getLastUsed();
mInvalidRoutePointsTransactionId = Framework.nativeInvalidRoutePointsTransactionId();
@@ -240,7 +260,7 @@ public class RoutingController
Framework.nativeSetRouteProgressListener(mRoutingProgressListener);
Framework.nativeSetRoutingRecommendationListener(recommendation -> UiThread.run(() -> {
if (recommendation == RouteRecommendationType.RebuildAfterPointsLoading)
setStartPoint(locationHelper.getMyPosition());
setStartPoint(MwmApplication.from(context).getLocationHelper().getMyPosition());
}));
Framework.nativeSetRoutingLoadPointsListener(mRoutingLoadPointsListener);
}
@@ -537,7 +557,7 @@ public class RoutingController
return mLastRouterType == Router.Vehicle;
}
public boolean isRulerRouterType()
boolean isRulerRouterType()
{
return mLastRouterType == Router.Ruler;
}
@@ -863,4 +883,26 @@ public class RoutingController
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

@@ -8,6 +8,7 @@ import android.text.TextUtils;
import android.util.Pair;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
@@ -17,7 +18,6 @@ import app.organicmaps.R;
import app.organicmaps.sdk.downloader.CountryItem;
import app.organicmaps.sdk.downloader.MapManager;
import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.textview.MaterialTextView;
public class RoutingErrorDialogFragment extends BaseRoutingErrorDialogFragment
{
@@ -38,7 +38,7 @@ public class RoutingErrorDialogFragment extends BaseRoutingErrorDialogFragment
if (!TextUtils.isEmpty(titleMessage.first))
{
MaterialTextView titleView = new MaterialTextView(requireContext());
TextView titleView = new TextView(requireContext());
titleView.setText(titleMessage.first);
titleView.setPadding(65, 32, 32, 16);
titleView.setTextSize(18);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -41,6 +41,8 @@ public enum BookmarkManager {
// These values have to match the values of kml::CompilationType from kml/types.hpp
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 TAG = BookmarkManager.class.getSimpleName();
@@ -68,6 +70,26 @@ public enum BookmarkManager {
@Nullable
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)
{
boolean isVisible = isVisible(category.getId());
@@ -320,7 +342,7 @@ public enum BookmarkManager {
nativeShowBookmarkCategoryOnMap(catId);
}
@PredefinedColors.Color
@Icon.PredefinedColor
public int getLastEditedColor()
{
return nativeGetLastEditedColor();
@@ -596,7 +618,7 @@ public enum BookmarkManager {
return nativeGetBookmarkXY(bookmarkId);
}
@PredefinedColors.Color
@Icon.PredefinedColor
public int getBookmarkColor(@IntRange(from = 0) long bookmarkId)
{
return nativeGetBookmarkColor(bookmarkId);
@@ -630,7 +652,7 @@ public enum BookmarkManager {
}
public void setBookmarkParams(@IntRange(from = 0) long bookmarkId, @NonNull String name,
@PredefinedColors.Color int color, @NonNull String descr)
@Icon.PredefinedColor int color, @NonNull String descr)
{
nativeSetBookmarkParams(bookmarkId, name, color, descr);
}
@@ -786,7 +808,7 @@ public enum BookmarkManager {
@Nullable
private native Bookmark nativeAddBookmarkToLastEditedCategory(double lat, double lon);
@PredefinedColors.Color
@Icon.PredefinedColor
private native int nativeGetLastEditedColor();
private static native void nativeLoadBookmarksFile(@NonNull String path, boolean isTemporaryFile);
@@ -852,7 +874,7 @@ public enum BookmarkManager {
@NonNull
private static native ParcelablePointD nativeGetBookmarkXY(@IntRange(from = 0) long bookmarkId);
@PredefinedColors.Color
@Icon.PredefinedColor
private static native int nativeGetBookmarkColor(@IntRange(from = 0) long bookmarkId);
private static native int nativeGetBookmarkIcon(@IntRange(from = 0) long bookmarkId);
@@ -867,13 +889,12 @@ public enum BookmarkManager {
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,
@PredefinedColors.Color int color, @NonNull String descr);
@Icon.PredefinedColor int color, @NonNull String descr);
private static native void nativeChangeTrackColor(@IntRange(from = 0) long trackId,
@PredefinedColors.Color int color);
private static native void nativeChangeTrackColor(@IntRange(from = 0) long trackId, @Icon.PredefinedColor int color);
private static native void nativeSetTrackParams(@IntRange(from = 0) long trackId, @NonNull String name,
@PredefinedColors.Color int color, @NonNull String descr);
@Icon.PredefinedColor int color, @NonNull String descr);
private static native void nativeChangeBookmarkCategory(@IntRange(from = 0) long oldCatId,
@IntRange(from = 0) long newCatId,

View File

@@ -1,29 +1,108 @@
package app.organicmaps.sdk.bookmarks.data;
import android.content.res.Resources;
import android.os.Parcel;
import android.os.Parcelable;
import androidx.annotation.ColorInt;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import app.organicmaps.BuildConfig;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.log.Logger;
import androidx.annotation.IntDef;
import app.organicmaps.sdk.R;
import com.google.common.base.Objects;
import dalvik.annotation.optimization.FastNative;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
public class Icon implements Parcelable
{
private static final String TAG = Icon.class.getSimpleName();
@Retention(RetentionPolicy.SOURCE)
@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
private static int[] sTypeIcons = null;
private static final int[] TYPE_ICONS = {
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
};
@PredefinedColors.Color
@PredefinedColor
private final int mColor;
private final int mType;
public Icon(@PredefinedColors.Color int color, int type)
public Icon(@PredefinedColor int color, int type)
{
mColor = color;
mType = type;
@@ -48,29 +127,31 @@ public class Icon implements Parcelable
mType = in.readInt();
}
@PredefinedColors.Color
@PredefinedColor
public int getColor()
{
return mColor;
}
@ColorInt
public int argb()
{
return PredefinedColors.getColor(mColor);
return ARGB_COLORS[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
public int getResId()
{
// loadDefaultIcons should be called
assert (sTypeIcons != null);
return sTypeIcons[mType];
}
public int getType()
{
return mType;
return TYPE_ICONS[mType];
}
@Override
@@ -100,29 +181,4 @@ public class Icon implements Parcelable
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

@@ -1,50 +0,0 @@
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,7 +161,6 @@ public final class Editor
public static native void nativeCreateNote(String text);
public static native void nativePlaceDoesNotExist(@NonNull String comment);
public static native void nativeRollbackMapObject();
public static native void nativeCreateStandaloneNote(double lat, double lon, String text);
/**
* @return all cuisines keys.

View File

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

View File

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

View File

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

View File

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

View File

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

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