mirror of
https://codeberg.org/comaps/comaps
synced 2025-12-22 06:03:45 +00:00
Compare commits
19 Commits
pastk-ios-
...
fix-ci
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
62fb50e95c | ||
|
|
664a156cc6 | ||
|
|
08b773dfa8 | ||
|
|
c31d3b6926 | ||
|
|
7469b0ecb4 | ||
|
|
2b78118310 | ||
|
|
70622bdca0 | ||
|
|
5b3e327ff8 | ||
|
|
8395e8d9a9 | ||
|
|
b7971b5cc0 | ||
|
|
8fb8be6a00 | ||
|
|
273afe052a | ||
|
|
9b5419b6d4 | ||
|
|
835ee4ab8d | ||
|
|
5bc8aae623 | ||
|
|
72439bd6d7 | ||
|
|
a3db039232 | ||
|
|
ffcaf3640b | ||
|
|
289f4c4343 |
@@ -3,6 +3,7 @@ BasedOnStyle: Google
|
|||||||
|
|
||||||
AccessModifierOffset: -2
|
AccessModifierOffset: -2
|
||||||
AlignAfterOpenBracket: Align
|
AlignAfterOpenBracket: Align
|
||||||
|
AlignArrayOfStructures: Right
|
||||||
AlignConsecutiveMacros: AcrossEmptyLinesAndComments
|
AlignConsecutiveMacros: AcrossEmptyLinesAndComments
|
||||||
AlignEscapedNewlines: LeftWithLastLine
|
AlignEscapedNewlines: LeftWithLastLine
|
||||||
AlignOperands: AlignAfterOperator
|
AlignOperands: AlignAfterOperator
|
||||||
@@ -39,10 +40,8 @@ ColumnLimit: 120
|
|||||||
ConstructorInitializerIndentWidth: 2
|
ConstructorInitializerIndentWidth: 2
|
||||||
ContinuationIndentWidth: 4
|
ContinuationIndentWidth: 4
|
||||||
DerivePointerAlignment: false
|
DerivePointerAlignment: false
|
||||||
EmptyLineBeforeAccessModifier: Always
|
|
||||||
IncludeBlocks: Preserve
|
IncludeBlocks: Preserve
|
||||||
IndentAccessModifiers: false
|
IndentAccessModifiers: false
|
||||||
IndentCaseLabels: false
|
|
||||||
IndentExternBlock: NoIndent
|
IndentExternBlock: NoIndent
|
||||||
InsertBraces: false
|
InsertBraces: false
|
||||||
InsertNewlineAtEOF: true
|
InsertNewlineAtEOF: true
|
||||||
@@ -50,7 +49,6 @@ LambdaBodyIndentation: OuterScope
|
|||||||
PackConstructorInitializers: CurrentLine
|
PackConstructorInitializers: CurrentLine
|
||||||
PointerAlignment: Middle
|
PointerAlignment: Middle
|
||||||
RemoveBracesLLVM: true
|
RemoveBracesLLVM: true
|
||||||
RemoveSemicolon: true
|
|
||||||
QualifierAlignment: Right
|
QualifierAlignment: Right
|
||||||
SpacesInContainerLiterals: false
|
SpacesInContainerLiterals: false
|
||||||
Standard: Latest
|
Standard: Latest
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -3,7 +3,7 @@ on:
|
|||||||
workflow_dispatch: # Manual trigger
|
workflow_dispatch: # Manual trigger
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- fix-ci
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- .gitignore
|
- .gitignore
|
||||||
- .forgejo/**
|
- .forgejo/**
|
||||||
@@ -41,11 +41,11 @@ jobs:
|
|||||||
- name: Install build tools and dependencies
|
- name: Install build tools and dependencies
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update -y
|
apt-get update -y
|
||||||
sudo apt-get install -y ninja-build
|
apt-get install -y cmake ninja-build
|
||||||
|
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: https://github.com/actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 100 # enough to get all commits for the current day
|
fetch-depth: 100 # enough to get all commits for the current day
|
||||||
|
|
||||||
@@ -69,6 +69,8 @@ jobs:
|
|||||||
RELEASE_KEYSTORE: ${{ secrets.RELEASE_KEYSTORE }}
|
RELEASE_KEYSTORE: ${{ secrets.RELEASE_KEYSTORE }}
|
||||||
|
|
||||||
- name: Compile
|
- name: Compile
|
||||||
|
container:
|
||||||
|
image: runmymind/docker-android-sdk:latest
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: android
|
working-directory: android
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: https://github.com/actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 1
|
fetch-depth: 1
|
||||||
sparse-checkout: |
|
sparse-checkout: |
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ on:
|
|||||||
workflow_dispatch: # Manual trigger
|
workflow_dispatch: # Manual trigger
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- fix-ci
|
||||||
pull_request:
|
pull_request:
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- .gitignore
|
- .gitignore
|
||||||
@@ -38,9 +38,17 @@ jobs:
|
|||||||
lint:
|
lint:
|
||||||
name: Android Lint
|
name: Android Lint
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: runmymind/docker-android-sdk:latest
|
||||||
steps:
|
steps:
|
||||||
|
- name: Install Node.JS
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
apt-get update -y
|
||||||
|
apt-get install -y nodejs
|
||||||
|
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: https://github.com/actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 1
|
fetch-depth: 1
|
||||||
|
|
||||||
@@ -56,6 +64,8 @@ jobs:
|
|||||||
android-check:
|
android-check:
|
||||||
name: Build Android Debug
|
name: Build Android Debug
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: runmymind/docker-android-sdk:latest
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@@ -74,11 +84,11 @@ jobs:
|
|||||||
- name: Install build tools and dependencies
|
- name: Install build tools and dependencies
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update -y
|
apt-get update -y
|
||||||
sudo apt-get install -y ninja-build
|
apt-get install -y cmake ninja-build nodejs
|
||||||
|
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: httpa://github.com/actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 200 # enough to get all commits for the current day
|
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))
|
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
|
||||||
|
|
||||||
- name: Configure ccache
|
- name: Configure ccache
|
||||||
uses: hendrikmuhs/ccache-action@v1.2
|
uses: https://github.com/hendrikmuhs/ccache-action@v1.2
|
||||||
with:
|
with:
|
||||||
key: ${{ github.workflow }}-${{ matrix.flavor }}
|
key: ${{ github.workflow }}-${{ matrix.flavor }}
|
||||||
|
|
||||||
@@ -106,5 +116,5 @@ jobs:
|
|||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: android-${{ matrix.flavor }}
|
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
|
if-no-files-found: error
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ jobs:
|
|||||||
name: Check preconditions
|
name: Check preconditions
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: https://github.com/actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 1000 # fetch month or so
|
fetch-depth: 1000 # fetch month or so
|
||||||
|
|
||||||
@@ -31,6 +31,8 @@ jobs:
|
|||||||
android-google-beta:
|
android-google-beta:
|
||||||
name: Android Google Beta
|
name: Android Google Beta
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: runmymind/docker-android-sdk:latest
|
||||||
needs: precondition
|
needs: precondition
|
||||||
if: ${{ needs.precondition.outputs.updated != '' }}
|
if: ${{ needs.precondition.outputs.updated != '' }}
|
||||||
environment: beta
|
environment: beta
|
||||||
@@ -38,14 +40,14 @@ jobs:
|
|||||||
- name: Install build tools and dependencies
|
- name: Install build tools and dependencies
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update -y
|
apt-get update -y
|
||||||
sudo apt-get install -y ninja-build
|
apt-get install -y ninja-build
|
||||||
|
|
||||||
- name: Install Google SDK
|
- name: Install Google SDK
|
||||||
uses: google-github-actions/setup-gcloud@v0
|
uses: google-github-actions/setup-gcloud@v0
|
||||||
|
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: https://github.com/actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 100 # enough to get all commits for the current day
|
fetch-depth: 100 # enough to get all commits for the current day
|
||||||
|
|
||||||
@@ -82,7 +84,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
gcloud auth activate-service-account --key-file android/app/firebase-test-lab.json
|
gcloud auth activate-service-account --key-file android/app/firebase-test-lab.json
|
||||||
gcloud config set project omapsapp
|
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=husky,version=34 \
|
||||||
--device model=tangorpro,version=33,orientation=landscape \
|
--device model=tangorpro,version=33,orientation=landscape \
|
||||||
--device model=bluejay,version=32 \
|
--device model=bluejay,version=32 \
|
||||||
|
|||||||
@@ -6,11 +6,13 @@ jobs:
|
|||||||
android-release-metadata:
|
android-release-metadata:
|
||||||
name: Upload Google Play metadata
|
name: Upload Google Play metadata
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: runmymind/docker-android-sdk:latest
|
||||||
environment: production
|
environment: production
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
# TODO: use shallow (and sparse?) checkout
|
# TODO: use shallow (and sparse?) checkout
|
||||||
uses: actions/checkout@v4
|
uses: https://github.com/actions/checkout@v4
|
||||||
|
|
||||||
# - name: Parallel submodules checkout
|
# - name: Parallel submodules checkout
|
||||||
# shell: bash
|
# shell: bash
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ jobs:
|
|||||||
environment: production
|
environment: production
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: https://github.com/actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 100 # Enough to get all commits for the last day.
|
fetch-depth: 100 # Enough to get all commits for the last day.
|
||||||
ssh-key: ${{ secrets.RELEASE_SSH_KEY }}
|
ssh-key: ${{ secrets.RELEASE_SSH_KEY }}
|
||||||
@@ -71,11 +71,11 @@ jobs:
|
|||||||
- name: Install build tools and dependencies
|
- name: Install build tools and dependencies
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update -y
|
apt-get update -y
|
||||||
sudo apt-get install -y ninja-build
|
apt-get install -y cmake ninja-build
|
||||||
|
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: https://github.com/actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 100 # enough to get all commits for the current day
|
fetch-depth: 100 # enough to get all commits for the current day
|
||||||
ref: 'refs/tags/${{ needs.tag.outputs.tag }}'
|
ref: 'refs/tags/${{ needs.tag.outputs.tag }}'
|
||||||
@@ -92,7 +92,7 @@ jobs:
|
|||||||
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
|
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
|
||||||
|
|
||||||
- name: Checkout screenshots
|
- name: Checkout screenshots
|
||||||
uses: actions/checkout@v4
|
uses: https://github.com/actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
repository: ${{ secrets.SCREENSHOTS_REPO }}
|
repository: ${{ secrets.SCREENSHOTS_REPO }}
|
||||||
ssh-key: ${{ secrets.SCREENSHOTS_SSH_KEY }}
|
ssh-key: ${{ secrets.SCREENSHOTS_SSH_KEY }}
|
||||||
@@ -121,6 +121,8 @@ jobs:
|
|||||||
run: echo "sdk.dir=$ANDROID_SDK_ROOT" > android/local.properties
|
run: echo "sdk.dir=$ANDROID_SDK_ROOT" > android/local.properties
|
||||||
|
|
||||||
- name: Compile and upload to Google Play
|
- name: Compile and upload to Google Play
|
||||||
|
container:
|
||||||
|
image: runmymind/docker-android-sdk:latest
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: android
|
working-directory: android
|
||||||
run: |
|
run: |
|
||||||
@@ -128,6 +130,8 @@ jobs:
|
|||||||
if: ${{ matrix.flavor == 'google' }}
|
if: ${{ matrix.flavor == 'google' }}
|
||||||
|
|
||||||
- name: Compile and upload to Huawei AppGallery
|
- name: Compile and upload to Huawei AppGallery
|
||||||
|
container:
|
||||||
|
image: runmymind/docker-android-sdk:latest
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: android
|
working-directory: android
|
||||||
run: |
|
run: |
|
||||||
@@ -136,6 +140,8 @@ jobs:
|
|||||||
if: ${{ matrix.flavor == 'huawei' }}
|
if: ${{ matrix.flavor == 'huawei' }}
|
||||||
|
|
||||||
- name: Compile universal APK
|
- name: Compile universal APK
|
||||||
|
container:
|
||||||
|
image: runmymind/docker-android-sdk:latest
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: android
|
working-directory: android
|
||||||
run: |
|
run: |
|
||||||
@@ -146,16 +152,16 @@ jobs:
|
|||||||
if: ${{ matrix.flavor == 'web' }}
|
if: ${{ matrix.flavor == 'web' }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
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 }}
|
cat ${{ env.RELEASE_NOTES }}
|
||||||
echo ""
|
echo ""
|
||||||
echo "See [a detailed announce](https://organicmaps.app/news/) on our website when app updates are published in all stores."
|
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://codeberg.org/comaps/comaps/wiki/Installing-Organic-Maps-from-GitHub-using-Obtainium)."
|
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 ""
|
||||||
echo "sha256sum:"
|
echo "sha256sum:"
|
||||||
echo -e '\n```'
|
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```'
|
echo -e '\n```'
|
||||||
} > ${{ runner.temp }}/release-notes.txt
|
} > ${{ runner.temp }}/release-notes.txt
|
||||||
|
|
||||||
@@ -170,6 +176,6 @@ jobs:
|
|||||||
discussion_category_name: 'Announcements'
|
discussion_category_name: 'Announcements'
|
||||||
prerelease: true
|
prerelease: true
|
||||||
files: |
|
files: |
|
||||||
./android/app/build/outputs/apk/web/release/OrganicMaps-${{ needs.tag.outputs.code }}-web-release.apk
|
./android/app/build/outputs/apk/web/release/CoMaps-${{ 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.sha256sum
|
||||||
fail_on_unmatched_files: true
|
fail_on_unmatched_files: true
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ on:
|
|||||||
workflow_dispatch: # Manual trigger
|
workflow_dispatch: # Manual trigger
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- packaging/app.comaps.comaps.metainfo.xml
|
- packaging/app.comaps.desktop.metainfo.xml
|
||||||
- .forgejo/workflows/appstream-check.yaml # Run check on self change
|
- .forgejo/workflows/appstream-check.yaml # Run check on self change
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -12,25 +12,25 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: https://github.com/actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 1
|
fetch-depth: 1
|
||||||
sparse-checkout: |
|
sparse-checkout: |
|
||||||
packaging/app.comaps.comaps.metainfo.xml
|
packaging/app.comaps.desktop.metainfo.xml
|
||||||
|
|
||||||
- name: Install appstream validator and flatpak Builder
|
- name: Install appstream validator and flatpak Builder
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
sudo apt update -y
|
apt update -y
|
||||||
sudo apt install -y \
|
apt install -y \
|
||||||
flatpak
|
flatpak
|
||||||
sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||||
sudo flatpak install -y org.flatpak.Builder
|
flatpak install -y org.flatpak.Builder
|
||||||
|
|
||||||
- name: Lint appstream data with flatpak Builder
|
- name: Lint appstream data with flatpak Builder
|
||||||
shell: bash
|
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
|
- name: Run appstreamcli in pedantic mode
|
||||||
shell: bash
|
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
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ jobs:
|
|||||||
if: ${{ needs.should-run-check.outputs.run-from-pr == 'true' || needs.should-run-check.outputs.manually-triggered == 'true'}}
|
if: ${{ needs.should-run-check.outputs.run-from-pr == 'true' || needs.should-run-check.outputs.manually-triggered == 'true'}}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: https://github.com/actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 100 # enough to get all commits for the current day
|
fetch-depth: 100 # enough to get all commits for the current day
|
||||||
|
|
||||||
@@ -74,8 +74,8 @@ jobs:
|
|||||||
- name: Install build tools and dependencies
|
- name: Install build tools and dependencies
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
sudo apt update -y
|
apt update -y
|
||||||
sudo apt install -y \
|
apt install -y \
|
||||||
ninja-build \
|
ninja-build \
|
||||||
libgl1-mesa-dev \
|
libgl1-mesa-dev \
|
||||||
libglvnd-dev \
|
libglvnd-dev \
|
||||||
@@ -90,7 +90,7 @@ jobs:
|
|||||||
gcovr
|
gcovr
|
||||||
|
|
||||||
- name: Configure ccache
|
- name: Configure ccache
|
||||||
uses: hendrikmuhs/ccache-action@v1.2
|
uses: https://github.com/hendrikmuhs/ccache-action@v1.2
|
||||||
with:
|
with:
|
||||||
key: ${{ github.workflow }}-coverage
|
key: ${{ github.workflow }}-coverage
|
||||||
|
|
||||||
@@ -124,15 +124,15 @@ jobs:
|
|||||||
# world_feed_integration_tests - https://github.com/organicmaps/organicmaps/issues/215
|
# 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"
|
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: |
|
run: |
|
||||||
sudo locale-gen en_US
|
locale-gen en_US
|
||||||
sudo locale-gen en_US.UTF-8
|
locale-gen en_US.UTF-8
|
||||||
sudo locale-gen es_ES
|
locale-gen es_ES
|
||||||
sudo locale-gen es_ES.UTF-8
|
locale-gen es_ES.UTF-8
|
||||||
sudo locale-gen fr_FR
|
locale-gen fr_FR
|
||||||
sudo locale-gen fr_FR.UTF-8
|
locale-gen fr_FR.UTF-8
|
||||||
sudo locale-gen ru_RU
|
locale-gen ru_RU
|
||||||
sudo locale-gen ru_RU.UTF-8
|
locale-gen ru_RU.UTF-8
|
||||||
sudo update-locale
|
update-locale
|
||||||
ctest -L "omim-test" -E "$CTEST_EXCLUDE_REGEX" --output-on-failure
|
ctest -L "omim-test" -E "$CTEST_EXCLUDE_REGEX" --output-on-failure
|
||||||
|
|
||||||
- name: Run coverage report generation
|
- name: Run coverage report generation
|
||||||
|
|||||||
@@ -3,6 +3,6 @@ on: [pull_request]
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check:
|
check:
|
||||||
runs-on: codeberg-tiny
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: https://github.com/KineticCafe/actions-dco@v1
|
- uses: https://github.com/KineticCafe/actions-dco@v1
|
||||||
@@ -3,7 +3,7 @@ on:
|
|||||||
workflow_dispatch: # Manual trigger
|
workflow_dispatch: # Manual trigger
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
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
|
- .forgejo/workflows/desktop-file-check.yaml # Run check on self change
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -12,19 +12,19 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: https://github.com/actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 1
|
fetch-depth: 1
|
||||||
sparse-checkout: |
|
sparse-checkout: |
|
||||||
qt/res/linux/app.comaps.comaps.desktop
|
qt/res/app.comaps.desktop.desktop
|
||||||
|
|
||||||
- name: Install desktop-file-validate tool
|
- name: Install desktop-file-validate tool
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
sudo apt update -y
|
apt update -y
|
||||||
sudo apt install -y \
|
apt install -y \
|
||||||
desktop-file-utils
|
desktop-file-utils
|
||||||
|
|
||||||
- name: Validate desktop file
|
- name: Validate desktop file
|
||||||
shell: bash
|
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"
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ on:
|
|||||||
workflow_dispatch: # Manual trigger
|
workflow_dispatch: # Manual trigger
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- fix-ci
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- .gitignore
|
- .gitignore
|
||||||
- .forgejo/**
|
- .forgejo/**
|
||||||
@@ -45,7 +45,7 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: https://github.com/actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 100 # enough to get all commits for the current day
|
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_DEV_P12: ${{ secrets.CERTIFICATES_DEV_P12 }}
|
||||||
CERTIFICATES_DISTR_P12: ${{ secrets.CERTIFICATES_DISTR_P12 }}
|
CERTIFICATES_DISTR_P12: ${{ secrets.CERTIFICATES_DISTR_P12 }}
|
||||||
|
|
||||||
- name: Configure repository
|
|
||||||
shell: bash
|
|
||||||
run: ./configure.sh
|
|
||||||
|
|
||||||
- name: Compile and upload to TestFlight
|
- name: Compile and upload to TestFlight
|
||||||
run: |
|
run: |
|
||||||
echo "IOS_VERSION=$(../tools/unix/version.sh ios_version)-$(../tools/unix/version.sh ios_build)" >> "$GITHUB_ENV"
|
echo "IOS_VERSION=$(../tools/unix/version.sh ios_version)-$(../tools/unix/version.sh ios_build)" >> "$GITHUB_ENV"
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: https://github.com/actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 1
|
fetch-depth: 1
|
||||||
sparse-checkout: |
|
sparse-checkout: |
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ on:
|
|||||||
workflow_dispatch: # Manual trigger
|
workflow_dispatch: # Manual trigger
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- fix-ci
|
||||||
pull_request:
|
pull_request:
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- .gitignore
|
- .gitignore
|
||||||
@@ -53,16 +53,12 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: https://github.com/actions/checkout@v4
|
||||||
|
|
||||||
- name: Parallel submodules checkout
|
- name: Parallel submodules checkout
|
||||||
shell: bash
|
shell: bash
|
||||||
run: git submodule update --depth 1 --init --recursive --jobs=$(($(sysctl -n hw.logicalcpu) * 20))
|
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
|
- name: Configure XCode cache
|
||||||
uses: irgaly/xcode-cache@v1
|
uses: irgaly/xcode-cache@v1
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ jobs:
|
|||||||
environment: production
|
environment: production
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: https://github.com/actions/checkout@v4
|
||||||
|
|
||||||
- name: Restore release keys
|
- name: Restore release keys
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -25,7 +25,7 @@ jobs:
|
|||||||
APPSTORE_JSON: ${{ secrets.APPSTORE_JSON }}
|
APPSTORE_JSON: ${{ secrets.APPSTORE_JSON }}
|
||||||
|
|
||||||
- name: Checkout screenshots
|
- name: Checkout screenshots
|
||||||
uses: actions/checkout@v4
|
uses: https://github.com/actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
repository: ${{ secrets.SCREENSHOTS_REPO }}
|
repository: ${{ secrets.SCREENSHOTS_REPO }}
|
||||||
ssh-key: ${{ secrets.SCREENSHOTS_SSH_KEY }}
|
ssh-key: ${{ secrets.SCREENSHOTS_SSH_KEY }}
|
||||||
@@ -33,7 +33,7 @@ jobs:
|
|||||||
path: screenshots
|
path: screenshots
|
||||||
|
|
||||||
- name: Checkout keywords
|
- name: Checkout keywords
|
||||||
uses: actions/checkout@v4
|
uses: https://github.com/actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
repository: ${{ secrets.KEYWORDS_REPO }}
|
repository: ${{ secrets.KEYWORDS_REPO }}
|
||||||
ssh-key: ${{ secrets.KEYWORDS_SSH_KEY }}
|
ssh-key: ${{ secrets.KEYWORDS_SSH_KEY }}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ on:
|
|||||||
workflow_dispatch: # Manual trigger
|
workflow_dispatch: # Manual trigger
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- fix-ci
|
||||||
pull_request:
|
pull_request:
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- .gitignore
|
- .gitignore
|
||||||
@@ -39,7 +39,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: https://github.com/actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 100 # enough to get all commits for the current day
|
fetch-depth: 100 # enough to get all commits for the current day
|
||||||
|
|
||||||
@@ -50,9 +50,10 @@ jobs:
|
|||||||
- name: Install build tools and dependencies
|
- name: Install build tools and dependencies
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
sudo apt update -y
|
apt update -y
|
||||||
sudo apt install -y \
|
apt install -y \
|
||||||
ninja-build \
|
ninja-build \
|
||||||
|
cmake \
|
||||||
libgl1-mesa-dev \
|
libgl1-mesa-dev \
|
||||||
libglvnd-dev \
|
libglvnd-dev \
|
||||||
libharfbuzz-dev \
|
libharfbuzz-dev \
|
||||||
@@ -67,7 +68,7 @@ jobs:
|
|||||||
libqt6positioning6
|
libqt6positioning6
|
||||||
|
|
||||||
- name: Configure ccache
|
- name: Configure ccache
|
||||||
uses: hendrikmuhs/ccache-action@v1.2
|
uses: https://github.com/hendrikmuhs/ccache-action@v1.2
|
||||||
with:
|
with:
|
||||||
key: ${{ github.workflow }}-no-unity
|
key: ${{ github.workflow }}-no-unity
|
||||||
|
|
||||||
@@ -103,7 +104,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: https://github.com/actions/checkout@v4
|
||||||
|
|
||||||
- name: Parallel submodules checkout
|
- name: Parallel submodules checkout
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -112,8 +113,8 @@ jobs:
|
|||||||
- name: Install build tools and dependencies
|
- name: Install build tools and dependencies
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
sudo apt update -y
|
apt update -y
|
||||||
sudo apt install -y \
|
apt install -y \
|
||||||
ninja-build \
|
ninja-build \
|
||||||
libgl1-mesa-dev \
|
libgl1-mesa-dev \
|
||||||
libglvnd-dev \
|
libglvnd-dev \
|
||||||
@@ -129,7 +130,7 @@ jobs:
|
|||||||
libqt6positioning6
|
libqt6positioning6
|
||||||
|
|
||||||
- name: Configure ccache
|
- name: Configure ccache
|
||||||
uses: hendrikmuhs/ccache-action@v1.2
|
uses: https://github.com/hendrikmuhs/ccache-action@v1.2
|
||||||
with:
|
with:
|
||||||
key: ${{ github.workflow }}-unity-${{ matrix.compiler.CC }}-${{ matrix.CMAKE_BUILD_TYPE }}
|
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
|
# 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"
|
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: |
|
run: |
|
||||||
sudo locale-gen en_US
|
locale-gen en_US
|
||||||
sudo locale-gen en_US.UTF-8
|
locale-gen en_US.UTF-8
|
||||||
sudo locale-gen es_ES
|
locale-gen es_ES
|
||||||
sudo locale-gen es_ES.UTF-8
|
locale-gen es_ES.UTF-8
|
||||||
sudo locale-gen fr_FR
|
locale-gen fr_FR
|
||||||
sudo locale-gen fr_FR.UTF-8
|
locale-gen fr_FR.UTF-8
|
||||||
sudo locale-gen ru_RU
|
locale-gen ru_RU
|
||||||
sudo locale-gen ru_RU.UTF-8
|
locale-gen ru_RU.UTF-8
|
||||||
sudo update-locale
|
update-locale
|
||||||
ctest -L "omim-test" -E "$CTEST_EXCLUDE_REGEX" --output-on-failure
|
ctest -L "omim-test" -E "$CTEST_EXCLUDE_REGEX" --output-on-failure
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ on:
|
|||||||
workflow_dispatch: # Manual trigger
|
workflow_dispatch: # Manual trigger
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- fix-ci
|
||||||
pull_request:
|
pull_request:
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- .gitignore
|
- .gitignore
|
||||||
@@ -46,7 +46,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: https://github.com/actions/checkout@v4
|
||||||
|
|
||||||
- name: Parallel submodules checkout
|
- name: Parallel submodules checkout
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|||||||
5
.github/workflows/android-check.yaml
vendored
5
.github/workflows/android-check.yaml
vendored
@@ -23,10 +23,6 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
|
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
|
||||||
|
|
||||||
- name: Configure repository
|
|
||||||
shell: bash
|
|
||||||
run: SKIP_GENERATE_SYMBOLS=1 ./configure.sh
|
|
||||||
|
|
||||||
- name: Lint
|
- name: Lint
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: android
|
working-directory: android
|
||||||
@@ -66,7 +62,6 @@ jobs:
|
|||||||
libxinerama-dev \
|
libxinerama-dev \
|
||||||
libxcursor-dev \
|
libxcursor-dev \
|
||||||
libxi-dev \
|
libxi-dev \
|
||||||
python3-protobuf \
|
|
||||||
zlib1g-dev
|
zlib1g-dev
|
||||||
|
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
|
|||||||
43
.github/workflows/clang-format.yaml
vendored
Normal file
43
.github/workflows/clang-format.yaml
vendored
Normal 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
|
||||||
51
.github/workflows/code-style-check.yaml
vendored
51
.github/workflows/code-style-check.yaml
vendored
@@ -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
|
|
||||||
5
.github/workflows/ios-check.yaml
vendored
5
.github/workflows/ios-check.yaml
vendored
@@ -30,7 +30,6 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
brew install qt \
|
brew install qt \
|
||||||
optipng
|
optipng
|
||||||
pip3 install "protobuf<3.21" --break-system-packages
|
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
@@ -38,10 +37,6 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: git submodule update --depth 1 --init --recursive --jobs=$(($(sysctl -n hw.logicalcpu) * 20))
|
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
|
- name: Configure XCode cache
|
||||||
uses: irgaly/xcode-cache@v1
|
uses: irgaly/xcode-cache@v1
|
||||||
with:
|
with:
|
||||||
|
|||||||
19
.gitignore
vendored
19
.gitignore
vendored
@@ -14,10 +14,12 @@ stxxl.errlog
|
|||||||
stxxl.log
|
stxxl.log
|
||||||
screenlog.0
|
screenlog.0
|
||||||
|
|
||||||
data/symbols/*/design/
|
data/styles/*/*/out/*
|
||||||
|
data/resources-*_design/*
|
||||||
# symbols png/sdf are now generated at build
|
# symbols png/sdf are now generated at build
|
||||||
data/symbols/**/symbols.png
|
data/resources-*_*/symbols.png
|
||||||
data/symbols/**/symbols.sdf
|
data/resources-*_*/symbols.sdf
|
||||||
|
data/drules_proto_default_design.bin
|
||||||
data/colors_design.txt
|
data/colors_design.txt
|
||||||
data/patterns_design.txt
|
data/patterns_design.txt
|
||||||
data/bookmarks
|
data/bookmarks
|
||||||
@@ -26,12 +28,6 @@ data/World.mwm
|
|||||||
data/WorldCoasts.mwm
|
data/WorldCoasts.mwm
|
||||||
data/world_mwm/*
|
data/world_mwm/*
|
||||||
data/*_hash
|
data/*_hash
|
||||||
data/drules_proto*
|
|
||||||
data/classificator.txt
|
|
||||||
data/types.txt
|
|
||||||
data/visibility.txt
|
|
||||||
data/colors.txt
|
|
||||||
data/patterns.txt
|
|
||||||
|
|
||||||
# Compiled Python
|
# Compiled Python
|
||||||
*.pyc
|
*.pyc
|
||||||
@@ -50,9 +46,10 @@ omim.sdf
|
|||||||
*.suo
|
*.suo
|
||||||
*.aps
|
*.aps
|
||||||
*.rc
|
*.rc
|
||||||
!qt/res/windows/windows.rc
|
!qt/res/windows.rc
|
||||||
*.pdb
|
*.pdb
|
||||||
out/
|
out/*
|
||||||
|
qt/mapswithme.log
|
||||||
|
|
||||||
# XCode
|
# XCode
|
||||||
xcode/keys/*
|
xcode/keys/*
|
||||||
|
|||||||
Submodule 3party/Vulkan-Headers updated: f69f0433ba...595c8d4794
Submodule 3party/protobuf/protobuf updated: 9442c12e86...a6189acd18
@@ -1,5 +1,4 @@
|
|||||||
cmake_minimum_required(VERSION 3.22.1)
|
cmake_minimum_required(VERSION 3.22.1)
|
||||||
|
|
||||||
project(omim C CXX)
|
project(omim C CXX)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 20)
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
@@ -106,7 +105,7 @@ if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")
|
|||||||
elseif (${CMAKE_BUILD_TYPE} MATCHES "Rel")
|
elseif (${CMAKE_BUILD_TYPE} MATCHES "Rel")
|
||||||
add_definitions(-DRELEASE)
|
add_definitions(-DRELEASE)
|
||||||
if (NOT MSVC)
|
if (NOT MSVC)
|
||||||
add_compile_options(-O3 $<$<CXX_COMPILER_ID:GNU>:-flto=auto>)
|
add_compile_options(-Ofast $<$<CXX_COMPILER_ID:GNU>:-flto=auto>) # Also enables -ffast-math
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
message(FATAL_ERROR "Unknown build type: " ${CMAKE_BUILD_TYPE})
|
message(FATAL_ERROR "Unknown build type: " ${CMAKE_BUILD_TYPE})
|
||||||
@@ -185,7 +184,7 @@ if (NOT PLATFORM_IPHONE AND NOT PLATFORM_ANDROID)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
# To allow #include "base/file_name.hpp" in all sources.
|
# To allow #include "base/file_name.hpp" in all sources.
|
||||||
include_directories("${CMAKE_HOME_DIRECTORY}" "${CMAKE_HOME_DIRECTORY}/libs" "${CMAKE_HOME_DIRECTORY}/tools")
|
include_directories(${CMAKE_HOME_DIRECTORY})
|
||||||
|
|
||||||
if (USE_PCH)
|
if (USE_PCH)
|
||||||
message(STATUS "Precompiled headers are ON")
|
message(STATUS "Precompiled headers are ON")
|
||||||
@@ -227,22 +226,49 @@ endif()
|
|||||||
# Used in qt/ and shaders/
|
# Used in qt/ and shaders/
|
||||||
find_package(Python3 REQUIRED COMPONENTS Interpreter)
|
find_package(Python3 REQUIRED COMPONENTS Interpreter)
|
||||||
|
|
||||||
add_subdirectory(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)
|
if (PLATFORM_DESKTOP)
|
||||||
add_subdirectory(dev_sandbox)
|
omim_add_tool_subdirectory(feature_list)
|
||||||
add_subdirectory(generator)
|
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)
|
if (NOT SKIP_QT_GUI)
|
||||||
add_subdirectory(qt)
|
add_subdirectory(qt)
|
||||||
|
omim_add_tool_subdirectory(skin_generator)
|
||||||
endif()
|
endif()
|
||||||
if (GENERATOR_TOOL)
|
if (GENERATOR_TOOL)
|
||||||
add_compile_options(-march=native -mtune=native)
|
add_compile_options(-march=native -mtune=native)
|
||||||
message(STATUS "target CPU optimizations enabled, produced binaries will NOT work on a different CPU")
|
message(STATUS "target CPU optimizations enabled, produced binaries will NOT work on a different CPU")
|
||||||
endif()
|
endif()
|
||||||
|
add_subdirectory(dev_sandbox)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
omim_add_test_subdirectory(libs/qt_tstfrm)
|
omim_add_test_subdirectory(qt_tstfrm)
|
||||||
|
|
||||||
if (PLATFORM_ANDROID)
|
if (PLATFORM_ANDROID)
|
||||||
add_subdirectory(android/sdk/src/main/cpp)
|
add_subdirectory(android/sdk/src/main/cpp)
|
||||||
|
|||||||
@@ -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)
|
- Build instructions: [docs/INSTALL.md](docs/INSTALL.md)
|
||||||
- Contribution guide: [docs/CONTRIBUTING.md](docs/CONTRIBUTING.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
|
## 💸 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).
|
Donate via [OpenCollective](https://opencollective.com/comaps/donate) or [Liberapay](https://liberapay.com/CoMaps).
|
||||||
The project's financial information is completely open and transparent at [our Open Collective](https://opencollective.com/comaps).
|
The project's financial information is completely open and transparent at [our Open Collective](https://opencollective.com/comaps).
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
• OpenStreetMap-Daten vom 4. August
|
Wir stellen vor: Das neue CoMaps-Logo!
|
||||||
• Verbesserte Farben für Wasser, Wälder, Gestrüpp, verschiedene Einrichtungen, Fussgängerbereiche etc.
|
• Verbesserte Höhenlinien in vielen Regionen (Stufen von 20/50 m)
|
||||||
• Besucherstationen, überdachte Fahrradparkplätze, Escaperooms, Gepäckschließfächer, und Postpartner hinzugefügt
|
• Links zu Panoramax-Bildern für ausgewählte POIs
|
||||||
• Konturhöhenlinien aktualisiert, bis zu 20m für beliebte Wanderregionen
|
• OpenStreetMap-Daten vom 13. Juli
|
||||||
• Unterstützung für mehr Such-Abkürzungen und Synonyme
|
• Neue Farben für viele Objekte und Farben werden früher angezeigt
|
||||||
• Such- und Lesezeichen-Symbole für Fast Food, Rad- und Lade-Stationen
|
• Öffnungszeiten werden beim Antippen eines POI angezeigt
|
||||||
• Der Positionspfeil bewegt sich gleichmässiger
|
• Verschiedene Arten von Feuchtgebieten
|
||||||
|
• Neue Farben für Vegetation und andere Features; einige neue Icons
|
||||||
|
• Wandern: bessere Darstellung der Höhenlinien
|
||||||
@@ -1,7 +1,10 @@
|
|||||||
• OpenStreetMap data as of August 4
|
Introducing CoMaps logo!
|
||||||
• 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 for many regions to 20 or 50 meters step
|
||||||
• upgrade altitude contour lines to 20m step for some popular hiking regions
|
• add Panoramax Picture links to selected POIs
|
||||||
• support more search abbreviations and aliases
|
• OpenStreetMap data as of July 13
|
||||||
• add search and bookmark icons for fast food, bicycle and charging stations
|
• add color fills to many features and display fills earlier for existing features
|
||||||
• more smooth position arrow movements
|
• 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
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
• Datos de OpenStreetMap a fecha 2025.08.04
|
¡Presentamos el logo de CoMaps!
|
||||||
• Mejora de colores del mapa para agua, bosques, matorrales, servicios, zonas peatonales, etc.
|
• mejora de isolíneas con más detalle para muchas regiones
|
||||||
• Añadidas estaciones de guardabosques, aparcamientos cubiertos de bicis, juegos de escape, consignas y oficinas de correo
|
• añade enlaces de imágenes de Panoramax a POIs seleccionados
|
||||||
• Nuevas curvas de nivel (20 m) en regiones populares para senderismo
|
• datos de OpenStreetMap a 13 de julio
|
||||||
• Más abreviaturas y alias de búsqueda
|
• añadidos rellenos de color a muchas características
|
||||||
• Iconos de búsqueda y marcadores para comida rápida, bicicletas y estaciones de recarga
|
• se muestra el estado de horarios de apertura al seleccionar un POI
|
||||||
• Más fluidez de la flecha de posición
|
• 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
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
ناوبری آسان نقشه - کشف بیشتر از سفر شما - توسط جامعه
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
CoMaps - کوه نوردی، دوچرخه سواری و رانندگی افلاین و خصوصی
|
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
Présentation du logo CoMaps !
|
||||||
|
• Amélioration des courbes d’altitude à 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 d’ouverture lors de la sélection d’un 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
|
||||||
@@ -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é
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
Könnyű térképes navigáció - Fedezz fel többet az útjaidról - A közösség erejével
|
|
||||||
@@ -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
|
|
||||||
@@ -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
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
• Dados OSM de 4/08
|
Apresentamos o logo do CoMaps!
|
||||||
• Melhoria nas cores para água, florestas, matagais, serviços, áreas de pedestres, etc.
|
• Curvas de nível mais detalhadas em muitas regiões
|
||||||
• Adição de guarda-florestais, estacionamentos cobertos para bicicletas, jogos de fuga, armários para bagagem e parceiros postais
|
• Adicionados links de imagens do Panoramax para pontos de interesse selecionados
|
||||||
• Melhoria na precisão de curvas de nível para 20 m em algumas regiões populares
|
• Dados OSM de 13/07
|
||||||
• Suporte a mais abreviações para busca
|
• Adicionados preenchimentos de cor a muitos elementos
|
||||||
• Adição de ícones de pesquisa e favoritos para fast food, bicicletas e estações de recarga
|
• Exibição de horário de funcionamento ao selecionar um ponto de interesse
|
||||||
• Movimentos mais suaves para seta de posição
|
• 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
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
Navegação fácil nos mapas - Descubra mais sobre o seu percurso - Feito por todos
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
CoMaps - Mapas e Navegação - Offline e Privada
|
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
• Карты OpenStreetMap от 4 августа
|
Представляем логотип CoMaps!
|
||||||
• Улучшен цвет воды, леса, кустарников, различных объектов инфраструктуры, пешеходных зон и т.д.
|
• Линии высот для многих регионов с шагом 20м или 50м
|
||||||
• Добавлены лесничества, крытые велопарковки, квесты, камеры хранения
|
• Ссылки на изображения Panoramax к выбранным POI
|
||||||
• Для некоторых популярных туристических регионов добавлены линии высот 20м
|
• Карты OpenStreetMap от 13 июля
|
||||||
• Поддержка дополнительных поисковых сокращений и синонимов
|
• Заливки цветом ко многим объектам и более ранняя заливка для существующих объектов
|
||||||
• Добавлены иконки меток и результатов поиска для фастфуда, велопарковок и зарядных станций
|
• Показ часов работы при выборе POI
|
||||||
• Более плавное движение стрелки местоположения
|
• Разные водно-болотные угодья отличаются цветом
|
||||||
|
• Обновлены цвета растительности и другие цвета на карте, изменены некоторые иконки
|
||||||
|
• В стиле "Активный отдых" более четкие линии высот
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
• подаци из OpenStreetMap-а од 4. августа
|
Представљамо CoMaps лого!
|
||||||
• побољшане боје на мапи за воду, шуме, жбуње, разне објекте, пешачке зоне итд.
|
• ажуриране изохипсе за многе регионе на кораке од 20 или 50 метара
|
||||||
• додате станице ренџера, наткривена паркинг места за бицикле, escape room-ови, ормарићи за пртљаг
|
• додате везе ка Panoramax сликама за изабране тачке интересовања (POI)
|
||||||
• унапређене изохипсе на кораке од 20 м за популарне планинарске регионе
|
• подаци са OpenStreetMap-а од 13. јула
|
||||||
• подршка за више скраћеница и алтернативних назива у претрази
|
• додате боје за многе елементе и раније приказивање постојећих површина
|
||||||
• додате иконе за претрагу и обележавање за брзу храну, бицикле и станице за пуњење
|
• приказ стања радног времена при избору POI-ја
|
||||||
• равномерније кретање стрелице која приказује позицију
|
• мочваре подељене на неколико различитих типова
|
||||||
|
• ажуриране боје вегетације и других елемената на мапи, ажуриране поједине иконе
|
||||||
|
• на отвореном: наглашеније изохипсе
|
||||||
@@ -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é
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
Könnyű térképes navigáció - Fedezz fel többet az útjaidról - A közösség erejével
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
CoMaps - Az adatvédő navigáció
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
കോമാപ്പ്സ് - സ്വകാര്യതയോടെ സഞ്ചരിക്കൂ
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
CoMaps - Nawigacja szanująca prywatność
|
|
||||||
@@ -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>
|
<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>Ç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>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>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 bu uygulamanın oluşturulmasına yardımcı oldular.
|
‣ <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 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>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>:
|
<b>Ana Özellikler</b>:
|
||||||
• Google Haritalar'da bulunmayan yerleri içeren, çevrimdışı detaylı haritalar
|
• Google Haritalar'da bulunmayan yerleri içeren, çevrimdışı detaylı haritalar
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<!-- Requiring "android.hardware.touchscreen" here breaks DeX mode -->
|
<!-- Requiring "android.hardware.touchscreen" here breaks DeX mode -->
|
||||||
<uses-feature
|
<uses-feature
|
||||||
android:glEsVersion="0x00030000"
|
android:glEsVersion="0x00020000"
|
||||||
android:required="true"/>
|
android:required="true"/>
|
||||||
<uses-feature
|
<uses-feature
|
||||||
android:name="android.hardware.wifi"
|
android:name="android.hardware.wifi"
|
||||||
|
|||||||
@@ -155,7 +155,9 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
|||||||
showMap();
|
showMap();
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case CountryItem.STATUS_FAILED: MapManager.showError(DownloadResourcesLegacyActivity.this, item, null); return;
|
case CountryItem.STATUS_FAILED:
|
||||||
|
MapManager.showError(DownloadResourcesLegacyActivity.this, item, null);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,10 +23,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
|||||||
public class MapFragment extends BaseMwmFragment implements View.OnTouchListener, SurfaceHolder.Callback
|
public class MapFragment extends BaseMwmFragment implements View.OnTouchListener, SurfaceHolder.Callback
|
||||||
{
|
{
|
||||||
private static final String TAG = MapFragment.class.getSimpleName();
|
private static final String TAG = MapFragment.class.getSimpleName();
|
||||||
|
private final Map mMap = new Map(DisplayType.Device);
|
||||||
@SuppressWarnings("NonNullFieldNotInitialized")
|
|
||||||
@NonNull
|
|
||||||
private Map mMap;
|
|
||||||
|
|
||||||
public void updateCompassOffset(int offsetX, int offsetY)
|
public void updateCompassOffset(int offsetX, int offsetY)
|
||||||
{
|
{
|
||||||
@@ -87,7 +84,6 @@ public class MapFragment extends BaseMwmFragment implements View.OnTouchListener
|
|||||||
{
|
{
|
||||||
Logger.d(TAG);
|
Logger.d(TAG);
|
||||||
super.onAttach(context);
|
super.onAttach(context);
|
||||||
mMap = new Map(DisplayType.Device, MwmApplication.from(requireContext()).getLocationHelper());
|
|
||||||
mMap.setMapRenderingListener((MapRenderingListener) context);
|
mMap.setMapRenderingListener((MapRenderingListener) context);
|
||||||
mMap.setCallbackUnsupported(this::reportUnsupported);
|
mMap.setCallbackUnsupported(this::reportUnsupported);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ import app.organicmaps.routing.ManageRouteBottomSheet;
|
|||||||
import app.organicmaps.routing.NavigationController;
|
import app.organicmaps.routing.NavigationController;
|
||||||
import app.organicmaps.routing.NavigationService;
|
import app.organicmaps.routing.NavigationService;
|
||||||
import app.organicmaps.routing.RoutingBottomMenuListener;
|
import app.organicmaps.routing.RoutingBottomMenuListener;
|
||||||
|
import app.organicmaps.routing.RoutingController;
|
||||||
import app.organicmaps.routing.RoutingErrorDialogFragment;
|
import app.organicmaps.routing.RoutingErrorDialogFragment;
|
||||||
import app.organicmaps.routing.RoutingPlanFragment;
|
import app.organicmaps.routing.RoutingPlanFragment;
|
||||||
import app.organicmaps.routing.RoutingPlanInplaceController;
|
import app.organicmaps.routing.RoutingPlanInplaceController;
|
||||||
@@ -107,7 +108,6 @@ import app.organicmaps.sdk.location.SensorListener;
|
|||||||
import app.organicmaps.sdk.location.TrackRecorder;
|
import app.organicmaps.sdk.location.TrackRecorder;
|
||||||
import app.organicmaps.sdk.maplayer.isolines.IsolinesState;
|
import app.organicmaps.sdk.maplayer.isolines.IsolinesState;
|
||||||
import app.organicmaps.sdk.routing.RouteMarkType;
|
import app.organicmaps.sdk.routing.RouteMarkType;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.routing.RoutingOptions;
|
import app.organicmaps.sdk.routing.RoutingOptions;
|
||||||
import app.organicmaps.sdk.search.SearchEngine;
|
import app.organicmaps.sdk.search.SearchEngine;
|
||||||
import app.organicmaps.sdk.settings.RoadType;
|
import app.organicmaps.sdk.settings.RoadType;
|
||||||
@@ -115,6 +115,7 @@ import app.organicmaps.sdk.settings.UnitLocale;
|
|||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import app.organicmaps.sdk.util.LocationUtils;
|
import app.organicmaps.sdk.util.LocationUtils;
|
||||||
import app.organicmaps.sdk.util.PowerManagment;
|
import app.organicmaps.sdk.util.PowerManagment;
|
||||||
|
import app.organicmaps.sdk.util.ThemeSwitcher;
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
import app.organicmaps.sdk.widget.placepage.PlacePageData;
|
import app.organicmaps.sdk.widget.placepage.PlacePageData;
|
||||||
@@ -124,7 +125,6 @@ import app.organicmaps.search.SearchFragment;
|
|||||||
import app.organicmaps.settings.DrivingOptionsActivity;
|
import app.organicmaps.settings.DrivingOptionsActivity;
|
||||||
import app.organicmaps.settings.SettingsActivity;
|
import app.organicmaps.settings.SettingsActivity;
|
||||||
import app.organicmaps.util.SharingUtils;
|
import app.organicmaps.util.SharingUtils;
|
||||||
import app.organicmaps.util.ThemeSwitcher;
|
|
||||||
import app.organicmaps.util.ThemeUtils;
|
import app.organicmaps.util.ThemeUtils;
|
||||||
import app.organicmaps.util.Utils;
|
import app.organicmaps.util.Utils;
|
||||||
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
|
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
|
||||||
@@ -1223,23 +1223,22 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
|
|
||||||
private void onIsolinesStateChanged(@NonNull IsolinesState type)
|
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)
|
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
||||||
.setTitle(R.string.downloader_update_maps)
|
.setTitle(R.string.downloader_update_maps)
|
||||||
.setMessage(R.string.isolines_activation_error_dialog)
|
.setMessage(R.string.isolines_activation_error_dialog)
|
||||||
.setPositiveButton(
|
.setPositiveButton(R.string.ok,
|
||||||
R.string.ok, (dialog, which) -> startActivity(new Intent(this, DownloaderActivity.class)))
|
(dialog, which) -> startActivity(new Intent(this, DownloaderActivity.class)))
|
||||||
.setNegativeButton(R.string.cancel, null)
|
.setNegativeButton(R.string.cancel, null)
|
||||||
.setOnDismissListener(dialog -> mAlertDialog = null)
|
.setOnDismissListener(dialog -> mAlertDialog = null)
|
||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onNewIntent(Intent intent)
|
protected void onNewIntent(Intent intent)
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import app.organicmaps.background.OsmUploadWork;
|
|||||||
import app.organicmaps.downloader.DownloaderNotifier;
|
import app.organicmaps.downloader.DownloaderNotifier;
|
||||||
import app.organicmaps.location.TrackRecordingService;
|
import app.organicmaps.location.TrackRecordingService;
|
||||||
import app.organicmaps.routing.NavigationService;
|
import app.organicmaps.routing.NavigationService;
|
||||||
|
import app.organicmaps.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.Map;
|
import app.organicmaps.sdk.Map;
|
||||||
import app.organicmaps.sdk.OrganicMaps;
|
import app.organicmaps.sdk.OrganicMaps;
|
||||||
import app.organicmaps.sdk.display.DisplayManager;
|
import app.organicmaps.sdk.display.DisplayManager;
|
||||||
@@ -27,11 +28,9 @@ import app.organicmaps.sdk.location.SensorHelper;
|
|||||||
import app.organicmaps.sdk.location.TrackRecorder;
|
import app.organicmaps.sdk.location.TrackRecorder;
|
||||||
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
||||||
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import app.organicmaps.sdk.util.ConnectionState;
|
import app.organicmaps.sdk.util.ConnectionState;
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
import app.organicmaps.util.ThemeSwitcher;
|
|
||||||
import app.organicmaps.util.Utils;
|
import app.organicmaps.util.Utils;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
@@ -134,8 +133,6 @@ public class MwmApplication extends Application implements Application.ActivityL
|
|||||||
public boolean initOrganicMaps(@NonNull Runnable onComplete) throws IOException
|
public boolean initOrganicMaps(@NonNull Runnable onComplete) throws IOException
|
||||||
{
|
{
|
||||||
return mOrganicMaps.init(() -> {
|
return mOrganicMaps.init(() -> {
|
||||||
ThemeSwitcher.INSTANCE.initialize(this);
|
|
||||||
ThemeSwitcher.INSTANCE.restart(false);
|
|
||||||
ProcessLifecycleOwner.get().getLifecycle().addObserver(mProcessLifecycleObserver);
|
ProcessLifecycleOwner.get().getLifecycle().addObserver(mProcessLifecycleObserver);
|
||||||
onComplete.run();
|
onComplete.run();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ import app.organicmaps.sdk.bookmarks.data.BookmarkSharingResult;
|
|||||||
import app.organicmaps.sdk.bookmarks.data.CategoryDataSource;
|
import app.organicmaps.sdk.bookmarks.data.CategoryDataSource;
|
||||||
import app.organicmaps.sdk.bookmarks.data.Icon;
|
import app.organicmaps.sdk.bookmarks.data.Icon;
|
||||||
import app.organicmaps.sdk.bookmarks.data.KmlFileType;
|
import app.organicmaps.sdk.bookmarks.data.KmlFileType;
|
||||||
import app.organicmaps.sdk.bookmarks.data.PredefinedColors;
|
|
||||||
import app.organicmaps.sdk.bookmarks.data.SortedBlock;
|
import app.organicmaps.sdk.bookmarks.data.SortedBlock;
|
||||||
import app.organicmaps.sdk.bookmarks.data.Track;
|
import app.organicmaps.sdk.bookmarks.data.Track;
|
||||||
import app.organicmaps.sdk.search.BookmarkSearchListener;
|
import app.organicmaps.sdk.search.BookmarkSearchListener;
|
||||||
@@ -593,7 +592,7 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
|
|||||||
if (mTrack == null)
|
if (mTrack == null)
|
||||||
return;
|
return;
|
||||||
final Bundle args = new Bundle();
|
final Bundle args = new Bundle();
|
||||||
args.putInt(BookmarkColorDialogFragment.ICON_COLOR, PredefinedColors.getPredefinedColorIndex(mTrack.getColor()));
|
args.putInt(BookmarkColorDialogFragment.ICON_TYPE, Icon.getColorPosition(mTrack.getColor()));
|
||||||
final FragmentManager manager = getChildFragmentManager();
|
final FragmentManager manager = getChildFragmentManager();
|
||||||
String className = BookmarkColorDialogFragment.class.getName();
|
String className = BookmarkColorDialogFragment.class.getName();
|
||||||
final FragmentFactory factory = manager.getFragmentFactory();
|
final FragmentFactory factory = manager.getFragmentFactory();
|
||||||
@@ -602,7 +601,7 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
|
|||||||
dialogFragment.setArguments(args);
|
dialogFragment.setArguments(args);
|
||||||
dialogFragment.setOnColorSetListener((colorPos) -> {
|
dialogFragment.setOnColorSetListener((colorPos) -> {
|
||||||
int from = mTrack.getColor();
|
int from = mTrack.getColor();
|
||||||
int to = PredefinedColors.getColor(colorPos);
|
int to = BookmarkManager.ICONS.get(colorPos).argb();
|
||||||
if (from == to)
|
if (from == to)
|
||||||
return;
|
return;
|
||||||
BookmarkManager.INSTANCE.changeTrackColor(mTrack.getTrackId(), to);
|
BookmarkManager.INSTANCE.changeTrackColor(mTrack.getTrackId(), to);
|
||||||
|
|||||||
@@ -6,26 +6,19 @@ import android.view.LayoutInflater;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ArrayAdapter;
|
import android.widget.ArrayAdapter;
|
||||||
import androidx.annotation.DrawableRes;
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.sdk.bookmarks.data.PredefinedColors;
|
import app.organicmaps.sdk.bookmarks.data.Icon;
|
||||||
import app.organicmaps.util.Graphics;
|
import app.organicmaps.util.Graphics;
|
||||||
import com.google.android.material.imageview.ShapeableImageView;
|
import com.google.android.material.imageview.ShapeableImageView;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
public class ColorsAdapter extends ArrayAdapter<Integer>
|
public class IconsAdapter extends ArrayAdapter<Icon>
|
||||||
{
|
{
|
||||||
@PredefinedColors.Color
|
|
||||||
private int mCheckedIconColor;
|
private int mCheckedIconColor;
|
||||||
|
|
||||||
@DrawableRes
|
public IconsAdapter(Context context, List<Icon> list)
|
||||||
private final int mIconResId;
|
|
||||||
|
|
||||||
public ColorsAdapter(Context context, List<Integer> list, @DrawableRes int iconResId)
|
|
||||||
{
|
{
|
||||||
super(context, 0, 0, list);
|
super(context, 0, 0, list);
|
||||||
mIconResId = iconResId;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -42,19 +35,19 @@ public class ColorsAdapter extends ArrayAdapter<Integer>
|
|||||||
else
|
else
|
||||||
holder = (SpinnerViewHolder) convertView.getTag();
|
holder = (SpinnerViewHolder) convertView.getTag();
|
||||||
|
|
||||||
@PredefinedColors.Color
|
final Icon icon = getItem(position);
|
||||||
final int color = Objects.requireNonNull(getItem(position));
|
|
||||||
|
|
||||||
Drawable circle;
|
Drawable circle;
|
||||||
if (color == mCheckedIconColor)
|
if (icon.getColor() == mCheckedIconColor)
|
||||||
{
|
{
|
||||||
circle = Graphics.drawCircleAndImage(PredefinedColors.getColor(mCheckedIconColor), R.dimen.track_circle_size,
|
circle = Graphics.drawCircleAndImage(getItem(position).argb(), R.dimen.track_circle_size,
|
||||||
mIconResId, R.dimen.bookmark_icon_size, getContext());
|
app.organicmaps.sdk.R.drawable.ic_bookmark_none, R.dimen.bookmark_icon_size,
|
||||||
|
getContext());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
circle = Graphics.drawCircle(PredefinedColors.getColor(color), R.dimen.select_color_circle_size,
|
circle =
|
||||||
getContext().getResources());
|
Graphics.drawCircle(getItem(position).argb(), R.dimen.select_color_circle_size, getContext().getResources());
|
||||||
}
|
}
|
||||||
holder.icon.setImageDrawable(circle);
|
holder.icon.setImageDrawable(circle);
|
||||||
return convertView;
|
return convertView;
|
||||||
@@ -26,6 +26,7 @@ import app.organicmaps.car.util.CurrentCountryChangedListener;
|
|||||||
import app.organicmaps.car.util.IntentUtils;
|
import app.organicmaps.car.util.IntentUtils;
|
||||||
import app.organicmaps.car.util.ThemeUtils;
|
import app.organicmaps.car.util.ThemeUtils;
|
||||||
import app.organicmaps.car.util.UserActionRequired;
|
import app.organicmaps.car.util.UserActionRequired;
|
||||||
|
import app.organicmaps.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.PlacePageActivationListener;
|
import app.organicmaps.sdk.PlacePageActivationListener;
|
||||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||||
@@ -33,7 +34,6 @@ import app.organicmaps.sdk.display.DisplayChangedListener;
|
|||||||
import app.organicmaps.sdk.display.DisplayManager;
|
import app.organicmaps.sdk.display.DisplayManager;
|
||||||
import app.organicmaps.sdk.display.DisplayType;
|
import app.organicmaps.sdk.display.DisplayType;
|
||||||
import app.organicmaps.sdk.location.LocationState;
|
import app.organicmaps.sdk.location.LocationState;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import app.organicmaps.sdk.util.LocationUtils;
|
import app.organicmaps.sdk.util.LocationUtils;
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
|
|||||||
@@ -27,11 +27,8 @@ public class SurfaceRenderer implements DefaultLifecycleObserver, SurfaceCallbac
|
|||||||
{
|
{
|
||||||
private static final String TAG = SurfaceRenderer.class.getSimpleName();
|
private static final String TAG = SurfaceRenderer.class.getSimpleName();
|
||||||
|
|
||||||
@NonNull
|
|
||||||
private final CarContext mCarContext;
|
private final CarContext mCarContext;
|
||||||
|
private final Map mMap = new Map(Car);
|
||||||
@NonNull
|
|
||||||
private final Map mMap;
|
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private Rect mVisibleArea = new Rect();
|
private Rect mVisibleArea = new Rect();
|
||||||
@@ -45,7 +42,6 @@ public class SurfaceRenderer implements DefaultLifecycleObserver, SurfaceCallbac
|
|||||||
{
|
{
|
||||||
Logger.d(TAG, "SurfaceRenderer()");
|
Logger.d(TAG, "SurfaceRenderer()");
|
||||||
mCarContext = carContext;
|
mCarContext = carContext;
|
||||||
mMap = new Map(Car, MwmApplication.from(mCarContext).getLocationHelper());
|
|
||||||
mIsRunning = true;
|
mIsRunning = true;
|
||||||
lifecycle.addObserver(this);
|
lifecycle.addObserver(this);
|
||||||
mMap.setMapRenderingListener(this);
|
mMap.setMapRenderingListener(this);
|
||||||
|
|||||||
@@ -28,11 +28,11 @@ import app.organicmaps.car.util.RoutingUtils;
|
|||||||
import app.organicmaps.car.util.ThemeUtils;
|
import app.organicmaps.car.util.ThemeUtils;
|
||||||
import app.organicmaps.car.util.UiHelpers;
|
import app.organicmaps.car.util.UiHelpers;
|
||||||
import app.organicmaps.routing.NavigationService;
|
import app.organicmaps.routing.NavigationService;
|
||||||
|
import app.organicmaps.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.location.LocationHelper;
|
import app.organicmaps.sdk.location.LocationHelper;
|
||||||
import app.organicmaps.sdk.location.LocationListener;
|
import app.organicmaps.sdk.location.LocationListener;
|
||||||
import app.organicmaps.sdk.routing.JunctionInfo;
|
import app.organicmaps.sdk.routing.JunctionInfo;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||||
import app.organicmaps.sdk.sound.TtsPlayer;
|
import app.organicmaps.sdk.sound.TtsPlayer;
|
||||||
import app.organicmaps.sdk.util.LocationUtils;
|
import app.organicmaps.sdk.util.LocationUtils;
|
||||||
|
|||||||
@@ -35,11 +35,11 @@ import app.organicmaps.car.util.OnBackPressedCallback;
|
|||||||
import app.organicmaps.car.util.RoutingHelpers;
|
import app.organicmaps.car.util.RoutingHelpers;
|
||||||
import app.organicmaps.car.util.UiHelpers;
|
import app.organicmaps.car.util.UiHelpers;
|
||||||
import app.organicmaps.routing.ResultCodesHelper;
|
import app.organicmaps.routing.ResultCodesHelper;
|
||||||
|
import app.organicmaps.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.Router;
|
import app.organicmaps.sdk.Router;
|
||||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||||
import app.organicmaps.sdk.bookmarks.data.Metadata;
|
import app.organicmaps.sdk.bookmarks.data.Metadata;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|||||||
@@ -7,9 +7,9 @@ import androidx.car.app.CarContext;
|
|||||||
import androidx.car.app.ScreenManager;
|
import androidx.car.app.ScreenManager;
|
||||||
import app.organicmaps.car.screens.download.DownloadMapsScreen;
|
import app.organicmaps.car.screens.download.DownloadMapsScreen;
|
||||||
import app.organicmaps.car.screens.download.DownloadMapsScreenBuilder;
|
import app.organicmaps.car.screens.download.DownloadMapsScreenBuilder;
|
||||||
|
import app.organicmaps.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.downloader.CountryItem;
|
import app.organicmaps.sdk.downloader.CountryItem;
|
||||||
import app.organicmaps.sdk.downloader.MapManager;
|
import app.organicmaps.sdk.downloader.MapManager;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
|
|
||||||
public class CurrentCountryChangedListener implements MapManager.CurrentCountryChangedListener
|
public class CurrentCountryChangedListener implements MapManager.CurrentCountryChangedListener
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -15,13 +15,13 @@ import app.organicmaps.car.CarAppService;
|
|||||||
import app.organicmaps.car.SurfaceRenderer;
|
import app.organicmaps.car.SurfaceRenderer;
|
||||||
import app.organicmaps.car.screens.NavigationScreen;
|
import app.organicmaps.car.screens.NavigationScreen;
|
||||||
import app.organicmaps.car.screens.search.SearchScreen;
|
import app.organicmaps.car.screens.search.SearchScreen;
|
||||||
|
import app.organicmaps.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.Map;
|
import app.organicmaps.sdk.Map;
|
||||||
import app.organicmaps.sdk.api.ParsedSearchRequest;
|
import app.organicmaps.sdk.api.ParsedSearchRequest;
|
||||||
import app.organicmaps.sdk.api.RequestType;
|
import app.organicmaps.sdk.api.RequestType;
|
||||||
import app.organicmaps.sdk.display.DisplayManager;
|
import app.organicmaps.sdk.display.DisplayManager;
|
||||||
import app.organicmaps.sdk.display.DisplayType;
|
import app.organicmaps.sdk.display.DisplayType;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
|
|
||||||
public final class IntentUtils
|
public final class IntentUtils
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ import androidx.annotation.StringRes;
|
|||||||
import androidx.annotation.UiThread;
|
import androidx.annotation.UiThread;
|
||||||
import androidx.car.app.CarContext;
|
import androidx.car.app.CarContext;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
|
import app.organicmaps.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.MapStyle;
|
import app.organicmaps.sdk.MapStyle;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
|
|
||||||
public final class ThemeUtils
|
public final class ThemeUtils
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -20,9 +20,9 @@ import androidx.recyclerview.widget.RecyclerView;
|
|||||||
import app.organicmaps.MwmActivity;
|
import app.organicmaps.MwmActivity;
|
||||||
import app.organicmaps.MwmApplication;
|
import app.organicmaps.MwmApplication;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
|
import app.organicmaps.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.downloader.CountryItem;
|
import app.organicmaps.sdk.downloader.CountryItem;
|
||||||
import app.organicmaps.sdk.downloader.MapManager;
|
import app.organicmaps.sdk.downloader.MapManager;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.util.StringUtils;
|
import app.organicmaps.sdk.util.StringUtils;
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
|
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ import app.organicmaps.widget.PlaceholderView;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class DownloaderFragment
|
public class DownloaderFragment extends BaseMwmRecyclerFragment<DownloaderAdapter>
|
||||||
extends BaseMwmRecyclerFragment<DownloaderAdapter> implements MenuBottomSheetFragment.MenuBottomSheetInterface
|
implements MenuBottomSheetFragment.MenuBottomSheetInterface
|
||||||
{
|
{
|
||||||
private DownloaderToolbarController mToolbarController;
|
private DownloaderToolbarController mToolbarController;
|
||||||
|
|
||||||
@@ -153,8 +153,7 @@ public class DownloaderFragment
|
|||||||
|
|
||||||
mBottomPanel = new BottomPanel(this, view);
|
mBottomPanel = new BottomPanel(this, view);
|
||||||
mToolbarController = new DownloaderToolbarController(view, requireActivity(), this);
|
mToolbarController = new DownloaderToolbarController(view, requireActivity(), this);
|
||||||
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(),
|
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), mToolbarController.getBackPressedCallback());
|
||||||
mToolbarController.getBackPressedCallback());
|
|
||||||
|
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
@@ -196,8 +195,7 @@ public class DownloaderFragment
|
|||||||
{
|
{
|
||||||
if (mAdapter == null)
|
if (mAdapter == null)
|
||||||
mAdapter = new DownloaderAdapter(this);
|
mAdapter = new DownloaderAdapter(this);
|
||||||
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(),
|
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), mAdapter.getBackPressedCallback());
|
||||||
mAdapter.getBackPressedCallback());
|
|
||||||
|
|
||||||
return mAdapter;
|
return mAdapter;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,9 +9,9 @@ import androidx.core.view.ViewCompat;
|
|||||||
import app.organicmaps.MwmActivity;
|
import app.organicmaps.MwmActivity;
|
||||||
import app.organicmaps.MwmApplication;
|
import app.organicmaps.MwmApplication;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
|
import app.organicmaps.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.downloader.CountryItem;
|
import app.organicmaps.sdk.downloader.CountryItem;
|
||||||
import app.organicmaps.sdk.downloader.MapManager;
|
import app.organicmaps.sdk.downloader.MapManager;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import app.organicmaps.sdk.util.ConnectionState;
|
import app.organicmaps.sdk.util.ConnectionState;
|
||||||
import app.organicmaps.sdk.util.StringUtils;
|
import app.organicmaps.sdk.util.StringUtils;
|
||||||
|
|||||||
@@ -87,8 +87,8 @@ public class AdvancedTimetableFragment extends BaseMwmFragment implements View.O
|
|||||||
private void setExampleDrawables(@DrawableRes int left, @DrawableRes int right)
|
private void setExampleDrawables(@DrawableRes int left, @DrawableRes int right)
|
||||||
{
|
{
|
||||||
mExamplesTitle.setCompoundDrawablesRelativeWithIntrinsicBounds(
|
mExamplesTitle.setCompoundDrawablesRelativeWithIntrinsicBounds(
|
||||||
Graphics.tint(requireActivity(), left, com.google.android.material.R.attr.colorSecondary), null,
|
Graphics.tint(requireActivity(), left, androidx.appcompat.R.attr.colorAccent), null,
|
||||||
Graphics.tint(requireActivity(), right, com.google.android.material.R.attr.colorSecondary), null);
|
Graphics.tint(requireActivity(), right, androidx.appcompat.R.attr.colorAccent), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -20,13 +20,13 @@ import androidx.recyclerview.widget.RecyclerView;
|
|||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.base.BaseMwmFragment;
|
import app.organicmaps.base.BaseMwmFragment;
|
||||||
import app.organicmaps.dialog.EditTextDialogFragment;
|
import app.organicmaps.dialog.EditTextDialogFragment;
|
||||||
import app.organicmaps.editor.data.TimeFormatUtils;
|
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.bookmarks.data.Metadata;
|
import app.organicmaps.sdk.bookmarks.data.Metadata;
|
||||||
import app.organicmaps.sdk.editor.Editor;
|
import app.organicmaps.sdk.editor.Editor;
|
||||||
import app.organicmaps.sdk.editor.OpeningHours;
|
import app.organicmaps.sdk.editor.OpeningHours;
|
||||||
import app.organicmaps.sdk.editor.data.LocalizedName;
|
import app.organicmaps.sdk.editor.data.LocalizedName;
|
||||||
import app.organicmaps.sdk.editor.data.LocalizedStreet;
|
import app.organicmaps.sdk.editor.data.LocalizedStreet;
|
||||||
|
import app.organicmaps.editor.data.TimeFormatUtils;
|
||||||
import app.organicmaps.sdk.editor.data.Timetable;
|
import app.organicmaps.sdk.editor.data.Timetable;
|
||||||
import app.organicmaps.sdk.util.StringUtils;
|
import app.organicmaps.sdk.util.StringUtils;
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
|
|||||||
@@ -292,8 +292,8 @@ public class EditorHostFragment
|
|||||||
editMapObject();
|
editMapObject();
|
||||||
}
|
}
|
||||||
case STREET ->
|
case STREET ->
|
||||||
setStreet(
|
setStreet(((StreetFragment) getChildFragmentManager().findFragmentByTag(StreetFragment.class.getName()))
|
||||||
((StreetFragment) getChildFragmentManager().findFragmentByTag(StreetFragment.class.getName())).getStreet());
|
.getStreet());
|
||||||
case CUISINE ->
|
case CUISINE ->
|
||||||
{
|
{
|
||||||
String[] cuisines =
|
String[] cuisines =
|
||||||
|
|||||||
@@ -9,9 +9,7 @@ import androidx.annotation.Nullable;
|
|||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.sdk.editor.data.FeatureCategory;
|
import app.organicmaps.sdk.editor.data.FeatureCategory;
|
||||||
import app.organicmaps.sdk.util.StringUtils;
|
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
import com.google.android.material.textfield.TextInputEditText;
|
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
|
|
||||||
public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
@@ -23,12 +21,6 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
|||||||
private final FeatureCategoryFragment mFragment;
|
private final FeatureCategoryFragment mFragment;
|
||||||
private final FeatureCategory mSelectedCategory;
|
private final FeatureCategory mSelectedCategory;
|
||||||
|
|
||||||
public interface FooterListener
|
|
||||||
{
|
|
||||||
void onNoteTextChanged(String newText);
|
|
||||||
void onSendNoteClicked();
|
|
||||||
}
|
|
||||||
|
|
||||||
public FeatureCategoryAdapter(@NonNull FeatureCategoryFragment host, @NonNull FeatureCategory[] categories,
|
public FeatureCategoryAdapter(@NonNull FeatureCategoryFragment host, @NonNull FeatureCategory[] categories,
|
||||||
@Nullable FeatureCategory category)
|
@Nullable FeatureCategory category)
|
||||||
{
|
{
|
||||||
@@ -65,8 +57,7 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
|||||||
case TYPE_FOOTER ->
|
case TYPE_FOOTER ->
|
||||||
{
|
{
|
||||||
return new FooterViewHolder(
|
return new FooterViewHolder(
|
||||||
LayoutInflater.from(parent.getContext()).inflate(R.layout.item_feature_category_footer, parent, false),
|
LayoutInflater.from(parent.getContext()).inflate(R.layout.item_feature_category_footer, parent, false));
|
||||||
(FooterListener) mFragment);
|
|
||||||
}
|
}
|
||||||
default -> throw new IllegalArgumentException("Unsupported");
|
default -> throw new IllegalArgumentException("Unsupported");
|
||||||
}
|
}
|
||||||
@@ -79,10 +70,6 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
|||||||
{
|
{
|
||||||
((FeatureViewHolder) holder).bind(position);
|
((FeatureViewHolder) holder).bind(position);
|
||||||
}
|
}
|
||||||
else if (holder instanceof FooterViewHolder)
|
|
||||||
{
|
|
||||||
((FooterViewHolder) holder).bind(mFragment.getPendingNoteText());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -118,36 +105,11 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
|||||||
|
|
||||||
protected static class FooterViewHolder extends RecyclerView.ViewHolder
|
protected static class FooterViewHolder extends RecyclerView.ViewHolder
|
||||||
{
|
{
|
||||||
private final TextInputEditText mNoteEditText;
|
FooterViewHolder(@NonNull View itemView)
|
||||||
private final View mSendNoteButton;
|
|
||||||
|
|
||||||
FooterViewHolder(@NonNull View itemView, @NonNull FooterListener listener)
|
|
||||||
{
|
{
|
||||||
super(itemView);
|
super(itemView);
|
||||||
MaterialTextView categoryUnsuitableText = itemView.findViewById(R.id.editor_category_unsuitable_text);
|
MaterialTextView categoryUnsuitableText = itemView.findViewById(R.id.editor_category_unsuitable_text);
|
||||||
categoryUnsuitableText.setMovementMethod(LinkMovementMethod.getInstance());
|
categoryUnsuitableText.setMovementMethod(LinkMovementMethod.getInstance());
|
||||||
mNoteEditText = itemView.findViewById(R.id.note_edit_text);
|
|
||||||
mSendNoteButton = itemView.findViewById(R.id.send_note_button);
|
|
||||||
mSendNoteButton.setOnClickListener(v -> listener.onSendNoteClicked());
|
|
||||||
mNoteEditText.addTextChangedListener(new StringUtils.SimpleTextWatcher() {
|
|
||||||
@Override
|
|
||||||
public void onTextChanged(CharSequence s, int start, int before, int count)
|
|
||||||
{
|
|
||||||
final String str = s.toString();
|
|
||||||
listener.onNoteTextChanged(str);
|
|
||||||
mSendNoteButton.setEnabled(!str.trim().isEmpty());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
public void bind(String pendingNoteText)
|
|
||||||
{
|
|
||||||
if (!mNoteEditText.getText().toString().equals(pendingNoteText))
|
|
||||||
{
|
|
||||||
mNoteEditText.setText(pendingNoteText);
|
|
||||||
if (pendingNoteText != null)
|
|
||||||
mNoteEditText.setSelection(pendingNoteText.length());
|
|
||||||
}
|
|
||||||
mSendNoteButton.setEnabled(pendingNoteText != null && !pendingNoteText.trim().isEmpty());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,39 +2,28 @@ package app.organicmaps.editor;
|
|||||||
|
|
||||||
import static app.organicmaps.sdk.util.Utils.getLocalizedFeatureType;
|
import static app.organicmaps.sdk.util.Utils.getLocalizedFeatureType;
|
||||||
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.Toast;
|
|
||||||
import androidx.annotation.CallSuper;
|
import androidx.annotation.CallSuper;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import app.organicmaps.MwmApplication;
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.base.BaseMwmRecyclerFragment;
|
import app.organicmaps.base.BaseMwmRecyclerFragment;
|
||||||
import app.organicmaps.dialog.EditTextDialogFragment;
|
|
||||||
import app.organicmaps.sdk.Framework;
|
|
||||||
import app.organicmaps.sdk.editor.Editor;
|
import app.organicmaps.sdk.editor.Editor;
|
||||||
import app.organicmaps.sdk.editor.OsmOAuth;
|
|
||||||
import app.organicmaps.sdk.editor.data.FeatureCategory;
|
import app.organicmaps.sdk.editor.data.FeatureCategory;
|
||||||
import app.organicmaps.sdk.util.Language;
|
import app.organicmaps.sdk.util.Language;
|
||||||
import app.organicmaps.util.Utils;
|
import app.organicmaps.util.Utils;
|
||||||
import app.organicmaps.widget.SearchToolbarController;
|
import app.organicmaps.widget.SearchToolbarController;
|
||||||
import app.organicmaps.widget.ToolbarController;
|
import app.organicmaps.widget.ToolbarController;
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
|
||||||
public class FeatureCategoryFragment
|
public class FeatureCategoryFragment extends BaseMwmRecyclerFragment<FeatureCategoryAdapter>
|
||||||
extends BaseMwmRecyclerFragment<FeatureCategoryAdapter> implements FeatureCategoryAdapter.FooterListener
|
|
||||||
{
|
{
|
||||||
private FeatureCategory mSelectedCategory;
|
private FeatureCategory mSelectedCategory;
|
||||||
protected ToolbarController mToolbarController;
|
protected ToolbarController mToolbarController;
|
||||||
private static final String NOTE_CONFIRMATION_SHOWN = "NoteConfirmationAlertWasShown";
|
|
||||||
private static String mPendingNoteText = "";
|
|
||||||
|
|
||||||
public interface FeatureCategoryListener
|
public interface FeatureCategoryListener
|
||||||
{
|
{
|
||||||
@@ -115,64 +104,4 @@ public class FeatureCategoryFragment
|
|||||||
else if (getParentFragment() instanceof FeatureCategoryListener)
|
else if (getParentFragment() instanceof FeatureCategoryListener)
|
||||||
((FeatureCategoryListener) getParentFragment()).onFeatureCategorySelected(category);
|
((FeatureCategoryListener) getParentFragment()).onFeatureCategorySelected(category);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getPendingNoteText()
|
|
||||||
{
|
|
||||||
return mPendingNoteText;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onNoteTextChanged(String newText)
|
|
||||||
{
|
|
||||||
mPendingNoteText = newText;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSendNoteClicked()
|
|
||||||
{
|
|
||||||
if (!OsmOAuth.isAuthorized())
|
|
||||||
{
|
|
||||||
final Intent intent = new Intent(requireActivity(), OsmLoginActivity.class);
|
|
||||||
startActivity(intent);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final double[] center = Framework.nativeGetScreenRectCenter();
|
|
||||||
final double lat = center[0];
|
|
||||||
final double lon = center[1];
|
|
||||||
|
|
||||||
if (!MwmApplication.prefs(requireContext().getApplicationContext()).contains(NOTE_CONFIRMATION_SHOWN))
|
|
||||||
{
|
|
||||||
showNoteConfirmationDialog(lat, lon, mPendingNoteText);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Editor.nativeCreateStandaloneNote(lat, lon, mPendingNoteText);
|
|
||||||
mPendingNoteText = "";
|
|
||||||
Toast.makeText(requireContext(), R.string.osm_note_toast, Toast.LENGTH_SHORT).show();
|
|
||||||
requireActivity().finish();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Duplicate of showNoobDialog()
|
|
||||||
private void showNoteConfirmationDialog(double lat, double lon, String noteText)
|
|
||||||
{
|
|
||||||
new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog)
|
|
||||||
.setTitle(R.string.editor_share_to_all_dialog_title)
|
|
||||||
.setMessage(getString(R.string.editor_share_to_all_dialog_message_1) + " "
|
|
||||||
+ getString(R.string.editor_share_to_all_dialog_message_2))
|
|
||||||
.setPositiveButton(android.R.string.ok,
|
|
||||||
(dlg, which) -> {
|
|
||||||
MwmApplication.prefs(requireContext().getApplicationContext())
|
|
||||||
.edit()
|
|
||||||
.putBoolean(NOTE_CONFIRMATION_SHOWN, true)
|
|
||||||
.apply();
|
|
||||||
Editor.nativeCreateStandaloneNote(lat, lon, noteText);
|
|
||||||
mPendingNoteText = "";
|
|
||||||
Toast.makeText(requireContext(), R.string.osm_note_toast, Toast.LENGTH_SHORT).show();
|
|
||||||
requireActivity().finish();
|
|
||||||
})
|
|
||||||
.setNegativeButton(R.string.cancel, null)
|
|
||||||
.show();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,9 +13,9 @@ import androidx.appcompat.widget.SwitchCompat;
|
|||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.editor.data.TimeFormatUtils;
|
|
||||||
import app.organicmaps.sdk.editor.OpeningHours;
|
import app.organicmaps.sdk.editor.OpeningHours;
|
||||||
import app.organicmaps.sdk.editor.data.HoursMinutes;
|
import app.organicmaps.sdk.editor.data.HoursMinutes;
|
||||||
|
import app.organicmaps.editor.data.TimeFormatUtils;
|
||||||
import app.organicmaps.sdk.editor.data.Timespan;
|
import app.organicmaps.sdk.editor.data.Timespan;
|
||||||
import app.organicmaps.sdk.editor.data.Timetable;
|
import app.organicmaps.sdk.editor.data.Timetable;
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import androidx.core.content.IntentCompat;
|
|||||||
import app.organicmaps.MwmActivity;
|
import app.organicmaps.MwmActivity;
|
||||||
import app.organicmaps.MwmApplication;
|
import app.organicmaps.MwmApplication;
|
||||||
import app.organicmaps.editor.OsmLoginActivity;
|
import app.organicmaps.editor.OsmLoginActivity;
|
||||||
|
import app.organicmaps.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.Map;
|
import app.organicmaps.sdk.Map;
|
||||||
import app.organicmaps.sdk.api.ParsedRoutingData;
|
import app.organicmaps.sdk.api.ParsedRoutingData;
|
||||||
@@ -19,7 +20,6 @@ import app.organicmaps.sdk.api.RoutePoint;
|
|||||||
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
||||||
import app.organicmaps.sdk.bookmarks.data.FeatureId;
|
import app.organicmaps.sdk.bookmarks.data.FeatureId;
|
||||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.search.SearchEngine;
|
import app.organicmaps.sdk.search.SearchEngine;
|
||||||
import app.organicmaps.sdk.util.StorageUtils;
|
import app.organicmaps.sdk.util.StorageUtils;
|
||||||
import app.organicmaps.sdk.util.concurrency.ThreadPool;
|
import app.organicmaps.sdk.util.concurrency.ThreadPool;
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import app.organicmaps.MwmActivity;
|
|||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.leftbutton.LeftButton;
|
import app.organicmaps.leftbutton.LeftButton;
|
||||||
import app.organicmaps.leftbutton.LeftToggleButton;
|
import app.organicmaps.leftbutton.LeftToggleButton;
|
||||||
|
import app.organicmaps.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.downloader.MapManager;
|
import app.organicmaps.sdk.downloader.MapManager;
|
||||||
import app.organicmaps.sdk.downloader.UpdateInfo;
|
import app.organicmaps.sdk.downloader.UpdateInfo;
|
||||||
@@ -33,7 +34,6 @@ import app.organicmaps.sdk.location.TrackRecorder;
|
|||||||
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
||||||
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
||||||
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
|
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
import app.organicmaps.util.ThemeUtils;
|
import app.organicmaps.util.ThemeUtils;
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.StringRes;
|
import androidx.annotation.StringRes;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
import app.organicmaps.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.search.SearchEngine;
|
import app.organicmaps.sdk.search.SearchEngine;
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
import app.organicmaps.sdk.util.concurrency.UiThread;
|
import app.organicmaps.sdk.util.concurrency.UiThread;
|
||||||
@@ -215,7 +215,7 @@ public class SearchWheel implements View.OnClickListener
|
|||||||
final SearchOption searchOption = mMapButtonsViewModel.getSearchOption().getValue();
|
final SearchOption searchOption = mMapButtonsViewModel.getSearchOption().getValue();
|
||||||
mSearchButton.setImageDrawable(Graphics.tint(
|
mSearchButton.setImageDrawable(Graphics.tint(
|
||||||
mSearchButton.getContext(), searchOption == null ? R.drawable.ic_routing_search_off : searchOption.mDrawableOff,
|
mSearchButton.getContext(), searchOption == null ? R.drawable.ic_routing_search_off : searchOption.mDrawableOff,
|
||||||
com.google.android.material.R.attr.colorSecondary));
|
androidx.appcompat.R.attr.colorAccent));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import app.organicmaps.MwmApplication;
|
|||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.sdk.maplayer.Mode;
|
import app.organicmaps.sdk.maplayer.Mode;
|
||||||
import app.organicmaps.sdk.util.SharedPropertiesUtils;
|
import app.organicmaps.sdk.util.SharedPropertiesUtils;
|
||||||
import app.organicmaps.util.ThemeSwitcher;
|
|
||||||
import app.organicmaps.util.Utils;
|
import app.organicmaps.util.Utils;
|
||||||
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
|
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
|
||||||
import app.organicmaps.widget.recycler.SpanningLinearLayoutManager;
|
import app.organicmaps.widget.recycler.SpanningLinearLayoutManager;
|
||||||
@@ -73,9 +72,6 @@ public class ToggleMapLayerFragment extends Fragment
|
|||||||
Context context = v.getContext();
|
Context context = v.getContext();
|
||||||
SharedPropertiesUtils.setLayerMarkerShownForLayerMode(mode);
|
SharedPropertiesUtils.setLayerMarkerShownForLayerMode(mode);
|
||||||
mode.setEnabled(context, !mode.isEnabled(context));
|
mode.setEnabled(context, !mode.isEnabled(context));
|
||||||
// TODO: dirty hack :(
|
|
||||||
if (mode == Mode.OUTDOORS)
|
|
||||||
ThemeSwitcher.INSTANCE.restart(true);
|
|
||||||
mAdapter.notifyDataSetChanged();
|
mAdapter.notifyDataSetChanged();
|
||||||
mMapButtonsController.updateLayerButton();
|
mMapButtonsController.updateLayerButton();
|
||||||
if (MwmApplication.from(context).getIsolinesManager().shouldShowNotification())
|
if (MwmApplication.from(context).getIsolinesManager().shouldShowNotification())
|
||||||
|
|||||||
@@ -9,17 +9,16 @@ import android.view.View;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ExpandableListAdapter;
|
import android.widget.ExpandableListAdapter;
|
||||||
import android.widget.ExpandableListView;
|
import android.widget.ExpandableListView;
|
||||||
|
import android.widget.TextView;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.adapter.DisabledChildSimpleExpandableListAdapter;
|
import app.organicmaps.adapter.DisabledChildSimpleExpandableListAdapter;
|
||||||
import app.organicmaps.base.BaseMwmDialogFragment;
|
import app.organicmaps.base.BaseMwmDialogFragment;
|
||||||
import app.organicmaps.sdk.downloader.CountryItem;
|
import app.organicmaps.sdk.downloader.CountryItem;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.util.StringUtils;
|
import app.organicmaps.sdk.util.StringUtils;
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -94,9 +93,9 @@ abstract class BaseRoutingErrorDialogFragment extends BaseMwmDialogFragment
|
|||||||
{
|
{
|
||||||
@SuppressLint("InflateParams")
|
@SuppressLint("InflateParams")
|
||||||
final View countryView = View.inflate(requireActivity(), R.layout.dialog_missed_map, null);
|
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));
|
szView.setText(StringUtils.getFileSizeString(requireContext(), map.totalSize));
|
||||||
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) szView.getLayoutParams();
|
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) szView.getLayoutParams();
|
||||||
lp.rightMargin = 0;
|
lp.rightMargin = 0;
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ import android.view.LayoutInflater;
|
|||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.appcompat.content.res.AppCompatResources;
|
import androidx.appcompat.content.res.AppCompatResources;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
@@ -17,8 +19,6 @@ import app.organicmaps.sdk.routing.RouteMarkData;
|
|||||||
import app.organicmaps.sdk.routing.RouteMarkType;
|
import app.organicmaps.sdk.routing.RouteMarkType;
|
||||||
import app.organicmaps.sdk.util.StringUtils;
|
import app.organicmaps.sdk.util.StringUtils;
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
import com.google.android.material.imageview.ShapeableImageView;
|
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -232,16 +232,16 @@ public class ManageRouteAdapter extends RecyclerView.Adapter<ManageRouteAdapter.
|
|||||||
public final View mItemView;
|
public final View mItemView;
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public final ShapeableImageView mImageViewIcon;
|
public final ImageView mImageViewIcon;
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public final MaterialTextView mTextViewTitle;
|
public final TextView mTextViewTitle;
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public final MaterialTextView mTextViewSubtitle;
|
public final TextView mTextViewSubtitle;
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public final ShapeableImageView mImageViewDelete;
|
public final ImageView mImageViewDelete;
|
||||||
|
|
||||||
ManageRouteViewHolder(@NonNull View itemView)
|
ManageRouteViewHolder(@NonNull View itemView)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ import app.organicmaps.R;
|
|||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||||
import app.organicmaps.sdk.routing.RouteMarkData;
|
import app.organicmaps.sdk.routing.RouteMarkData;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
import com.google.android.material.bottomsheet.BottomSheetBehavior;
|
import com.google.android.material.bottomsheet.BottomSheetBehavior;
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialog;
|
import com.google.android.material.bottomsheet.BottomSheetDialog;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import android.location.Location;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
@@ -18,7 +19,6 @@ import app.organicmaps.sdk.Framework;
|
|||||||
import app.organicmaps.sdk.Router;
|
import app.organicmaps.sdk.Router;
|
||||||
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
|
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
|
||||||
import app.organicmaps.sdk.routing.CarDirection;
|
import app.organicmaps.sdk.routing.CarDirection;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||||
import app.organicmaps.sdk.util.StringUtils;
|
import app.organicmaps.sdk.util.StringUtils;
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
@@ -28,22 +28,20 @@ import app.organicmaps.widget.LanesView;
|
|||||||
import app.organicmaps.widget.SpeedLimitView;
|
import app.organicmaps.widget.SpeedLimitView;
|
||||||
import app.organicmaps.widget.menu.NavMenu;
|
import app.organicmaps.widget.menu.NavMenu;
|
||||||
import com.google.android.material.bottomsheet.BottomSheetBehavior;
|
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
|
public class NavigationController implements TrafficManager.TrafficCallback, NavMenu.NavMenuListener
|
||||||
{
|
{
|
||||||
private final View mFrame;
|
private final View mFrame;
|
||||||
|
|
||||||
private final ImageView mNextTurnImage;
|
private final ImageView mNextTurnImage;
|
||||||
private final MaterialTextView mNextTurnDistance;
|
private final TextView mNextTurnDistance;
|
||||||
private final MaterialTextView mCircleExit;
|
private final TextView mCircleExit;
|
||||||
|
|
||||||
private final View mNextNextTurnFrame;
|
private final View mNextNextTurnFrame;
|
||||||
private final ImageView mNextNextTurnImage;
|
private final ImageView mNextNextTurnImage;
|
||||||
|
|
||||||
private final View mStreetFrame;
|
private final View mStreetFrame;
|
||||||
private final MaterialTextView mNextStreet;
|
private final TextView mNextStreet;
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private final LanesView mLanesView;
|
private final LanesView mLanesView;
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ import app.organicmaps.R;
|
|||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.location.LocationHelper;
|
import app.organicmaps.sdk.location.LocationHelper;
|
||||||
import app.organicmaps.sdk.location.LocationListener;
|
import app.organicmaps.sdk.location.LocationListener;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||||
import app.organicmaps.sdk.sound.MediaPlayerWrapper;
|
import app.organicmaps.sdk.sound.MediaPlayerWrapper;
|
||||||
import app.organicmaps.sdk.sound.TtsPlayer;
|
import app.organicmaps.sdk.sound.TtsPlayer;
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ import app.organicmaps.sdk.Framework;
|
|||||||
import app.organicmaps.sdk.bookmarks.data.DistanceAndAzimut;
|
import app.organicmaps.sdk.bookmarks.data.DistanceAndAzimut;
|
||||||
import app.organicmaps.sdk.routing.RouteMarkData;
|
import app.organicmaps.sdk.routing.RouteMarkData;
|
||||||
import app.organicmaps.sdk.routing.RouteMarkType;
|
import app.organicmaps.sdk.routing.RouteMarkType;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||||
import app.organicmaps.sdk.routing.TransitRouteInfo;
|
import app.organicmaps.sdk.routing.TransitRouteInfo;
|
||||||
import app.organicmaps.sdk.routing.TransitStepInfo;
|
import app.organicmaps.sdk.routing.TransitStepInfo;
|
||||||
@@ -40,7 +39,6 @@ import app.organicmaps.sdk.util.Distance;
|
|||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
import app.organicmaps.util.Graphics;
|
import app.organicmaps.util.Graphics;
|
||||||
import app.organicmaps.util.ThemeUtils;
|
import app.organicmaps.util.ThemeUtils;
|
||||||
import app.organicmaps.util.Utils;
|
|
||||||
import app.organicmaps.widget.recycler.DotDividerItemDecoration;
|
import app.organicmaps.widget.recycler.DotDividerItemDecoration;
|
||||||
import app.organicmaps.widget.recycler.MultilineLayoutManager;
|
import app.organicmaps.widget.recycler.MultilineLayoutManager;
|
||||||
import com.google.android.material.imageview.ShapeableImageView;
|
import com.google.android.material.imageview.ShapeableImageView;
|
||||||
@@ -62,7 +60,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
|||||||
@NonNull
|
@NonNull
|
||||||
private final View mTransitFrame;
|
private final View mTransitFrame;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final MaterialTextView mError;
|
private final TextView mError;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final Button mStart;
|
private final Button mStart;
|
||||||
@NonNull
|
@NonNull
|
||||||
@@ -96,7 +94,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
|||||||
View altitudeChartFrame = getViewById(activity, frame, R.id.altitude_chart_panel);
|
View altitudeChartFrame = getViewById(activity, frame, R.id.altitude_chart_panel);
|
||||||
View timeElevationLine = getViewById(activity, frame, R.id.time_elevation_line);
|
View timeElevationLine = getViewById(activity, frame, R.id.time_elevation_line);
|
||||||
View transitFrame = getViewById(activity, frame, R.id.transit_panel);
|
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);
|
Button start = (Button) getViewById(activity, frame, R.id.start);
|
||||||
ImageView altitudeChart = (ImageView) getViewById(activity, frame, R.id.altitude_chart);
|
ImageView altitudeChart = (ImageView) getViewById(activity, frame, R.id.altitude_chart);
|
||||||
MaterialTextView time = (MaterialTextView) getViewById(activity, frame, R.id.time);
|
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,
|
private RoutingBottomMenuController(@NonNull Activity context, @NonNull View altitudeChartFrame,
|
||||||
@NonNull View timeElevationLine, @NonNull View transitFrame,
|
@NonNull View timeElevationLine, @NonNull View transitFrame,
|
||||||
@NonNull MaterialTextView error, @NonNull Button start,
|
@NonNull TextView error, @NonNull Button start, @NonNull ImageView altitudeChart,
|
||||||
@NonNull ImageView altitudeChart, @NonNull MaterialTextView time,
|
@NonNull MaterialTextView time, @NonNull MaterialTextView altitudeDifference,
|
||||||
@NonNull MaterialTextView altitudeDifference, @NonNull TextView timeVehicle,
|
@NonNull TextView timeVehicle, @Nullable MaterialTextView arrival,
|
||||||
@Nullable MaterialTextView arrival, @NonNull View actionFrame,
|
@NonNull View actionFrame, @Nullable RoutingBottomMenuListener listener)
|
||||||
@Nullable RoutingBottomMenuListener listener)
|
|
||||||
{
|
{
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mAltitudeChartFrame = altitudeChartFrame;
|
mAltitudeChartFrame = altitudeChartFrame;
|
||||||
@@ -194,7 +191,8 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
|||||||
scrollToBottom(rv);
|
scrollToBottom(rv);
|
||||||
|
|
||||||
MaterialTextView totalTimeView = mTransitFrame.findViewById(R.id.total_time);
|
MaterialTextView totalTimeView = mTransitFrame.findViewById(R.id.total_time);
|
||||||
totalTimeView.setText(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 dotView = mTransitFrame.findViewById(R.id.dot);
|
||||||
View pedestrianIcon = mTransitFrame.findViewById(R.id.pedestrian_icon);
|
View pedestrianIcon = mTransitFrame.findViewById(R.id.pedestrian_icon);
|
||||||
MaterialTextView distanceView = mTransitFrame.findViewById(R.id.total_distance);
|
MaterialTextView distanceView = mTransitFrame.findViewById(R.id.total_distance);
|
||||||
@@ -225,7 +223,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
|||||||
else
|
else
|
||||||
UiUtils.hide(rv); // Show only distance between start and finish
|
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 + " "
|
totalTimeView.setText(mContext.getString(R.string.placepage_distance) + ": " + totalLength.mDistanceStr + " "
|
||||||
+ totalLength.getUnitsStr(mContext));
|
+ totalLength.getUnitsStr(mContext));
|
||||||
|
|
||||||
@@ -263,9 +261,9 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
|||||||
{
|
{
|
||||||
UiUtils.show(mActionButton);
|
UiUtils.show(mActionButton);
|
||||||
Drawable icon = ContextCompat.getDrawable(mContext, R.drawable.ic_location_crosshair);
|
Drawable icon = ContextCompat.getDrawable(mContext, R.drawable.ic_location_crosshair);
|
||||||
int colorSecondary = ContextCompat.getColor(
|
int colorAccent = ContextCompat.getColor(
|
||||||
mContext, UiUtils.getStyledResourceId(mContext, com.google.android.material.R.attr.colorSecondary));
|
mContext, UiUtils.getStyledResourceId(mContext, androidx.appcompat.R.attr.colorAccent));
|
||||||
mActionIcon.setImageDrawable(Graphics.tint(icon, colorSecondary));
|
mActionIcon.setImageDrawable(Graphics.tint(icon, colorAccent));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -384,7 +382,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
|||||||
|
|
||||||
if (mArrival != null)
|
if (mArrival != null)
|
||||||
{
|
{
|
||||||
String arrivalTime = Utils.formatArrivalTime(rinfo.totalTimeInSeconds);
|
String arrivalTime = RoutingController.formatArrivalTime(rinfo.totalTimeInSeconds);
|
||||||
mArrival.setText(arrivalTime);
|
mArrival.setText(arrivalTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -402,7 +400,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
|||||||
|
|
||||||
{
|
{
|
||||||
CharSequence time =
|
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();
|
SpannableStringBuilder builder = new SpannableStringBuilder();
|
||||||
initTimeBuilderSequence(context, time, builder);
|
initTimeBuilderSequence(context, time, builder);
|
||||||
|
|||||||
@@ -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 android.text.TextUtils;
|
||||||
|
import androidx.annotation.DimenRes;
|
||||||
import androidx.annotation.IntRange;
|
import androidx.annotation.IntRange;
|
||||||
import androidx.annotation.MainThread;
|
import androidx.annotation.MainThread;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.core.util.Pair;
|
import androidx.core.util.Pair;
|
||||||
|
import app.organicmaps.MwmApplication;
|
||||||
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.Router;
|
import app.organicmaps.sdk.Router;
|
||||||
import app.organicmaps.sdk.bookmarks.data.FeatureId;
|
import app.organicmaps.sdk.bookmarks.data.FeatureId;
|
||||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||||
import app.organicmaps.sdk.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.concurrency.UiThread;
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
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
|
@androidx.annotation.UiThread
|
||||||
public class RoutingController
|
public class RoutingController
|
||||||
@@ -95,7 +114,7 @@ public class RoutingController
|
|||||||
mLastMissingMaps = missingMaps;
|
mLastMissingMaps = missingMaps;
|
||||||
mContainsCachedResult = true;
|
mContainsCachedResult = true;
|
||||||
|
|
||||||
if (mLastResultCode == ResultCodes.NO_ERROR || resultCode == ResultCodes.NEED_MORE_MAPS)
|
if (mLastResultCode == ResultCodes.NO_ERROR || ResultCodesHelper.isMoreMapsNeeded(mLastResultCode))
|
||||||
{
|
{
|
||||||
onBuiltRoute();
|
onBuiltRoute();
|
||||||
}
|
}
|
||||||
@@ -161,7 +180,7 @@ public class RoutingController
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mLastResultCode != ResultCodes.NEED_MORE_MAPS)
|
if (!ResultCodesHelper.isMoreMapsNeeded(mLastResultCode))
|
||||||
{
|
{
|
||||||
setBuildState(BuildState.ERROR);
|
setBuildState(BuildState.ERROR);
|
||||||
mLastBuildProgress = 0;
|
mLastBuildProgress = 0;
|
||||||
@@ -176,7 +195,8 @@ public class RoutingController
|
|||||||
|
|
||||||
private boolean isDrivingOptionsBuildError()
|
private boolean isDrivingOptionsBuildError()
|
||||||
{
|
{
|
||||||
return mLastResultCode != ResultCodes.NEED_MORE_MAPS && RoutingOptions.hasAnyOptions() && !isRulerRouterType();
|
return !ResultCodesHelper.isMoreMapsNeeded(mLastResultCode) && RoutingOptions.hasAnyOptions()
|
||||||
|
&& !isRulerRouterType();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setState(State newState)
|
private void setState(State newState)
|
||||||
@@ -230,7 +250,7 @@ public class RoutingController
|
|||||||
mContainer = container;
|
mContainer = container;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void initialize(@NonNull LocationHelper locationHelper)
|
public void initialize(@NonNull Context context)
|
||||||
{
|
{
|
||||||
mLastRouterType = Router.getLastUsed();
|
mLastRouterType = Router.getLastUsed();
|
||||||
mInvalidRoutePointsTransactionId = Framework.nativeInvalidRoutePointsTransactionId();
|
mInvalidRoutePointsTransactionId = Framework.nativeInvalidRoutePointsTransactionId();
|
||||||
@@ -240,7 +260,7 @@ public class RoutingController
|
|||||||
Framework.nativeSetRouteProgressListener(mRoutingProgressListener);
|
Framework.nativeSetRouteProgressListener(mRoutingProgressListener);
|
||||||
Framework.nativeSetRoutingRecommendationListener(recommendation -> UiThread.run(() -> {
|
Framework.nativeSetRoutingRecommendationListener(recommendation -> UiThread.run(() -> {
|
||||||
if (recommendation == RouteRecommendationType.RebuildAfterPointsLoading)
|
if (recommendation == RouteRecommendationType.RebuildAfterPointsLoading)
|
||||||
setStartPoint(locationHelper.getMyPosition());
|
setStartPoint(MwmApplication.from(context).getLocationHelper().getMyPosition());
|
||||||
}));
|
}));
|
||||||
Framework.nativeSetRoutingLoadPointsListener(mRoutingLoadPointsListener);
|
Framework.nativeSetRoutingLoadPointsListener(mRoutingLoadPointsListener);
|
||||||
}
|
}
|
||||||
@@ -537,7 +557,7 @@ public class RoutingController
|
|||||||
return mLastRouterType == Router.Vehicle;
|
return mLastRouterType == Router.Vehicle;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isRulerRouterType()
|
boolean isRulerRouterType()
|
||||||
{
|
{
|
||||||
return mLastRouterType == Router.Ruler;
|
return mLastRouterType == Router.Ruler;
|
||||||
}
|
}
|
||||||
@@ -863,4 +883,26 @@ public class RoutingController
|
|||||||
|
|
||||||
mWaitingPoiPickType = null;
|
mWaitingPoiPickType = null;
|
||||||
}
|
}
|
||||||
|
public static CharSequence formatRoutingTime(Context context, int seconds, @DimenRes int unitsSize)
|
||||||
|
{
|
||||||
|
return formatRoutingTime(context, seconds, unitsSize, R.dimen.text_size_routing_number);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CharSequence formatRoutingTime(Context context, int seconds, @DimenRes int unitsSize,
|
||||||
|
@DimenRes int textSize)
|
||||||
|
{
|
||||||
|
long minutes = TimeUnit.SECONDS.toMinutes(seconds) % 60;
|
||||||
|
long hours = TimeUnit.SECONDS.toHours(seconds);
|
||||||
|
String min = context.getString(R.string.minute);
|
||||||
|
String hour = context.getString(R.string.hour);
|
||||||
|
SpannableStringBuilder displayedH = Utils.formatTime(context, textSize, unitsSize, String.valueOf(hours), hour);
|
||||||
|
SpannableStringBuilder displayedM = Utils.formatTime(context, textSize, unitsSize, String.valueOf(minutes), min);
|
||||||
|
return hours == 0 ? displayedM : TextUtils.concat(displayedH + "\u00A0", displayedM);
|
||||||
|
}
|
||||||
|
|
||||||
|
static String formatArrivalTime(int seconds)
|
||||||
|
{
|
||||||
|
final LocalTime time = LocalTime.now().plusSeconds(seconds);
|
||||||
|
return StringUtils.formatUsingUsLocale("%d:%02d", time.getHour(), time.getMinute());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -8,6 +8,7 @@ import android.text.TextUtils;
|
|||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
|
import android.widget.TextView;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
@@ -17,7 +18,6 @@ import app.organicmaps.R;
|
|||||||
import app.organicmaps.sdk.downloader.CountryItem;
|
import app.organicmaps.sdk.downloader.CountryItem;
|
||||||
import app.organicmaps.sdk.downloader.MapManager;
|
import app.organicmaps.sdk.downloader.MapManager;
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
|
||||||
|
|
||||||
public class RoutingErrorDialogFragment extends BaseRoutingErrorDialogFragment
|
public class RoutingErrorDialogFragment extends BaseRoutingErrorDialogFragment
|
||||||
{
|
{
|
||||||
@@ -38,7 +38,7 @@ public class RoutingErrorDialogFragment extends BaseRoutingErrorDialogFragment
|
|||||||
|
|
||||||
if (!TextUtils.isEmpty(titleMessage.first))
|
if (!TextUtils.isEmpty(titleMessage.first))
|
||||||
{
|
{
|
||||||
MaterialTextView titleView = new MaterialTextView(requireContext());
|
TextView titleView = new TextView(requireContext());
|
||||||
titleView.setText(titleMessage.first);
|
titleView.setText(titleMessage.first);
|
||||||
titleView.setPadding(65, 32, 32, 16);
|
titleView.setPadding(65, 32, 32, 16);
|
||||||
titleView.setTextSize(18);
|
titleView.setTextSize(18);
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import androidx.fragment.app.FragmentFactory;
|
|||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.sdk.downloader.CountryItem;
|
import app.organicmaps.sdk.downloader.CountryItem;
|
||||||
import app.organicmaps.sdk.downloader.MapManager;
|
import app.organicmaps.sdk.downloader.MapManager;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
import app.organicmaps.widget.WheelProgressView;
|
import app.organicmaps.widget.WheelProgressView;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ import app.organicmaps.MwmApplication;
|
|||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.Router;
|
import app.organicmaps.sdk.Router;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||||
import app.organicmaps.sdk.routing.RoutingOptions;
|
import app.organicmaps.sdk.routing.RoutingOptions;
|
||||||
import app.organicmaps.sdk.routing.TransitRouteInfo;
|
import app.organicmaps.sdk.routing.TransitRouteInfo;
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import app.organicmaps.MwmActivity;
|
|||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.base.BaseMwmFragment;
|
import app.organicmaps.base.BaseMwmFragment;
|
||||||
import app.organicmaps.sdk.Router;
|
import app.organicmaps.sdk.Router;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
|
|
||||||
public class RoutingPlanFragment extends BaseMwmFragment
|
public class RoutingPlanFragment extends BaseMwmFragment
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ import android.content.Context;
|
|||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.Surface;
|
import android.view.Surface;
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import app.organicmaps.BuildConfig;
|
import app.organicmaps.BuildConfig;
|
||||||
|
import app.organicmaps.MwmApplication;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.sdk.display.DisplayType;
|
import app.organicmaps.sdk.display.DisplayType;
|
||||||
import app.organicmaps.sdk.location.LocationHelper;
|
import app.organicmaps.sdk.location.LocationHelper;
|
||||||
@@ -53,12 +53,8 @@ public final class Map
|
|||||||
public static final int INVALID_POINTER_MASK = 0xFF;
|
public static final int INVALID_POINTER_MASK = 0xFF;
|
||||||
public static final int INVALID_TOUCH_ID = -1;
|
public static final int INVALID_TOUCH_ID = -1;
|
||||||
|
|
||||||
@NonNull
|
|
||||||
private final DisplayType mDisplayType;
|
private final DisplayType mDisplayType;
|
||||||
|
|
||||||
@NonNull
|
|
||||||
private final LocationHelper mLocationHelper;
|
|
||||||
|
|
||||||
private int mCurrentCompassOffsetX;
|
private int mCurrentCompassOffsetX;
|
||||||
private int mCurrentCompassOffsetY;
|
private int mCurrentCompassOffsetY;
|
||||||
private int mBottomWidgetOffsetX;
|
private int mBottomWidgetOffsetX;
|
||||||
@@ -79,10 +75,9 @@ public final class Map
|
|||||||
|
|
||||||
private static int sCurrentDpi = 0;
|
private static int sCurrentDpi = 0;
|
||||||
|
|
||||||
public Map(@NonNull DisplayType mapType, @NonNull LocationHelper locationHelper)
|
public Map(DisplayType mapType)
|
||||||
{
|
{
|
||||||
mDisplayType = mapType;
|
mDisplayType = mapType;
|
||||||
mLocationHelper = locationHelper;
|
|
||||||
onCreate(false);
|
onCreate(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -174,7 +169,9 @@ public final class Map
|
|||||||
mRequireResize = false;
|
mRequireResize = false;
|
||||||
setupWidgets(context, surfaceFrame.width(), surfaceFrame.height());
|
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,
|
if (!nativeCreateEngine(surface, surfaceDpi, firstStart, mLaunchByDeepLink, BuildConfig.VERSION_CODE,
|
||||||
ROMUtils.isCustomROM()))
|
ROMUtils.isCustomROM()))
|
||||||
{
|
{
|
||||||
@@ -185,7 +182,7 @@ public final class Map
|
|||||||
sCurrentDpi = surfaceDpi;
|
sCurrentDpi = surfaceDpi;
|
||||||
|
|
||||||
if (firstStart)
|
if (firstStart)
|
||||||
UiThread.runLater(mLocationHelper::onExitFromFirstRun);
|
UiThread.runLater(locationHelper::onExitFromFirstRun);
|
||||||
|
|
||||||
mSurfaceCreated = true;
|
mSurfaceCreated = true;
|
||||||
mSurfaceAttached = true;
|
mSurfaceAttached = true;
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ import androidx.lifecycle.DefaultLifecycleObserver;
|
|||||||
import androidx.lifecycle.LifecycleOwner;
|
import androidx.lifecycle.LifecycleOwner;
|
||||||
import androidx.lifecycle.ProcessLifecycleOwner;
|
import androidx.lifecycle.ProcessLifecycleOwner;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
|
import app.organicmaps.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
||||||
import app.organicmaps.sdk.bookmarks.data.Icon;
|
|
||||||
import app.organicmaps.sdk.downloader.Android7RootCertificateWorkaround;
|
import app.organicmaps.sdk.downloader.Android7RootCertificateWorkaround;
|
||||||
import app.organicmaps.sdk.editor.OsmOAuth;
|
import app.organicmaps.sdk.editor.OsmOAuth;
|
||||||
import app.organicmaps.sdk.location.LocationHelper;
|
import app.organicmaps.sdk.location.LocationHelper;
|
||||||
@@ -16,16 +16,16 @@ import app.organicmaps.sdk.location.SensorHelper;
|
|||||||
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
||||||
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
||||||
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
|
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.search.SearchEngine;
|
import app.organicmaps.sdk.search.SearchEngine;
|
||||||
import app.organicmaps.sdk.settings.StoragePathManager;
|
|
||||||
import app.organicmaps.sdk.sound.TtsPlayer;
|
import app.organicmaps.sdk.sound.TtsPlayer;
|
||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import app.organicmaps.sdk.util.SharedPropertiesUtils;
|
import app.organicmaps.sdk.util.SharedPropertiesUtils;
|
||||||
import app.organicmaps.sdk.util.StorageUtils;
|
import app.organicmaps.sdk.util.StorageUtils;
|
||||||
|
import app.organicmaps.sdk.util.ThemeSwitcher;
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
import app.organicmaps.sdk.util.log.LogsManager;
|
import app.organicmaps.sdk.util.log.LogsManager;
|
||||||
|
import app.organicmaps.settings.StoragePathManager;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
public final class OrganicMaps implements DefaultLifecycleObserver
|
public final class OrganicMaps implements DefaultLifecycleObserver
|
||||||
@@ -96,11 +96,9 @@ public final class OrganicMaps implements DefaultLifecycleObserver
|
|||||||
|
|
||||||
Android7RootCertificateWorkaround.initializeIfNeeded(mContext);
|
Android7RootCertificateWorkaround.initializeIfNeeded(mContext);
|
||||||
|
|
||||||
Icon.loadDefaultIcons(mContext.getResources(), mContext.getPackageName());
|
|
||||||
|
|
||||||
mSensorHelper = new SensorHelper(mContext);
|
mSensorHelper = new SensorHelper(mContext);
|
||||||
mLocationHelper = new LocationHelper(mContext, mSensorHelper);
|
mLocationHelper = new LocationHelper(mContext, mSensorHelper);
|
||||||
mIsolinesManager = new IsolinesManager();
|
mIsolinesManager = new IsolinesManager(mContext);
|
||||||
mSubwayManager = new SubwayManager(mContext);
|
mSubwayManager = new SubwayManager(mContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,10 +174,12 @@ public final class OrganicMaps implements DefaultLifecycleObserver
|
|||||||
nativeInitFramework(onComplete);
|
nativeInitFramework(onComplete);
|
||||||
|
|
||||||
initNativeStrings();
|
initNativeStrings();
|
||||||
|
ThemeSwitcher.INSTANCE.initialize(mContext);
|
||||||
SearchEngine.INSTANCE.initialize();
|
SearchEngine.INSTANCE.initialize();
|
||||||
BookmarkManager.loadBookmarks();
|
BookmarkManager.loadBookmarks();
|
||||||
TtsPlayer.INSTANCE.initialize(mContext);
|
TtsPlayer.INSTANCE.initialize(mContext);
|
||||||
RoutingController.get().initialize(mLocationHelper);
|
ThemeSwitcher.INSTANCE.restart(false);
|
||||||
|
RoutingController.get().initialize(mContext);
|
||||||
TrafficManager.INSTANCE.initialize();
|
TrafficManager.INSTANCE.initialize();
|
||||||
mSubwayManager.initialize();
|
mSubwayManager.initialize();
|
||||||
mIsolinesManager.initialize();
|
mIsolinesManager.initialize();
|
||||||
|
|||||||
@@ -10,12 +10,12 @@ import java.lang.annotation.RetentionPolicy;
|
|||||||
public @interface RequestType
|
public @interface RequestType
|
||||||
{
|
{
|
||||||
// Represents url_scheme::ParsedMapApi::UrlType from c++ part.
|
// Represents url_scheme::ParsedMapApi::UrlType from c++ part.
|
||||||
int INCORRECT = 0;
|
public static final int INCORRECT = 0;
|
||||||
int MAP = 1;
|
public static final int MAP = 1;
|
||||||
int ROUTE = 2;
|
public static final int ROUTE = 2;
|
||||||
int SEARCH = 3;
|
public static final int SEARCH = 3;
|
||||||
int CROSSHAIR = 4;
|
public static final int CROSSHAIR = 4;
|
||||||
int OAUTH2 = 5;
|
public static final int OAUTH2 = 5;
|
||||||
int MENU = 6;
|
public static final int MENU = 6;
|
||||||
int SETTINGS = 7;
|
public static final int SETTINGS = 7;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,6 +41,8 @@ public enum BookmarkManager {
|
|||||||
// These values have to match the values of kml::CompilationType from kml/types.hpp
|
// These values have to match the values of kml::CompilationType from kml/types.hpp
|
||||||
public static final int CATEGORY = 0;
|
public static final int CATEGORY = 0;
|
||||||
|
|
||||||
|
public static final List<Icon> ICONS = new ArrayList<>();
|
||||||
|
|
||||||
private static final String[] BOOKMARKS_EXTENSIONS = Framework.nativeGetBookmarksFilesExts();
|
private static final String[] BOOKMARKS_EXTENSIONS = Framework.nativeGetBookmarksFilesExts();
|
||||||
|
|
||||||
private static final String TAG = BookmarkManager.class.getSimpleName();
|
private static final String TAG = BookmarkManager.class.getSimpleName();
|
||||||
@@ -68,6 +70,26 @@ public enum BookmarkManager {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private OnElevationActivePointChangedListener mOnElevationActivePointChangedListener;
|
private OnElevationActivePointChangedListener mOnElevationActivePointChangedListener;
|
||||||
|
|
||||||
|
static
|
||||||
|
{
|
||||||
|
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_RED, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||||
|
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_PINK, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||||
|
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_PURPLE, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||||
|
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_DEEPPURPLE, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||||
|
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_BLUE, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||||
|
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_LIGHTBLUE, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||||
|
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_CYAN, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||||
|
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_TEAL, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||||
|
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_GREEN, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||||
|
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_LIME, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||||
|
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_YELLOW, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||||
|
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_ORANGE, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||||
|
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_DEEPORANGE, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||||
|
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_BROWN, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||||
|
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_GRAY, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||||
|
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_BLUEGRAY, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||||
|
}
|
||||||
|
|
||||||
public void toggleCategoryVisibility(@NonNull BookmarkCategory category)
|
public void toggleCategoryVisibility(@NonNull BookmarkCategory category)
|
||||||
{
|
{
|
||||||
boolean isVisible = isVisible(category.getId());
|
boolean isVisible = isVisible(category.getId());
|
||||||
@@ -320,7 +342,7 @@ public enum BookmarkManager {
|
|||||||
nativeShowBookmarkCategoryOnMap(catId);
|
nativeShowBookmarkCategoryOnMap(catId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PredefinedColors.Color
|
@Icon.PredefinedColor
|
||||||
public int getLastEditedColor()
|
public int getLastEditedColor()
|
||||||
{
|
{
|
||||||
return nativeGetLastEditedColor();
|
return nativeGetLastEditedColor();
|
||||||
@@ -596,7 +618,7 @@ public enum BookmarkManager {
|
|||||||
return nativeGetBookmarkXY(bookmarkId);
|
return nativeGetBookmarkXY(bookmarkId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PredefinedColors.Color
|
@Icon.PredefinedColor
|
||||||
public int getBookmarkColor(@IntRange(from = 0) long bookmarkId)
|
public int getBookmarkColor(@IntRange(from = 0) long bookmarkId)
|
||||||
{
|
{
|
||||||
return nativeGetBookmarkColor(bookmarkId);
|
return nativeGetBookmarkColor(bookmarkId);
|
||||||
@@ -630,7 +652,7 @@ public enum BookmarkManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setBookmarkParams(@IntRange(from = 0) long bookmarkId, @NonNull String name,
|
public void setBookmarkParams(@IntRange(from = 0) long bookmarkId, @NonNull String name,
|
||||||
@PredefinedColors.Color int color, @NonNull String descr)
|
@Icon.PredefinedColor int color, @NonNull String descr)
|
||||||
{
|
{
|
||||||
nativeSetBookmarkParams(bookmarkId, name, color, descr);
|
nativeSetBookmarkParams(bookmarkId, name, color, descr);
|
||||||
}
|
}
|
||||||
@@ -786,7 +808,7 @@ public enum BookmarkManager {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private native Bookmark nativeAddBookmarkToLastEditedCategory(double lat, double lon);
|
private native Bookmark nativeAddBookmarkToLastEditedCategory(double lat, double lon);
|
||||||
|
|
||||||
@PredefinedColors.Color
|
@Icon.PredefinedColor
|
||||||
private native int nativeGetLastEditedColor();
|
private native int nativeGetLastEditedColor();
|
||||||
|
|
||||||
private static native void nativeLoadBookmarksFile(@NonNull String path, boolean isTemporaryFile);
|
private static native void nativeLoadBookmarksFile(@NonNull String path, boolean isTemporaryFile);
|
||||||
@@ -852,7 +874,7 @@ public enum BookmarkManager {
|
|||||||
@NonNull
|
@NonNull
|
||||||
private static native ParcelablePointD nativeGetBookmarkXY(@IntRange(from = 0) long bookmarkId);
|
private static native ParcelablePointD nativeGetBookmarkXY(@IntRange(from = 0) long bookmarkId);
|
||||||
|
|
||||||
@PredefinedColors.Color
|
@Icon.PredefinedColor
|
||||||
private static native int nativeGetBookmarkColor(@IntRange(from = 0) long bookmarkId);
|
private static native int nativeGetBookmarkColor(@IntRange(from = 0) long bookmarkId);
|
||||||
|
|
||||||
private static native int nativeGetBookmarkIcon(@IntRange(from = 0) long bookmarkId);
|
private static native int nativeGetBookmarkIcon(@IntRange(from = 0) long bookmarkId);
|
||||||
@@ -867,13 +889,12 @@ public enum BookmarkManager {
|
|||||||
private static native String nativeEncode2Ge0Url(@IntRange(from = 0) long bookmarkId, boolean addName);
|
private static native String nativeEncode2Ge0Url(@IntRange(from = 0) long bookmarkId, boolean addName);
|
||||||
|
|
||||||
private static native void nativeSetBookmarkParams(@IntRange(from = 0) long bookmarkId, @NonNull String name,
|
private static native void nativeSetBookmarkParams(@IntRange(from = 0) long bookmarkId, @NonNull String name,
|
||||||
@PredefinedColors.Color int color, @NonNull String descr);
|
@Icon.PredefinedColor int color, @NonNull String descr);
|
||||||
|
|
||||||
private static native void nativeChangeTrackColor(@IntRange(from = 0) long trackId,
|
private static native void nativeChangeTrackColor(@IntRange(from = 0) long trackId, @Icon.PredefinedColor int color);
|
||||||
@PredefinedColors.Color int color);
|
|
||||||
|
|
||||||
private static native void nativeSetTrackParams(@IntRange(from = 0) long trackId, @NonNull String name,
|
private static native void nativeSetTrackParams(@IntRange(from = 0) long trackId, @NonNull String name,
|
||||||
@PredefinedColors.Color int color, @NonNull String descr);
|
@Icon.PredefinedColor int color, @NonNull String descr);
|
||||||
|
|
||||||
private static native void nativeChangeBookmarkCategory(@IntRange(from = 0) long oldCatId,
|
private static native void nativeChangeBookmarkCategory(@IntRange(from = 0) long oldCatId,
|
||||||
@IntRange(from = 0) long newCatId,
|
@IntRange(from = 0) long newCatId,
|
||||||
|
|||||||
@@ -1,29 +1,108 @@
|
|||||||
package app.organicmaps.sdk.bookmarks.data;
|
package app.organicmaps.sdk.bookmarks.data;
|
||||||
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
import androidx.annotation.ColorInt;
|
|
||||||
import androidx.annotation.DrawableRes;
|
import androidx.annotation.DrawableRes;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.IntDef;
|
||||||
import app.organicmaps.BuildConfig;
|
import app.organicmaps.sdk.R;
|
||||||
import app.organicmaps.sdk.util.StringUtils;
|
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
|
||||||
import com.google.common.base.Objects;
|
import com.google.common.base.Objects;
|
||||||
import dalvik.annotation.optimization.FastNative;
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
|
||||||
public class Icon implements Parcelable
|
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
|
@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 mColor;
|
||||||
private final int mType;
|
private final int mType;
|
||||||
|
|
||||||
public Icon(@PredefinedColors.Color int color, int type)
|
public Icon(@PredefinedColor int color, int type)
|
||||||
{
|
{
|
||||||
mColor = color;
|
mColor = color;
|
||||||
mType = type;
|
mType = type;
|
||||||
@@ -48,29 +127,31 @@ public class Icon implements Parcelable
|
|||||||
mType = in.readInt();
|
mType = in.readInt();
|
||||||
}
|
}
|
||||||
|
|
||||||
@PredefinedColors.Color
|
@PredefinedColor
|
||||||
public int getColor()
|
public int getColor()
|
||||||
{
|
{
|
||||||
return mColor;
|
return mColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ColorInt
|
|
||||||
public int argb()
|
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
|
@DrawableRes
|
||||||
public int getResId()
|
public int getResId()
|
||||||
{
|
{
|
||||||
// loadDefaultIcons should be called
|
return TYPE_ICONS[mType];
|
||||||
assert (sTypeIcons != null);
|
|
||||||
return sTypeIcons[mType];
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getType()
|
|
||||||
{
|
|
||||||
return mType;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -100,29 +181,4 @@ public class Icon implements Parcelable
|
|||||||
return new Icon[size];
|
return new Icon[size];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static public void loadDefaultIcons(@NonNull Resources resources, @NonNull String packageName)
|
|
||||||
{
|
|
||||||
final String[] names = nativeGetBookmarkIconNames();
|
|
||||||
int[] icons = new int[names.length];
|
|
||||||
for (int i = 0; i < names.length; i++)
|
|
||||||
{
|
|
||||||
final String name = StringUtils.toSnakeCase(names[i]);
|
|
||||||
icons[i] = resources.getIdentifier("ic_bookmark_" + name, "drawable", packageName);
|
|
||||||
if (icons[i] == 0)
|
|
||||||
{
|
|
||||||
Logger.e(TAG, "Error getting icon for " + name);
|
|
||||||
// Force devs to add an icon for each bookmark type.
|
|
||||||
if (BuildConfig.DEBUG)
|
|
||||||
throw new RuntimeException("Error getting icon for " + name);
|
|
||||||
icons[i] = app.organicmaps.sdk.R.drawable.ic_bookmark_none; // Fallback icon
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sTypeIcons = icons;
|
|
||||||
}
|
|
||||||
|
|
||||||
@FastNative
|
|
||||||
@NonNull
|
|
||||||
private static native String[] nativeGetBookmarkIconNames();
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
|
||||||
@@ -161,7 +161,6 @@ public final class Editor
|
|||||||
public static native void nativeCreateNote(String text);
|
public static native void nativeCreateNote(String text);
|
||||||
public static native void nativePlaceDoesNotExist(@NonNull String comment);
|
public static native void nativePlaceDoesNotExist(@NonNull String comment);
|
||||||
public static native void nativeRollbackMapObject();
|
public static native void nativeRollbackMapObject();
|
||||||
public static native void nativeCreateStandaloneNote(double lat, double lon, String text);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return all cuisines keys.
|
* @return all cuisines keys.
|
||||||
|
|||||||
@@ -16,12 +16,13 @@ import androidx.annotation.UiThread;
|
|||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
import androidx.core.location.GnssStatusCompat;
|
import androidx.core.location.GnssStatusCompat;
|
||||||
import androidx.core.location.LocationManagerCompat;
|
import androidx.core.location.LocationManagerCompat;
|
||||||
|
import app.organicmaps.MwmApplication;
|
||||||
|
import app.organicmaps.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.Map;
|
import app.organicmaps.sdk.Map;
|
||||||
import app.organicmaps.sdk.bookmarks.data.FeatureId;
|
import app.organicmaps.sdk.bookmarks.data.FeatureId;
|
||||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||||
import app.organicmaps.sdk.routing.JunctionInfo;
|
import app.organicmaps.sdk.routing.JunctionInfo;
|
||||||
import app.organicmaps.sdk.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import app.organicmaps.sdk.util.LocationUtils;
|
import app.organicmaps.sdk.util.LocationUtils;
|
||||||
import app.organicmaps.sdk.util.NetworkPolicy;
|
import app.organicmaps.sdk.util.NetworkPolicy;
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import app.organicmaps.sdk.Framework;
|
|||||||
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
||||||
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
||||||
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
|
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
|
||||||
|
import app.organicmaps.sdk.util.ThemeSwitcher;
|
||||||
|
|
||||||
public enum Mode
|
public enum Mode
|
||||||
{
|
{
|
||||||
@@ -60,8 +61,7 @@ public enum Mode
|
|||||||
public void setEnabled(@NonNull Context context, boolean isEnabled)
|
public void setEnabled(@NonNull Context context, boolean isEnabled)
|
||||||
{
|
{
|
||||||
Framework.nativeSetOutdoorsLayerEnabled(isEnabled);
|
Framework.nativeSetOutdoorsLayerEnabled(isEnabled);
|
||||||
// TODO: ThemeSwitcher is outside sdk package. Properly fix dependencies
|
ThemeSwitcher.INSTANCE.restart(true);
|
||||||
// ThemeSwitcher.INSTANCE.restart(true);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,18 @@
|
|||||||
package app.organicmaps.sdk.maplayer.isolines;
|
package app.organicmaps.sdk.maplayer.isolines;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
|
|
||||||
public class IsolinesManager
|
public class IsolinesManager
|
||||||
{
|
{
|
||||||
@NonNull
|
@NonNull
|
||||||
private final OnIsolinesChangedListener mListener = new OnIsolinesChangedListener();
|
private final OnIsolinesChangedListener mListener;
|
||||||
|
|
||||||
|
public IsolinesManager(@NonNull Context context)
|
||||||
|
{
|
||||||
|
mListener = new OnIsolinesChangedListener(context);
|
||||||
|
}
|
||||||
|
|
||||||
static public boolean isEnabled()
|
static public boolean isEnabled()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,9 +1,40 @@
|
|||||||
package app.organicmaps.sdk.maplayer.isolines;
|
package app.organicmaps.sdk.maplayer.isolines;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.Toast;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import app.organicmaps.R;
|
||||||
|
import app.organicmaps.util.Utils;
|
||||||
|
|
||||||
public enum IsolinesState
|
public enum IsolinesState
|
||||||
{
|
{
|
||||||
DISABLED,
|
DISABLED,
|
||||||
ENABLED,
|
ENABLED,
|
||||||
EXPIREDDATA,
|
EXPIREDDATA {
|
||||||
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_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 */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,33 @@
|
|||||||
package app.organicmaps.sdk.maplayer.isolines;
|
package app.organicmaps.sdk.maplayer.isolines;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import androidx.annotation.Keep;
|
import androidx.annotation.Keep;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
|
|
||||||
class OnIsolinesChangedListener
|
class OnIsolinesChangedListener
|
||||||
{
|
{
|
||||||
@Nullable
|
@NonNull
|
||||||
|
private final Context mContext;
|
||||||
private IsolinesErrorDialogListener mListener;
|
private IsolinesErrorDialogListener mListener;
|
||||||
|
|
||||||
|
OnIsolinesChangedListener(@NonNull Context app)
|
||||||
|
{
|
||||||
|
mContext = app;
|
||||||
|
}
|
||||||
|
|
||||||
// Called from JNI.
|
// Called from JNI.
|
||||||
@Keep
|
@Keep
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public void onStateChanged(int type)
|
public void onStateChanged(int type)
|
||||||
{
|
{
|
||||||
|
IsolinesState state = IsolinesState.values()[type];
|
||||||
if (mListener == null)
|
if (mListener == null)
|
||||||
|
{
|
||||||
|
state.activate(mContext, null, null);
|
||||||
return;
|
return;
|
||||||
mListener.onStateChanged(IsolinesState.values()[type]);
|
}
|
||||||
|
|
||||||
|
mListener.onStateChanged(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void attach(@NonNull IsolinesErrorDialogListener listener)
|
public void attach(@NonNull IsolinesErrorDialogListener listener)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package app.organicmaps.sdk.sound;
|
package app.organicmaps.sdk.sound;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.res.Resources;
|
||||||
import android.database.ContentObserver;
|
import android.database.ContentObserver;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
@@ -9,9 +10,9 @@ import android.provider.Settings;
|
|||||||
import android.speech.tts.TextToSpeech;
|
import android.speech.tts.TextToSpeech;
|
||||||
import android.speech.tts.UtteranceProgressListener;
|
import android.speech.tts.UtteranceProgressListener;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Pair;
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import app.organicmaps.sdk.util.concurrency.UiThread;
|
import app.organicmaps.sdk.util.concurrency.UiThread;
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
@@ -42,9 +43,6 @@ public enum TtsPlayer
|
|||||||
private static final float SPEECH_RATE = 1.0f;
|
private static final float SPEECH_RATE = 1.0f;
|
||||||
private static final int TTS_SPEAK_DELAY_MILLIS = 50;
|
private static final int TTS_SPEAK_DELAY_MILLIS = 50;
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private static List<Pair<String, String>> sSupportedLanguages = null;
|
|
||||||
|
|
||||||
public static Runnable sOnReloadCallback = null;
|
public static Runnable sOnReloadCallback = null;
|
||||||
|
|
||||||
private ContentObserver mTtsEngineObserver;
|
private ContentObserver mTtsEngineObserver;
|
||||||
@@ -288,15 +286,19 @@ public enum TtsPlayer
|
|||||||
|
|
||||||
private boolean getUsableLanguages(List<LanguageData> outList)
|
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
|
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)
|
catch (IllegalArgumentException e)
|
||||||
{
|
{
|
||||||
@@ -349,20 +351,8 @@ public enum TtsPlayer
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
|
||||||
private List<Pair<String, String>> getSupportedLanguages()
|
|
||||||
{
|
|
||||||
if (sSupportedLanguages == null)
|
|
||||||
{
|
|
||||||
sSupportedLanguages = nativeGetSupportedLanguages();
|
|
||||||
}
|
|
||||||
return sSupportedLanguages;
|
|
||||||
}
|
|
||||||
|
|
||||||
private native static void nativeEnableTurnNotifications(boolean enable);
|
private native static void nativeEnableTurnNotifications(boolean enable);
|
||||||
private native static boolean nativeAreTurnNotificationsEnabled();
|
private native static boolean nativeAreTurnNotificationsEnabled();
|
||||||
private native static void nativeSetTurnNotificationsLocale(String code);
|
private native static void nativeSetTurnNotificationsLocale(String code);
|
||||||
private native static String nativeGetTurnNotificationsLocale();
|
private native static String nativeGetTurnNotificationsLocale();
|
||||||
@NonNull
|
|
||||||
private native static List<Pair<String, String>> nativeGetSupportedLanguages();
|
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user