mirror of
https://codeberg.org/comaps/comaps
synced 2025-12-21 13:53:37 +00:00
Compare commits
105 Commits
v2025.08.1
...
x7z4w-patc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
98f537bc86 | ||
|
|
9c0e1abd15 | ||
|
|
ca9b3535a8 | ||
|
|
dddbfa315d | ||
|
|
c30990ecda | ||
|
|
fdb72c9d31 | ||
|
|
139facfb00 | ||
|
|
7536591ca4 | ||
|
|
c7592276f7 | ||
|
|
8ef68a5559 | ||
|
|
e46d3d9b65 | ||
|
|
62de63eda0 | ||
|
|
e786dbe5f5 | ||
|
|
d44f0ae7da | ||
|
|
4232de04ac | ||
|
|
bfacc2a98d | ||
|
|
d04327082d | ||
|
|
3097b54036 | ||
|
|
e2fa169832 | ||
|
|
3d6d08e2a1 | ||
|
|
5e8eeb1f20 | ||
|
|
8d61c7447b | ||
|
|
4117cca562 | ||
|
|
416b8ab95a | ||
|
|
d8f9323705 | ||
|
|
e3d47775fc | ||
|
|
a580c19dc0 | ||
|
|
8e0d4776af | ||
|
|
674abcf02e | ||
|
|
fbaa59ce3b | ||
|
|
72ff90defd | ||
|
|
1d29e7816a | ||
|
|
7b4862b442 | ||
|
|
b7b87f5530 | ||
|
|
fb62982000 | ||
|
|
64f50d4e49 | ||
|
|
fda1da03c8 | ||
|
|
8477fff988 | ||
|
|
5158ceb311 | ||
|
|
7e5e6ec78e | ||
|
|
0ea0f2e49a | ||
|
|
b1c2b204a1 | ||
|
|
52a0c45083 | ||
|
|
4de9de38ad | ||
|
|
215c19dcc7 | ||
|
|
b5b333c832 | ||
|
|
dfd7af92fa | ||
|
|
e00d5d33b2 | ||
|
|
5ae8156fa3 | ||
|
|
b107638b8b | ||
|
|
c4599f4889 | ||
|
|
580209f7ea | ||
|
|
abc755c058 | ||
|
|
035a8edebb | ||
|
|
c59b63d784 | ||
|
|
daf2a7d8e7 | ||
|
|
f549108e72 | ||
|
|
90667e9fa1 | ||
|
|
8bac8b7d37 | ||
|
|
bfffa1fff4 | ||
|
|
9f0290c0ec | ||
|
|
8a8a3c5a08 | ||
|
|
518747d503 | ||
|
|
5063b511ae | ||
|
|
fbe3f72fb1 | ||
|
|
872c0d3e15 | ||
|
|
9833918aac | ||
|
|
0000ec149c | ||
|
|
da3053f5fc | ||
|
|
5a0ff536a7 | ||
|
|
36f123ef25 | ||
|
|
01c2f02c86 | ||
|
|
4d702ec541 | ||
|
|
344cf6d709 | ||
|
|
14b3e8fc8f | ||
|
|
6d0daf6fe7 | ||
|
|
9b3507211f | ||
|
|
a406462549 | ||
|
|
897d7a253d | ||
|
|
b23c2ba3e3 | ||
|
|
705c715356 | ||
|
|
826ddba26f | ||
|
|
2492e8bda4 | ||
|
|
9e494ed8a5 | ||
|
|
1c8ac1f32a | ||
|
|
d0bb8c1c49 | ||
|
|
6c4503b0db | ||
|
|
a39b3a9921 | ||
|
|
8493ed369a | ||
|
|
2ded7e5e2b | ||
|
|
d9335c0b6c | ||
|
|
ebc5370052 | ||
|
|
0a96a23ca0 | ||
|
|
5b05a7ac71 | ||
|
|
31104eed4d | ||
|
|
0f2353aae6 | ||
|
|
d01b8aaab4 | ||
|
|
33f8e20f1b | ||
|
|
76d8396cb1 | ||
|
|
0f744e7cf2 | ||
|
|
5d990bdc19 | ||
|
|
1f2d70c720 | ||
|
|
76ffc99abd | ||
|
|
c9cbb64f12 | ||
|
|
c4722f7025 |
@@ -3,7 +3,6 @@ BasedOnStyle: Google
|
|||||||
|
|
||||||
AccessModifierOffset: -2
|
AccessModifierOffset: -2
|
||||||
AlignAfterOpenBracket: Align
|
AlignAfterOpenBracket: Align
|
||||||
AlignArrayOfStructures: Right
|
|
||||||
AlignConsecutiveMacros: AcrossEmptyLinesAndComments
|
AlignConsecutiveMacros: AcrossEmptyLinesAndComments
|
||||||
AlignEscapedNewlines: LeftWithLastLine
|
AlignEscapedNewlines: LeftWithLastLine
|
||||||
AlignOperands: AlignAfterOperator
|
AlignOperands: AlignAfterOperator
|
||||||
@@ -40,8 +39,10 @@ ColumnLimit: 120
|
|||||||
ConstructorInitializerIndentWidth: 2
|
ConstructorInitializerIndentWidth: 2
|
||||||
ContinuationIndentWidth: 4
|
ContinuationIndentWidth: 4
|
||||||
DerivePointerAlignment: false
|
DerivePointerAlignment: false
|
||||||
|
EmptyLineBeforeAccessModifier: Always
|
||||||
IncludeBlocks: Preserve
|
IncludeBlocks: Preserve
|
||||||
IndentAccessModifiers: false
|
IndentAccessModifiers: false
|
||||||
|
IndentCaseLabels: false
|
||||||
IndentExternBlock: NoIndent
|
IndentExternBlock: NoIndent
|
||||||
InsertBraces: false
|
InsertBraces: false
|
||||||
InsertNewlineAtEOF: true
|
InsertNewlineAtEOF: true
|
||||||
@@ -49,6 +50,7 @@ LambdaBodyIndentation: OuterScope
|
|||||||
PackConstructorInitializers: CurrentLine
|
PackConstructorInitializers: CurrentLine
|
||||||
PointerAlignment: Middle
|
PointerAlignment: Middle
|
||||||
RemoveBracesLLVM: true
|
RemoveBracesLLVM: true
|
||||||
|
RemoveSemicolon: true
|
||||||
QualifierAlignment: Right
|
QualifierAlignment: Right
|
||||||
SpacesInContainerLiterals: false
|
SpacesInContainerLiterals: false
|
||||||
Standard: Latest
|
Standard: Latest
|
||||||
|
|||||||
8
.clang-format-ignore
Normal file
8
.clang-format-ignore
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Files that should not be formatted.
|
||||||
|
./3party
|
||||||
|
# A patched copy of the https://registry.khronos.org/OpenGL/api/GLES3/gl3.h
|
||||||
|
./android/sdk/src/main/cpp/app/organicmaps/sdk/opengl/gl3stub.h
|
||||||
|
# Formatting it leads to crashes in runtime. Newer protobuf may fix it.
|
||||||
|
./libs/indexer/drules_struct.pb.cc
|
||||||
|
# No need to format this 3party tool.
|
||||||
|
tools/osmctools/*.c
|
||||||
@@ -21,11 +21,12 @@ jobs:
|
|||||||
- 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-get update
|
||||||
sudo apt install -y \
|
apt-get install -y flatpak dbus --no-install-recommends
|
||||||
flatpak
|
mkdir /run/dbus
|
||||||
sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
dbus-daemon --system
|
||||||
sudo flatpak install -y org.flatpak.Builder
|
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||||
|
flatpak install -y org.flatpak.Builder
|
||||||
|
|
||||||
- name: Lint appstream data with flatpak Builder
|
- name: Lint appstream data with flatpak Builder
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ on:
|
|||||||
workflow_dispatch: # Manual trigger
|
workflow_dispatch: # Manual trigger
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- qt/res/app.comaps.comaps.desktop
|
- qt/res/linux/app.comaps.comaps.desktop
|
||||||
- .forgejo/workflows/desktop-file-check.yaml # Run check on self change
|
- .forgejo/workflows/desktop-file-check.yaml # Run check on self change
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -16,7 +16,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 1
|
fetch-depth: 1
|
||||||
sparse-checkout: |
|
sparse-checkout: |
|
||||||
qt/res/app.comaps.comaps.desktop
|
qt/res/linux/app.comaps.comaps.desktop
|
||||||
|
|
||||||
- name: Install desktop-file-validate tool
|
- name: Install desktop-file-validate tool
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -27,4 +27,4 @@ jobs:
|
|||||||
|
|
||||||
- name: Validate desktop file
|
- name: Validate desktop file
|
||||||
shell: bash
|
shell: bash
|
||||||
run: desktop-file-validate qt/res/app.comaps.comaps.desktop && echo "Successfully validated .desktop file"
|
run: desktop-file-validate qt/res/linux/app.comaps.comaps.desktop && echo "Successfully validated .desktop file"
|
||||||
|
|||||||
5
.github/workflows/android-check.yaml
vendored
5
.github/workflows/android-check.yaml
vendored
@@ -23,6 +23,10 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
|
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
|
||||||
|
|
||||||
|
- name: Configure repository
|
||||||
|
shell: bash
|
||||||
|
run: SKIP_GENERATE_SYMBOLS=1 ./configure.sh
|
||||||
|
|
||||||
- name: Lint
|
- name: Lint
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: android
|
working-directory: android
|
||||||
@@ -62,6 +66,7 @@ jobs:
|
|||||||
libxinerama-dev \
|
libxinerama-dev \
|
||||||
libxcursor-dev \
|
libxcursor-dev \
|
||||||
libxi-dev \
|
libxi-dev \
|
||||||
|
python3-protobuf \
|
||||||
zlib1g-dev
|
zlib1g-dev
|
||||||
|
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
|
|||||||
43
.github/workflows/clang-format.yaml
vendored
43
.github/workflows/clang-format.yaml
vendored
@@ -1,43 +0,0 @@
|
|||||||
name: clang-format
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
paths:
|
|
||||||
- 'android/app/src/**.java'
|
|
||||||
- '.clang-format'
|
|
||||||
- '.github/workflows/clang-format.yml'
|
|
||||||
pull_request:
|
|
||||||
branches: [ master ]
|
|
||||||
paths:
|
|
||||||
- 'android/app/src/**.java'
|
|
||||||
- '.clang-format'
|
|
||||||
- '.github/workflows/clang-format.yml'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
check-formatting:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
continue-on-error: true # TODO(AB): Remove this line when ready to enforce formatting.
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Install clang-format
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y clang-format-19
|
|
||||||
clang-format-19 --version
|
|
||||||
|
|
||||||
- name: Check Java formatting
|
|
||||||
run: |
|
|
||||||
JAVA_FILES=($(find android/app/src -name '*.java'))
|
|
||||||
|
|
||||||
FORMATTING_ISSUES=$(clang-format-19 --dry-run --Werror $JAVA_FILES 2>&1 || true)
|
|
||||||
|
|
||||||
if [ -n "$FORMATTING_ISSUES" ]; then
|
|
||||||
echo "$FORMATTING_ISSUES"
|
|
||||||
echo ""
|
|
||||||
echo "To fix formatting, please run:"
|
|
||||||
echo " clang-format -i <file>"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
51
.github/workflows/code-style-check.yaml
vendored
Normal file
51
.github/workflows/code-style-check.yaml
vendored
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
name: Code style check
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
paths: # Should stay in sync with tools/unix/clang-format.sh
|
||||||
|
- '.github/workflows/code-style-check.yaml'
|
||||||
|
- 'android/app/src/**.java'
|
||||||
|
- 'android/sdk/src/**.java'
|
||||||
|
- 'android/sdk/src/main/cpp/**.[ch]pp'
|
||||||
|
- 'dev_sandbox/**.[ch]pp'
|
||||||
|
- 'generator/**.[ch]pp'
|
||||||
|
- 'iphone/**.[ch]pp'
|
||||||
|
- 'iphone/**.[hm]'
|
||||||
|
- 'iphone/**.mm'
|
||||||
|
- 'libs/**.[ch]pp'
|
||||||
|
- 'libs/**.[hm]'
|
||||||
|
- '!libs/indexer/drules_struct.pb.h'
|
||||||
|
- 'libs/**.mm'
|
||||||
|
- 'qt/**.[ch]pp'
|
||||||
|
- 'qt/**.h'
|
||||||
|
- 'tools/**.[ch]pp'
|
||||||
|
- '.clang-format'
|
||||||
|
- '.clang-format-ignore'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
code-style-check:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Install clang-format
|
||||||
|
run: |
|
||||||
|
sudo apt purge -y clang-format-18 # Remove default old version of clang-format
|
||||||
|
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
|
||||||
|
echo 'deb http://apt.llvm.org/noble/ llvm-toolchain-noble-20 main' | sudo tee /etc/apt/sources.list.d/llvm-toolchain-noble-20.list
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y clang-format-20
|
||||||
|
sudo update-alternatives --force --install /usr/bin/clang-format clang-format /usr/bin/clang-format-20 10
|
||||||
|
sudo update-alternatives --force --install /usr/bin/git-clang-format git-clang-format /usr/bin/git-clang-format-20 10
|
||||||
|
clang-format --version
|
||||||
|
- name: Checkout sources
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Check code style
|
||||||
|
run: tools/unix/clang-format.sh
|
||||||
|
|
||||||
|
- name: Post clang-format comments
|
||||||
|
if: failure()
|
||||||
|
uses: reviewdog/action-suggester@v1.21.0
|
||||||
|
with:
|
||||||
|
tool_name: clang-format
|
||||||
|
fail_level: error
|
||||||
1
.github/workflows/ios-check.yaml
vendored
1
.github/workflows/ios-check.yaml
vendored
@@ -30,6 +30,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
brew install qt \
|
brew install qt \
|
||||||
optipng
|
optipng
|
||||||
|
pip3 install "protobuf<3.21" --break-system-packages
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -50,7 +50,7 @@ omim.sdf
|
|||||||
*.suo
|
*.suo
|
||||||
*.aps
|
*.aps
|
||||||
*.rc
|
*.rc
|
||||||
!qt/res/windows.rc
|
!qt/res/windows/windows.rc
|
||||||
*.pdb
|
*.pdb
|
||||||
out/
|
out/
|
||||||
|
|
||||||
|
|||||||
4
.gitmodules
vendored
4
.gitmodules
vendored
@@ -65,3 +65,7 @@
|
|||||||
[submodule "3party/imgui/imgui"]
|
[submodule "3party/imgui/imgui"]
|
||||||
path = 3party/imgui/imgui
|
path = 3party/imgui/imgui
|
||||||
url = https://github.com/ocornut/imgui
|
url = https://github.com/ocornut/imgui
|
||||||
|
[submodule "3party/glaze"]
|
||||||
|
path = 3party/glaze
|
||||||
|
url = https://github.com/stephenberry/glaze
|
||||||
|
branch = main
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ endif()
|
|||||||
|
|
||||||
add_subdirectory(agg)
|
add_subdirectory(agg)
|
||||||
add_subdirectory(bsdiff-courgette)
|
add_subdirectory(bsdiff-courgette)
|
||||||
|
add_subdirectory(glaze)
|
||||||
add_subdirectory(minizip)
|
add_subdirectory(minizip)
|
||||||
add_subdirectory(open-location-code)
|
add_subdirectory(open-location-code)
|
||||||
add_subdirectory(opening_hours)
|
add_subdirectory(opening_hours)
|
||||||
|
|||||||
Submodule 3party/Vulkan-Headers updated: 595c8d4794...f69f0433ba
@@ -4,7 +4,9 @@ set(FT_DISABLE_HARFBUZZ ON)
|
|||||||
add_subdirectory(freetype)
|
add_subdirectory(freetype)
|
||||||
|
|
||||||
# Fix warning with ONE_PIXEL macro clash.
|
# Fix warning with ONE_PIXEL macro clash.
|
||||||
target_compile_options(freetype PRIVATE -Wno-macro-redefined)
|
if(NOT MSVC)
|
||||||
|
target_compile_options(freetype PRIVATE -Wno-macro-redefined)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Use ft2build.h from the current directory instead of the default.
|
# Use ft2build.h from the current directory instead of the default.
|
||||||
target_include_directories(freetype
|
target_include_directories(freetype
|
||||||
|
|||||||
1
3party/glaze
Submodule
1
3party/glaze
Submodule
Submodule 3party/glaze added at 5a58d7936e
@@ -11,14 +11,23 @@ target_include_directories(${PROJECT_NAME}
|
|||||||
harfbuzz/src
|
harfbuzz/src
|
||||||
)
|
)
|
||||||
|
|
||||||
# Keep these settigns in sync with xcode/harfbuzz project.
|
if (MSVC)
|
||||||
target_compile_options(${PROJECT_NAME}
|
target_compile_options(${PROJECT_NAME}
|
||||||
PRIVATE
|
PRIVATE
|
||||||
-fno-rtti
|
/GR-
|
||||||
-fno-exceptions
|
/EHsc-
|
||||||
-fno-threadsafe-statics
|
/Zc:threadSafeInit-
|
||||||
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:-Wno-format-pedantic>
|
)
|
||||||
)
|
else()
|
||||||
|
# Keep these settings in sync with xcode/harfbuzz project.
|
||||||
|
target_compile_options(${PROJECT_NAME}
|
||||||
|
PRIVATE
|
||||||
|
-fno-rtti
|
||||||
|
-fno-exceptions
|
||||||
|
-fno-threadsafe-statics
|
||||||
|
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:-Wno-format-pedantic>
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
target_compile_definitions(${PROJECT_NAME}
|
target_compile_definitions(${PROJECT_NAME}
|
||||||
PRIVATE
|
PRIVATE
|
||||||
@@ -28,14 +37,20 @@ target_compile_definitions(${PROJECT_NAME}
|
|||||||
#$<$<BOOL:${APPLE}>:HAVE_CORETEXT>
|
#$<$<BOOL:${APPLE}>:HAVE_CORETEXT>
|
||||||
HAVE_ATEXIT
|
HAVE_ATEXIT
|
||||||
HAVE_GETPAGESIZE
|
HAVE_GETPAGESIZE
|
||||||
HAVE_MMAP
|
|
||||||
HAVE_MPROTECT
|
HAVE_MPROTECT
|
||||||
HAVE_PTHREAD
|
|
||||||
HAVE_SYSCONF
|
HAVE_SYSCONF
|
||||||
HAVE_SYS_MMAN_H
|
|
||||||
HAVE_UNISTD_H
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (NOT MSVC)
|
||||||
|
target_compile_definitions(${PROJECT_NAME}
|
||||||
|
PRIVATE
|
||||||
|
HAVE_MMAP
|
||||||
|
HAVE_PTHREAD
|
||||||
|
HAVE_SYS_MMAN_H
|
||||||
|
HAVE_UNISTD_H
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
target_link_libraries(${PROJECT_NAME} Freetype::Freetype)
|
target_link_libraries(${PROJECT_NAME} Freetype::Freetype)
|
||||||
|
|
||||||
add_library(harfbuzz::harfbuzz ALIAS harfbuzz)
|
add_library(harfbuzz::harfbuzz ALIAS harfbuzz)
|
||||||
|
|||||||
@@ -172,6 +172,7 @@ add_library(icuuc
|
|||||||
icu/icu4c/source/common/uvector.cpp
|
icu/icu4c/source/common/uvector.cpp
|
||||||
icu/icu4c/source/common/uvectr32.cpp
|
icu/icu4c/source/common/uvectr32.cpp
|
||||||
icu/icu4c/source/common/uvectr64.h
|
icu/icu4c/source/common/uvectr64.h
|
||||||
|
icu/icu4c/source/common/wintz.cpp
|
||||||
icu/icu4c/source/common/wintz.h
|
icu/icu4c/source/common/wintz.h
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ set(SRC
|
|||||||
protobuf/src/google/protobuf/message_lite.cc
|
protobuf/src/google/protobuf/message_lite.cc
|
||||||
protobuf/src/google/protobuf/repeated_field.cc
|
protobuf/src/google/protobuf/repeated_field.cc
|
||||||
protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc
|
protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc
|
||||||
|
protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc
|
||||||
protobuf/src/google/protobuf/stubs/bytestream.cc
|
protobuf/src/google/protobuf/stubs/bytestream.cc
|
||||||
protobuf/src/google/protobuf/stubs/common.cc
|
protobuf/src/google/protobuf/stubs/common.cc
|
||||||
protobuf/src/google/protobuf/stubs/int128.cc
|
protobuf/src/google/protobuf/stubs/int128.cc
|
||||||
|
|||||||
Submodule 3party/protobuf/protobuf updated: a6189acd18...9442c12e86
@@ -7,7 +7,6 @@
|
|||||||
#include <boost/utility/enable_if.hpp>
|
#include <boost/utility/enable_if.hpp>
|
||||||
#include <boost/utility.hpp>
|
#include <boost/utility.hpp>
|
||||||
#include <boost/type_traits/is_pod.hpp>
|
#include <boost/type_traits/is_pod.hpp>
|
||||||
#include <boost/iostreams/device/mapped_file.hpp>
|
|
||||||
|
|
||||||
#include "mappable_vector.hpp"
|
#include "mappable_vector.hpp"
|
||||||
|
|
||||||
@@ -283,12 +282,6 @@ namespace succinct { namespace mapper {
|
|||||||
return mapper.bytes_read();
|
return mapper.bytes_read();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
size_t map(T& val, boost::iostreams::mapped_file_source const& m, uint64_t flags = 0, const char* friendly_name = "<TOP>")
|
|
||||||
{
|
|
||||||
return map(val, m.data(), flags, friendly_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
uint64_t size_of(T& val)
|
uint64_t size_of(T& val)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,7 +8,6 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include <boost/iterator/iterator_facade.hpp>
|
#include <boost/iterator/iterator_facade.hpp>
|
||||||
#include <boost/iostreams/device/mapped_file.hpp>
|
|
||||||
|
|
||||||
namespace succinct { namespace util {
|
namespace succinct { namespace util {
|
||||||
|
|
||||||
@@ -205,29 +204,6 @@ namespace succinct { namespace util {
|
|||||||
std::string m_cur_value;
|
std::string m_cur_value;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mmap_lines
|
|
||||||
{
|
|
||||||
typedef buffer_line_iterator iterator;
|
|
||||||
typedef buffer_line_iterator const_iterator;
|
|
||||||
|
|
||||||
mmap_lines(std::string filename)
|
|
||||||
: m_map(filename)
|
|
||||||
{}
|
|
||||||
|
|
||||||
const_iterator begin() const
|
|
||||||
{
|
|
||||||
return const_iterator(m_map.data(), m_map.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
const_iterator end() const
|
|
||||||
{
|
|
||||||
return const_iterator();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
boost::iostreams::mapped_file_source m_map;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct input_error : std::invalid_argument
|
struct input_error : std::invalid_argument
|
||||||
{
|
{
|
||||||
input_error(std::string const& what)
|
input_error(std::string const& what)
|
||||||
|
|||||||
@@ -19,7 +19,18 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "vulkan_wrapper.h"
|
#include "vulkan_wrapper.h"
|
||||||
|
|
||||||
|
#if defined(_WIN32)
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#ifndef NOMINMAX
|
||||||
|
#define NOMINMAX
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#else
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
int InitVulkan(void) {
|
int InitVulkan(void) {
|
||||||
#if defined(__APPLE__)
|
#if defined(__APPLE__)
|
||||||
@@ -30,6 +41,9 @@ int InitVulkan(void) {
|
|||||||
if (!libvulkan) {
|
if (!libvulkan) {
|
||||||
libvulkan = dlopen("libMoltenVK.dylib", RTLD_NOW | RTLD_LOCAL);
|
libvulkan = dlopen("libMoltenVK.dylib", RTLD_NOW | RTLD_LOCAL);
|
||||||
}
|
}
|
||||||
|
#elif defined( _WIN32 )
|
||||||
|
HMODULE libvulkan = LoadLibraryA("vulkan-1.dll");
|
||||||
|
auto dlsym = [](HMODULE h, char const * name) { return GetProcAddress(h, name); };
|
||||||
#else
|
#else
|
||||||
void* libvulkan = dlopen("libvulkan.so.1", RTLD_NOW | RTLD_LOCAL);
|
void* libvulkan = dlopen("libvulkan.so.1", RTLD_NOW | RTLD_LOCAL);
|
||||||
if (!libvulkan) {
|
if (!libvulkan) {
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ cmake_minimum_required(VERSION 3.22.1)
|
|||||||
|
|
||||||
project(omim C CXX)
|
project(omim C CXX)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 20)
|
set(CMAKE_CXX_STANDARD 23)
|
||||||
set(CMAKE_C_STANDARD 17)
|
set(CMAKE_C_STANDARD 23)
|
||||||
# Our code does not rely on gnu extensions.
|
# Our code does not rely on gnu extensions.
|
||||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
set(CMAKE_C_EXTENSIONS OFF)
|
set(CMAKE_C_EXTENSIONS OFF)
|
||||||
@@ -39,12 +39,12 @@ if (APPLE AND NOT ("${CMAKE_SYSTEM_NAME}" STREQUAL Android))
|
|||||||
# https://gitlab.kitware.com/cmake/cmake/-/issues/21963
|
# https://gitlab.kitware.com/cmake/cmake/-/issues/21963
|
||||||
enable_language(OBJC)
|
enable_language(OBJC)
|
||||||
set(CMAKE_OBJC_EXTENSIONS OFF)
|
set(CMAKE_OBJC_EXTENSIONS OFF)
|
||||||
set(CMAKE_OBJC_STANDARD 11)
|
set(CMAKE_OBJC_STANDARD 23)
|
||||||
set(CMAKE_OBJC_FLAGS -fobjc-arc)
|
set(CMAKE_OBJC_FLAGS -fobjc-arc)
|
||||||
set(CMAKE_OBJC_VISIBILITY_PRESET hidden)
|
set(CMAKE_OBJC_VISIBILITY_PRESET hidden)
|
||||||
enable_language(OBJCXX)
|
enable_language(OBJCXX)
|
||||||
set(CMAKE_OBJCXX_EXTENSIONS OFF)
|
set(CMAKE_OBJCXX_EXTENSIONS OFF)
|
||||||
set(CMAKE_OBJCXX_STANDARD 20)
|
set(CMAKE_OBJCXX_STANDARD 23)
|
||||||
set(CMAKE_OBJCXX_FLAGS -fobjc-arc)
|
set(CMAKE_OBJCXX_FLAGS -fobjc-arc)
|
||||||
set(CMAKE_OBJCXX_VISIBILITY_PRESET hidden)
|
set(CMAKE_OBJCXX_VISIBILITY_PRESET hidden)
|
||||||
endif()
|
endif()
|
||||||
@@ -87,7 +87,7 @@ if (MSVC)
|
|||||||
add_compile_options(/utf-8)
|
add_compile_options(/utf-8)
|
||||||
add_link_options(/INCREMENTAL:NO)
|
add_link_options(/INCREMENTAL:NO)
|
||||||
else()
|
else()
|
||||||
add_compile_options(-ffast-math)
|
add_compile_options(-ffast-math $<$<CXX_COMPILER_ID:GNU>:-Wno-psabi>)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (PLATFORM_WIN)
|
if (PLATFORM_WIN)
|
||||||
@@ -185,7 +185,7 @@ if (NOT PLATFORM_IPHONE AND NOT PLATFORM_ANDROID)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
# To allow #include "base/file_name.hpp" in all sources.
|
# To allow #include "base/file_name.hpp" in all sources.
|
||||||
include_directories(${CMAKE_HOME_DIRECTORY})
|
include_directories("${CMAKE_HOME_DIRECTORY}" "${CMAKE_HOME_DIRECTORY}/libs" "${CMAKE_HOME_DIRECTORY}/tools")
|
||||||
|
|
||||||
if (USE_PCH)
|
if (USE_PCH)
|
||||||
message(STATUS "Precompiled headers are ON")
|
message(STATUS "Precompiled headers are ON")
|
||||||
@@ -197,7 +197,7 @@ if (USE_PCH)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Should be on the root level, not in 3party, so tests can get these dependencies.
|
# Should be on the root level, not in 3party, so tests can get these dependencies.
|
||||||
if (PLATFORM_LINUX OR PLATFORM_WIN)
|
if (PLATFORM_LINUX)
|
||||||
find_package(ICU COMPONENTS uc i18n data REQUIRED)
|
find_package(ICU COMPONENTS uc i18n data REQUIRED)
|
||||||
find_package(Freetype REQUIRED)
|
find_package(Freetype REQUIRED)
|
||||||
find_package(harfbuzz REQUIRED)
|
find_package(harfbuzz REQUIRED)
|
||||||
@@ -227,49 +227,22 @@ endif()
|
|||||||
# Used in qt/ and shaders/
|
# Used in qt/ and shaders/
|
||||||
find_package(Python3 REQUIRED COMPONENTS Interpreter)
|
find_package(Python3 REQUIRED COMPONENTS Interpreter)
|
||||||
|
|
||||||
add_subdirectory(base)
|
add_subdirectory(libs)
|
||||||
add_subdirectory(coding)
|
|
||||||
add_subdirectory(descriptions)
|
|
||||||
add_subdirectory(drape)
|
|
||||||
add_subdirectory(drape_frontend)
|
|
||||||
add_subdirectory(editor)
|
|
||||||
add_subdirectory(ge0)
|
|
||||||
add_subdirectory(generator/mwm_diff)
|
|
||||||
add_subdirectory(geometry)
|
|
||||||
add_subdirectory(indexer)
|
|
||||||
add_subdirectory(kml)
|
|
||||||
add_subdirectory(map)
|
|
||||||
add_subdirectory(cppjansson)
|
|
||||||
add_subdirectory(platform)
|
|
||||||
add_subdirectory(routing)
|
|
||||||
add_subdirectory(routing_common)
|
|
||||||
add_subdirectory(search)
|
|
||||||
add_subdirectory(shaders)
|
|
||||||
add_subdirectory(storage)
|
|
||||||
add_subdirectory(tracking)
|
|
||||||
add_subdirectory(traffic)
|
|
||||||
add_subdirectory(transit)
|
|
||||||
|
|
||||||
if (PLATFORM_DESKTOP)
|
if (PLATFORM_DESKTOP)
|
||||||
omim_add_tool_subdirectory(feature_list)
|
add_subdirectory(dev_sandbox)
|
||||||
add_subdirectory(generator)
|
add_subdirectory(generator)
|
||||||
add_subdirectory(openlr)
|
add_subdirectory(tools)
|
||||||
add_subdirectory(poly_borders)
|
|
||||||
omim_add_tool_subdirectory(topography_generator)
|
|
||||||
add_subdirectory(track_analyzing)
|
|
||||||
omim_add_tool_subdirectory(track_generator)
|
|
||||||
if (NOT SKIP_QT_GUI)
|
if (NOT SKIP_QT_GUI)
|
||||||
add_subdirectory(qt)
|
add_subdirectory(qt)
|
||||||
omim_add_tool_subdirectory(skin_generator)
|
|
||||||
endif()
|
endif()
|
||||||
if (GENERATOR_TOOL)
|
if (GENERATOR_TOOL)
|
||||||
add_compile_options(-march=native -mtune=native)
|
add_compile_options(-march=native -mtune=native)
|
||||||
message(STATUS "target CPU optimizations enabled, produced binaries will NOT work on a different CPU")
|
message(STATUS "target CPU optimizations enabled, produced binaries will NOT work on a different CPU")
|
||||||
endif()
|
endif()
|
||||||
add_subdirectory(dev_sandbox)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
omim_add_test_subdirectory(qt_tstfrm)
|
omim_add_test_subdirectory(libs/qt_tstfrm)
|
||||||
|
|
||||||
if (PLATFORM_ANDROID)
|
if (PLATFORM_ANDROID)
|
||||||
add_subdirectory(android/sdk/src/main/cpp)
|
add_subdirectory(android/sdk/src/main/cpp)
|
||||||
|
|||||||
12
README.md
12
README.md
@@ -20,19 +20,19 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://codeberg.org/comaps/comaps/releases">
|
<a href="https://codeberg.org/comaps/comaps/releases">
|
||||||
<img src="https://img.shields.io/github/license/comaps/comaps?style=for-the-badge&logo=opensourceinitiative&logoColor=white&color=588157" alt="License" style="width: 90%; max-width: 150px;"/>
|
<img src="https://img.shields.io/github/license/comaps/comaps?style=for-the-badge&logo=opensourceinitiative&logoColor=white&color=588157" alt="License"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/comaps/comaps/actions/workflows/android-check.yaml">
|
<a href="https://github.com/comaps/comaps/actions/workflows/android-check.yaml">
|
||||||
<img src="https://img.shields.io/github/actions/workflow/status/comaps/comaps/.github/workflows/android-check.yaml?label=Android%20Build&logo=android&logoColor=white&style=for-the-badge&color=588157" alt="Android Build Status" style="width: 90%; max-width: 170px;"/>
|
<img src="https://img.shields.io/github/actions/workflow/status/comaps/comaps/.github/workflows/android-check.yaml?label=Android%20Build&logo=android&logoColor=white&style=for-the-badge&color=588157" alt="Android Build Status"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/comaps/comaps/actions/workflows/ios-check.yaml">
|
<a href="https://github.com/comaps/comaps/actions/workflows/ios-check.yaml">
|
||||||
<img src="https://img.shields.io/github/actions/workflow/status/comaps/comaps/.github/workflows/ios-check.yaml?label=iOS%20Build&logo=apple&logoColor=white&style=for-the-badge&color=588157" alt="iOS Build Status" style="width: 90%; max-width: 145px;"/>
|
<img src="https://img.shields.io/github/actions/workflow/status/comaps/comaps/.github/workflows/ios-check.yaml?label=iOS%20Build&logo=apple&logoColor=white&style=for-the-badge&color=588157" alt="iOS Build Status"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://opencollective.com/comaps">
|
<a href="https://opencollective.com/comaps">
|
||||||
<img src="https://img.shields.io/opencollective/all/comaps?label=Open%20Collective%20Donors&logo=opencollective&logoColor=white&style=for-the-badge&color=588157" alt="Open Collective Donors" style="width: 90%; max-width: 191px;"/>
|
<img src="https://img.shields.io/opencollective/all/comaps?label=Open%20Collective%20Donors&logo=opencollective&logoColor=white&style=for-the-badge&color=588157" alt="Open Collective Donors"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://liberapay.com/CoMaps">
|
<a href="https://liberapay.com/CoMaps">
|
||||||
<img src="https://img.shields.io/liberapay/patrons/CoMaps.svg?label=Liberapay%20Patrons&logo=liberapay&logoColor=white&style=for-the-badge&color=588157" alt="Liberapay Patrons" style="width: 90%; max-width: 160px;"/>
|
<img src="https://img.shields.io/liberapay/patrons/CoMaps.svg?label=Liberapay%20Patrons&logo=liberapay&logoColor=white&style=for-the-badge&color=588157" alt="Liberapay Patrons"/>
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -140,7 +140,7 @@ There is a dedicated [Zulip](https://codeberg.org/comaps/Governance/src/branch/m
|
|||||||
|
|
||||||
## 💸 Funding
|
## 💸 Funding
|
||||||
|
|
||||||
CoMaps is free. To stay that way, it relies on your support.
|
CoMaps is free. To fund development, we rely on your voluntary support ♥️
|
||||||
Donate via [OpenCollective](https://opencollective.com/comaps/donate) or [Liberapay](https://liberapay.com/CoMaps).
|
Donate via [OpenCollective](https://opencollective.com/comaps/donate) or [Liberapay](https://liberapay.com/CoMaps).
|
||||||
The project's financial information is completely open and transparent at [our Open Collective](https://opencollective.com/comaps).
|
The project's financial information is completely open and transparent at [our Open Collective](https://opencollective.com/comaps).
|
||||||
|
|
||||||
|
|||||||
@@ -138,8 +138,6 @@ android {
|
|||||||
disable 'MissingTranslation'
|
disable 'MissingTranslation'
|
||||||
// https://github.com/organicmaps/organicmaps/issues/3551
|
// https://github.com/organicmaps/organicmaps/issues/3551
|
||||||
disable 'MissingQuantity', 'UnusedQuantity'
|
disable 'MissingQuantity', 'UnusedQuantity'
|
||||||
// https://github.com/organicmaps/organicmaps/issues/3550
|
|
||||||
disable 'ByteOrderMark'
|
|
||||||
// https://github.com/organicmaps/organicmaps/issues/1077
|
// https://github.com/organicmaps/organicmaps/issues/1077
|
||||||
disable 'CustomSplashScreen'
|
disable 'CustomSplashScreen'
|
||||||
// https://github.com/organicmaps/organicmaps/issues/3610
|
// https://github.com/organicmaps/organicmaps/issues/3610
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ Sartu komunitatean eta lagundu maparik onena aplikatzen
|
|||||||
• Lineaz kanpoko Wikipedia artikuluak
|
• Lineaz kanpoko Wikipedia artikuluak
|
||||||
• Metroaren garraio geruza eta jarraibideak
|
• Metroaren garraio geruza eta jarraibideak
|
||||||
• Arrastoen grabazioa
|
• Arrastoen grabazioa
|
||||||
• Laster-markak eta ibilbideak esportatu eta inportatu KML, KMZ, GPX formatuetan
|
• Markagailuak eta arrastoak esportatu eta inportatu KML, KMZ, GPX formatuetan
|
||||||
• Gauean erabiltzeko modu iluna
|
• Gauean erabiltzeko modu iluna
|
||||||
• Hobetu mapako datuak guztiontzat oinarrizko editore integratua erabiliz
|
• Hobetu mapako datuak guztiontzat oinarrizko editore integratua erabiliz
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Lett kart navigasjon - Opplev mere på din reise - Drevet av felleskapet
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<!-- Requiring "android.hardware.touchscreen" here breaks DeX mode -->
|
<!-- Requiring "android.hardware.touchscreen" here breaks DeX mode -->
|
||||||
<uses-feature
|
<uses-feature
|
||||||
android:glEsVersion="0x00020000"
|
android:glEsVersion="0x00030000"
|
||||||
android:required="true"/>
|
android:required="true"/>
|
||||||
<uses-feature
|
<uses-feature
|
||||||
android:name="android.hardware.wifi"
|
android:name="android.hardware.wifi"
|
||||||
|
|||||||
@@ -150,14 +150,12 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
|||||||
|
|
||||||
switch (item.newStatus)
|
switch (item.newStatus)
|
||||||
{
|
{
|
||||||
case CountryItem.STATUS_DONE:
|
case CountryItem.STATUS_DONE:
|
||||||
mAreResourcesDownloaded = true;
|
mAreResourcesDownloaded = true;
|
||||||
showMap();
|
showMap();
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case CountryItem.STATUS_FAILED:
|
case CountryItem.STATUS_FAILED: MapManager.showError(DownloadResourcesLegacyActivity.this, item, null); return;
|
||||||
MapManager.showError(DownloadResourcesLegacyActivity.this, item, null);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ 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();
|
||||||
|
|
||||||
|
@NonNull
|
||||||
private final Map mMap = new Map(DisplayType.Device);
|
private final Map mMap = new Map(DisplayType.Device);
|
||||||
|
|
||||||
public void updateCompassOffset(int offsetX, int offsetY)
|
public void updateCompassOffset(int offsetX, int offsetY)
|
||||||
@@ -84,6 +86,8 @@ public class MapFragment extends BaseMwmFragment implements View.OnTouchListener
|
|||||||
{
|
{
|
||||||
Logger.d(TAG);
|
Logger.d(TAG);
|
||||||
super.onAttach(context);
|
super.onAttach(context);
|
||||||
|
|
||||||
|
mMap.setLocationHelper(MwmApplication.from(requireContext()).getLocationHelper());
|
||||||
mMap.setMapRenderingListener((MapRenderingListener) context);
|
mMap.setMapRenderingListener((MapRenderingListener) context);
|
||||||
mMap.setCallbackUnsupported(this::reportUnsupported);
|
mMap.setCallbackUnsupported(this::reportUnsupported);
|
||||||
}
|
}
|
||||||
@@ -159,24 +163,24 @@ public class MapFragment extends BaseMwmFragment implements View.OnTouchListener
|
|||||||
int pointerIndex = event.getActionIndex();
|
int pointerIndex = event.getActionIndex();
|
||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case MotionEvent.ACTION_POINTER_UP -> action = Map.NATIVE_ACTION_UP;
|
case MotionEvent.ACTION_POINTER_UP -> action = Map.NATIVE_ACTION_UP;
|
||||||
case MotionEvent.ACTION_UP ->
|
case MotionEvent.ACTION_UP ->
|
||||||
{
|
{
|
||||||
action = Map.NATIVE_ACTION_UP;
|
action = Map.NATIVE_ACTION_UP;
|
||||||
pointerIndex = 0;
|
pointerIndex = 0;
|
||||||
}
|
}
|
||||||
case MotionEvent.ACTION_POINTER_DOWN -> action = Map.NATIVE_ACTION_DOWN;
|
case MotionEvent.ACTION_POINTER_DOWN -> action = Map.NATIVE_ACTION_DOWN;
|
||||||
case MotionEvent.ACTION_DOWN ->
|
case MotionEvent.ACTION_DOWN ->
|
||||||
{
|
{
|
||||||
action = Map.NATIVE_ACTION_DOWN;
|
action = Map.NATIVE_ACTION_DOWN;
|
||||||
pointerIndex = 0;
|
pointerIndex = 0;
|
||||||
}
|
}
|
||||||
case MotionEvent.ACTION_MOVE ->
|
case MotionEvent.ACTION_MOVE ->
|
||||||
{
|
{
|
||||||
action = Map.NATIVE_ACTION_MOVE;
|
action = Map.NATIVE_ACTION_MOVE;
|
||||||
pointerIndex = Map.INVALID_POINTER_MASK;
|
pointerIndex = Map.INVALID_POINTER_MASK;
|
||||||
}
|
}
|
||||||
case MotionEvent.ACTION_CANCEL -> action = Map.NATIVE_ACTION_CANCEL;
|
case MotionEvent.ACTION_CANCEL -> action = Map.NATIVE_ACTION_CANCEL;
|
||||||
}
|
}
|
||||||
Map.onTouch(action, event, pointerIndex);
|
Map.onTouch(action, event, pointerIndex);
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ import android.app.Activity;
|
|||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.res.ColorStateList;
|
import android.content.res.ColorStateList;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
@@ -28,7 +27,6 @@ import android.net.Uri;
|
|||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.text.method.LinkMovementMethod;
|
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@@ -66,7 +64,6 @@ import app.organicmaps.downloader.OnmapDownloader;
|
|||||||
import app.organicmaps.editor.EditorActivity;
|
import app.organicmaps.editor.EditorActivity;
|
||||||
import app.organicmaps.editor.EditorHostFragment;
|
import app.organicmaps.editor.EditorHostFragment;
|
||||||
import app.organicmaps.editor.FeatureCategoryActivity;
|
import app.organicmaps.editor.FeatureCategoryActivity;
|
||||||
import app.organicmaps.editor.OsmLoginActivity;
|
|
||||||
import app.organicmaps.editor.ReportFragment;
|
import app.organicmaps.editor.ReportFragment;
|
||||||
import app.organicmaps.help.HelpActivity;
|
import app.organicmaps.help.HelpActivity;
|
||||||
import app.organicmaps.intent.Factory;
|
import app.organicmaps.intent.Factory;
|
||||||
@@ -82,7 +79,6 @@ import app.organicmaps.routing.ManageRouteBottomSheet;
|
|||||||
import app.organicmaps.routing.NavigationController;
|
import app.organicmaps.routing.NavigationController;
|
||||||
import app.organicmaps.routing.NavigationService;
|
import app.organicmaps.routing.NavigationService;
|
||||||
import app.organicmaps.routing.RoutingBottomMenuListener;
|
import app.organicmaps.routing.RoutingBottomMenuListener;
|
||||||
import app.organicmaps.routing.RoutingController;
|
|
||||||
import app.organicmaps.routing.RoutingErrorDialogFragment;
|
import app.organicmaps.routing.RoutingErrorDialogFragment;
|
||||||
import app.organicmaps.routing.RoutingPlanFragment;
|
import app.organicmaps.routing.RoutingPlanFragment;
|
||||||
import app.organicmaps.routing.RoutingPlanInplaceController;
|
import app.organicmaps.routing.RoutingPlanInplaceController;
|
||||||
@@ -100,7 +96,6 @@ import app.organicmaps.sdk.display.DisplayType;
|
|||||||
import app.organicmaps.sdk.downloader.MapManager;
|
import app.organicmaps.sdk.downloader.MapManager;
|
||||||
import app.organicmaps.sdk.downloader.UpdateInfo;
|
import app.organicmaps.sdk.downloader.UpdateInfo;
|
||||||
import app.organicmaps.sdk.editor.Editor;
|
import app.organicmaps.sdk.editor.Editor;
|
||||||
import app.organicmaps.sdk.editor.OsmOAuth;
|
|
||||||
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.location.LocationState;
|
import app.organicmaps.sdk.location.LocationState;
|
||||||
@@ -108,6 +103,7 @@ import app.organicmaps.sdk.location.SensorListener;
|
|||||||
import app.organicmaps.sdk.location.TrackRecorder;
|
import app.organicmaps.sdk.location.TrackRecorder;
|
||||||
import app.organicmaps.sdk.maplayer.isolines.IsolinesState;
|
import app.organicmaps.sdk.maplayer.isolines.IsolinesState;
|
||||||
import app.organicmaps.sdk.routing.RouteMarkType;
|
import app.organicmaps.sdk.routing.RouteMarkType;
|
||||||
|
import app.organicmaps.sdk.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.routing.RoutingOptions;
|
import app.organicmaps.sdk.routing.RoutingOptions;
|
||||||
import app.organicmaps.sdk.search.SearchEngine;
|
import app.organicmaps.sdk.search.SearchEngine;
|
||||||
import app.organicmaps.sdk.settings.RoadType;
|
import app.organicmaps.sdk.settings.RoadType;
|
||||||
@@ -115,7 +111,6 @@ import app.organicmaps.sdk.settings.UnitLocale;
|
|||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import app.organicmaps.sdk.util.LocationUtils;
|
import app.organicmaps.sdk.util.LocationUtils;
|
||||||
import app.organicmaps.sdk.util.PowerManagment;
|
import app.organicmaps.sdk.util.PowerManagment;
|
||||||
import app.organicmaps.sdk.util.ThemeSwitcher;
|
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
import app.organicmaps.sdk.widget.placepage.PlacePageData;
|
import app.organicmaps.sdk.widget.placepage.PlacePageData;
|
||||||
@@ -125,6 +120,7 @@ import app.organicmaps.search.SearchFragment;
|
|||||||
import app.organicmaps.settings.DrivingOptionsActivity;
|
import app.organicmaps.settings.DrivingOptionsActivity;
|
||||||
import app.organicmaps.settings.SettingsActivity;
|
import app.organicmaps.settings.SettingsActivity;
|
||||||
import app.organicmaps.util.SharingUtils;
|
import app.organicmaps.util.SharingUtils;
|
||||||
|
import app.organicmaps.util.ThemeSwitcher;
|
||||||
import app.organicmaps.util.ThemeUtils;
|
import app.organicmaps.util.ThemeUtils;
|
||||||
import app.organicmaps.util.Utils;
|
import app.organicmaps.util.Utils;
|
||||||
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
|
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
|
||||||
@@ -290,7 +286,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
}
|
}
|
||||||
|
|
||||||
processIntent();
|
processIntent();
|
||||||
migrateOAuthCredentials();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -345,36 +340,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void migrateOAuthCredentials()
|
|
||||||
{
|
|
||||||
if (OsmOAuth.containsOAuth1Credentials())
|
|
||||||
{
|
|
||||||
// Remove old OAuth v1 secrets
|
|
||||||
OsmOAuth.clearOAuth1Credentials();
|
|
||||||
|
|
||||||
// Notify user to re-login
|
|
||||||
dismissAlertDialog();
|
|
||||||
final DialogInterface.OnClickListener navigateToLoginHandler =
|
|
||||||
(dialog, which) -> startActivity(new Intent(MwmActivity.this, OsmLoginActivity.class));
|
|
||||||
|
|
||||||
final int marginBase = getResources().getDimensionPixelSize(R.dimen.margin_base);
|
|
||||||
final float textSize = getResources().getDimension(R.dimen.line_spacing_extra_1);
|
|
||||||
final TextView text = new TextView(this);
|
|
||||||
text.setText(getText(R.string.alert_reauth_message));
|
|
||||||
text.setPadding(marginBase, marginBase, marginBase, marginBase);
|
|
||||||
text.setTextSize(textSize);
|
|
||||||
text.setMovementMethod(LinkMovementMethod.getInstance());
|
|
||||||
|
|
||||||
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
|
||||||
.setTitle(R.string.login_osm)
|
|
||||||
.setView(text)
|
|
||||||
.setPositiveButton(R.string.login, navigateToLoginHandler)
|
|
||||||
.setNegativeButton(R.string.cancel, null)
|
|
||||||
.setOnDismissListener(dialog -> mAlertDialog = null)
|
|
||||||
.show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void checkMeasurementSystem()
|
private static void checkMeasurementSystem()
|
||||||
{
|
{
|
||||||
UnitLocale.initializeCurrentUnits();
|
UnitLocale.initializeCurrentUnits();
|
||||||
@@ -683,29 +648,29 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
mPointChooser.findViewById(R.id.done).setOnClickListener(v -> {
|
mPointChooser.findViewById(R.id.done).setOnClickListener(v -> {
|
||||||
switch (ChoosePositionMode.get())
|
switch (ChoosePositionMode.get())
|
||||||
{
|
{
|
||||||
case Api:
|
case Api:
|
||||||
final Intent apiResult = new Intent();
|
final Intent apiResult = new Intent();
|
||||||
final double[] center = Framework.nativeGetScreenRectCenter();
|
final double[] center = Framework.nativeGetScreenRectCenter();
|
||||||
apiResult.putExtra(Const.EXTRA_POINT_LAT, center[0]);
|
apiResult.putExtra(Const.EXTRA_POINT_LAT, center[0]);
|
||||||
apiResult.putExtra(Const.EXTRA_POINT_LON, center[1]);
|
apiResult.putExtra(Const.EXTRA_POINT_LON, center[1]);
|
||||||
apiResult.putExtra(Const.EXTRA_ZOOM_LEVEL, Framework.nativeGetDrawScale());
|
apiResult.putExtra(Const.EXTRA_ZOOM_LEVEL, Framework.nativeGetDrawScale());
|
||||||
setResult(Activity.RESULT_OK, apiResult);
|
setResult(Activity.RESULT_OK, apiResult);
|
||||||
finish();
|
finish();
|
||||||
break;
|
break;
|
||||||
case Editor:
|
case Editor:
|
||||||
if (Framework.nativeIsDownloadedMapAtScreenCenter())
|
if (Framework.nativeIsDownloadedMapAtScreenCenter())
|
||||||
startActivity(new Intent(MwmActivity.this, FeatureCategoryActivity.class));
|
startActivity(new Intent(MwmActivity.this, FeatureCategoryActivity.class));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dismissAlertDialog();
|
dismissAlertDialog();
|
||||||
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
||||||
.setTitle(R.string.message_invalid_feature_position)
|
.setTitle(R.string.message_invalid_feature_position)
|
||||||
.setPositiveButton(R.string.ok, null)
|
.setPositiveButton(R.string.ok, null)
|
||||||
.setOnDismissListener(dialog -> mAlertDialog = null)
|
.setOnDismissListener(dialog -> mAlertDialog = null)
|
||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case None: throw new IllegalStateException("Unexpected Framework.nativeGetChoosePositionMode()");
|
case None: throw new IllegalStateException("Unexpected Framework.nativeGetChoosePositionMode()");
|
||||||
}
|
}
|
||||||
closePositionChooser();
|
closePositionChooser();
|
||||||
});
|
});
|
||||||
@@ -772,9 +737,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
final View mapView = mMapFragment.getView();
|
final View mapView = mMapFragment.getView();
|
||||||
if (mapView != null)
|
if (mapView != null)
|
||||||
{
|
{
|
||||||
int width = mapView.getWidth();
|
int width = mapView.getWidth();
|
||||||
int height = mapView.getHeight();
|
int height = mapView.getHeight();
|
||||||
Framework.nativeSetVisibleRect(0, 0, width, height);
|
Framework.nativeSetVisibleRect(0, 0, width, height);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UiUtils.show(mPointChooser);
|
UiUtils.show(mPointChooser);
|
||||||
@@ -972,24 +937,24 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
{
|
{
|
||||||
switch (button)
|
switch (button)
|
||||||
{
|
{
|
||||||
case zoomIn -> Map.zoomIn();
|
case zoomIn -> Map.zoomIn();
|
||||||
case zoomOut -> Map.zoomOut();
|
case zoomOut -> Map.zoomOut();
|
||||||
case myPosition ->
|
case myPosition ->
|
||||||
{
|
{
|
||||||
Logger.i(LOCATION_TAG, "The location button pressed");
|
Logger.i(LOCATION_TAG, "The location button pressed");
|
||||||
// Calls onMyPositionModeChanged(mode + 1).
|
// Calls onMyPositionModeChanged(mode + 1).
|
||||||
LocationState.nativeSwitchToNextMode();
|
LocationState.nativeSwitchToNextMode();
|
||||||
}
|
}
|
||||||
case toggleMapLayer -> toggleMapLayerBottomSheet();
|
case toggleMapLayer -> toggleMapLayerBottomSheet();
|
||||||
case bookmarks -> showBookmarks();
|
case bookmarks -> showBookmarks();
|
||||||
case search -> showSearch("");
|
case search -> showSearch("");
|
||||||
case menu ->
|
case menu ->
|
||||||
{
|
{
|
||||||
closeFloatingPanels();
|
closeFloatingPanels();
|
||||||
showBottomSheet(MAIN_MENU_ID);
|
showBottomSheet(MAIN_MENU_ID);
|
||||||
}
|
}
|
||||||
case help -> showHelp();
|
case help -> showHelp();
|
||||||
case trackRecordingStatus -> showTrackSaveDialog();
|
case trackRecordingStatus -> showTrackSaveDialog();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1223,21 +1188,22 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
|
|
||||||
private void onIsolinesStateChanged(@NonNull IsolinesState type)
|
private void onIsolinesStateChanged(@NonNull IsolinesState type)
|
||||||
{
|
{
|
||||||
if (type != IsolinesState.EXPIREDDATA)
|
if (type == IsolinesState.NODATA)
|
||||||
{
|
{
|
||||||
type.activate(this, findViewById(R.id.coordinator), findViewById(R.id.menu_frame));
|
Toast.makeText(this, R.string.isolines_location_error_dialog, Toast.LENGTH_SHORT).show();
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dismissAlertDialog();
|
if (type == IsolinesState.EXPIREDDATA)
|
||||||
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
{
|
||||||
.setTitle(R.string.downloader_update_maps)
|
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
||||||
.setMessage(R.string.isolines_activation_error_dialog)
|
.setTitle(R.string.downloader_update_maps)
|
||||||
.setPositiveButton(R.string.ok,
|
.setMessage(R.string.isolines_activation_error_dialog)
|
||||||
(dialog, which) -> startActivity(new Intent(this, DownloaderActivity.class)))
|
.setPositiveButton(
|
||||||
.setNegativeButton(R.string.cancel, null)
|
R.string.ok, (dialog, which) -> startActivity(new Intent(this, DownloaderActivity.class)))
|
||||||
.setOnDismissListener(dialog -> mAlertDialog = null)
|
.setNegativeButton(R.string.cancel, null)
|
||||||
.show();
|
.setOnDismissListener(dialog -> mAlertDialog = null)
|
||||||
|
.show();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -2428,18 +2394,18 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
{
|
{
|
||||||
switch (keyCode)
|
switch (keyCode)
|
||||||
{
|
{
|
||||||
case KeyEvent.KEYCODE_DPAD_DOWN: Map.zoomOut(); return true;
|
case KeyEvent.KEYCODE_DPAD_DOWN: Map.zoomOut(); return true;
|
||||||
case KeyEvent.KEYCODE_DPAD_UP: Map.zoomIn(); return true;
|
case KeyEvent.KEYCODE_DPAD_UP: Map.zoomIn(); return true;
|
||||||
case KeyEvent.KEYCODE_ESCAPE:
|
case KeyEvent.KEYCODE_ESCAPE:
|
||||||
final Intent currIntent = getIntent();
|
final Intent currIntent = getIntent();
|
||||||
final String backUrl = Framework.nativeGetParsedBackUrl();
|
final String backUrl = Framework.nativeGetParsedBackUrl();
|
||||||
if (TextUtils.isEmpty(backUrl) || (currIntent != null && Factory.isStartedForApiResult(currIntent)))
|
if (TextUtils.isEmpty(backUrl) || (currIntent != null && Factory.isStartedForApiResult(currIntent)))
|
||||||
{
|
{
|
||||||
finish();
|
finish();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return super.onKeyUp(keyCode, event);
|
return super.onKeyUp(keyCode, event);
|
||||||
default: return super.onKeyUp(keyCode, event);
|
default: return super.onKeyUp(keyCode, event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ import app.organicmaps.background.OsmUploadWork;
|
|||||||
import app.organicmaps.downloader.DownloaderNotifier;
|
import app.organicmaps.downloader.DownloaderNotifier;
|
||||||
import app.organicmaps.location.TrackRecordingService;
|
import app.organicmaps.location.TrackRecordingService;
|
||||||
import app.organicmaps.routing.NavigationService;
|
import app.organicmaps.routing.NavigationService;
|
||||||
import app.organicmaps.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.Map;
|
import app.organicmaps.sdk.Map;
|
||||||
import app.organicmaps.sdk.OrganicMaps;
|
import app.organicmaps.sdk.OrganicMaps;
|
||||||
import app.organicmaps.sdk.display.DisplayManager;
|
import app.organicmaps.sdk.display.DisplayManager;
|
||||||
@@ -28,9 +27,11 @@ import app.organicmaps.sdk.location.SensorHelper;
|
|||||||
import app.organicmaps.sdk.location.TrackRecorder;
|
import app.organicmaps.sdk.location.TrackRecorder;
|
||||||
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
||||||
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
||||||
|
import app.organicmaps.sdk.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import app.organicmaps.sdk.util.ConnectionState;
|
import app.organicmaps.sdk.util.ConnectionState;
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
|
import app.organicmaps.util.ThemeSwitcher;
|
||||||
import app.organicmaps.util.Utils;
|
import app.organicmaps.util.Utils;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
@@ -133,6 +134,8 @@ public class MwmApplication extends Application implements Application.ActivityL
|
|||||||
public boolean initOrganicMaps(@NonNull Runnable onComplete) throws IOException
|
public boolean initOrganicMaps(@NonNull Runnable onComplete) throws IOException
|
||||||
{
|
{
|
||||||
return mOrganicMaps.init(() -> {
|
return mOrganicMaps.init(() -> {
|
||||||
|
ThemeSwitcher.INSTANCE.initialize(this);
|
||||||
|
ThemeSwitcher.INSTANCE.restart(false);
|
||||||
ProcessLifecycleOwner.get().getLifecycle().addObserver(mProcessLifecycleObserver);
|
ProcessLifecycleOwner.get().getLifecycle().addObserver(mProcessLifecycleObserver);
|
||||||
onComplete.run();
|
onComplete.run();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -62,39 +62,39 @@ public class LocalBackupManager implements BookmarkManager.BookmarksSharingListe
|
|||||||
ErrorCode errorCode = null;
|
ErrorCode errorCode = null;
|
||||||
switch (result.getCode())
|
switch (result.getCode())
|
||||||
{
|
{
|
||||||
case BookmarkSharingResult.SUCCESS ->
|
case BookmarkSharingResult.SUCCESS ->
|
||||||
{
|
{
|
||||||
if (!saveBackup(result))
|
if (!saveBackup(result))
|
||||||
{
|
|
||||||
Logger.e(TAG, "Failed to save backup. See system log above");
|
|
||||||
errorCode = ErrorCode.FILE_ERROR;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Logger.i(TAG, "Backup was created and saved successfully");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case BookmarkSharingResult.EMPTY_CATEGORY ->
|
|
||||||
{
|
|
||||||
errorCode = ErrorCode.EMPTY_CATEGORY;
|
|
||||||
Logger.e(TAG, "Failed to create backup. Category is empty");
|
|
||||||
}
|
|
||||||
case BookmarkSharingResult.ARCHIVE_ERROR ->
|
|
||||||
{
|
|
||||||
errorCode = ErrorCode.ARCHIVE_ERROR;
|
|
||||||
Logger.e(TAG, "Failed to create archive of bookmarks");
|
|
||||||
}
|
|
||||||
case BookmarkSharingResult.FILE_ERROR ->
|
|
||||||
{
|
{
|
||||||
|
Logger.e(TAG, "Failed to save backup. See system log above");
|
||||||
errorCode = ErrorCode.FILE_ERROR;
|
errorCode = ErrorCode.FILE_ERROR;
|
||||||
Logger.e(TAG, "Failed create file for archive");
|
|
||||||
}
|
}
|
||||||
default ->
|
else
|
||||||
{
|
{
|
||||||
errorCode = ErrorCode.UNSUPPORTED;
|
Logger.i(TAG, "Backup was created and saved successfully");
|
||||||
Logger.e(TAG, "Failed to create backup. Unknown error");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case BookmarkSharingResult.EMPTY_CATEGORY ->
|
||||||
|
{
|
||||||
|
errorCode = ErrorCode.EMPTY_CATEGORY;
|
||||||
|
Logger.e(TAG, "Failed to create backup. Category is empty");
|
||||||
|
}
|
||||||
|
case BookmarkSharingResult.ARCHIVE_ERROR ->
|
||||||
|
{
|
||||||
|
errorCode = ErrorCode.ARCHIVE_ERROR;
|
||||||
|
Logger.e(TAG, "Failed to create archive of bookmarks");
|
||||||
|
}
|
||||||
|
case BookmarkSharingResult.FILE_ERROR ->
|
||||||
|
{
|
||||||
|
errorCode = ErrorCode.FILE_ERROR;
|
||||||
|
Logger.e(TAG, "Failed create file for archive");
|
||||||
|
}
|
||||||
|
default ->
|
||||||
|
{
|
||||||
|
errorCode = ErrorCode.UNSUPPORTED;
|
||||||
|
Logger.e(TAG, "Failed to create backup. Unknown error");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ErrorCode finalErrorCode = errorCode;
|
ErrorCode finalErrorCode = errorCode;
|
||||||
UiThread.run(() -> {
|
UiThread.run(() -> {
|
||||||
|
|||||||
@@ -66,47 +66,47 @@ public class BookmarkCategoriesAdapter extends BaseBookmarkCategoryAdapter<Recyc
|
|||||||
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
|
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
|
||||||
switch (viewType)
|
switch (viewType)
|
||||||
{
|
{
|
||||||
case TYPE_ACTION_HEADER ->
|
case TYPE_ACTION_HEADER ->
|
||||||
{
|
{
|
||||||
View header = inflater.inflate(R.layout.item_bookmark_group_list_header, parent, false);
|
View header = inflater.inflate(R.layout.item_bookmark_group_list_header, parent, false);
|
||||||
return new HeaderViewHolder(header);
|
return new HeaderViewHolder(header);
|
||||||
}
|
}
|
||||||
case TYPE_CATEGORY_ITEM ->
|
case TYPE_CATEGORY_ITEM ->
|
||||||
{
|
{
|
||||||
View view = inflater.inflate(R.layout.item_bookmark_category, parent, false);
|
View view = inflater.inflate(R.layout.item_bookmark_category, parent, false);
|
||||||
final CategoryViewHolder holder = new CategoryViewHolder(view);
|
final CategoryViewHolder holder = new CategoryViewHolder(view);
|
||||||
view.setOnClickListener(new CategoryItemClickListener(holder));
|
view.setOnClickListener(new CategoryItemClickListener(holder));
|
||||||
view.setOnLongClickListener(new LongClickListener(holder));
|
view.setOnLongClickListener(new LongClickListener(holder));
|
||||||
return holder;
|
return holder;
|
||||||
}
|
}
|
||||||
case TYPE_ACTION_ADD ->
|
case TYPE_ACTION_ADD ->
|
||||||
{
|
{
|
||||||
View item = inflater.inflate(R.layout.item_bookmark_button, parent, false);
|
View item = inflater.inflate(R.layout.item_bookmark_button, parent, false);
|
||||||
item.setOnClickListener(v -> {
|
item.setOnClickListener(v -> {
|
||||||
if (mCategoryListCallback != null)
|
if (mCategoryListCallback != null)
|
||||||
mCategoryListCallback.onAddButtonClick();
|
mCategoryListCallback.onAddButtonClick();
|
||||||
});
|
});
|
||||||
return new Holders.GeneralViewHolder(item);
|
return new Holders.GeneralViewHolder(item);
|
||||||
}
|
}
|
||||||
case TYPE_ACTION_IMPORT ->
|
case TYPE_ACTION_IMPORT ->
|
||||||
{
|
{
|
||||||
View item = inflater.inflate(R.layout.item_bookmark_button, parent, false);
|
View item = inflater.inflate(R.layout.item_bookmark_button, parent, false);
|
||||||
item.setOnClickListener(v -> {
|
item.setOnClickListener(v -> {
|
||||||
if (mCategoryListCallback != null)
|
if (mCategoryListCallback != null)
|
||||||
mCategoryListCallback.onImportButtonClick();
|
mCategoryListCallback.onImportButtonClick();
|
||||||
});
|
});
|
||||||
return new Holders.GeneralViewHolder(item);
|
return new Holders.GeneralViewHolder(item);
|
||||||
}
|
}
|
||||||
case TYPE_ACTION_EXPORT_ALL_AS_KMZ ->
|
case TYPE_ACTION_EXPORT_ALL_AS_KMZ ->
|
||||||
{
|
{
|
||||||
View item = inflater.inflate(R.layout.item_bookmark_button, parent, false);
|
View item = inflater.inflate(R.layout.item_bookmark_button, parent, false);
|
||||||
item.setOnClickListener(v -> {
|
item.setOnClickListener(v -> {
|
||||||
if (mCategoryListCallback != null)
|
if (mCategoryListCallback != null)
|
||||||
mCategoryListCallback.onExportButtonClick();
|
mCategoryListCallback.onExportButtonClick();
|
||||||
});
|
});
|
||||||
return new Holders.GeneralViewHolder(item);
|
return new Holders.GeneralViewHolder(item);
|
||||||
}
|
}
|
||||||
default -> throw new AssertionError("Invalid item type: " + viewType);
|
default -> throw new AssertionError("Invalid item type: " + viewType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,44 +116,44 @@ public class BookmarkCategoriesAdapter extends BaseBookmarkCategoryAdapter<Recyc
|
|||||||
int type = getItemViewType(position);
|
int type = getItemViewType(position);
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case TYPE_ACTION_HEADER ->
|
case TYPE_ACTION_HEADER ->
|
||||||
{
|
{
|
||||||
HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder;
|
HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder;
|
||||||
headerViewHolder.setAction(mMassOperationAction, BookmarkManager.INSTANCE.areAllCategoriesInvisible());
|
headerViewHolder.setAction(mMassOperationAction, BookmarkManager.INSTANCE.areAllCategoriesInvisible());
|
||||||
headerViewHolder.getText().setText(R.string.bookmark_lists);
|
headerViewHolder.getText().setText(R.string.bookmark_lists);
|
||||||
}
|
}
|
||||||
case TYPE_CATEGORY_ITEM ->
|
case TYPE_CATEGORY_ITEM ->
|
||||||
{
|
{
|
||||||
final BookmarkCategory category = getCategoryByPosition(toCategoryPosition(position));
|
final BookmarkCategory category = getCategoryByPosition(toCategoryPosition(position));
|
||||||
CategoryViewHolder categoryHolder = (CategoryViewHolder) holder;
|
CategoryViewHolder categoryHolder = (CategoryViewHolder) holder;
|
||||||
categoryHolder.setEntity(category);
|
categoryHolder.setEntity(category);
|
||||||
categoryHolder.setName(category.getName());
|
categoryHolder.setName(category.getName());
|
||||||
categoryHolder.setSize();
|
categoryHolder.setSize();
|
||||||
categoryHolder.setVisibilityState(category.isVisible());
|
categoryHolder.setVisibilityState(category.isVisible());
|
||||||
ToggleVisibilityClickListener visibilityListener = new ToggleVisibilityClickListener(categoryHolder);
|
ToggleVisibilityClickListener visibilityListener = new ToggleVisibilityClickListener(categoryHolder);
|
||||||
categoryHolder.setVisibilityListener(visibilityListener);
|
categoryHolder.setVisibilityListener(visibilityListener);
|
||||||
CategoryItemMoreClickListener moreClickListener = new CategoryItemMoreClickListener(categoryHolder);
|
CategoryItemMoreClickListener moreClickListener = new CategoryItemMoreClickListener(categoryHolder);
|
||||||
categoryHolder.setMoreButtonClickListener(moreClickListener);
|
categoryHolder.setMoreButtonClickListener(moreClickListener);
|
||||||
}
|
}
|
||||||
case TYPE_ACTION_ADD ->
|
case TYPE_ACTION_ADD ->
|
||||||
{
|
{
|
||||||
Holders.GeneralViewHolder generalViewHolder = (Holders.GeneralViewHolder) holder;
|
Holders.GeneralViewHolder generalViewHolder = (Holders.GeneralViewHolder) holder;
|
||||||
generalViewHolder.getImage().setImageResource(R.drawable.ic_add_list);
|
generalViewHolder.getImage().setImageResource(R.drawable.ic_add_list);
|
||||||
generalViewHolder.getText().setText(R.string.bookmarks_create_new_group);
|
generalViewHolder.getText().setText(R.string.bookmarks_create_new_group);
|
||||||
}
|
}
|
||||||
case TYPE_ACTION_IMPORT ->
|
case TYPE_ACTION_IMPORT ->
|
||||||
{
|
{
|
||||||
Holders.GeneralViewHolder generalViewHolder = (Holders.GeneralViewHolder) holder;
|
Holders.GeneralViewHolder generalViewHolder = (Holders.GeneralViewHolder) holder;
|
||||||
generalViewHolder.getImage().setImageResource(R.drawable.ic_import);
|
generalViewHolder.getImage().setImageResource(R.drawable.ic_import);
|
||||||
generalViewHolder.getText().setText(R.string.bookmarks_import);
|
generalViewHolder.getText().setText(R.string.bookmarks_import);
|
||||||
}
|
}
|
||||||
case TYPE_ACTION_EXPORT_ALL_AS_KMZ ->
|
case TYPE_ACTION_EXPORT_ALL_AS_KMZ ->
|
||||||
{
|
{
|
||||||
Holders.GeneralViewHolder generalViewHolder = (Holders.GeneralViewHolder) holder;
|
Holders.GeneralViewHolder generalViewHolder = (Holders.GeneralViewHolder) holder;
|
||||||
generalViewHolder.getImage().setImageResource(R.drawable.ic_export);
|
generalViewHolder.getImage().setImageResource(R.drawable.ic_export);
|
||||||
generalViewHolder.getText().setText(R.string.bookmarks_export);
|
generalViewHolder.getText().setText(R.string.bookmarks_export);
|
||||||
}
|
}
|
||||||
default -> throw new AssertionError("Invalid item type: " + type);
|
default -> throw new AssertionError("Invalid item type: " + type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -442,37 +442,37 @@ public class BookmarkListAdapter extends RecyclerView.Adapter<Holders.BaseBookma
|
|||||||
Holders.BaseBookmarkHolder holder = null;
|
Holders.BaseBookmarkHolder holder = null;
|
||||||
switch (viewType)
|
switch (viewType)
|
||||||
{
|
{
|
||||||
case TYPE_TRACK:
|
case TYPE_TRACK:
|
||||||
Holders.TrackViewHolder trackHolder =
|
Holders.TrackViewHolder trackHolder =
|
||||||
new Holders.TrackViewHolder(inflater.inflate(R.layout.item_track, parent, false));
|
new Holders.TrackViewHolder(inflater.inflate(R.layout.item_track, parent, false));
|
||||||
trackHolder.setOnClickListener(mClickListener);
|
trackHolder.setOnClickListener(mClickListener);
|
||||||
trackHolder.setOnLongClickListener(mLongClickListener);
|
trackHolder.setOnLongClickListener(mLongClickListener);
|
||||||
trackHolder.setTrackIconClickListener(mIconClickListener);
|
trackHolder.setTrackIconClickListener(mIconClickListener);
|
||||||
trackHolder.setMoreButtonClickListener(mMoreClickListener);
|
trackHolder.setMoreButtonClickListener(mMoreClickListener);
|
||||||
holder = trackHolder;
|
holder = trackHolder;
|
||||||
break;
|
break;
|
||||||
case TYPE_BOOKMARK:
|
case TYPE_BOOKMARK:
|
||||||
Holders.BookmarkViewHolder bookmarkHolder =
|
Holders.BookmarkViewHolder bookmarkHolder =
|
||||||
new Holders.BookmarkViewHolder(inflater.inflate(R.layout.item_bookmark, parent, false));
|
new Holders.BookmarkViewHolder(inflater.inflate(R.layout.item_bookmark, parent, false));
|
||||||
bookmarkHolder.setOnClickListener(mClickListener);
|
bookmarkHolder.setOnClickListener(mClickListener);
|
||||||
bookmarkHolder.setOnLongClickListener(mLongClickListener);
|
bookmarkHolder.setOnLongClickListener(mLongClickListener);
|
||||||
holder = bookmarkHolder;
|
holder = bookmarkHolder;
|
||||||
break;
|
break;
|
||||||
case TYPE_SECTION:
|
case TYPE_SECTION:
|
||||||
MaterialTextView tv = (MaterialTextView) inflater.inflate(R.layout.item_category_title, parent, false);
|
MaterialTextView tv = (MaterialTextView) inflater.inflate(R.layout.item_category_title, parent, false);
|
||||||
holder = new Holders.SectionViewHolder(tv);
|
holder = new Holders.SectionViewHolder(tv);
|
||||||
break;
|
break;
|
||||||
case TYPE_DESC:
|
case TYPE_DESC:
|
||||||
View desc = inflater.inflate(R.layout.item_category_description, parent, false);
|
View desc = inflater.inflate(R.layout.item_category_description, parent, false);
|
||||||
MaterialTextView moreBtn = desc.findViewById(R.id.more_btn);
|
MaterialTextView moreBtn = desc.findViewById(R.id.more_btn);
|
||||||
MaterialTextView text = desc.findViewById(R.id.text);
|
MaterialTextView text = desc.findViewById(R.id.text);
|
||||||
MaterialTextView title = desc.findViewById(R.id.title);
|
MaterialTextView title = desc.findViewById(R.id.title);
|
||||||
setMoreButtonVisibility(text, moreBtn);
|
setMoreButtonVisibility(text, moreBtn);
|
||||||
holder = new Holders.DescriptionViewHolder(desc, mSectionsDataSource.getCategory());
|
holder = new Holders.DescriptionViewHolder(desc, mSectionsDataSource.getCategory());
|
||||||
text.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn));
|
text.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn));
|
||||||
moreBtn.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn));
|
moreBtn.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn));
|
||||||
title.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn));
|
title.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (holder == null)
|
if (holder == null)
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import app.organicmaps.sdk.bookmarks.data.BookmarkSharingResult;
|
|||||||
import app.organicmaps.sdk.bookmarks.data.CategoryDataSource;
|
import app.organicmaps.sdk.bookmarks.data.CategoryDataSource;
|
||||||
import app.organicmaps.sdk.bookmarks.data.Icon;
|
import app.organicmaps.sdk.bookmarks.data.Icon;
|
||||||
import app.organicmaps.sdk.bookmarks.data.KmlFileType;
|
import app.organicmaps.sdk.bookmarks.data.KmlFileType;
|
||||||
|
import app.organicmaps.sdk.bookmarks.data.PredefinedColors;
|
||||||
import app.organicmaps.sdk.bookmarks.data.SortedBlock;
|
import app.organicmaps.sdk.bookmarks.data.SortedBlock;
|
||||||
import app.organicmaps.sdk.bookmarks.data.Track;
|
import app.organicmaps.sdk.bookmarks.data.Track;
|
||||||
import app.organicmaps.sdk.search.BookmarkSearchListener;
|
import app.organicmaps.sdk.search.BookmarkSearchListener;
|
||||||
@@ -551,12 +552,12 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
|
|||||||
|
|
||||||
switch (adapter.getItemViewType(position))
|
switch (adapter.getItemViewType(position))
|
||||||
{
|
{
|
||||||
case BookmarkListAdapter.TYPE_SECTION, BookmarkListAdapter.TYPE_DESC ->
|
case BookmarkListAdapter.TYPE_SECTION, BookmarkListAdapter.TYPE_DESC ->
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case BookmarkListAdapter.TYPE_BOOKMARK -> onBookmarkClicked(position, intent, adapter);
|
case BookmarkListAdapter.TYPE_BOOKMARK -> onBookmarkClicked(position, intent, adapter);
|
||||||
case BookmarkListAdapter.TYPE_TRACK -> onTrackClicked(position, intent, adapter);
|
case BookmarkListAdapter.TYPE_TRACK -> onTrackClicked(position, intent, adapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||||
@@ -592,7 +593,7 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
|
|||||||
if (mTrack == null)
|
if (mTrack == null)
|
||||||
return;
|
return;
|
||||||
final Bundle args = new Bundle();
|
final Bundle args = new Bundle();
|
||||||
args.putInt(BookmarkColorDialogFragment.ICON_TYPE, Icon.getColorPosition(mTrack.getColor()));
|
args.putInt(BookmarkColorDialogFragment.ICON_COLOR, PredefinedColors.getPredefinedColorIndex(mTrack.getColor()));
|
||||||
final FragmentManager manager = getChildFragmentManager();
|
final FragmentManager manager = getChildFragmentManager();
|
||||||
String className = BookmarkColorDialogFragment.class.getName();
|
String className = BookmarkColorDialogFragment.class.getName();
|
||||||
final FragmentFactory factory = manager.getFragmentFactory();
|
final FragmentFactory factory = manager.getFragmentFactory();
|
||||||
@@ -601,7 +602,7 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
|
|||||||
dialogFragment.setArguments(args);
|
dialogFragment.setArguments(args);
|
||||||
dialogFragment.setOnColorSetListener((colorPos) -> {
|
dialogFragment.setOnColorSetListener((colorPos) -> {
|
||||||
int from = mTrack.getColor();
|
int from = mTrack.getColor();
|
||||||
int to = BookmarkManager.ICONS.get(colorPos).argb();
|
int to = PredefinedColors.getColor(colorPos);
|
||||||
if (from == to)
|
if (from == to)
|
||||||
return;
|
return;
|
||||||
BookmarkManager.INSTANCE.changeTrackColor(mTrack.getTrackId(), to);
|
BookmarkManager.INSTANCE.changeTrackColor(mTrack.getTrackId(), to);
|
||||||
@@ -621,22 +622,22 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
|
|||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case BookmarkListAdapter.TYPE_SECTION:
|
case BookmarkListAdapter.TYPE_SECTION:
|
||||||
case BookmarkListAdapter.TYPE_DESC:
|
case BookmarkListAdapter.TYPE_DESC:
|
||||||
// Do nothing here?
|
// Do nothing here?
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BookmarkListAdapter.TYPE_BOOKMARK:
|
case BookmarkListAdapter.TYPE_BOOKMARK:
|
||||||
final BookmarkInfo bookmark = (BookmarkInfo) adapter.getItem(mSelectedPosition);
|
final BookmarkInfo bookmark = (BookmarkInfo) adapter.getItem(mSelectedPosition);
|
||||||
MenuBottomSheetFragment.newInstance(BOOKMARKS_MENU_ID, bookmark.getName())
|
MenuBottomSheetFragment.newInstance(BOOKMARKS_MENU_ID, bookmark.getName())
|
||||||
.show(getChildFragmentManager(), BOOKMARKS_MENU_ID);
|
.show(getChildFragmentManager(), BOOKMARKS_MENU_ID);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BookmarkListAdapter.TYPE_TRACK:
|
case BookmarkListAdapter.TYPE_TRACK:
|
||||||
final Track track = (Track) adapter.getItem(mSelectedPosition);
|
final Track track = (Track) adapter.getItem(mSelectedPosition);
|
||||||
MenuBottomSheetFragment.newInstance(TRACK_MENU_ID, track.getName())
|
MenuBottomSheetFragment.newInstance(TRACK_MENU_ID, track.getName())
|
||||||
.show(getChildFragmentManager(), TRACK_MENU_ID);
|
.show(getChildFragmentManager(), TRACK_MENU_ID);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -843,19 +844,19 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
|
|||||||
{
|
{
|
||||||
switch (id)
|
switch (id)
|
||||||
{
|
{
|
||||||
case BOOKMARKS_MENU_ID ->
|
case BOOKMARKS_MENU_ID ->
|
||||||
{
|
{
|
||||||
return getBookmarkMenuItems();
|
return getBookmarkMenuItems();
|
||||||
}
|
}
|
||||||
case TRACK_MENU_ID ->
|
case TRACK_MENU_ID ->
|
||||||
{
|
{
|
||||||
final Track track = (Track) getBookmarkListAdapter().getItem(mSelectedPosition);
|
final Track track = (Track) getBookmarkListAdapter().getItem(mSelectedPosition);
|
||||||
return getTrackMenuItems(track);
|
return getTrackMenuItems(track);
|
||||||
}
|
}
|
||||||
case OPTIONS_MENU_ID ->
|
case OPTIONS_MENU_ID ->
|
||||||
{
|
{
|
||||||
return getOptionsMenuItems();
|
return getOptionsMenuItems();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,27 +57,27 @@ public enum BookmarksSharingHelper
|
|||||||
|
|
||||||
switch (result.getCode())
|
switch (result.getCode())
|
||||||
{
|
{
|
||||||
case BookmarkSharingResult.SUCCESS ->
|
case BookmarkSharingResult.SUCCESS ->
|
||||||
SharingUtils.shareBookmarkFile(context, launcher, result.getSharingPath(), result.getMimeType());
|
SharingUtils.shareBookmarkFile(context, launcher, result.getSharingPath(), result.getMimeType());
|
||||||
case BookmarkSharingResult.EMPTY_CATEGORY ->
|
case BookmarkSharingResult.EMPTY_CATEGORY ->
|
||||||
new MaterialAlertDialogBuilder(context, R.style.MwmTheme_AlertDialog)
|
new MaterialAlertDialogBuilder(context, R.style.MwmTheme_AlertDialog)
|
||||||
.setTitle(R.string.bookmarks_error_title_share_empty)
|
.setTitle(R.string.bookmarks_error_title_share_empty)
|
||||||
.setMessage(R.string.bookmarks_error_message_share_empty)
|
.setMessage(R.string.bookmarks_error_message_share_empty)
|
||||||
.setPositiveButton(R.string.ok, null)
|
.setPositiveButton(R.string.ok, null)
|
||||||
.show();
|
.show();
|
||||||
case BookmarkSharingResult.ARCHIVE_ERROR, BookmarkSharingResult.FILE_ERROR ->
|
case BookmarkSharingResult.ARCHIVE_ERROR, BookmarkSharingResult.FILE_ERROR ->
|
||||||
{
|
{
|
||||||
new MaterialAlertDialogBuilder(context, R.style.MwmTheme_AlertDialog)
|
new MaterialAlertDialogBuilder(context, R.style.MwmTheme_AlertDialog)
|
||||||
.setTitle(R.string.dialog_routing_system_error)
|
.setTitle(R.string.dialog_routing_system_error)
|
||||||
.setMessage(R.string.bookmarks_error_message_share_general)
|
.setMessage(R.string.bookmarks_error_message_share_general)
|
||||||
.setPositiveButton(R.string.ok, null)
|
.setPositiveButton(R.string.ok, null)
|
||||||
.show();
|
.show();
|
||||||
List<String> names = new ArrayList<>();
|
List<String> names = new ArrayList<>();
|
||||||
for (long categoryId : result.getCategoriesIds())
|
for (long categoryId : result.getCategoriesIds())
|
||||||
names.add(BookmarkManager.INSTANCE.getCategoryById(categoryId).getName());
|
names.add(BookmarkManager.INSTANCE.getCategoryById(categoryId).getName());
|
||||||
Logger.e(TAG, "Failed to share bookmark categories " + names + ", error code: " + result.getCode());
|
Logger.e(TAG, "Failed to share bookmark categories " + names + ", error code: " + result.getCode());
|
||||||
}
|
}
|
||||||
default -> throw new AssertionError("Unsupported bookmark sharing code: " + result.getCode());
|
default -> throw new AssertionError("Unsupported bookmark sharing code: " + result.getCode());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -64,10 +64,10 @@ public class ChooseBookmarksSortingTypeFragment
|
|||||||
{
|
{
|
||||||
switch (sortingType)
|
switch (sortingType)
|
||||||
{
|
{
|
||||||
case BookmarkManager.SORT_BY_TYPE: return R.id.sort_by_type;
|
case BookmarkManager.SORT_BY_TYPE: return R.id.sort_by_type;
|
||||||
case BookmarkManager.SORT_BY_DISTANCE: return R.id.sort_by_distance;
|
case BookmarkManager.SORT_BY_DISTANCE: return R.id.sort_by_distance;
|
||||||
case BookmarkManager.SORT_BY_TIME: return R.id.sort_by_time;
|
case BookmarkManager.SORT_BY_TIME: return R.id.sort_by_time;
|
||||||
case BookmarkManager.SORT_BY_NAME: return R.id.sort_by_name;
|
case BookmarkManager.SORT_BY_NAME: return R.id.sort_by_name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return R.id.sort_by_default;
|
return R.id.sort_by_default;
|
||||||
|
|||||||
@@ -6,19 +6,26 @@ import android.view.LayoutInflater;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ArrayAdapter;
|
import android.widget.ArrayAdapter;
|
||||||
|
import androidx.annotation.DrawableRes;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.sdk.bookmarks.data.Icon;
|
import app.organicmaps.sdk.bookmarks.data.PredefinedColors;
|
||||||
import app.organicmaps.util.Graphics;
|
import app.organicmaps.util.Graphics;
|
||||||
import com.google.android.material.imageview.ShapeableImageView;
|
import com.google.android.material.imageview.ShapeableImageView;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
public class IconsAdapter extends ArrayAdapter<Icon>
|
public class ColorsAdapter extends ArrayAdapter<Integer>
|
||||||
{
|
{
|
||||||
|
@PredefinedColors.Color
|
||||||
private int mCheckedIconColor;
|
private int mCheckedIconColor;
|
||||||
|
|
||||||
public IconsAdapter(Context context, List<Icon> list)
|
@DrawableRes
|
||||||
|
private final int mIconResId;
|
||||||
|
|
||||||
|
public ColorsAdapter(Context context, List<Integer> list, @DrawableRes int iconResId)
|
||||||
{
|
{
|
||||||
super(context, 0, 0, list);
|
super(context, 0, 0, list);
|
||||||
|
mIconResId = iconResId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -35,19 +42,19 @@ public class IconsAdapter extends ArrayAdapter<Icon>
|
|||||||
else
|
else
|
||||||
holder = (SpinnerViewHolder) convertView.getTag();
|
holder = (SpinnerViewHolder) convertView.getTag();
|
||||||
|
|
||||||
final Icon icon = getItem(position);
|
@PredefinedColors.Color
|
||||||
|
final int color = Objects.requireNonNull(getItem(position));
|
||||||
|
|
||||||
Drawable circle;
|
Drawable circle;
|
||||||
if (icon.getColor() == mCheckedIconColor)
|
if (color == mCheckedIconColor)
|
||||||
{
|
{
|
||||||
circle = Graphics.drawCircleAndImage(getItem(position).argb(), R.dimen.track_circle_size,
|
circle = Graphics.drawCircleAndImage(PredefinedColors.getColor(mCheckedIconColor), R.dimen.track_circle_size,
|
||||||
app.organicmaps.sdk.R.drawable.ic_bookmark_none, R.dimen.bookmark_icon_size,
|
mIconResId, R.dimen.bookmark_icon_size, getContext());
|
||||||
getContext());
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
circle =
|
circle = Graphics.drawCircle(PredefinedColors.getColor(color), R.dimen.select_color_circle_size,
|
||||||
Graphics.drawCircle(getItem(position).argb(), R.dimen.select_color_circle_size, getContext().getResources());
|
getContext().getResources());
|
||||||
}
|
}
|
||||||
holder.icon.setImageDrawable(circle);
|
holder.icon.setImageDrawable(circle);
|
||||||
return convertView;
|
return convertView;
|
||||||
@@ -26,7 +26,6 @@ import app.organicmaps.car.util.CurrentCountryChangedListener;
|
|||||||
import app.organicmaps.car.util.IntentUtils;
|
import app.organicmaps.car.util.IntentUtils;
|
||||||
import app.organicmaps.car.util.ThemeUtils;
|
import app.organicmaps.car.util.ThemeUtils;
|
||||||
import app.organicmaps.car.util.UserActionRequired;
|
import app.organicmaps.car.util.UserActionRequired;
|
||||||
import app.organicmaps.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.PlacePageActivationListener;
|
import app.organicmaps.sdk.PlacePageActivationListener;
|
||||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||||
@@ -34,6 +33,7 @@ import app.organicmaps.sdk.display.DisplayChangedListener;
|
|||||||
import app.organicmaps.sdk.display.DisplayManager;
|
import app.organicmaps.sdk.display.DisplayManager;
|
||||||
import app.organicmaps.sdk.display.DisplayType;
|
import app.organicmaps.sdk.display.DisplayType;
|
||||||
import app.organicmaps.sdk.location.LocationState;
|
import app.organicmaps.sdk.location.LocationState;
|
||||||
|
import app.organicmaps.sdk.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import app.organicmaps.sdk.util.LocationUtils;
|
import app.organicmaps.sdk.util.LocationUtils;
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
|
|||||||
@@ -27,7 +27,10 @@ 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;
|
||||||
|
|
||||||
|
@NonNull
|
||||||
private final Map mMap = new Map(Car);
|
private final Map mMap = new Map(Car);
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@@ -56,6 +59,7 @@ public class SurfaceRenderer implements DefaultLifecycleObserver, SurfaceCallbac
|
|||||||
mSurface.release();
|
mSurface.release();
|
||||||
mSurface = surfaceContainer.getSurface();
|
mSurface = surfaceContainer.getSurface();
|
||||||
|
|
||||||
|
mMap.setLocationHelper(MwmApplication.from(mCarContext).getLocationHelper());
|
||||||
mMap.onSurfaceCreated(mCarContext, mSurface,
|
mMap.onSurfaceCreated(mCarContext, mSurface,
|
||||||
new Rect(0, 0, surfaceContainer.getWidth(), surfaceContainer.getHeight()),
|
new Rect(0, 0, surfaceContainer.getWidth(), surfaceContainer.getHeight()),
|
||||||
surfaceContainer.getDpi());
|
surfaceContainer.getDpi());
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -62,29 +62,29 @@ public final class SearchUiHelpers
|
|||||||
CarColor color = Colors.DEFAULT;
|
CarColor color = Colors.DEFAULT;
|
||||||
switch (searchResult.description.openNow)
|
switch (searchResult.description.openNow)
|
||||||
{
|
{
|
||||||
case SearchResult.OPEN_NOW_YES:
|
case SearchResult.OPEN_NOW_YES:
|
||||||
if (searchResult.description.minutesUntilClosed < 60) // less than 1 hour
|
if (searchResult.description.minutesUntilClosed < 60) // less than 1 hour
|
||||||
{
|
{
|
||||||
final String time = searchResult.description.minutesUntilClosed + " " + carContext.getString(R.string.minute);
|
final String time = searchResult.description.minutesUntilClosed + " " + carContext.getString(R.string.minute);
|
||||||
text = carContext.getString(R.string.closes_in, time);
|
text = carContext.getString(R.string.closes_in, time);
|
||||||
color = Colors.OPENING_HOURS_CLOSES_SOON;
|
color = Colors.OPENING_HOURS_CLOSES_SOON;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
text = carContext.getString(R.string.editor_time_open);
|
text = carContext.getString(R.string.editor_time_open);
|
||||||
color = Colors.OPENING_HOURS_OPEN;
|
color = Colors.OPENING_HOURS_OPEN;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SearchResult.OPEN_NOW_NO:
|
case SearchResult.OPEN_NOW_NO:
|
||||||
if (searchResult.description.minutesUntilOpen < 60) // less than 1 hour
|
if (searchResult.description.minutesUntilOpen < 60) // less than 1 hour
|
||||||
{
|
{
|
||||||
final String time = searchResult.description.minutesUntilOpen + " " + carContext.getString(R.string.minute);
|
final String time = searchResult.description.minutesUntilOpen + " " + carContext.getString(R.string.minute);
|
||||||
text = carContext.getString(R.string.opens_in, time);
|
text = carContext.getString(R.string.opens_in, time);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
text = carContext.getString(R.string.closed);
|
text = carContext.getString(R.string.closed);
|
||||||
color = Colors.OPENING_HOURS_CLOSED;
|
color = Colors.OPENING_HOURS_CLOSED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
result.append(text);
|
result.append(text);
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -65,36 +65,36 @@ public final class IntentUtils
|
|||||||
final ScreenManager screenManager = carContext.getCarService(ScreenManager.class);
|
final ScreenManager screenManager = carContext.getCarService(ScreenManager.class);
|
||||||
switch (Framework.nativeParseAndSetApiUrl(uri.toString()))
|
switch (Framework.nativeParseAndSetApiUrl(uri.toString()))
|
||||||
{
|
{
|
||||||
case RequestType.INCORRECT: return;
|
case RequestType.INCORRECT: return;
|
||||||
case RequestType.MAP:
|
case RequestType.MAP:
|
||||||
screenManager.popToRoot();
|
screenManager.popToRoot();
|
||||||
Map.executeMapApiRequest();
|
Map.executeMapApiRequest();
|
||||||
return;
|
return;
|
||||||
case RequestType.SEARCH:
|
case RequestType.SEARCH:
|
||||||
screenManager.popToRoot();
|
screenManager.popToRoot();
|
||||||
final ParsedSearchRequest request = Framework.nativeGetParsedSearchRequest();
|
final ParsedSearchRequest request = Framework.nativeGetParsedSearchRequest();
|
||||||
final double[] latlon = Framework.nativeGetParsedCenterLatLon();
|
final double[] latlon = Framework.nativeGetParsedCenterLatLon();
|
||||||
if (latlon != null)
|
if (latlon != null)
|
||||||
{
|
{
|
||||||
Framework.nativeStopLocationFollow();
|
Framework.nativeStopLocationFollow();
|
||||||
Framework.nativeSetViewportCenter(latlon[0], latlon[1], SEARCH_IN_VIEWPORT_ZOOM);
|
Framework.nativeSetViewportCenter(latlon[0], latlon[1], SEARCH_IN_VIEWPORT_ZOOM);
|
||||||
// We need to update viewport for search api manually because of drape engine
|
// We need to update viewport for search api manually because of drape engine
|
||||||
// will not notify subscribers when search activity is shown.
|
// will not notify subscribers when search activity is shown.
|
||||||
if (!request.mIsSearchOnMap)
|
if (!request.mIsSearchOnMap)
|
||||||
Framework.nativeSetSearchViewport(latlon[0], latlon[1], SEARCH_IN_VIEWPORT_ZOOM);
|
Framework.nativeSetSearchViewport(latlon[0], latlon[1], SEARCH_IN_VIEWPORT_ZOOM);
|
||||||
}
|
}
|
||||||
final SearchScreen.Builder builder = new SearchScreen.Builder(carContext, surfaceRenderer);
|
final SearchScreen.Builder builder = new SearchScreen.Builder(carContext, surfaceRenderer);
|
||||||
builder.setQuery(request.mQuery);
|
builder.setQuery(request.mQuery);
|
||||||
if (request.mLocale != null)
|
if (request.mLocale != null)
|
||||||
builder.setLocale(request.mLocale);
|
builder.setLocale(request.mLocale);
|
||||||
|
|
||||||
screenManager.popToRoot();
|
screenManager.popToRoot();
|
||||||
screenManager.push(builder.build());
|
screenManager.push(builder.build());
|
||||||
return;
|
return;
|
||||||
case RequestType.ROUTE: Logger.e(TAG, "Route API is not supported by Android Auto: " + uri); return;
|
case RequestType.ROUTE: Logger.e(TAG, "Route API is not supported by Android Auto: " + uri); return;
|
||||||
case RequestType.CROSSHAIR: Logger.e(TAG, "Crosshair API is not supported by Android Auto: " + uri); return;
|
case RequestType.CROSSHAIR: Logger.e(TAG, "Crosshair API is not supported by Android Auto: " + uri); return;
|
||||||
case RequestType.MENU: Logger.e(TAG, "Menu API is not supported by Android Auto: " + uri); return;
|
case RequestType.MENU: Logger.e(TAG, "Menu API is not supported by Android Auto: " + uri); return;
|
||||||
case RequestType.SETTINGS: Logger.e(TAG, "Settings API is not supported by Android Auto: " + uri);
|
case RequestType.SETTINGS: Logger.e(TAG, "Settings API is not supported by Android Auto: " + uri);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -171,20 +171,20 @@ public final class UiHelpers
|
|||||||
int drawableRes;
|
int drawableRes;
|
||||||
switch (locationMode)
|
switch (locationMode)
|
||||||
{
|
{
|
||||||
case LocationState.PENDING_POSITION, LocationState.NOT_FOLLOW_NO_POSITION ->
|
case LocationState.PENDING_POSITION, LocationState.NOT_FOLLOW_NO_POSITION ->
|
||||||
drawableRes = R.drawable.ic_location_off;
|
drawableRes = R.drawable.ic_location_off;
|
||||||
case LocationState.NOT_FOLLOW -> drawableRes = R.drawable.ic_not_follow;
|
case LocationState.NOT_FOLLOW -> drawableRes = R.drawable.ic_not_follow;
|
||||||
case LocationState.FOLLOW ->
|
case LocationState.FOLLOW ->
|
||||||
{
|
{
|
||||||
drawableRes = R.drawable.ic_follow;
|
drawableRes = R.drawable.ic_follow;
|
||||||
tintColor = Colors.LOCATION_TINT;
|
tintColor = Colors.LOCATION_TINT;
|
||||||
}
|
}
|
||||||
case LocationState.FOLLOW_AND_ROTATE ->
|
case LocationState.FOLLOW_AND_ROTATE ->
|
||||||
{
|
{
|
||||||
drawableRes = R.drawable.ic_follow_and_rotate;
|
drawableRes = R.drawable.ic_follow_and_rotate;
|
||||||
tintColor = Colors.LOCATION_TINT;
|
tintColor = Colors.LOCATION_TINT;
|
||||||
}
|
}
|
||||||
default -> throw new IllegalArgumentException("Invalid button mode: " + locationMode);
|
default -> throw new IllegalArgumentException("Invalid button mode: " + locationMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
final CarIcon icon =
|
final CarIcon icon =
|
||||||
|
|||||||
@@ -115,15 +115,15 @@ class BottomPanel
|
|||||||
{
|
{
|
||||||
switch (status)
|
switch (status)
|
||||||
{
|
{
|
||||||
case STATUS_UPDATABLE ->
|
case STATUS_UPDATABLE ->
|
||||||
{
|
{
|
||||||
UpdateInfo info = MapManager.nativeGetUpdateInfo(root);
|
UpdateInfo info = MapManager.nativeGetUpdateInfo(root);
|
||||||
setUpdateAllState(info);
|
setUpdateAllState(info);
|
||||||
} // Special case for "Countries" node when no maps currently downloaded.
|
} // Special case for "Countries" node when no maps currently downloaded.
|
||||||
case STATUS_DOWNLOADABLE, STATUS_DONE, STATUS_PARTLY -> show = false;
|
case STATUS_DOWNLOADABLE, STATUS_DONE, STATUS_PARTLY -> show = false;
|
||||||
case STATUS_PROGRESS, STATUS_APPLYING, STATUS_ENQUEUED -> setCancelState();
|
case STATUS_PROGRESS, STATUS_APPLYING, STATUS_ENQUEUED -> setCancelState();
|
||||||
case STATUS_FAILED -> setRetryFailedStates();
|
case STATUS_FAILED -> setRetryFailedStates();
|
||||||
default -> throw new IllegalArgumentException("Inappropriate status for \"" + root + "\": " + status);
|
default -> throw new IllegalArgumentException("Inappropriate status for \"" + root + "\": " + status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -133,15 +133,15 @@ class BottomPanel
|
|||||||
{
|
{
|
||||||
switch (status)
|
switch (status)
|
||||||
{
|
{
|
||||||
case STATUS_UPDATABLE ->
|
case STATUS_UPDATABLE ->
|
||||||
{
|
{
|
||||||
UpdateInfo info = MapManager.nativeGetUpdateInfo(root);
|
UpdateInfo info = MapManager.nativeGetUpdateInfo(root);
|
||||||
setUpdateAllState(info);
|
setUpdateAllState(info);
|
||||||
}
|
}
|
||||||
case STATUS_DONE -> show = false;
|
case STATUS_DONE -> show = false;
|
||||||
case STATUS_PROGRESS, STATUS_APPLYING, STATUS_ENQUEUED -> setCancelState();
|
case STATUS_PROGRESS, STATUS_APPLYING, STATUS_ENQUEUED -> setCancelState();
|
||||||
case STATUS_FAILED -> setRetryFailedStates();
|
case STATUS_FAILED -> setRetryFailedStates();
|
||||||
default -> setDownloadAllState();
|
default -> setDownloadAllState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,9 +70,9 @@ public class CountrySuggestFragment extends BaseMwmFragment implements View.OnCl
|
|||||||
|
|
||||||
switch (item.newStatus)
|
switch (item.newStatus)
|
||||||
{
|
{
|
||||||
case CountryItem.STATUS_FAILED: updateViews(); return;
|
case CountryItem.STATUS_FAILED: updateViews(); return;
|
||||||
|
|
||||||
case CountryItem.STATUS_DONE: exitFragment(); return;
|
case CountryItem.STATUS_DONE: exitFragment(); return;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -287,41 +287,41 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
|||||||
ArrayList<MenuBottomSheetItem> items = new ArrayList<>();
|
ArrayList<MenuBottomSheetItem> items = new ArrayList<>();
|
||||||
switch (mSelectedItem.status)
|
switch (mSelectedItem.status)
|
||||||
{
|
{
|
||||||
case CountryItem.STATUS_DOWNLOADABLE: items.add(getDownloadMenuItem()); break;
|
case CountryItem.STATUS_DOWNLOADABLE: items.add(getDownloadMenuItem()); break;
|
||||||
|
|
||||||
case CountryItem.STATUS_UPDATABLE:
|
case CountryItem.STATUS_UPDATABLE:
|
||||||
items.add(getUpdateMenuItem());
|
items.add(getUpdateMenuItem());
|
||||||
// Fallthrough
|
// Fallthrough
|
||||||
|
|
||||||
case CountryItem.STATUS_DONE:
|
case CountryItem.STATUS_DONE:
|
||||||
if (!mSelectedItem.isExpandable())
|
if (!mSelectedItem.isExpandable())
|
||||||
items.add(getExploreMenuItem());
|
items.add(getExploreMenuItem());
|
||||||
|
appendDeleteMenuItem(items);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CountryItem.STATUS_FAILED:
|
||||||
|
items.add(getCancelMenuItem());
|
||||||
|
|
||||||
|
if (mSelectedItem.present)
|
||||||
|
{
|
||||||
appendDeleteMenuItem(items);
|
appendDeleteMenuItem(items);
|
||||||
break;
|
items.add(getExploreMenuItem());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case CountryItem.STATUS_FAILED:
|
case CountryItem.STATUS_PROGRESS:
|
||||||
items.add(getCancelMenuItem());
|
case CountryItem.STATUS_APPLYING:
|
||||||
|
case CountryItem.STATUS_ENQUEUED:
|
||||||
|
items.add(getCancelMenuItem());
|
||||||
|
|
||||||
if (mSelectedItem.present)
|
if (mSelectedItem.present)
|
||||||
{
|
items.add(getExploreMenuItem());
|
||||||
appendDeleteMenuItem(items);
|
break;
|
||||||
items.add(getExploreMenuItem());
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CountryItem.STATUS_PROGRESS:
|
case CountryItem.STATUS_PARTLY:
|
||||||
case CountryItem.STATUS_APPLYING:
|
items.add(getDownloadMenuItem());
|
||||||
case CountryItem.STATUS_ENQUEUED:
|
appendDeleteMenuItem(items);
|
||||||
items.add(getCancelMenuItem());
|
break;
|
||||||
|
|
||||||
if (mSelectedItem.present)
|
|
||||||
items.add(getExploreMenuItem());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CountryItem.STATUS_PARTLY:
|
|
||||||
items.add(getDownloadMenuItem());
|
|
||||||
appendDeleteMenuItem(items);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
@@ -372,20 +372,20 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
|||||||
{
|
{
|
||||||
switch (mItem.status)
|
switch (mItem.status)
|
||||||
{
|
{
|
||||||
case CountryItem.STATUS_DONE, CountryItem.STATUS_PROGRESS, CountryItem.STATUS_APPLYING,
|
case CountryItem.STATUS_DONE, CountryItem.STATUS_PROGRESS, CountryItem.STATUS_APPLYING,
|
||||||
CountryItem.STATUS_ENQUEUED ->
|
CountryItem.STATUS_ENQUEUED ->
|
||||||
|
processLongClick();
|
||||||
|
case CountryItem.STATUS_DOWNLOADABLE, CountryItem.STATUS_PARTLY ->
|
||||||
|
{
|
||||||
|
if (clickOnStatus)
|
||||||
|
onDownloadActionSelected(mItem, DownloaderAdapter.this);
|
||||||
|
else
|
||||||
processLongClick();
|
processLongClick();
|
||||||
case CountryItem.STATUS_DOWNLOADABLE, CountryItem.STATUS_PARTLY ->
|
}
|
||||||
{
|
case CountryItem.STATUS_FAILED -> MapManager.warn3gAndRetry(mActivity, mItem.id, null);
|
||||||
if (clickOnStatus)
|
case CountryItem.STATUS_UPDATABLE ->
|
||||||
onDownloadActionSelected(mItem, DownloaderAdapter.this);
|
MapManager.warnOn3gUpdate(mActivity, mItem.id, () -> MapManager.startUpdate(mItem.id));
|
||||||
else
|
default -> throw new IllegalArgumentException("Inappropriate item status: " + mItem.status);
|
||||||
processLongClick();
|
|
||||||
}
|
|
||||||
case CountryItem.STATUS_FAILED -> MapManager.warn3gAndRetry(mActivity, mItem.id, null);
|
|
||||||
case CountryItem.STATUS_UPDATABLE ->
|
|
||||||
MapManager.warnOn3gUpdate(mActivity, mItem.id, () -> MapManager.startUpdate(mItem.id));
|
|
||||||
default -> throw new IllegalArgumentException("Inappropriate item status: " + mItem.status);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -535,33 +535,33 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
|||||||
{
|
{
|
||||||
switch (ci.category)
|
switch (ci.category)
|
||||||
{
|
{
|
||||||
case CountryItem.CATEGORY_NEAR_ME ->
|
case CountryItem.CATEGORY_NEAR_ME ->
|
||||||
|
{
|
||||||
|
if (ci.category != prev)
|
||||||
{
|
{
|
||||||
if (ci.category != prev)
|
headerId = CountryItem.CATEGORY_NEAR_ME;
|
||||||
{
|
mItemsAndHeader.add(new GenericItem(mActivity.getString(R.string.downloader_near_me_subtitle)));
|
||||||
headerId = CountryItem.CATEGORY_NEAR_ME;
|
|
||||||
mItemsAndHeader.add(new GenericItem(mActivity.getString(R.string.downloader_near_me_subtitle)));
|
|
||||||
prev = ci.category;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case CountryItem.CATEGORY_DOWNLOADED ->
|
|
||||||
{
|
|
||||||
if (ci.category != prev)
|
|
||||||
{
|
|
||||||
headerId = CountryItem.CATEGORY_DOWNLOADED;
|
|
||||||
mItemsAndHeader.add(new GenericItem(mActivity.getString(R.string.downloader_downloaded_subtitle)));
|
|
||||||
prev = ci.category;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default ->
|
|
||||||
{
|
|
||||||
int prevHeader = headerId;
|
|
||||||
headerId = CountryItem.CATEGORY_AVAILABLE + ci.name.charAt(0);
|
|
||||||
if (headerId != prevHeader)
|
|
||||||
mItemsAndHeader.add(new GenericItem(StringUtils.toUpperCase(ci.name.substring(0, 1))));
|
|
||||||
prev = ci.category;
|
prev = ci.category;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case CountryItem.CATEGORY_DOWNLOADED ->
|
||||||
|
{
|
||||||
|
if (ci.category != prev)
|
||||||
|
{
|
||||||
|
headerId = CountryItem.CATEGORY_DOWNLOADED;
|
||||||
|
mItemsAndHeader.add(new GenericItem(mActivity.getString(R.string.downloader_downloaded_subtitle)));
|
||||||
|
prev = ci.category;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default ->
|
||||||
|
{
|
||||||
|
int prevHeader = headerId;
|
||||||
|
headerId = CountryItem.CATEGORY_AVAILABLE + ci.name.charAt(0);
|
||||||
|
if (headerId != prevHeader)
|
||||||
|
mItemsAndHeader.add(new GenericItem(StringUtils.toUpperCase(ci.name.substring(0, 1))));
|
||||||
|
prev = ci.category;
|
||||||
|
}
|
||||||
|
}
|
||||||
ci.headerId = headerId;
|
ci.headerId = headerId;
|
||||||
}
|
}
|
||||||
mItemsAndHeader.add(new GenericItem(ci));
|
mItemsAndHeader.add(new GenericItem(ci));
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ import app.organicmaps.widget.PlaceholderView;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class DownloaderFragment extends BaseMwmRecyclerFragment<DownloaderAdapter>
|
public class DownloaderFragment
|
||||||
implements MenuBottomSheetFragment.MenuBottomSheetInterface
|
extends BaseMwmRecyclerFragment<DownloaderAdapter> implements MenuBottomSheetFragment.MenuBottomSheetInterface
|
||||||
{
|
{
|
||||||
private DownloaderToolbarController mToolbarController;
|
private DownloaderToolbarController mToolbarController;
|
||||||
|
|
||||||
@@ -153,7 +153,8 @@ public class DownloaderFragment extends BaseMwmRecyclerFragment<DownloaderAdapte
|
|||||||
|
|
||||||
mBottomPanel = new BottomPanel(this, view);
|
mBottomPanel = new BottomPanel(this, view);
|
||||||
mToolbarController = new DownloaderToolbarController(view, requireActivity(), this);
|
mToolbarController = new DownloaderToolbarController(view, requireActivity(), this);
|
||||||
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), mToolbarController.getBackPressedCallback());
|
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(),
|
||||||
|
mToolbarController.getBackPressedCallback());
|
||||||
|
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
@@ -195,7 +196,8 @@ public class DownloaderFragment extends BaseMwmRecyclerFragment<DownloaderAdapte
|
|||||||
{
|
{
|
||||||
if (mAdapter == null)
|
if (mAdapter == null)
|
||||||
mAdapter = new DownloaderAdapter(this);
|
mAdapter = new DownloaderAdapter(this);
|
||||||
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), mAdapter.getBackPressedCallback());
|
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(),
|
||||||
|
mAdapter.getBackPressedCallback());
|
||||||
|
|
||||||
return mAdapter;
|
return mAdapter;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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, androidx.appcompat.R.attr.colorAccent), null,
|
Graphics.tint(requireActivity(), left, com.google.android.material.R.attr.colorSecondary), null,
|
||||||
Graphics.tint(requireActivity(), right, androidx.appcompat.R.attr.colorAccent), null);
|
Graphics.tint(requireActivity(), right, com.google.android.material.R.attr.colorSecondary), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -623,11 +623,11 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
|||||||
|
|
||||||
switch (Editor.nativeGetMapObjectStatus())
|
switch (Editor.nativeGetMapObjectStatus())
|
||||||
{
|
{
|
||||||
case Editor.CREATED -> mReset.setText(R.string.editor_remove_place_button);
|
case Editor.CREATED -> mReset.setText(R.string.editor_remove_place_button);
|
||||||
case Editor.MODIFIED -> mReset.setText(R.string.editor_reset_edits_button);
|
case Editor.MODIFIED -> mReset.setText(R.string.editor_reset_edits_button);
|
||||||
case Editor.UNTOUCHED -> mReset.setText(R.string.editor_place_doesnt_exist);
|
case Editor.UNTOUCHED -> mReset.setText(R.string.editor_place_doesnt_exist);
|
||||||
case Editor.DELETED -> throw new IllegalStateException("Can't delete already deleted feature.");
|
case Editor.DELETED -> throw new IllegalStateException("Can't delete already deleted feature.");
|
||||||
case Editor.OBSOLETE -> throw new IllegalStateException("Obsolete objects cannot be reverted.");
|
case Editor.OBSOLETE -> throw new IllegalStateException("Obsolete objects cannot be reverted.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -641,11 +641,11 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
|||||||
|
|
||||||
switch (Editor.nativeGetMapObjectStatus())
|
switch (Editor.nativeGetMapObjectStatus())
|
||||||
{
|
{
|
||||||
case Editor.CREATED -> rollback(Editor.CREATED);
|
case Editor.CREATED -> rollback(Editor.CREATED);
|
||||||
case Editor.MODIFIED -> rollback(Editor.MODIFIED);
|
case Editor.MODIFIED -> rollback(Editor.MODIFIED);
|
||||||
case Editor.UNTOUCHED -> placeDoesntExist();
|
case Editor.UNTOUCHED -> placeDoesntExist();
|
||||||
case Editor.DELETED -> throw new IllegalStateException("Can't delete already deleted feature.");
|
case Editor.DELETED -> throw new IllegalStateException("Can't delete already deleted feature.");
|
||||||
case Editor.OBSOLETE -> throw new IllegalStateException("Obsolete objects cannot be reverted.");
|
case Editor.OBSOLETE -> throw new IllegalStateException("Obsolete objects cannot be reverted.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -173,8 +173,8 @@ public class EditorHostFragment
|
|||||||
{
|
{
|
||||||
switch (mMode)
|
switch (mMode)
|
||||||
{
|
{
|
||||||
case OPENING_HOURS, STREET, CUISINE, LANGUAGE, PHONE, SELF_SERVICE -> editMapObject();
|
case OPENING_HOURS, STREET, CUISINE, LANGUAGE, PHONE, SELF_SERVICE -> editMapObject();
|
||||||
default -> Utils.navigateToParent(requireActivity());
|
default -> Utils.navigateToParent(requireActivity());
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -283,57 +283,57 @@ public class EditorHostFragment
|
|||||||
{
|
{
|
||||||
switch (mMode)
|
switch (mMode)
|
||||||
{
|
{
|
||||||
case OPENING_HOURS ->
|
case OPENING_HOURS ->
|
||||||
{
|
{
|
||||||
final String timetables = ((TimetableContainerFragment) getChildFragmentManager().findFragmentByTag(
|
final String timetables = ((TimetableContainerFragment) getChildFragmentManager().findFragmentByTag(
|
||||||
TimetableContainerFragment.class.getName()))
|
TimetableContainerFragment.class.getName()))
|
||||||
.getTimetable();
|
.getTimetable();
|
||||||
Editor.nativeSetOpeningHours(timetables);
|
Editor.nativeSetOpeningHours(timetables);
|
||||||
editMapObject();
|
editMapObject();
|
||||||
}
|
}
|
||||||
case STREET ->
|
case STREET ->
|
||||||
setStreet(((StreetFragment) getChildFragmentManager().findFragmentByTag(StreetFragment.class.getName()))
|
setStreet(
|
||||||
.getStreet());
|
((StreetFragment) getChildFragmentManager().findFragmentByTag(StreetFragment.class.getName())).getStreet());
|
||||||
case CUISINE ->
|
case CUISINE ->
|
||||||
{
|
{
|
||||||
String[] cuisines =
|
String[] cuisines =
|
||||||
((CuisineFragment) getChildFragmentManager().findFragmentByTag(CuisineFragment.class.getName()))
|
((CuisineFragment) getChildFragmentManager().findFragmentByTag(CuisineFragment.class.getName()))
|
||||||
.getCuisines();
|
.getCuisines();
|
||||||
Editor.nativeSetSelectedCuisines(cuisines);
|
Editor.nativeSetSelectedCuisines(cuisines);
|
||||||
editMapObject();
|
editMapObject();
|
||||||
}
|
}
|
||||||
case SELF_SERVICE ->
|
case SELF_SERVICE ->
|
||||||
setSelection(
|
setSelection(
|
||||||
Metadata.MetadataType.FMD_SELF_SERVICE,
|
Metadata.MetadataType.FMD_SELF_SERVICE,
|
||||||
((SelfServiceFragment) getChildFragmentManager().findFragmentByTag(SelfServiceFragment.class.getName()))
|
((SelfServiceFragment) getChildFragmentManager().findFragmentByTag(SelfServiceFragment.class.getName()))
|
||||||
.getSelection());
|
.getSelection());
|
||||||
case LANGUAGE -> editMapObject();
|
case LANGUAGE -> editMapObject();
|
||||||
case MAP_OBJECT ->
|
case MAP_OBJECT ->
|
||||||
{
|
{
|
||||||
if (!setEdits())
|
if (!setEdits())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Save object edits
|
// Save object edits
|
||||||
if (!MwmApplication.prefs(requireContext()).contains(NOOB_ALERT_SHOWN))
|
if (!MwmApplication.prefs(requireContext()).contains(NOOB_ALERT_SHOWN))
|
||||||
{
|
|
||||||
showNoobDialog();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
saveNote();
|
|
||||||
saveMapObjectEdits();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case PHONE ->
|
|
||||||
{
|
{
|
||||||
final String phone =
|
showNoobDialog();
|
||||||
((PhoneFragment) getChildFragmentManager().findFragmentByTag(PhoneFragment.class.getName())).getPhone();
|
|
||||||
if (Editor.nativeIsPhoneValid(phone))
|
|
||||||
{
|
|
||||||
Editor.nativeSetPhone(phone);
|
|
||||||
editMapObject();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
saveNote();
|
||||||
|
saveMapObjectEdits();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case PHONE ->
|
||||||
|
{
|
||||||
|
final String phone =
|
||||||
|
((PhoneFragment) getChildFragmentManager().findFragmentByTag(PhoneFragment.class.getName())).getPhone();
|
||||||
|
if (Editor.nativeIsPhoneValid(phone))
|
||||||
|
{
|
||||||
|
Editor.nativeSetPhone(phone);
|
||||||
|
editMapObject();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,9 @@ import androidx.annotation.Nullable;
|
|||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.sdk.editor.data.FeatureCategory;
|
import app.organicmaps.sdk.editor.data.FeatureCategory;
|
||||||
|
import app.organicmaps.sdk.util.StringUtils;
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
|
import com.google.android.material.textfield.TextInputEditText;
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
|
|
||||||
public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
@@ -21,6 +23,12 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
|||||||
private final FeatureCategoryFragment mFragment;
|
private final FeatureCategoryFragment mFragment;
|
||||||
private final FeatureCategory mSelectedCategory;
|
private final FeatureCategory mSelectedCategory;
|
||||||
|
|
||||||
|
public interface FooterListener
|
||||||
|
{
|
||||||
|
void onNoteTextChanged(String newText);
|
||||||
|
void onSendNoteClicked();
|
||||||
|
}
|
||||||
|
|
||||||
public FeatureCategoryAdapter(@NonNull FeatureCategoryFragment host, @NonNull FeatureCategory[] categories,
|
public FeatureCategoryAdapter(@NonNull FeatureCategoryFragment host, @NonNull FeatureCategory[] categories,
|
||||||
@Nullable FeatureCategory category)
|
@Nullable FeatureCategory category)
|
||||||
{
|
{
|
||||||
@@ -47,19 +55,23 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
|||||||
@Override
|
@Override
|
||||||
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
|
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
|
||||||
{
|
{
|
||||||
|
final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
|
||||||
|
|
||||||
switch (viewType)
|
switch (viewType)
|
||||||
{
|
{
|
||||||
case TYPE_CATEGORY ->
|
case TYPE_CATEGORY ->
|
||||||
{
|
{
|
||||||
return new FeatureViewHolder(
|
return new FeatureViewHolder(inflater.inflate(R.layout.item_feature_category, parent, false));
|
||||||
LayoutInflater.from(parent.getContext()).inflate(R.layout.item_feature_category, parent, false));
|
}
|
||||||
}
|
case TYPE_FOOTER ->
|
||||||
case TYPE_FOOTER ->
|
{
|
||||||
{
|
return new FooterViewHolder(inflater.inflate(R.layout.item_feature_category_footer, parent, false),
|
||||||
return new FooterViewHolder(
|
(FooterListener) mFragment);
|
||||||
LayoutInflater.from(parent.getContext()).inflate(R.layout.item_feature_category_footer, parent, false));
|
}
|
||||||
}
|
default ->
|
||||||
default -> throw new IllegalArgumentException("Unsupported");
|
{
|
||||||
|
throw new IllegalArgumentException("Unsupported viewType: " + viewType);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,6 +82,10 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
|||||||
{
|
{
|
||||||
((FeatureViewHolder) holder).bind(position);
|
((FeatureViewHolder) holder).bind(position);
|
||||||
}
|
}
|
||||||
|
else if (holder instanceof FooterViewHolder)
|
||||||
|
{
|
||||||
|
((FooterViewHolder) holder).bind(mFragment.getPendingNoteText());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -105,11 +121,36 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
|||||||
|
|
||||||
protected static class FooterViewHolder extends RecyclerView.ViewHolder
|
protected static class FooterViewHolder extends RecyclerView.ViewHolder
|
||||||
{
|
{
|
||||||
FooterViewHolder(@NonNull View itemView)
|
private final TextInputEditText mNoteEditText;
|
||||||
|
private final View mSendNoteButton;
|
||||||
|
|
||||||
|
FooterViewHolder(@NonNull View itemView, @NonNull FooterListener listener)
|
||||||
{
|
{
|
||||||
super(itemView);
|
super(itemView);
|
||||||
MaterialTextView categoryUnsuitableText = itemView.findViewById(R.id.editor_category_unsuitable_text);
|
MaterialTextView categoryUnsuitableText = itemView.findViewById(R.id.editor_category_unsuitable_text);
|
||||||
categoryUnsuitableText.setMovementMethod(LinkMovementMethod.getInstance());
|
categoryUnsuitableText.setMovementMethod(LinkMovementMethod.getInstance());
|
||||||
|
mNoteEditText = itemView.findViewById(R.id.note_edit_text);
|
||||||
|
mSendNoteButton = itemView.findViewById(R.id.send_note_button);
|
||||||
|
mSendNoteButton.setOnClickListener(v -> listener.onSendNoteClicked());
|
||||||
|
mNoteEditText.addTextChangedListener(new StringUtils.SimpleTextWatcher() {
|
||||||
|
@Override
|
||||||
|
public void onTextChanged(CharSequence s, int start, int before, int count)
|
||||||
|
{
|
||||||
|
final String str = s.toString();
|
||||||
|
listener.onNoteTextChanged(str);
|
||||||
|
mSendNoteButton.setEnabled(!str.trim().isEmpty());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
public void bind(String pendingNoteText)
|
||||||
|
{
|
||||||
|
if (!mNoteEditText.getText().toString().equals(pendingNoteText))
|
||||||
|
{
|
||||||
|
mNoteEditText.setText(pendingNoteText);
|
||||||
|
if (pendingNoteText != null)
|
||||||
|
mNoteEditText.setSelection(pendingNoteText.length());
|
||||||
|
}
|
||||||
|
mSendNoteButton.setEnabled(pendingNoteText != null && !pendingNoteText.trim().isEmpty());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,28 +2,39 @@ package app.organicmaps.editor;
|
|||||||
|
|
||||||
import static app.organicmaps.sdk.util.Utils.getLocalizedFeatureType;
|
import static app.organicmaps.sdk.util.Utils.getLocalizedFeatureType;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.Toast;
|
||||||
import androidx.annotation.CallSuper;
|
import androidx.annotation.CallSuper;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
import app.organicmaps.MwmApplication;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.base.BaseMwmRecyclerFragment;
|
import app.organicmaps.base.BaseMwmRecyclerFragment;
|
||||||
|
import app.organicmaps.dialog.EditTextDialogFragment;
|
||||||
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.editor.Editor;
|
import app.organicmaps.sdk.editor.Editor;
|
||||||
|
import app.organicmaps.sdk.editor.OsmOAuth;
|
||||||
import app.organicmaps.sdk.editor.data.FeatureCategory;
|
import app.organicmaps.sdk.editor.data.FeatureCategory;
|
||||||
import app.organicmaps.sdk.util.Language;
|
import app.organicmaps.sdk.util.Language;
|
||||||
import app.organicmaps.util.Utils;
|
import app.organicmaps.util.Utils;
|
||||||
import app.organicmaps.widget.SearchToolbarController;
|
import app.organicmaps.widget.SearchToolbarController;
|
||||||
import app.organicmaps.widget.ToolbarController;
|
import app.organicmaps.widget.ToolbarController;
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
|
||||||
public class FeatureCategoryFragment extends BaseMwmRecyclerFragment<FeatureCategoryAdapter>
|
public class FeatureCategoryFragment
|
||||||
|
extends BaseMwmRecyclerFragment<FeatureCategoryAdapter> implements FeatureCategoryAdapter.FooterListener
|
||||||
{
|
{
|
||||||
private FeatureCategory mSelectedCategory;
|
private FeatureCategory mSelectedCategory;
|
||||||
protected ToolbarController mToolbarController;
|
protected ToolbarController mToolbarController;
|
||||||
|
private static final String NOTE_CONFIRMATION_SHOWN = "NoteConfirmationAlertWasShown";
|
||||||
|
private static String mPendingNoteText = "";
|
||||||
|
|
||||||
public interface FeatureCategoryListener
|
public interface FeatureCategoryListener
|
||||||
{
|
{
|
||||||
@@ -104,4 +115,71 @@ public class FeatureCategoryFragment extends BaseMwmRecyclerFragment<FeatureCate
|
|||||||
else if (getParentFragment() instanceof FeatureCategoryListener)
|
else if (getParentFragment() instanceof FeatureCategoryListener)
|
||||||
((FeatureCategoryListener) getParentFragment()).onFeatureCategorySelected(category);
|
((FeatureCategoryListener) getParentFragment()).onFeatureCategorySelected(category);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getPendingNoteText()
|
||||||
|
{
|
||||||
|
return mPendingNoteText;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onNoteTextChanged(String newText)
|
||||||
|
{
|
||||||
|
mPendingNoteText = newText;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSendNoteClicked()
|
||||||
|
{
|
||||||
|
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();
|
||||||
|
|
||||||
|
if (!OsmOAuth.isAuthorized())
|
||||||
|
{
|
||||||
|
final Intent intent = new Intent(requireActivity(), OsmLoginActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
|
||||||
|
if (!OsmOAuth.isAuthorized())
|
||||||
|
{
|
||||||
|
final Intent intent = new Intent(requireActivity(), OsmLoginActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
}
|
||||||
|
|
||||||
|
requireActivity().finish();
|
||||||
|
})
|
||||||
|
.setNegativeButton(R.string.cancel, null)
|
||||||
|
.show();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ public class HoursMinutesPickerFragment extends BaseMwmDialogFragment
|
|||||||
tabView.setText(getResources().getString(R.string.editor_time_to));
|
tabView.setText(getResources().getString(R.string.editor_time_to));
|
||||||
tabView.setTextColor(textColor);
|
tabView.setTextColor(textColor);
|
||||||
mTabs.addTab(mTabs.newTab().setCustomView(tabView), true);
|
mTabs.addTab(mTabs.newTab().setCustomView(tabView), true);
|
||||||
mTabs.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
|
mTabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onTabSelected(TabLayout.Tab tab)
|
public void onTabSelected(TabLayout.Tab tab)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -162,8 +162,8 @@ public class TimetableContainerFragment extends BaseMwmFragment implements Timet
|
|||||||
|
|
||||||
switch (mMode)
|
switch (mMode)
|
||||||
{
|
{
|
||||||
case SIMPLE -> setMode(Mode.ADVANCED, filledTimetables);
|
case SIMPLE -> setMode(Mode.ADVANCED, filledTimetables);
|
||||||
case ADVANCED -> setMode(Mode.SIMPLE, filledTimetables);
|
case ADVANCED -> setMode(Mode.SIMPLE, filledTimetables);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,8 +42,8 @@ public class FaqFragment extends BaseMwmFragment
|
|||||||
{
|
{
|
||||||
switch (which)
|
switch (which)
|
||||||
{
|
{
|
||||||
case 0 -> sendGeneralFeedback();
|
case 0 -> sendGeneralFeedback();
|
||||||
case 1 -> reportBug();
|
case 1 -> reportBug();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import androidx.core.content.IntentCompat;
|
|||||||
import app.organicmaps.MwmActivity;
|
import app.organicmaps.MwmActivity;
|
||||||
import app.organicmaps.MwmApplication;
|
import app.organicmaps.MwmApplication;
|
||||||
import app.organicmaps.editor.OsmLoginActivity;
|
import app.organicmaps.editor.OsmLoginActivity;
|
||||||
import app.organicmaps.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.Map;
|
import app.organicmaps.sdk.Map;
|
||||||
import app.organicmaps.sdk.api.ParsedRoutingData;
|
import app.organicmaps.sdk.api.ParsedRoutingData;
|
||||||
@@ -20,6 +19,7 @@ import app.organicmaps.sdk.api.RoutePoint;
|
|||||||
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
||||||
import app.organicmaps.sdk.bookmarks.data.FeatureId;
|
import app.organicmaps.sdk.bookmarks.data.FeatureId;
|
||||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||||
|
import app.organicmaps.sdk.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.search.SearchEngine;
|
import app.organicmaps.sdk.search.SearchEngine;
|
||||||
import app.organicmaps.sdk.util.StorageUtils;
|
import app.organicmaps.sdk.util.StorageUtils;
|
||||||
import app.organicmaps.sdk.util.concurrency.ThreadPool;
|
import app.organicmaps.sdk.util.concurrency.ThreadPool;
|
||||||
@@ -78,67 +78,67 @@ public class Factory
|
|||||||
|
|
||||||
switch (Framework.nativeParseAndSetApiUrl(uri.toString()))
|
switch (Framework.nativeParseAndSetApiUrl(uri.toString()))
|
||||||
{
|
{
|
||||||
case RequestType.INCORRECT: return false;
|
case RequestType.INCORRECT: return false;
|
||||||
|
|
||||||
case RequestType.MAP:
|
case RequestType.MAP:
|
||||||
SearchEngine.INSTANCE.cancelInteractiveSearch();
|
SearchEngine.INSTANCE.cancelInteractiveSearch();
|
||||||
Map.executeMapApiRequest();
|
Map.executeMapApiRequest();
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case RequestType.ROUTE:
|
case RequestType.ROUTE:
|
||||||
SearchEngine.INSTANCE.cancelInteractiveSearch();
|
SearchEngine.INSTANCE.cancelInteractiveSearch();
|
||||||
final ParsedRoutingData data = Framework.nativeGetParsedRoutingData();
|
final ParsedRoutingData data = Framework.nativeGetParsedRoutingData();
|
||||||
RoutingController.get().setRouterType(data.mRouterType);
|
RoutingController.get().setRouterType(data.mRouterType);
|
||||||
final RoutePoint from = data.mPoints[0];
|
final RoutePoint from = data.mPoints[0];
|
||||||
final RoutePoint to = data.mPoints[1];
|
final RoutePoint to = data.mPoints[1];
|
||||||
RoutingController.get().prepare(
|
RoutingController.get().prepare(
|
||||||
MapObject.createMapObject(FeatureId.EMPTY, MapObject.API_POINT, from.mName, "", from.mLat, from.mLon),
|
MapObject.createMapObject(FeatureId.EMPTY, MapObject.API_POINT, from.mName, "", from.mLat, from.mLon),
|
||||||
MapObject.createMapObject(FeatureId.EMPTY, MapObject.API_POINT, to.mName, "", to.mLat, to.mLon));
|
MapObject.createMapObject(FeatureId.EMPTY, MapObject.API_POINT, to.mName, "", to.mLat, to.mLon));
|
||||||
return true;
|
return true;
|
||||||
case RequestType.SEARCH:
|
case RequestType.SEARCH:
|
||||||
|
{
|
||||||
|
SearchEngine.INSTANCE.cancelInteractiveSearch();
|
||||||
|
final ParsedSearchRequest request = Framework.nativeGetParsedSearchRequest();
|
||||||
|
final double[] latlon = Framework.nativeGetParsedCenterLatLon();
|
||||||
|
if (latlon != null)
|
||||||
{
|
{
|
||||||
SearchEngine.INSTANCE.cancelInteractiveSearch();
|
Framework.nativeStopLocationFollow();
|
||||||
final ParsedSearchRequest request = Framework.nativeGetParsedSearchRequest();
|
Framework.nativeSetViewportCenter(latlon[0], latlon[1], SEARCH_IN_VIEWPORT_ZOOM);
|
||||||
final double[] latlon = Framework.nativeGetParsedCenterLatLon();
|
// We need to update viewport for search api manually because of drape engine
|
||||||
if (latlon != null)
|
// will not notify subscribers when search activity is shown.
|
||||||
{
|
if (!request.mIsSearchOnMap)
|
||||||
Framework.nativeStopLocationFollow();
|
Framework.nativeSetSearchViewport(latlon[0], latlon[1], SEARCH_IN_VIEWPORT_ZOOM);
|
||||||
Framework.nativeSetViewportCenter(latlon[0], latlon[1], SEARCH_IN_VIEWPORT_ZOOM);
|
|
||||||
// We need to update viewport for search api manually because of drape engine
|
|
||||||
// will not notify subscribers when search activity is shown.
|
|
||||||
if (!request.mIsSearchOnMap)
|
|
||||||
Framework.nativeSetSearchViewport(latlon[0], latlon[1], SEARCH_IN_VIEWPORT_ZOOM);
|
|
||||||
}
|
|
||||||
SearchActivity.start(target, request.mQuery, request.mLocale, request.mIsSearchOnMap);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
case RequestType.CROSSHAIR:
|
SearchActivity.start(target, request.mQuery, request.mLocale, request.mIsSearchOnMap);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
case RequestType.CROSSHAIR:
|
||||||
|
{
|
||||||
|
SearchEngine.INSTANCE.cancelInteractiveSearch();
|
||||||
|
target.showPositionChooserForAPI(Framework.nativeGetParsedAppName());
|
||||||
|
|
||||||
|
final double[] latlon = Framework.nativeGetParsedCenterLatLon();
|
||||||
|
if (latlon != null)
|
||||||
{
|
{
|
||||||
SearchEngine.INSTANCE.cancelInteractiveSearch();
|
Framework.nativeStopLocationFollow();
|
||||||
target.showPositionChooserForAPI(Framework.nativeGetParsedAppName());
|
Framework.nativeSetViewportCenter(latlon[0], latlon[1], SEARCH_IN_VIEWPORT_ZOOM);
|
||||||
|
|
||||||
final double[] latlon = Framework.nativeGetParsedCenterLatLon();
|
|
||||||
if (latlon != null)
|
|
||||||
{
|
|
||||||
Framework.nativeStopLocationFollow();
|
|
||||||
Framework.nativeSetViewportCenter(latlon[0], latlon[1], SEARCH_IN_VIEWPORT_ZOOM);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
case RequestType.OAUTH2:
|
|
||||||
{
|
|
||||||
SearchEngine.INSTANCE.cancelInteractiveSearch();
|
|
||||||
|
|
||||||
final String oauth2code = Framework.nativeGetParsedOAuth2Code();
|
|
||||||
OsmLoginActivity.OAuth2Callback(target, oauth2code);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Menu and Settings url types should be implemented to support deeplinking.
|
return true;
|
||||||
case RequestType.MENU:
|
}
|
||||||
case RequestType.SETTINGS:
|
case RequestType.OAUTH2:
|
||||||
|
{
|
||||||
|
SearchEngine.INSTANCE.cancelInteractiveSearch();
|
||||||
|
|
||||||
|
final String oauth2code = Framework.nativeGetParsedOAuth2Code();
|
||||||
|
OsmLoginActivity.OAuth2Callback(target, oauth2code);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Menu and Settings url types should be implemented to support deeplinking.
|
||||||
|
case RequestType.MENU:
|
||||||
|
case RequestType.SETTINGS:
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -42,26 +42,26 @@ public class LayerBottomSheetItem
|
|||||||
int buttonTextResource = R.string.layers_title;
|
int buttonTextResource = R.string.layers_title;
|
||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
case OUTDOORS:
|
case OUTDOORS:
|
||||||
disabledResource = R.attr.outdoorsMenuDisabled;
|
disabledResource = R.attr.outdoorsMenuDisabled;
|
||||||
enabledResource = R.attr.outdoorsMenuEnabled;
|
enabledResource = R.attr.outdoorsMenuEnabled;
|
||||||
buttonTextResource = R.string.button_layer_outdoor;
|
buttonTextResource = R.string.button_layer_outdoor;
|
||||||
break;
|
break;
|
||||||
case SUBWAY:
|
case SUBWAY:
|
||||||
disabledResource = R.attr.subwayMenuDisabled;
|
disabledResource = R.attr.subwayMenuDisabled;
|
||||||
enabledResource = R.attr.subwayMenuEnabled;
|
enabledResource = R.attr.subwayMenuEnabled;
|
||||||
buttonTextResource = R.string.subway;
|
buttonTextResource = R.string.subway;
|
||||||
break;
|
break;
|
||||||
case ISOLINES:
|
case ISOLINES:
|
||||||
disabledResource = R.attr.isoLinesMenuDisabled;
|
disabledResource = R.attr.isoLinesMenuDisabled;
|
||||||
enabledResource = R.attr.isoLinesMenuEnabled;
|
enabledResource = R.attr.isoLinesMenuEnabled;
|
||||||
buttonTextResource = R.string.button_layer_isolines;
|
buttonTextResource = R.string.button_layer_isolines;
|
||||||
break;
|
break;
|
||||||
case TRAFFIC:
|
case TRAFFIC:
|
||||||
disabledResource = R.attr.trafficMenuDisabled;
|
disabledResource = R.attr.trafficMenuDisabled;
|
||||||
enabledResource = R.attr.trafficMenuEnabled;
|
enabledResource = R.attr.trafficMenuEnabled;
|
||||||
buttonTextResource = R.string.button_layer_traffic;
|
buttonTextResource = R.string.button_layer_traffic;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
int disabled = ThemeUtils.getResource(mContext, disabledResource);
|
int disabled = ThemeUtils.getResource(mContext, disabledResource);
|
||||||
int enabled = ThemeUtils.getResource(mContext, enabledResource);
|
int enabled = ThemeUtils.getResource(mContext, enabledResource);
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ public class LayersButton extends FloatingActionButton
|
|||||||
{
|
{
|
||||||
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
|
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
|
||||||
if (mAreLayersActive)
|
if (mAreLayersActive)
|
||||||
mergeDrawableStates(drawableState, new int[] {R.attr.layers_enabled});
|
mergeDrawableStates(drawableState, new int[] {R.attr.state_layers_enabled});
|
||||||
return drawableState;
|
return drawableState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import android.view.ViewTreeObserver;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.OptIn;
|
import androidx.annotation.OptIn;
|
||||||
|
import androidx.core.content.ContextCompat;
|
||||||
import androidx.core.view.ViewCompat;
|
import androidx.core.view.ViewCompat;
|
||||||
import androidx.core.view.WindowInsetsCompat;
|
import androidx.core.view.WindowInsetsCompat;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
@@ -26,7 +27,6 @@ import app.organicmaps.MwmActivity;
|
|||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.leftbutton.LeftButton;
|
import app.organicmaps.leftbutton.LeftButton;
|
||||||
import app.organicmaps.leftbutton.LeftToggleButton;
|
import app.organicmaps.leftbutton.LeftToggleButton;
|
||||||
import app.organicmaps.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.downloader.MapManager;
|
import app.organicmaps.sdk.downloader.MapManager;
|
||||||
import app.organicmaps.sdk.downloader.UpdateInfo;
|
import app.organicmaps.sdk.downloader.UpdateInfo;
|
||||||
@@ -34,6 +34,7 @@ import app.organicmaps.sdk.location.TrackRecorder;
|
|||||||
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
||||||
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
||||||
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
|
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
|
||||||
|
import app.organicmaps.sdk.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
import app.organicmaps.util.ThemeUtils;
|
import app.organicmaps.util.ThemeUtils;
|
||||||
@@ -230,21 +231,21 @@ public class MapButtonsController extends Fragment
|
|||||||
return;
|
return;
|
||||||
switch (button)
|
switch (button)
|
||||||
{
|
{
|
||||||
case zoom: UiUtils.showIf(show && Config.showZoomButtons(), buttonView); break;
|
case zoom: UiUtils.showIf(show && Config.showZoomButtons(), buttonView); break;
|
||||||
case toggleMapLayer:
|
case toggleMapLayer:
|
||||||
if (mToggleMapLayerButton != null)
|
if (mToggleMapLayerButton != null)
|
||||||
UiUtils.showIf(show && !isInNavigationMode(), mToggleMapLayerButton);
|
UiUtils.showIf(show && !isInNavigationMode(), mToggleMapLayerButton);
|
||||||
break;
|
break;
|
||||||
case myPosition:
|
case myPosition:
|
||||||
if (mNavMyPosition != null)
|
if (mNavMyPosition != null)
|
||||||
mNavMyPosition.showButton(show);
|
mNavMyPosition.showButton(show);
|
||||||
break;
|
break;
|
||||||
case search: mSearchWheel.show(show);
|
case search: mSearchWheel.show(show);
|
||||||
case bookmarks:
|
case bookmarks:
|
||||||
case menu: UiUtils.showIf(show, buttonView); break;
|
case menu: UiUtils.showIf(show, buttonView); break;
|
||||||
case trackRecordingStatus:
|
case trackRecordingStatus:
|
||||||
UiUtils.showIf(show, buttonView);
|
UiUtils.showIf(show, buttonView);
|
||||||
animateIconBlinking(show, (FloatingActionButton) buttonView);
|
animateIconBlinking(show, (FloatingActionButton) buttonView);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -295,7 +296,7 @@ public class MapButtonsController extends Fragment
|
|||||||
mBadgeDrawable.setMaxCharacterCount(0);
|
mBadgeDrawable.setMaxCharacterCount(0);
|
||||||
mBadgeDrawable.setHorizontalOffset(verticalOffset);
|
mBadgeDrawable.setHorizontalOffset(verticalOffset);
|
||||||
mBadgeDrawable.setVerticalOffset(dpToPx(9, context));
|
mBadgeDrawable.setVerticalOffset(dpToPx(9, context));
|
||||||
mBadgeDrawable.setBackgroundColor(getResources().getColor(R.color.base_accent));
|
mBadgeDrawable.setBackgroundColor(ContextCompat.getColor(context, R.color.base_accent));
|
||||||
mBadgeDrawable.setVisible(enable);
|
mBadgeDrawable.setVisible(enable);
|
||||||
BadgeUtils.attachBadgeDrawable(mBadgeDrawable, menuButton);
|
BadgeUtils.attachBadgeDrawable(mBadgeDrawable, menuButton);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.StringRes;
|
import androidx.annotation.StringRes;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.routing.RoutingController;
|
import app.organicmaps.sdk.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.search.SearchEngine;
|
import app.organicmaps.sdk.search.SearchEngine;
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
import app.organicmaps.sdk.util.concurrency.UiThread;
|
import app.organicmaps.sdk.util.concurrency.UiThread;
|
||||||
@@ -215,7 +215,7 @@ public class SearchWheel implements View.OnClickListener
|
|||||||
final SearchOption searchOption = mMapButtonsViewModel.getSearchOption().getValue();
|
final SearchOption searchOption = mMapButtonsViewModel.getSearchOption().getValue();
|
||||||
mSearchButton.setImageDrawable(Graphics.tint(
|
mSearchButton.setImageDrawable(Graphics.tint(
|
||||||
mSearchButton.getContext(), searchOption == null ? R.drawable.ic_routing_search_off : searchOption.mDrawableOff,
|
mSearchButton.getContext(), searchOption == null ? R.drawable.ic_routing_search_off : searchOption.mDrawableOff,
|
||||||
androidx.appcompat.R.attr.colorAccent));
|
com.google.android.material.R.attr.colorSecondary));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import app.organicmaps.MwmApplication;
|
|||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.sdk.maplayer.Mode;
|
import app.organicmaps.sdk.maplayer.Mode;
|
||||||
import app.organicmaps.sdk.util.SharedPropertiesUtils;
|
import app.organicmaps.sdk.util.SharedPropertiesUtils;
|
||||||
|
import app.organicmaps.util.ThemeSwitcher;
|
||||||
import app.organicmaps.util.Utils;
|
import app.organicmaps.util.Utils;
|
||||||
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
|
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
|
||||||
import app.organicmaps.widget.recycler.SpanningLinearLayoutManager;
|
import app.organicmaps.widget.recycler.SpanningLinearLayoutManager;
|
||||||
@@ -72,6 +73,9 @@ public class ToggleMapLayerFragment extends Fragment
|
|||||||
Context context = v.getContext();
|
Context context = v.getContext();
|
||||||
SharedPropertiesUtils.setLayerMarkerShownForLayerMode(mode);
|
SharedPropertiesUtils.setLayerMarkerShownForLayerMode(mode);
|
||||||
mode.setEnabled(context, !mode.isEnabled(context));
|
mode.setEnabled(context, !mode.isEnabled(context));
|
||||||
|
// TODO: dirty hack :(
|
||||||
|
if (mode == Mode.OUTDOORS)
|
||||||
|
ThemeSwitcher.INSTANCE.restart(true);
|
||||||
mAdapter.notifyDataSetChanged();
|
mAdapter.notifyDataSetChanged();
|
||||||
mMapButtonsController.updateLayerButton();
|
mMapButtonsController.updateLayerButton();
|
||||||
if (MwmApplication.from(context).getIsolinesManager().shouldShowNotification())
|
if (MwmApplication.from(context).getIsolinesManager().shouldShowNotification())
|
||||||
|
|||||||
@@ -11,10 +11,13 @@ import android.widget.ExpandableListAdapter;
|
|||||||
import android.widget.ExpandableListView;
|
import android.widget.ExpandableListView;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
import androidx.core.content.ContextCompat;
|
||||||
|
|
||||||
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;
|
||||||
@@ -121,7 +124,7 @@ abstract class BaseRoutingErrorDialogFragment extends BaseMwmDialogFragment
|
|||||||
}
|
}
|
||||||
|
|
||||||
listView.setAdapter(buildAdapter());
|
listView.setAdapter(buildAdapter());
|
||||||
listView.setChildDivider(new ColorDrawable(getResources().getColor(android.R.color.transparent)));
|
listView.setChildDivider(new ColorDrawable(ContextCompat.getColor(requireContext(), android.R.color.transparent)));
|
||||||
|
|
||||||
UiUtils.waitLayout(listView, () -> {
|
UiUtils.waitLayout(listView, () -> {
|
||||||
final int width = listView.getWidth();
|
final int width = listView.getWidth();
|
||||||
|
|||||||
@@ -11,14 +11,14 @@ import android.view.ViewGroup;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.appcompat.content.res.AppCompatResources;
|
import androidx.appcompat.content.res.AppCompatResources;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import com.google.android.material.imageview.ShapeableImageView;
|
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||||
import app.organicmaps.sdk.routing.RouteMarkData;
|
import app.organicmaps.sdk.routing.RouteMarkData;
|
||||||
import app.organicmaps.sdk.routing.RouteMarkType;
|
import app.organicmaps.sdk.routing.RouteMarkType;
|
||||||
import app.organicmaps.sdk.util.StringUtils;
|
import app.organicmaps.sdk.util.StringUtils;
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
|
import com.google.android.material.imageview.ShapeableImageView;
|
||||||
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -63,26 +63,26 @@ public class ManageRouteAdapter extends RecyclerView.Adapter<ManageRouteAdapter.
|
|||||||
|
|
||||||
switch (mRoutePoints.get(position).mPointType)
|
switch (mRoutePoints.get(position).mPointType)
|
||||||
{
|
{
|
||||||
case Start: // Starting point.
|
case Start: // Starting point.
|
||||||
if (mRoutePoints.get(position).mIsMyPosition)
|
if (mRoutePoints.get(position).mIsMyPosition)
|
||||||
iconId = R.drawable.ic_location_arrow_blue;
|
iconId = R.drawable.ic_location_arrow_blue;
|
||||||
else
|
else
|
||||||
iconId = R.drawable.route_point_start;
|
iconId = R.drawable.route_point_start;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Intermediate: // Intermediate stop.
|
case Intermediate: // Intermediate stop.
|
||||||
TypedArray iconArray = mContext.getResources().obtainTypedArray(R.array.route_stop_icons);
|
TypedArray iconArray = mContext.getResources().obtainTypedArray(R.array.route_stop_icons);
|
||||||
iconId = iconArray.getResourceId(mRoutePoints.get(position).mIntermediateIndex, R.drawable.route_point_20);
|
iconId = iconArray.getResourceId(mRoutePoints.get(position).mIntermediateIndex, R.drawable.route_point_20);
|
||||||
iconArray.recycle();
|
iconArray.recycle();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Finish: // Destination point.
|
case Finish: // Destination point.
|
||||||
iconId = R.drawable.route_point_finish;
|
iconId = R.drawable.route_point_finish;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: // Unknown route type.
|
default: // Unknown route type.
|
||||||
iconId = R.drawable.warning_icon;
|
iconId = R.drawable.warning_icon;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set icon widget.
|
// Set icon widget.
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import app.organicmaps.R;
|
|||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||||
import app.organicmaps.sdk.routing.RouteMarkData;
|
import app.organicmaps.sdk.routing.RouteMarkData;
|
||||||
|
import app.organicmaps.sdk.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
import com.google.android.material.bottomsheet.BottomSheetBehavior;
|
import com.google.android.material.bottomsheet.BottomSheetBehavior;
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialog;
|
import com.google.android.material.bottomsheet.BottomSheetDialog;
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import app.organicmaps.sdk.Framework;
|
|||||||
import app.organicmaps.sdk.Router;
|
import app.organicmaps.sdk.Router;
|
||||||
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
|
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
|
||||||
import app.organicmaps.sdk.routing.CarDirection;
|
import app.organicmaps.sdk.routing.CarDirection;
|
||||||
|
import app.organicmaps.sdk.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||||
import app.organicmaps.sdk.util.StringUtils;
|
import app.organicmaps.sdk.util.StringUtils;
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import app.organicmaps.R;
|
|||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.location.LocationHelper;
|
import app.organicmaps.sdk.location.LocationHelper;
|
||||||
import app.organicmaps.sdk.location.LocationListener;
|
import app.organicmaps.sdk.location.LocationListener;
|
||||||
|
import app.organicmaps.sdk.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||||
import app.organicmaps.sdk.sound.MediaPlayerWrapper;
|
import app.organicmaps.sdk.sound.MediaPlayerWrapper;
|
||||||
import app.organicmaps.sdk.sound.TtsPlayer;
|
import app.organicmaps.sdk.sound.TtsPlayer;
|
||||||
|
|||||||
@@ -23,76 +23,76 @@ public class ResultCodesHelper
|
|||||||
int cancelBtnResId = android.R.string.cancel;
|
int cancelBtnResId = android.R.string.cancel;
|
||||||
switch (errorCode)
|
switch (errorCode)
|
||||||
{
|
{
|
||||||
case ResultCodes.NO_POSITION:
|
case ResultCodes.NO_POSITION:
|
||||||
if (!MwmApplication.from(context).getLocationHelper().isActive())
|
if (!MwmApplication.from(context).getLocationHelper().isActive())
|
||||||
{
|
{
|
||||||
titleRes = R.string.dialog_routing_location_turn_on;
|
titleRes = R.string.dialog_routing_location_turn_on;
|
||||||
messages.add(resources.getString(R.string.dialog_routing_location_unknown_turn_on));
|
messages.add(resources.getString(R.string.dialog_routing_location_unknown_turn_on));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
titleRes = R.string.dialog_routing_check_gps;
|
titleRes = R.string.dialog_routing_check_gps;
|
||||||
messages.add(resources.getString(R.string.dialog_routing_error_location_not_found));
|
messages.add(resources.getString(R.string.dialog_routing_error_location_not_found));
|
||||||
messages.add(resources.getString(R.string.dialog_routing_location_turn_wifi));
|
messages.add(resources.getString(R.string.dialog_routing_location_turn_wifi));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ResultCodes.INCONSISTENT_MWM_ROUTE:
|
case ResultCodes.INCONSISTENT_MWM_ROUTE:
|
||||||
case ResultCodes.ROUTING_FILE_NOT_EXIST:
|
case ResultCodes.ROUTING_FILE_NOT_EXIST:
|
||||||
|
titleRes = R.string.routing_download_maps_along;
|
||||||
|
messages.add(resources.getString(R.string.routing_requires_all_map));
|
||||||
|
break;
|
||||||
|
case ResultCodes.START_POINT_NOT_FOUND:
|
||||||
|
titleRes = R.string.dialog_routing_change_start;
|
||||||
|
messages.add(resources.getString(R.string.dialog_routing_start_not_determined));
|
||||||
|
messages.add(resources.getString(R.string.dialog_routing_select_closer_start));
|
||||||
|
break;
|
||||||
|
case ResultCodes.END_POINT_NOT_FOUND:
|
||||||
|
titleRes = R.string.dialog_routing_change_end;
|
||||||
|
messages.add(resources.getString(R.string.dialog_routing_end_not_determined));
|
||||||
|
messages.add(resources.getString(R.string.dialog_routing_select_closer_end));
|
||||||
|
break;
|
||||||
|
case ResultCodes.INTERMEDIATE_POINT_NOT_FOUND:
|
||||||
|
titleRes = R.string.dialog_routing_change_intermediate;
|
||||||
|
messages.add(resources.getString(R.string.dialog_routing_intermediate_not_determined));
|
||||||
|
break;
|
||||||
|
case ResultCodes.DIFFERENT_MWM:
|
||||||
|
messages.add(resources.getString(R.string.routing_failed_cross_mwm_building));
|
||||||
|
break;
|
||||||
|
case ResultCodes.FILE_TOO_OLD:
|
||||||
|
titleRes = R.string.downloader_update_maps;
|
||||||
|
messages.add(resources.getString(R.string.downloader_mwm_migration_dialog));
|
||||||
|
break;
|
||||||
|
case ResultCodes.TRANSIT_ROUTE_NOT_FOUND_NO_NETWORK:
|
||||||
|
messages.add(resources.getString(R.string.transit_not_found));
|
||||||
|
break;
|
||||||
|
case ResultCodes.TRANSIT_ROUTE_NOT_FOUND_TOO_LONG_PEDESTRIAN:
|
||||||
|
titleRes = R.string.dialog_pedestrian_route_is_long_header;
|
||||||
|
messages.add(resources.getString(R.string.dialog_pedestrian_route_is_long_message));
|
||||||
|
cancelBtnResId = R.string.ok;
|
||||||
|
break;
|
||||||
|
case ResultCodes.ROUTE_NOT_FOUND:
|
||||||
|
case ResultCodes.ROUTE_NOT_FOUND_REDRESS_ROUTE_ERROR:
|
||||||
|
if (missingCount == 0)
|
||||||
|
{
|
||||||
|
titleRes = R.string.dialog_routing_unable_locate_route;
|
||||||
|
messages.add(resources.getString(R.string.dialog_routing_cant_build_route));
|
||||||
|
messages.add(resources.getString(R.string.dialog_routing_change_start_or_end));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
titleRes = R.string.routing_download_maps_along;
|
titleRes = R.string.routing_download_maps_along;
|
||||||
messages.add(resources.getString(R.string.routing_requires_all_map));
|
messages.add(resources.getString(R.string.routing_requires_all_map));
|
||||||
break;
|
}
|
||||||
case ResultCodes.START_POINT_NOT_FOUND:
|
break;
|
||||||
titleRes = R.string.dialog_routing_change_start;
|
case ResultCodes.INTERNAL_ERROR:
|
||||||
messages.add(resources.getString(R.string.dialog_routing_start_not_determined));
|
titleRes = R.string.dialog_routing_system_error;
|
||||||
messages.add(resources.getString(R.string.dialog_routing_select_closer_start));
|
messages.add(resources.getString(R.string.dialog_routing_application_error));
|
||||||
break;
|
messages.add(resources.getString(R.string.dialog_routing_try_again));
|
||||||
case ResultCodes.END_POINT_NOT_FOUND:
|
break;
|
||||||
titleRes = R.string.dialog_routing_change_end;
|
case ResultCodes.NEED_MORE_MAPS:
|
||||||
messages.add(resources.getString(R.string.dialog_routing_end_not_determined));
|
titleRes = R.string.dialog_routing_download_and_build_cross_route;
|
||||||
messages.add(resources.getString(R.string.dialog_routing_select_closer_end));
|
messages.add(resources.getString(R.string.dialog_routing_download_cross_route));
|
||||||
break;
|
break;
|
||||||
case ResultCodes.INTERMEDIATE_POINT_NOT_FOUND:
|
|
||||||
titleRes = R.string.dialog_routing_change_intermediate;
|
|
||||||
messages.add(resources.getString(R.string.dialog_routing_intermediate_not_determined));
|
|
||||||
break;
|
|
||||||
case ResultCodes.DIFFERENT_MWM:
|
|
||||||
messages.add(resources.getString(R.string.routing_failed_cross_mwm_building));
|
|
||||||
break;
|
|
||||||
case ResultCodes.FILE_TOO_OLD:
|
|
||||||
titleRes = R.string.downloader_update_maps;
|
|
||||||
messages.add(resources.getString(R.string.downloader_mwm_migration_dialog));
|
|
||||||
break;
|
|
||||||
case ResultCodes.TRANSIT_ROUTE_NOT_FOUND_NO_NETWORK:
|
|
||||||
messages.add(resources.getString(R.string.transit_not_found));
|
|
||||||
break;
|
|
||||||
case ResultCodes.TRANSIT_ROUTE_NOT_FOUND_TOO_LONG_PEDESTRIAN:
|
|
||||||
titleRes = R.string.dialog_pedestrian_route_is_long_header;
|
|
||||||
messages.add(resources.getString(R.string.dialog_pedestrian_route_is_long_message));
|
|
||||||
cancelBtnResId = R.string.ok;
|
|
||||||
break;
|
|
||||||
case ResultCodes.ROUTE_NOT_FOUND:
|
|
||||||
case ResultCodes.ROUTE_NOT_FOUND_REDRESS_ROUTE_ERROR:
|
|
||||||
if (missingCount == 0)
|
|
||||||
{
|
|
||||||
titleRes = R.string.dialog_routing_unable_locate_route;
|
|
||||||
messages.add(resources.getString(R.string.dialog_routing_cant_build_route));
|
|
||||||
messages.add(resources.getString(R.string.dialog_routing_change_start_or_end));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
titleRes = R.string.routing_download_maps_along;
|
|
||||||
messages.add(resources.getString(R.string.routing_requires_all_map));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ResultCodes.INTERNAL_ERROR:
|
|
||||||
titleRes = R.string.dialog_routing_system_error;
|
|
||||||
messages.add(resources.getString(R.string.dialog_routing_application_error));
|
|
||||||
messages.add(resources.getString(R.string.dialog_routing_try_again));
|
|
||||||
break;
|
|
||||||
case ResultCodes.NEED_MORE_MAPS:
|
|
||||||
titleRes = R.string.dialog_routing_download_and_build_cross_route;
|
|
||||||
messages.add(resources.getString(R.string.dialog_routing_download_cross_route));
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ import app.organicmaps.sdk.Framework;
|
|||||||
import app.organicmaps.sdk.bookmarks.data.DistanceAndAzimut;
|
import app.organicmaps.sdk.bookmarks.data.DistanceAndAzimut;
|
||||||
import app.organicmaps.sdk.routing.RouteMarkData;
|
import app.organicmaps.sdk.routing.RouteMarkData;
|
||||||
import app.organicmaps.sdk.routing.RouteMarkType;
|
import app.organicmaps.sdk.routing.RouteMarkType;
|
||||||
|
import app.organicmaps.sdk.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||||
import app.organicmaps.sdk.routing.TransitRouteInfo;
|
import app.organicmaps.sdk.routing.TransitRouteInfo;
|
||||||
import app.organicmaps.sdk.routing.TransitStepInfo;
|
import app.organicmaps.sdk.routing.TransitStepInfo;
|
||||||
@@ -39,6 +40,7 @@ import app.organicmaps.sdk.util.Distance;
|
|||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
import app.organicmaps.util.Graphics;
|
import app.organicmaps.util.Graphics;
|
||||||
import app.organicmaps.util.ThemeUtils;
|
import app.organicmaps.util.ThemeUtils;
|
||||||
|
import app.organicmaps.util.Utils;
|
||||||
import app.organicmaps.widget.recycler.DotDividerItemDecoration;
|
import app.organicmaps.widget.recycler.DotDividerItemDecoration;
|
||||||
import app.organicmaps.widget.recycler.MultilineLayoutManager;
|
import app.organicmaps.widget.recycler.MultilineLayoutManager;
|
||||||
import com.google.android.material.imageview.ShapeableImageView;
|
import com.google.android.material.imageview.ShapeableImageView;
|
||||||
@@ -117,10 +119,11 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
|||||||
|
|
||||||
private RoutingBottomMenuController(@NonNull Activity context, @NonNull View altitudeChartFrame,
|
private RoutingBottomMenuController(@NonNull Activity context, @NonNull View altitudeChartFrame,
|
||||||
@NonNull View timeElevationLine, @NonNull View transitFrame,
|
@NonNull View timeElevationLine, @NonNull View transitFrame,
|
||||||
@NonNull MaterialTextView error, @NonNull Button start, @NonNull ImageView altitudeChart,
|
@NonNull MaterialTextView error, @NonNull Button start,
|
||||||
@NonNull MaterialTextView time, @NonNull MaterialTextView altitudeDifference,
|
@NonNull ImageView altitudeChart, @NonNull MaterialTextView time,
|
||||||
@NonNull TextView timeVehicle, @Nullable MaterialTextView arrival,
|
@NonNull MaterialTextView altitudeDifference, @NonNull TextView timeVehicle,
|
||||||
@NonNull View actionFrame, @Nullable RoutingBottomMenuListener listener)
|
@Nullable MaterialTextView arrival, @NonNull View actionFrame,
|
||||||
|
@Nullable RoutingBottomMenuListener listener)
|
||||||
{
|
{
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mAltitudeChartFrame = altitudeChartFrame;
|
mAltitudeChartFrame = altitudeChartFrame;
|
||||||
@@ -191,8 +194,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
|||||||
scrollToBottom(rv);
|
scrollToBottom(rv);
|
||||||
|
|
||||||
MaterialTextView totalTimeView = mTransitFrame.findViewById(R.id.total_time);
|
MaterialTextView totalTimeView = mTransitFrame.findViewById(R.id.total_time);
|
||||||
totalTimeView.setText(
|
totalTimeView.setText(Utils.formatRoutingTime(mContext, info.getTotalTime(), R.dimen.text_size_routing_number));
|
||||||
RoutingController.formatRoutingTime(mContext, info.getTotalTime(), R.dimen.text_size_routing_number));
|
|
||||||
View dotView = mTransitFrame.findViewById(R.id.dot);
|
View dotView = mTransitFrame.findViewById(R.id.dot);
|
||||||
View pedestrianIcon = mTransitFrame.findViewById(R.id.pedestrian_icon);
|
View pedestrianIcon = mTransitFrame.findViewById(R.id.pedestrian_icon);
|
||||||
MaterialTextView distanceView = mTransitFrame.findViewById(R.id.total_distance);
|
MaterialTextView distanceView = mTransitFrame.findViewById(R.id.total_distance);
|
||||||
@@ -261,9 +263,9 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
|||||||
{
|
{
|
||||||
UiUtils.show(mActionButton);
|
UiUtils.show(mActionButton);
|
||||||
Drawable icon = ContextCompat.getDrawable(mContext, R.drawable.ic_location_crosshair);
|
Drawable icon = ContextCompat.getDrawable(mContext, R.drawable.ic_location_crosshair);
|
||||||
int colorAccent = ContextCompat.getColor(
|
int colorSecondary = ContextCompat.getColor(
|
||||||
mContext, UiUtils.getStyledResourceId(mContext, androidx.appcompat.R.attr.colorAccent));
|
mContext, UiUtils.getStyledResourceId(mContext, com.google.android.material.R.attr.colorSecondary));
|
||||||
mActionIcon.setImageDrawable(Graphics.tint(icon, colorAccent));
|
mActionIcon.setImageDrawable(Graphics.tint(icon, colorSecondary));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -382,7 +384,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
|||||||
|
|
||||||
if (mArrival != null)
|
if (mArrival != null)
|
||||||
{
|
{
|
||||||
String arrivalTime = RoutingController.formatArrivalTime(rinfo.totalTimeInSeconds);
|
String arrivalTime = Utils.formatArrivalTime(rinfo.totalTimeInSeconds);
|
||||||
mArrival.setText(arrivalTime);
|
mArrival.setText(arrivalTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -400,7 +402,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
|||||||
|
|
||||||
{
|
{
|
||||||
CharSequence time =
|
CharSequence time =
|
||||||
RoutingController.formatRoutingTime(context, routingInfo.totalTimeInSeconds, R.dimen.text_size_routing_number);
|
Utils.formatRoutingTime(context, routingInfo.totalTimeInSeconds, R.dimen.text_size_routing_number);
|
||||||
|
|
||||||
SpannableStringBuilder builder = new SpannableStringBuilder();
|
SpannableStringBuilder builder = new SpannableStringBuilder();
|
||||||
initTimeBuilderSequence(context, time, builder);
|
initTimeBuilderSequence(context, time, builder);
|
||||||
|
|||||||
@@ -13,11 +13,11 @@ import androidx.annotation.Nullable;
|
|||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.fragment.app.FragmentFactory;
|
import androidx.fragment.app.FragmentFactory;
|
||||||
import androidx.fragment.app.FragmentManager;
|
import androidx.fragment.app.FragmentManager;
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.sdk.downloader.CountryItem;
|
import app.organicmaps.sdk.downloader.CountryItem;
|
||||||
import app.organicmaps.sdk.downloader.MapManager;
|
import app.organicmaps.sdk.downloader.MapManager;
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
|
|
||||||
public class RoutingErrorDialogFragment extends BaseRoutingErrorDialogFragment
|
public class RoutingErrorDialogFragment extends BaseRoutingErrorDialogFragment
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import androidx.fragment.app.FragmentFactory;
|
|||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.sdk.downloader.CountryItem;
|
import app.organicmaps.sdk.downloader.CountryItem;
|
||||||
import app.organicmaps.sdk.downloader.MapManager;
|
import app.organicmaps.sdk.downloader.MapManager;
|
||||||
|
import app.organicmaps.sdk.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
import app.organicmaps.widget.WheelProgressView;
|
import app.organicmaps.widget.WheelProgressView;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import app.organicmaps.MwmApplication;
|
|||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.Router;
|
import app.organicmaps.sdk.Router;
|
||||||
|
import app.organicmaps.sdk.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||||
import app.organicmaps.sdk.routing.RoutingOptions;
|
import app.organicmaps.sdk.routing.RoutingOptions;
|
||||||
import app.organicmaps.sdk.routing.TransitRouteInfo;
|
import app.organicmaps.sdk.routing.TransitRouteInfo;
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import app.organicmaps.MwmActivity;
|
|||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.base.BaseMwmFragment;
|
import app.organicmaps.base.BaseMwmFragment;
|
||||||
import app.organicmaps.sdk.Router;
|
import app.organicmaps.sdk.Router;
|
||||||
|
import app.organicmaps.sdk.routing.RoutingController;
|
||||||
|
|
||||||
public class RoutingPlanFragment extends BaseMwmFragment
|
public class RoutingPlanFragment extends BaseMwmFragment
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ import android.content.Context;
|
|||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.Surface;
|
import android.view.Surface;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import app.organicmaps.BuildConfig;
|
import app.organicmaps.BuildConfig;
|
||||||
import app.organicmaps.MwmApplication;
|
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.sdk.display.DisplayType;
|
import app.organicmaps.sdk.display.DisplayType;
|
||||||
import app.organicmaps.sdk.location.LocationHelper;
|
import app.organicmaps.sdk.location.LocationHelper;
|
||||||
@@ -53,8 +53,12 @@ public final class Map
|
|||||||
public static final int INVALID_POINTER_MASK = 0xFF;
|
public static final int INVALID_POINTER_MASK = 0xFF;
|
||||||
public static final int INVALID_TOUCH_ID = -1;
|
public static final int INVALID_TOUCH_ID = -1;
|
||||||
|
|
||||||
|
@NonNull
|
||||||
private final DisplayType mDisplayType;
|
private final DisplayType mDisplayType;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private LocationHelper mLocationHelper;
|
||||||
|
|
||||||
private int mCurrentCompassOffsetX;
|
private int mCurrentCompassOffsetX;
|
||||||
private int mCurrentCompassOffsetY;
|
private int mCurrentCompassOffsetY;
|
||||||
private int mBottomWidgetOffsetX;
|
private int mBottomWidgetOffsetX;
|
||||||
@@ -75,12 +79,17 @@ public final class Map
|
|||||||
|
|
||||||
private static int sCurrentDpi = 0;
|
private static int sCurrentDpi = 0;
|
||||||
|
|
||||||
public Map(DisplayType mapType)
|
public Map(@NonNull DisplayType mapType)
|
||||||
{
|
{
|
||||||
mDisplayType = mapType;
|
mDisplayType = mapType;
|
||||||
onCreate(false);
|
onCreate(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setLocationHelper(@NonNull LocationHelper locationHelper)
|
||||||
|
{
|
||||||
|
mLocationHelper = locationHelper;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Moves the map compass using the given offsets.
|
* Moves the map compass using the given offsets.
|
||||||
*
|
*
|
||||||
@@ -137,6 +146,8 @@ public final class Map
|
|||||||
|
|
||||||
public void onSurfaceCreated(final Context context, final Surface surface, Rect surfaceFrame, int surfaceDpi)
|
public void onSurfaceCreated(final Context context, final Surface surface, Rect surfaceFrame, int surfaceDpi)
|
||||||
{
|
{
|
||||||
|
assert mLocationHelper != null : "LocationHelper must be initialized before calling onSurfaceCreated";
|
||||||
|
|
||||||
if (isThemeChangingProcess(context))
|
if (isThemeChangingProcess(context))
|
||||||
{
|
{
|
||||||
Logger.d(TAG, "Theme changing process, skip 'onSurfaceCreated' callback");
|
Logger.d(TAG, "Theme changing process, skip 'onSurfaceCreated' callback");
|
||||||
@@ -169,9 +180,7 @@ public final class Map
|
|||||||
mRequireResize = false;
|
mRequireResize = false;
|
||||||
setupWidgets(context, surfaceFrame.width(), surfaceFrame.height());
|
setupWidgets(context, surfaceFrame.width(), surfaceFrame.height());
|
||||||
|
|
||||||
final LocationHelper locationHelper = MwmApplication.from(context).getLocationHelper();
|
final boolean firstStart = mLocationHelper.isInFirstRun();
|
||||||
|
|
||||||
final boolean firstStart = locationHelper.isInFirstRun();
|
|
||||||
if (!nativeCreateEngine(surface, surfaceDpi, firstStart, mLaunchByDeepLink, BuildConfig.VERSION_CODE,
|
if (!nativeCreateEngine(surface, surfaceDpi, firstStart, mLaunchByDeepLink, BuildConfig.VERSION_CODE,
|
||||||
ROMUtils.isCustomROM()))
|
ROMUtils.isCustomROM()))
|
||||||
{
|
{
|
||||||
@@ -182,7 +191,7 @@ public final class Map
|
|||||||
sCurrentDpi = surfaceDpi;
|
sCurrentDpi = surfaceDpi;
|
||||||
|
|
||||||
if (firstStart)
|
if (firstStart)
|
||||||
UiThread.runLater(locationHelper::onExitFromFirstRun);
|
UiThread.runLater(mLocationHelper::onExitFromFirstRun);
|
||||||
|
|
||||||
mSurfaceCreated = true;
|
mSurfaceCreated = true;
|
||||||
mSurfaceAttached = true;
|
mSurfaceAttached = true;
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ import androidx.lifecycle.DefaultLifecycleObserver;
|
|||||||
import androidx.lifecycle.LifecycleOwner;
|
import androidx.lifecycle.LifecycleOwner;
|
||||||
import androidx.lifecycle.ProcessLifecycleOwner;
|
import androidx.lifecycle.ProcessLifecycleOwner;
|
||||||
import app.organicmaps.R;
|
import app.organicmaps.R;
|
||||||
import app.organicmaps.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
||||||
|
import app.organicmaps.sdk.bookmarks.data.Icon;
|
||||||
import app.organicmaps.sdk.downloader.Android7RootCertificateWorkaround;
|
import app.organicmaps.sdk.downloader.Android7RootCertificateWorkaround;
|
||||||
import app.organicmaps.sdk.editor.OsmOAuth;
|
import app.organicmaps.sdk.editor.OsmOAuth;
|
||||||
import app.organicmaps.sdk.location.LocationHelper;
|
import app.organicmaps.sdk.location.LocationHelper;
|
||||||
@@ -16,16 +16,16 @@ import app.organicmaps.sdk.location.SensorHelper;
|
|||||||
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
||||||
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
||||||
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
|
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
|
||||||
|
import app.organicmaps.sdk.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.search.SearchEngine;
|
import app.organicmaps.sdk.search.SearchEngine;
|
||||||
|
import app.organicmaps.sdk.settings.StoragePathManager;
|
||||||
import app.organicmaps.sdk.sound.TtsPlayer;
|
import app.organicmaps.sdk.sound.TtsPlayer;
|
||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import app.organicmaps.sdk.util.SharedPropertiesUtils;
|
import app.organicmaps.sdk.util.SharedPropertiesUtils;
|
||||||
import app.organicmaps.sdk.util.StorageUtils;
|
import app.organicmaps.sdk.util.StorageUtils;
|
||||||
import app.organicmaps.sdk.util.ThemeSwitcher;
|
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
import app.organicmaps.sdk.util.log.LogsManager;
|
import app.organicmaps.sdk.util.log.LogsManager;
|
||||||
import app.organicmaps.settings.StoragePathManager;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
public final class OrganicMaps implements DefaultLifecycleObserver
|
public final class OrganicMaps implements DefaultLifecycleObserver
|
||||||
@@ -96,9 +96,11 @@ public final class OrganicMaps implements DefaultLifecycleObserver
|
|||||||
|
|
||||||
Android7RootCertificateWorkaround.initializeIfNeeded(mContext);
|
Android7RootCertificateWorkaround.initializeIfNeeded(mContext);
|
||||||
|
|
||||||
|
Icon.loadDefaultIcons(mContext.getResources(), mContext.getPackageName());
|
||||||
|
|
||||||
mSensorHelper = new SensorHelper(mContext);
|
mSensorHelper = new SensorHelper(mContext);
|
||||||
mLocationHelper = new LocationHelper(mContext, mSensorHelper);
|
mLocationHelper = new LocationHelper(mContext, mSensorHelper);
|
||||||
mIsolinesManager = new IsolinesManager(mContext);
|
mIsolinesManager = new IsolinesManager();
|
||||||
mSubwayManager = new SubwayManager(mContext);
|
mSubwayManager = new SubwayManager(mContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -174,12 +176,10 @@ public final class OrganicMaps implements DefaultLifecycleObserver
|
|||||||
nativeInitFramework(onComplete);
|
nativeInitFramework(onComplete);
|
||||||
|
|
||||||
initNativeStrings();
|
initNativeStrings();
|
||||||
ThemeSwitcher.INSTANCE.initialize(mContext);
|
|
||||||
SearchEngine.INSTANCE.initialize();
|
SearchEngine.INSTANCE.initialize();
|
||||||
BookmarkManager.loadBookmarks();
|
BookmarkManager.loadBookmarks();
|
||||||
TtsPlayer.INSTANCE.initialize(mContext);
|
TtsPlayer.INSTANCE.initialize(mContext);
|
||||||
ThemeSwitcher.INSTANCE.restart(false);
|
RoutingController.get().initialize(mLocationHelper);
|
||||||
RoutingController.get().initialize(mContext);
|
|
||||||
TrafficManager.INSTANCE.initialize();
|
TrafficManager.INSTANCE.initialize();
|
||||||
mSubwayManager.initialize();
|
mSubwayManager.initialize();
|
||||||
mIsolinesManager.initialize();
|
mIsolinesManager.initialize();
|
||||||
|
|||||||
@@ -10,12 +10,12 @@ import java.lang.annotation.RetentionPolicy;
|
|||||||
public @interface RequestType
|
public @interface RequestType
|
||||||
{
|
{
|
||||||
// Represents url_scheme::ParsedMapApi::UrlType from c++ part.
|
// Represents url_scheme::ParsedMapApi::UrlType from c++ part.
|
||||||
public static final int INCORRECT = 0;
|
int INCORRECT = 0;
|
||||||
public static final int MAP = 1;
|
int MAP = 1;
|
||||||
public static final int ROUTE = 2;
|
int ROUTE = 2;
|
||||||
public static final int SEARCH = 3;
|
int SEARCH = 3;
|
||||||
public static final int CROSSHAIR = 4;
|
int CROSSHAIR = 4;
|
||||||
public static final int OAUTH2 = 5;
|
int OAUTH2 = 5;
|
||||||
public static final int MENU = 6;
|
int MENU = 6;
|
||||||
public static final int SETTINGS = 7;
|
int SETTINGS = 7;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,8 +41,6 @@ public enum BookmarkManager {
|
|||||||
// These values have to match the values of kml::CompilationType from kml/types.hpp
|
// These values have to match the values of kml::CompilationType from kml/types.hpp
|
||||||
public static final int CATEGORY = 0;
|
public static final int CATEGORY = 0;
|
||||||
|
|
||||||
public static final List<Icon> ICONS = new ArrayList<>();
|
|
||||||
|
|
||||||
private static final String[] BOOKMARKS_EXTENSIONS = Framework.nativeGetBookmarksFilesExts();
|
private static final String[] BOOKMARKS_EXTENSIONS = Framework.nativeGetBookmarksFilesExts();
|
||||||
|
|
||||||
private static final String TAG = BookmarkManager.class.getSimpleName();
|
private static final String TAG = BookmarkManager.class.getSimpleName();
|
||||||
@@ -70,26 +68,6 @@ public enum BookmarkManager {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private OnElevationActivePointChangedListener mOnElevationActivePointChangedListener;
|
private OnElevationActivePointChangedListener mOnElevationActivePointChangedListener;
|
||||||
|
|
||||||
static
|
|
||||||
{
|
|
||||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_RED, Icon.BOOKMARK_ICON_TYPE_NONE));
|
|
||||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_PINK, Icon.BOOKMARK_ICON_TYPE_NONE));
|
|
||||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_PURPLE, Icon.BOOKMARK_ICON_TYPE_NONE));
|
|
||||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_DEEPPURPLE, Icon.BOOKMARK_ICON_TYPE_NONE));
|
|
||||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_BLUE, Icon.BOOKMARK_ICON_TYPE_NONE));
|
|
||||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_LIGHTBLUE, Icon.BOOKMARK_ICON_TYPE_NONE));
|
|
||||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_CYAN, Icon.BOOKMARK_ICON_TYPE_NONE));
|
|
||||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_TEAL, Icon.BOOKMARK_ICON_TYPE_NONE));
|
|
||||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_GREEN, Icon.BOOKMARK_ICON_TYPE_NONE));
|
|
||||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_LIME, Icon.BOOKMARK_ICON_TYPE_NONE));
|
|
||||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_YELLOW, Icon.BOOKMARK_ICON_TYPE_NONE));
|
|
||||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_ORANGE, Icon.BOOKMARK_ICON_TYPE_NONE));
|
|
||||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_DEEPORANGE, Icon.BOOKMARK_ICON_TYPE_NONE));
|
|
||||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_BROWN, Icon.BOOKMARK_ICON_TYPE_NONE));
|
|
||||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_GRAY, Icon.BOOKMARK_ICON_TYPE_NONE));
|
|
||||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_BLUEGRAY, Icon.BOOKMARK_ICON_TYPE_NONE));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void toggleCategoryVisibility(@NonNull BookmarkCategory category)
|
public void toggleCategoryVisibility(@NonNull BookmarkCategory category)
|
||||||
{
|
{
|
||||||
boolean isVisible = isVisible(category.getId());
|
boolean isVisible = isVisible(category.getId());
|
||||||
@@ -342,7 +320,7 @@ public enum BookmarkManager {
|
|||||||
nativeShowBookmarkCategoryOnMap(catId);
|
nativeShowBookmarkCategoryOnMap(catId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Icon.PredefinedColor
|
@PredefinedColors.Color
|
||||||
public int getLastEditedColor()
|
public int getLastEditedColor()
|
||||||
{
|
{
|
||||||
return nativeGetLastEditedColor();
|
return nativeGetLastEditedColor();
|
||||||
@@ -618,7 +596,7 @@ public enum BookmarkManager {
|
|||||||
return nativeGetBookmarkXY(bookmarkId);
|
return nativeGetBookmarkXY(bookmarkId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Icon.PredefinedColor
|
@PredefinedColors.Color
|
||||||
public int getBookmarkColor(@IntRange(from = 0) long bookmarkId)
|
public int getBookmarkColor(@IntRange(from = 0) long bookmarkId)
|
||||||
{
|
{
|
||||||
return nativeGetBookmarkColor(bookmarkId);
|
return nativeGetBookmarkColor(bookmarkId);
|
||||||
@@ -652,7 +630,7 @@ public enum BookmarkManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setBookmarkParams(@IntRange(from = 0) long bookmarkId, @NonNull String name,
|
public void setBookmarkParams(@IntRange(from = 0) long bookmarkId, @NonNull String name,
|
||||||
@Icon.PredefinedColor int color, @NonNull String descr)
|
@PredefinedColors.Color int color, @NonNull String descr)
|
||||||
{
|
{
|
||||||
nativeSetBookmarkParams(bookmarkId, name, color, descr);
|
nativeSetBookmarkParams(bookmarkId, name, color, descr);
|
||||||
}
|
}
|
||||||
@@ -808,7 +786,7 @@ public enum BookmarkManager {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private native Bookmark nativeAddBookmarkToLastEditedCategory(double lat, double lon);
|
private native Bookmark nativeAddBookmarkToLastEditedCategory(double lat, double lon);
|
||||||
|
|
||||||
@Icon.PredefinedColor
|
@PredefinedColors.Color
|
||||||
private native int nativeGetLastEditedColor();
|
private native int nativeGetLastEditedColor();
|
||||||
|
|
||||||
private static native void nativeLoadBookmarksFile(@NonNull String path, boolean isTemporaryFile);
|
private static native void nativeLoadBookmarksFile(@NonNull String path, boolean isTemporaryFile);
|
||||||
@@ -874,7 +852,7 @@ public enum BookmarkManager {
|
|||||||
@NonNull
|
@NonNull
|
||||||
private static native ParcelablePointD nativeGetBookmarkXY(@IntRange(from = 0) long bookmarkId);
|
private static native ParcelablePointD nativeGetBookmarkXY(@IntRange(from = 0) long bookmarkId);
|
||||||
|
|
||||||
@Icon.PredefinedColor
|
@PredefinedColors.Color
|
||||||
private static native int nativeGetBookmarkColor(@IntRange(from = 0) long bookmarkId);
|
private static native int nativeGetBookmarkColor(@IntRange(from = 0) long bookmarkId);
|
||||||
|
|
||||||
private static native int nativeGetBookmarkIcon(@IntRange(from = 0) long bookmarkId);
|
private static native int nativeGetBookmarkIcon(@IntRange(from = 0) long bookmarkId);
|
||||||
@@ -889,12 +867,13 @@ public enum BookmarkManager {
|
|||||||
private static native String nativeEncode2Ge0Url(@IntRange(from = 0) long bookmarkId, boolean addName);
|
private static native String nativeEncode2Ge0Url(@IntRange(from = 0) long bookmarkId, boolean addName);
|
||||||
|
|
||||||
private static native void nativeSetBookmarkParams(@IntRange(from = 0) long bookmarkId, @NonNull String name,
|
private static native void nativeSetBookmarkParams(@IntRange(from = 0) long bookmarkId, @NonNull String name,
|
||||||
@Icon.PredefinedColor int color, @NonNull String descr);
|
@PredefinedColors.Color int color, @NonNull String descr);
|
||||||
|
|
||||||
private static native void nativeChangeTrackColor(@IntRange(from = 0) long trackId, @Icon.PredefinedColor int color);
|
private static native void nativeChangeTrackColor(@IntRange(from = 0) long trackId,
|
||||||
|
@PredefinedColors.Color int color);
|
||||||
|
|
||||||
private static native void nativeSetTrackParams(@IntRange(from = 0) long trackId, @NonNull String name,
|
private static native void nativeSetTrackParams(@IntRange(from = 0) long trackId, @NonNull String name,
|
||||||
@Icon.PredefinedColor int color, @NonNull String descr);
|
@PredefinedColors.Color int color, @NonNull String descr);
|
||||||
|
|
||||||
private static native void nativeChangeBookmarkCategory(@IntRange(from = 0) long oldCatId,
|
private static native void nativeChangeBookmarkCategory(@IntRange(from = 0) long oldCatId,
|
||||||
@IntRange(from = 0) long newCatId,
|
@IntRange(from = 0) long newCatId,
|
||||||
|
|||||||
@@ -1,108 +1,29 @@
|
|||||||
package app.organicmaps.sdk.bookmarks.data;
|
package app.organicmaps.sdk.bookmarks.data;
|
||||||
|
|
||||||
|
import android.content.res.Resources;
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
|
import androidx.annotation.ColorInt;
|
||||||
import androidx.annotation.DrawableRes;
|
import androidx.annotation.DrawableRes;
|
||||||
import androidx.annotation.IntDef;
|
import androidx.annotation.NonNull;
|
||||||
import app.organicmaps.sdk.R;
|
import app.organicmaps.BuildConfig;
|
||||||
|
import app.organicmaps.sdk.util.StringUtils;
|
||||||
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
import com.google.common.base.Objects;
|
import com.google.common.base.Objects;
|
||||||
import java.lang.annotation.Retention;
|
import dalvik.annotation.optimization.FastNative;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
|
|
||||||
public class Icon implements Parcelable
|
public class Icon implements Parcelable
|
||||||
{
|
{
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
private static final String TAG = Icon.class.getSimpleName();
|
||||||
@IntDef({PREDEFINED_COLOR_NONE, PREDEFINED_COLOR_RED, PREDEFINED_COLOR_BLUE, PREDEFINED_COLOR_PURPLE,
|
|
||||||
PREDEFINED_COLOR_YELLOW, PREDEFINED_COLOR_PINK, PREDEFINED_COLOR_BROWN, PREDEFINED_COLOR_GREEN,
|
|
||||||
PREDEFINED_COLOR_ORANGE, PREDEFINED_COLOR_DEEPPURPLE, PREDEFINED_COLOR_LIGHTBLUE, PREDEFINED_COLOR_CYAN,
|
|
||||||
PREDEFINED_COLOR_TEAL, PREDEFINED_COLOR_LIME, PREDEFINED_COLOR_DEEPORANGE, PREDEFINED_COLOR_GRAY,
|
|
||||||
PREDEFINED_COLOR_BLUEGRAY})
|
|
||||||
@interface PredefinedColor
|
|
||||||
{}
|
|
||||||
|
|
||||||
static final int PREDEFINED_COLOR_NONE = 0;
|
|
||||||
static final int PREDEFINED_COLOR_RED = 1;
|
|
||||||
static final int PREDEFINED_COLOR_BLUE = 2;
|
|
||||||
static final int PREDEFINED_COLOR_PURPLE = 3;
|
|
||||||
static final int PREDEFINED_COLOR_YELLOW = 4;
|
|
||||||
static final int PREDEFINED_COLOR_PINK = 5;
|
|
||||||
static final int PREDEFINED_COLOR_BROWN = 6;
|
|
||||||
static final int PREDEFINED_COLOR_GREEN = 7;
|
|
||||||
static final int PREDEFINED_COLOR_ORANGE = 8;
|
|
||||||
static final int PREDEFINED_COLOR_DEEPPURPLE = 9;
|
|
||||||
static final int PREDEFINED_COLOR_LIGHTBLUE = 10;
|
|
||||||
static final int PREDEFINED_COLOR_CYAN = 11;
|
|
||||||
static final int PREDEFINED_COLOR_TEAL = 12;
|
|
||||||
static final int PREDEFINED_COLOR_LIME = 13;
|
|
||||||
static final int PREDEFINED_COLOR_DEEPORANGE = 14;
|
|
||||||
static final int PREDEFINED_COLOR_GRAY = 15;
|
|
||||||
static final int PREDEFINED_COLOR_BLUEGRAY = 16;
|
|
||||||
|
|
||||||
private static int shift(int v, int bitCount)
|
|
||||||
{
|
|
||||||
return v << bitCount;
|
|
||||||
}
|
|
||||||
private static int toARGB(int r, int g, int b)
|
|
||||||
{
|
|
||||||
return shift(255, 24) + shift(r, 16) + shift(g, 8) + b;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @note Important! Should be synced with kml/types.hpp/PredefinedColor
|
|
||||||
/// @todo Values can be taken from Core.
|
|
||||||
private static final int[] ARGB_COLORS = {toARGB(229, 27, 35), // none
|
|
||||||
toARGB(229, 27, 35), // red
|
|
||||||
toARGB(0, 110, 199), // blue
|
|
||||||
toARGB(156, 39, 176), // purple
|
|
||||||
toARGB(255, 200, 0), // yellow
|
|
||||||
toARGB(255, 65, 130), // pink
|
|
||||||
toARGB(121, 85, 72), // brown
|
|
||||||
toARGB(56, 142, 60), // green
|
|
||||||
toARGB(255, 160, 0), // orange
|
|
||||||
toARGB(102, 57, 191), // deeppurple
|
|
||||||
toARGB(36, 156, 242), // lightblue
|
|
||||||
toARGB(20, 190, 205), // cyan
|
|
||||||
toARGB(0, 165, 140), // teal
|
|
||||||
toARGB(147, 191, 57), // lime
|
|
||||||
toARGB(240, 100, 50), // deeporange
|
|
||||||
toARGB(115, 115, 115), // gray
|
|
||||||
toARGB(89, 115, 128)}; // bluegray
|
|
||||||
|
|
||||||
static final int BOOKMARK_ICON_TYPE_NONE = 0;
|
|
||||||
|
|
||||||
/// @note Important! Should be synced with kml/types.hpp/BookmarkIcon
|
|
||||||
/// @todo Can make better: take name-by-type from Core and make a concat: "R.drawable.ic_bookmark_" + name.
|
|
||||||
// First icon should be "none" <-> BOOKMARK_ICON_TYPE_NONE.
|
|
||||||
@DrawableRes
|
@DrawableRes
|
||||||
private static final int[] TYPE_ICONS = {
|
private static int[] sTypeIcons = null;
|
||||||
R.drawable.ic_bookmark_none, R.drawable.ic_bookmark_hotel, R.drawable.ic_bookmark_animals,
|
|
||||||
R.drawable.ic_bookmark_buddhism, R.drawable.ic_bookmark_building, R.drawable.ic_bookmark_christianity,
|
|
||||||
R.drawable.ic_bookmark_entertainment, R.drawable.ic_bookmark_money, R.drawable.ic_bookmark_food,
|
|
||||||
R.drawable.ic_bookmark_gas, R.drawable.ic_bookmark_judaism, R.drawable.ic_bookmark_medicine,
|
|
||||||
R.drawable.ic_bookmark_mountain, R.drawable.ic_bookmark_museum, R.drawable.ic_bookmark_islam,
|
|
||||||
R.drawable.ic_bookmark_park, R.drawable.ic_bookmark_parking, R.drawable.ic_bookmark_shop,
|
|
||||||
R.drawable.ic_bookmark_sights, R.drawable.ic_bookmark_swim, R.drawable.ic_bookmark_water,
|
|
||||||
R.drawable.ic_bookmark_bar, R.drawable.ic_bookmark_transport, R.drawable.ic_bookmark_viewpoint,
|
|
||||||
R.drawable.ic_bookmark_sport,
|
|
||||||
R.drawable.ic_bookmark_none, // pub
|
|
||||||
R.drawable.ic_bookmark_none, // art
|
|
||||||
R.drawable.ic_bookmark_none, // bank
|
|
||||||
R.drawable.ic_bookmark_none, // cafe
|
|
||||||
R.drawable.ic_bookmark_none, // pharmacy
|
|
||||||
R.drawable.ic_bookmark_none, // stadium
|
|
||||||
R.drawable.ic_bookmark_none, // theatre
|
|
||||||
R.drawable.ic_bookmark_none, // information
|
|
||||||
R.drawable.ic_bookmark_none, // ChargingStation
|
|
||||||
R.drawable.ic_bookmark_none, // BicycleParking
|
|
||||||
R.drawable.ic_bookmark_none, // BicycleParkingCovered
|
|
||||||
R.drawable.ic_bookmark_none, // BicycleRental
|
|
||||||
R.drawable.ic_bookmark_none // FastFood
|
|
||||||
};
|
|
||||||
|
|
||||||
@PredefinedColor
|
@PredefinedColors.Color
|
||||||
private final int mColor;
|
private final int mColor;
|
||||||
private final int mType;
|
private final int mType;
|
||||||
|
|
||||||
public Icon(@PredefinedColor int color, int type)
|
public Icon(@PredefinedColors.Color int color, int type)
|
||||||
{
|
{
|
||||||
mColor = color;
|
mColor = color;
|
||||||
mType = type;
|
mType = type;
|
||||||
@@ -127,31 +48,29 @@ public class Icon implements Parcelable
|
|||||||
mType = in.readInt();
|
mType = in.readInt();
|
||||||
}
|
}
|
||||||
|
|
||||||
@PredefinedColor
|
@PredefinedColors.Color
|
||||||
public int getColor()
|
public int getColor()
|
||||||
{
|
{
|
||||||
return mColor;
|
return mColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ColorInt
|
||||||
public int argb()
|
public int argb()
|
||||||
{
|
{
|
||||||
return ARGB_COLORS[mColor];
|
return PredefinedColors.getColor(mColor);
|
||||||
}
|
|
||||||
|
|
||||||
public static int getColorPosition(int color)
|
|
||||||
{
|
|
||||||
for (int index = 1; index < ARGB_COLORS.length; index++)
|
|
||||||
{
|
|
||||||
if (ARGB_COLORS[index] == color)
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@DrawableRes
|
@DrawableRes
|
||||||
public int getResId()
|
public int getResId()
|
||||||
{
|
{
|
||||||
return TYPE_ICONS[mType];
|
// loadDefaultIcons should be called
|
||||||
|
assert (sTypeIcons != null);
|
||||||
|
return sTypeIcons[mType];
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getType()
|
||||||
|
{
|
||||||
|
return mType;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -181,4 +100,29 @@ public class Icon implements Parcelable
|
|||||||
return new Icon[size];
|
return new Icon[size];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static public void loadDefaultIcons(@NonNull Resources resources, @NonNull String packageName)
|
||||||
|
{
|
||||||
|
final String[] names = nativeGetBookmarkIconNames();
|
||||||
|
int[] icons = new int[names.length];
|
||||||
|
for (int i = 0; i < names.length; i++)
|
||||||
|
{
|
||||||
|
final String name = StringUtils.toSnakeCase(names[i]);
|
||||||
|
icons[i] = resources.getIdentifier("ic_bookmark_" + name, "drawable", packageName);
|
||||||
|
if (icons[i] == 0)
|
||||||
|
{
|
||||||
|
Logger.e(TAG, "Error getting icon for " + name);
|
||||||
|
// Force devs to add an icon for each bookmark type.
|
||||||
|
if (BuildConfig.DEBUG)
|
||||||
|
throw new RuntimeException("Error getting icon for " + name);
|
||||||
|
icons[i] = app.organicmaps.sdk.R.drawable.ic_bookmark_none; // Fallback icon
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sTypeIcons = icons;
|
||||||
|
}
|
||||||
|
|
||||||
|
@FastNative
|
||||||
|
@NonNull
|
||||||
|
private static native String[] nativeGetBookmarkIconNames();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
package app.organicmaps.sdk.bookmarks.data;
|
||||||
|
|
||||||
|
import androidx.annotation.ColorInt;
|
||||||
|
import androidx.annotation.IntRange;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import dalvik.annotation.optimization.FastNative;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
|
||||||
|
public class PredefinedColors
|
||||||
|
{
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
@IntRange(from = 0)
|
||||||
|
public @interface Color
|
||||||
|
{}
|
||||||
|
|
||||||
|
/// @note Color format: ARGB
|
||||||
|
@ColorInt
|
||||||
|
private static final int[] PREDEFINED_COLORS = nativeGetPredefinedColors();
|
||||||
|
|
||||||
|
@ColorInt
|
||||||
|
public static int getColor(int index)
|
||||||
|
{
|
||||||
|
return PREDEFINED_COLORS[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
@PredefinedColors.Color
|
||||||
|
public static List<Integer> getAllPredefinedColors()
|
||||||
|
{
|
||||||
|
// 0 is reserved for "no color" option.
|
||||||
|
return IntStream.range(1, PREDEFINED_COLORS.length).boxed().toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getPredefinedColorIndex(@ColorInt int color)
|
||||||
|
{
|
||||||
|
// 0 is reserved for "no color" option.
|
||||||
|
for (int index = 1; index < PREDEFINED_COLORS.length; index++)
|
||||||
|
{
|
||||||
|
if (PREDEFINED_COLORS[index] == color)
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@FastNative
|
||||||
|
@NonNull
|
||||||
|
private static native int[] nativeGetPredefinedColors();
|
||||||
|
}
|
||||||
@@ -161,6 +161,7 @@ public final class Editor
|
|||||||
public static native void nativeCreateNote(String text);
|
public static native void nativeCreateNote(String text);
|
||||||
public static native void nativePlaceDoesNotExist(@NonNull String comment);
|
public static native void nativePlaceDoesNotExist(@NonNull String comment);
|
||||||
public static native void nativeRollbackMapObject();
|
public static native void nativeRollbackMapObject();
|
||||||
|
public static native void nativeCreateStandaloneNote(double lat, double lon, String text);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return all cuisines keys.
|
* @return all cuisines keys.
|
||||||
|
|||||||
@@ -29,9 +29,6 @@ public final class OsmOAuth
|
|||||||
@SuppressWarnings("NotNullFieldNotInitialized")
|
@SuppressWarnings("NotNullFieldNotInitialized")
|
||||||
@NonNull
|
@NonNull
|
||||||
private static SharedPreferences mPrefs;
|
private static SharedPreferences mPrefs;
|
||||||
|
|
||||||
private static final String PREF_OSM_TOKEN = "OsmToken"; // Unused after migration from OAuth1 to OAuth2
|
|
||||||
private static final String PREF_OSM_SECRET = "OsmSecret"; // Unused after migration from OAuth1 to OAuth2
|
|
||||||
private static final String PREF_OSM_USERNAME = "OsmUsername";
|
private static final String PREF_OSM_USERNAME = "OsmUsername";
|
||||||
private static final String PREF_OSM_CHANGESETS_COUNT = "OsmChangesetsCount";
|
private static final String PREF_OSM_CHANGESETS_COUNT = "OsmChangesetsCount";
|
||||||
private static final String PREF_OSM_OAUTH2_TOKEN = "OsmOAuth2Token";
|
private static final String PREF_OSM_OAUTH2_TOKEN = "OsmOAuth2Token";
|
||||||
@@ -48,16 +45,6 @@ public final class OsmOAuth
|
|||||||
return mPrefs.contains(PREF_OSM_OAUTH2_TOKEN);
|
return mPrefs.contains(PREF_OSM_OAUTH2_TOKEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean containsOAuth1Credentials()
|
|
||||||
{
|
|
||||||
return mPrefs.contains(PREF_OSM_TOKEN) && mPrefs.contains(PREF_OSM_SECRET);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void clearOAuth1Credentials()
|
|
||||||
{
|
|
||||||
mPrefs.edit().remove(PREF_OSM_TOKEN).remove(PREF_OSM_SECRET).apply();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getAuthToken()
|
public static String getAuthToken()
|
||||||
{
|
{
|
||||||
return mPrefs.getString(PREF_OSM_OAUTH2_TOKEN, "");
|
return mPrefs.getString(PREF_OSM_OAUTH2_TOKEN, "");
|
||||||
@@ -82,8 +69,6 @@ public final class OsmOAuth
|
|||||||
public static void clearAuthorization()
|
public static void clearAuthorization()
|
||||||
{
|
{
|
||||||
mPrefs.edit()
|
mPrefs.edit()
|
||||||
.remove(PREF_OSM_TOKEN)
|
|
||||||
.remove(PREF_OSM_SECRET)
|
|
||||||
.remove(PREF_OSM_USERNAME)
|
.remove(PREF_OSM_USERNAME)
|
||||||
.remove(PREF_OSM_OAUTH2_TOKEN)
|
.remove(PREF_OSM_OAUTH2_TOKEN)
|
||||||
.apply();
|
.apply();
|
||||||
|
|||||||
@@ -16,13 +16,12 @@ import androidx.annotation.UiThread;
|
|||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
import androidx.core.location.GnssStatusCompat;
|
import androidx.core.location.GnssStatusCompat;
|
||||||
import androidx.core.location.LocationManagerCompat;
|
import androidx.core.location.LocationManagerCompat;
|
||||||
import app.organicmaps.MwmApplication;
|
|
||||||
import app.organicmaps.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.Map;
|
import app.organicmaps.sdk.Map;
|
||||||
import app.organicmaps.sdk.bookmarks.data.FeatureId;
|
import app.organicmaps.sdk.bookmarks.data.FeatureId;
|
||||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||||
import app.organicmaps.sdk.routing.JunctionInfo;
|
import app.organicmaps.sdk.routing.JunctionInfo;
|
||||||
|
import app.organicmaps.sdk.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import app.organicmaps.sdk.util.LocationUtils;
|
import app.organicmaps.sdk.util.LocationUtils;
|
||||||
import app.organicmaps.sdk.util.NetworkPolicy;
|
import app.organicmaps.sdk.util.NetworkPolicy;
|
||||||
|
|||||||
@@ -45,16 +45,16 @@ public class SensorHelper implements SensorEventListener
|
|||||||
mLastAccuracy = event.accuracy;
|
mLastAccuracy = event.accuracy;
|
||||||
switch (mLastAccuracy)
|
switch (mLastAccuracy)
|
||||||
{
|
{
|
||||||
case SensorManager.SENSOR_STATUS_ACCURACY_HIGH: break;
|
case SensorManager.SENSOR_STATUS_ACCURACY_HIGH: break;
|
||||||
case SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM:
|
case SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM:
|
||||||
for (SensorListener listener : mListeners)
|
for (SensorListener listener : mListeners)
|
||||||
listener.onCompassCalibrationRecommended();
|
listener.onCompassCalibrationRecommended();
|
||||||
break;
|
break;
|
||||||
case SensorManager.SENSOR_STATUS_ACCURACY_LOW:
|
case SensorManager.SENSOR_STATUS_ACCURACY_LOW:
|
||||||
case SensorManager.SENSOR_STATUS_UNRELIABLE:
|
case SensorManager.SENSOR_STATUS_UNRELIABLE:
|
||||||
default:
|
default:
|
||||||
for (SensorListener listener : mListeners)
|
for (SensorListener listener : mListeners)
|
||||||
listener.onCompassCalibrationRequired();
|
listener.onCompassCalibrationRequired();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import app.organicmaps.sdk.Framework;
|
|||||||
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
||||||
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
||||||
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
|
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
|
||||||
import app.organicmaps.sdk.util.ThemeSwitcher;
|
|
||||||
|
|
||||||
public enum Mode
|
public enum Mode
|
||||||
{
|
{
|
||||||
@@ -61,7 +60,8 @@ public enum Mode
|
|||||||
public void setEnabled(@NonNull Context context, boolean isEnabled)
|
public void setEnabled(@NonNull Context context, boolean isEnabled)
|
||||||
{
|
{
|
||||||
Framework.nativeSetOutdoorsLayerEnabled(isEnabled);
|
Framework.nativeSetOutdoorsLayerEnabled(isEnabled);
|
||||||
ThemeSwitcher.INSTANCE.restart(true);
|
// TODO: ThemeSwitcher is outside sdk package. Properly fix dependencies
|
||||||
|
// ThemeSwitcher.INSTANCE.restart(true);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,12 @@
|
|||||||
package app.organicmaps.sdk.maplayer.isolines;
|
package app.organicmaps.sdk.maplayer.isolines;
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
|
|
||||||
public class IsolinesManager
|
public class IsolinesManager
|
||||||
{
|
{
|
||||||
@NonNull
|
@NonNull
|
||||||
private final OnIsolinesChangedListener mListener;
|
private final OnIsolinesChangedListener mListener = new OnIsolinesChangedListener();
|
||||||
|
|
||||||
public IsolinesManager(@NonNull Context context)
|
|
||||||
{
|
|
||||||
mListener = new OnIsolinesChangedListener(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
static public boolean isEnabled()
|
static public boolean isEnabled()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,40 +1,9 @@
|
|||||||
package app.organicmaps.sdk.maplayer.isolines;
|
package app.organicmaps.sdk.maplayer.isolines;
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.Toast;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import app.organicmaps.R;
|
|
||||||
import app.organicmaps.util.Utils;
|
|
||||||
|
|
||||||
public enum IsolinesState
|
public enum IsolinesState
|
||||||
{
|
{
|
||||||
DISABLED,
|
DISABLED,
|
||||||
ENABLED,
|
ENABLED,
|
||||||
EXPIREDDATA {
|
EXPIREDDATA,
|
||||||
@Override
|
NODATA;
|
||||||
public void activate(@NonNull Context context, @Nullable View view, @Nullable View viewAbove)
|
|
||||||
{
|
|
||||||
if (view != null)
|
|
||||||
Utils.showSnackbar(context, view, viewAbove, R.string.isolines_activation_error_dialog);
|
|
||||||
else
|
|
||||||
Toast.makeText(context, R.string.isolines_activation_error_dialog, Toast.LENGTH_SHORT).show();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
NODATA {
|
|
||||||
@Override
|
|
||||||
public void activate(@NonNull Context context, @Nullable View view, @Nullable View viewAbove)
|
|
||||||
{
|
|
||||||
if (view != null)
|
|
||||||
Utils.showSnackbar(context, view, viewAbove, R.string.isolines_location_error_dialog);
|
|
||||||
else
|
|
||||||
Toast.makeText(context, R.string.isolines_location_error_dialog, Toast.LENGTH_SHORT).show();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
public void activate(@NonNull Context context, @Nullable View viewAbove, @Nullable View view)
|
|
||||||
{
|
|
||||||
/* Do nothing by default */
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,33 +1,22 @@
|
|||||||
package app.organicmaps.sdk.maplayer.isolines;
|
package app.organicmaps.sdk.maplayer.isolines;
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import androidx.annotation.Keep;
|
import androidx.annotation.Keep;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
class OnIsolinesChangedListener
|
class OnIsolinesChangedListener
|
||||||
{
|
{
|
||||||
@NonNull
|
@Nullable
|
||||||
private final Context mContext;
|
|
||||||
private IsolinesErrorDialogListener mListener;
|
private IsolinesErrorDialogListener mListener;
|
||||||
|
|
||||||
OnIsolinesChangedListener(@NonNull Context app)
|
|
||||||
{
|
|
||||||
mContext = app;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Called from JNI.
|
// Called from JNI.
|
||||||
@Keep
|
@Keep
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public void onStateChanged(int type)
|
public void onStateChanged(int type)
|
||||||
{
|
{
|
||||||
IsolinesState state = IsolinesState.values()[type];
|
|
||||||
if (mListener == null)
|
if (mListener == null)
|
||||||
{
|
|
||||||
state.activate(mContext, null, null);
|
|
||||||
return;
|
return;
|
||||||
}
|
mListener.onStateChanged(IsolinesState.values()[type]);
|
||||||
|
|
||||||
mListener.onStateChanged(state);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void attach(@NonNull IsolinesErrorDialogListener listener)
|
public void attach(@NonNull IsolinesErrorDialogListener listener)
|
||||||
|
|||||||
@@ -34,10 +34,10 @@ public final class RoutePointInfo implements Parcelable
|
|||||||
{
|
{
|
||||||
switch (markType)
|
switch (markType)
|
||||||
{
|
{
|
||||||
case 0: mMarkType = RouteMarkType.Start; break;
|
case 0: mMarkType = RouteMarkType.Start; break;
|
||||||
case 1: mMarkType = RouteMarkType.Intermediate; break;
|
case 1: mMarkType = RouteMarkType.Intermediate; break;
|
||||||
case 2: mMarkType = RouteMarkType.Finish; break;
|
case 2: mMarkType = RouteMarkType.Finish; break;
|
||||||
default: throw new IllegalArgumentException("Mark type is not valid = " + markType);
|
default: throw new IllegalArgumentException("Mark type is not valid = " + markType);
|
||||||
}
|
}
|
||||||
|
|
||||||
mIntermediateIndex = intermediateIndex;
|
mIntermediateIndex = intermediateIndex;
|
||||||
|
|||||||
@@ -1,38 +1,19 @@
|
|||||||
package app.organicmaps.routing;
|
package app.organicmaps.sdk.routing;
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.SpannableStringBuilder;
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import androidx.annotation.DimenRes;
|
|
||||||
import androidx.annotation.IntRange;
|
import androidx.annotation.IntRange;
|
||||||
import androidx.annotation.MainThread;
|
import androidx.annotation.MainThread;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.core.util.Pair;
|
import androidx.core.util.Pair;
|
||||||
import app.organicmaps.MwmApplication;
|
|
||||||
import app.organicmaps.R;
|
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.Router;
|
import app.organicmaps.sdk.Router;
|
||||||
import app.organicmaps.sdk.bookmarks.data.FeatureId;
|
import app.organicmaps.sdk.bookmarks.data.FeatureId;
|
||||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||||
import app.organicmaps.sdk.routing.ResultCodes;
|
import app.organicmaps.sdk.location.LocationHelper;
|
||||||
import app.organicmaps.sdk.routing.RouteMarkData;
|
|
||||||
import app.organicmaps.sdk.routing.RouteMarkType;
|
|
||||||
import app.organicmaps.sdk.routing.RoutePointInfo;
|
|
||||||
import app.organicmaps.sdk.routing.RouteRecommendationType;
|
|
||||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
|
||||||
import app.organicmaps.sdk.routing.RoutingListener;
|
|
||||||
import app.organicmaps.sdk.routing.RoutingLoadPointsListener;
|
|
||||||
import app.organicmaps.sdk.routing.RoutingOptions;
|
|
||||||
import app.organicmaps.sdk.routing.RoutingProgressListener;
|
|
||||||
import app.organicmaps.sdk.routing.TransitRouteInfo;
|
|
||||||
import app.organicmaps.sdk.util.StringUtils;
|
|
||||||
import app.organicmaps.sdk.util.concurrency.UiThread;
|
import app.organicmaps.sdk.util.concurrency.UiThread;
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
import app.organicmaps.util.Utils;
|
import app.organicmaps.sdk.widget.placepage.CoordinatesFormat;
|
||||||
import app.organicmaps.widget.placepage.CoordinatesFormat;
|
|
||||||
import java.time.LocalTime;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
@androidx.annotation.UiThread
|
@androidx.annotation.UiThread
|
||||||
public class RoutingController
|
public class RoutingController
|
||||||
@@ -114,7 +95,7 @@ public class RoutingController
|
|||||||
mLastMissingMaps = missingMaps;
|
mLastMissingMaps = missingMaps;
|
||||||
mContainsCachedResult = true;
|
mContainsCachedResult = true;
|
||||||
|
|
||||||
if (mLastResultCode == ResultCodes.NO_ERROR || ResultCodesHelper.isMoreMapsNeeded(mLastResultCode))
|
if (mLastResultCode == ResultCodes.NO_ERROR || resultCode == ResultCodes.NEED_MORE_MAPS)
|
||||||
{
|
{
|
||||||
onBuiltRoute();
|
onBuiltRoute();
|
||||||
}
|
}
|
||||||
@@ -180,7 +161,7 @@ public class RoutingController
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ResultCodesHelper.isMoreMapsNeeded(mLastResultCode))
|
if (mLastResultCode != ResultCodes.NEED_MORE_MAPS)
|
||||||
{
|
{
|
||||||
setBuildState(BuildState.ERROR);
|
setBuildState(BuildState.ERROR);
|
||||||
mLastBuildProgress = 0;
|
mLastBuildProgress = 0;
|
||||||
@@ -195,8 +176,7 @@ public class RoutingController
|
|||||||
|
|
||||||
private boolean isDrivingOptionsBuildError()
|
private boolean isDrivingOptionsBuildError()
|
||||||
{
|
{
|
||||||
return !ResultCodesHelper.isMoreMapsNeeded(mLastResultCode) && RoutingOptions.hasAnyOptions()
|
return mLastResultCode != ResultCodes.NEED_MORE_MAPS && RoutingOptions.hasAnyOptions() && !isRulerRouterType();
|
||||||
&& !isRulerRouterType();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setState(State newState)
|
private void setState(State newState)
|
||||||
@@ -250,7 +230,7 @@ public class RoutingController
|
|||||||
mContainer = container;
|
mContainer = container;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void initialize(@NonNull Context context)
|
public void initialize(@NonNull LocationHelper locationHelper)
|
||||||
{
|
{
|
||||||
mLastRouterType = Router.getLastUsed();
|
mLastRouterType = Router.getLastUsed();
|
||||||
mInvalidRoutePointsTransactionId = Framework.nativeInvalidRoutePointsTransactionId();
|
mInvalidRoutePointsTransactionId = Framework.nativeInvalidRoutePointsTransactionId();
|
||||||
@@ -260,7 +240,7 @@ public class RoutingController
|
|||||||
Framework.nativeSetRouteProgressListener(mRoutingProgressListener);
|
Framework.nativeSetRouteProgressListener(mRoutingProgressListener);
|
||||||
Framework.nativeSetRoutingRecommendationListener(recommendation -> UiThread.run(() -> {
|
Framework.nativeSetRoutingRecommendationListener(recommendation -> UiThread.run(() -> {
|
||||||
if (recommendation == RouteRecommendationType.RebuildAfterPointsLoading)
|
if (recommendation == RouteRecommendationType.RebuildAfterPointsLoading)
|
||||||
setStartPoint(MwmApplication.from(context).getLocationHelper().getMyPosition());
|
setStartPoint(locationHelper.getMyPosition());
|
||||||
}));
|
}));
|
||||||
Framework.nativeSetRoutingLoadPointsListener(mRoutingLoadPointsListener);
|
Framework.nativeSetRoutingLoadPointsListener(mRoutingLoadPointsListener);
|
||||||
}
|
}
|
||||||
@@ -557,7 +537,7 @@ public class RoutingController
|
|||||||
return mLastRouterType == Router.Vehicle;
|
return mLastRouterType == Router.Vehicle;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isRulerRouterType()
|
public boolean isRulerRouterType()
|
||||||
{
|
{
|
||||||
return mLastRouterType == Router.Ruler;
|
return mLastRouterType == Router.Ruler;
|
||||||
}
|
}
|
||||||
@@ -883,26 +863,4 @@ public class RoutingController
|
|||||||
|
|
||||||
mWaitingPoiPickType = null;
|
mWaitingPoiPickType = null;
|
||||||
}
|
}
|
||||||
public static CharSequence formatRoutingTime(Context context, int seconds, @DimenRes int unitsSize)
|
|
||||||
{
|
|
||||||
return formatRoutingTime(context, seconds, unitsSize, R.dimen.text_size_routing_number);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static CharSequence formatRoutingTime(Context context, int seconds, @DimenRes int unitsSize,
|
|
||||||
@DimenRes int textSize)
|
|
||||||
{
|
|
||||||
long minutes = TimeUnit.SECONDS.toMinutes(seconds) % 60;
|
|
||||||
long hours = TimeUnit.SECONDS.toHours(seconds);
|
|
||||||
String min = context.getString(R.string.minute);
|
|
||||||
String hour = context.getString(R.string.hour);
|
|
||||||
SpannableStringBuilder displayedH = Utils.formatTime(context, textSize, unitsSize, String.valueOf(hours), hour);
|
|
||||||
SpannableStringBuilder displayedM = Utils.formatTime(context, textSize, unitsSize, String.valueOf(minutes), min);
|
|
||||||
return hours == 0 ? displayedM : TextUtils.concat(displayedH + "\u00A0", displayedM);
|
|
||||||
}
|
|
||||||
|
|
||||||
static String formatArrivalTime(int seconds)
|
|
||||||
{
|
|
||||||
final LocalTime time = LocalTime.now().plusSeconds(seconds);
|
|
||||||
return StringUtils.formatUsingUsLocale("%d:%02d", time.getHour(), time.getMinute());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package app.organicmaps.settings;
|
package app.organicmaps.sdk.settings;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents storage option.
|
* Represents storage option.
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package app.organicmaps.settings;
|
package app.organicmaps.sdk.settings;
|
||||||
|
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
@@ -28,7 +28,7 @@ public class StoragePathManager
|
|||||||
private static final String TAG = StoragePathManager.class.getSimpleName();
|
private static final String TAG = StoragePathManager.class.getSimpleName();
|
||||||
private static final String DATA_FILE_EXT = Framework.nativeGetDataFileExt();
|
private static final String DATA_FILE_EXT = Framework.nativeGetDataFileExt();
|
||||||
private static final String[] MOVABLE_EXTS = Framework.nativeGetMovableFilesExts();
|
private static final String[] MOVABLE_EXTS = Framework.nativeGetMovableFilesExts();
|
||||||
static final FilenameFilter MOVABLE_FILES_FILTER = (dir, filename) ->
|
public static final FilenameFilter MOVABLE_FILES_FILTER = (dir, filename) ->
|
||||||
{
|
{
|
||||||
for (String ext : MOVABLE_EXTS)
|
for (String ext : MOVABLE_EXTS)
|
||||||
if (filename.endsWith(ext))
|
if (filename.endsWith(ext))
|
||||||
@@ -37,7 +37,7 @@ public class StoragePathManager
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
interface OnStorageListChangedListener
|
public interface OnStorageListChangedListener
|
||||||
{
|
{
|
||||||
void onStorageListChanged(List<StorageItem> storageItems, int currentStorageIndex);
|
void onStorageListChanged(List<StorageItem> storageItems, int currentStorageIndex);
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
package app.organicmaps.sdk.sound;
|
package app.organicmaps.sdk.sound;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.database.ContentObserver;
|
import android.database.ContentObserver;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
@@ -10,9 +9,9 @@ import android.provider.Settings;
|
|||||||
import android.speech.tts.TextToSpeech;
|
import android.speech.tts.TextToSpeech;
|
||||||
import android.speech.tts.UtteranceProgressListener;
|
import android.speech.tts.UtteranceProgressListener;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
import android.util.Pair;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import app.organicmaps.R;
|
|
||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import app.organicmaps.sdk.util.concurrency.UiThread;
|
import app.organicmaps.sdk.util.concurrency.UiThread;
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
@@ -43,6 +42,9 @@ public enum TtsPlayer
|
|||||||
private static final float SPEECH_RATE = 1.0f;
|
private static final float SPEECH_RATE = 1.0f;
|
||||||
private static final int TTS_SPEAK_DELAY_MILLIS = 50;
|
private static final int TTS_SPEAK_DELAY_MILLIS = 50;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private static List<Pair<String, String>> sSupportedLanguages = null;
|
||||||
|
|
||||||
public static Runnable sOnReloadCallback = null;
|
public static Runnable sOnReloadCallback = null;
|
||||||
|
|
||||||
private ContentObserver mTtsEngineObserver;
|
private ContentObserver mTtsEngineObserver;
|
||||||
@@ -286,19 +288,15 @@ public enum TtsPlayer
|
|||||||
|
|
||||||
private boolean getUsableLanguages(List<LanguageData> outList)
|
private boolean getUsableLanguages(List<LanguageData> outList)
|
||||||
{
|
{
|
||||||
Resources resources = mContext.getResources();
|
for (final Pair<String, String> langNamePair : getSupportedLanguages())
|
||||||
String[] codes = resources.getStringArray(R.array.tts_languages_supported);
|
|
||||||
String[] names = resources.getStringArray(R.array.tts_language_names);
|
|
||||||
|
|
||||||
for (int i = 0; i < codes.length; i++)
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
outList.add(new LanguageData(codes[i], names[i], mTts));
|
outList.add(new LanguageData(langNamePair.first, langNamePair.second, mTts));
|
||||||
}
|
}
|
||||||
catch (LanguageData.NotAvailableException ignored)
|
catch (LanguageData.NotAvailableException ex)
|
||||||
{
|
{
|
||||||
Logger.w(TAG, "Failed to get usable languages " + ignored.getMessage());
|
Logger.w(TAG, "Failed to get usable languages " + ex.getMessage());
|
||||||
}
|
}
|
||||||
catch (IllegalArgumentException e)
|
catch (IllegalArgumentException e)
|
||||||
{
|
{
|
||||||
@@ -351,8 +349,20 @@ public enum TtsPlayer
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
private List<Pair<String, String>> getSupportedLanguages()
|
||||||
|
{
|
||||||
|
if (sSupportedLanguages == null)
|
||||||
|
{
|
||||||
|
sSupportedLanguages = nativeGetSupportedLanguages();
|
||||||
|
}
|
||||||
|
return sSupportedLanguages;
|
||||||
|
}
|
||||||
|
|
||||||
private native static void nativeEnableTurnNotifications(boolean enable);
|
private native static void nativeEnableTurnNotifications(boolean enable);
|
||||||
private native static boolean nativeAreTurnNotificationsEnabled();
|
private native static boolean nativeAreTurnNotificationsEnabled();
|
||||||
private native static void nativeSetTurnNotificationsLocale(String code);
|
private native static void nativeSetTurnNotificationsLocale(String code);
|
||||||
private native static String nativeGetTurnNotificationsLocale();
|
private native static String nativeGetTurnNotificationsLocale();
|
||||||
|
@NonNull
|
||||||
|
private native static List<Pair<String, String>> nativeGetSupportedLanguages();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -231,7 +231,7 @@ public final class Config
|
|||||||
return defaultTheme;
|
return defaultTheme;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setCurrentUiTheme(@NonNull Context context, @NonNull String theme)
|
public static void setCurrentUiTheme(@NonNull Context context, @NonNull String theme)
|
||||||
{
|
{
|
||||||
if (getCurrentUiTheme(context).equals(theme))
|
if (getCurrentUiTheme(context).equals(theme))
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
package app.organicmaps.sdk.util;
|
package app.organicmaps.sdk.util;
|
||||||
|
|
||||||
import app.organicmaps.BuildConfig;
|
|
||||||
|
|
||||||
public final class Constants
|
public final class Constants
|
||||||
{
|
{
|
||||||
public static final int KB = 1024;
|
public static final int KB = 1024;
|
||||||
@@ -36,13 +34,6 @@ public final class Constants
|
|||||||
private Url() {}
|
private Url() {}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Email
|
|
||||||
{
|
|
||||||
public static final String SUPPORT = BuildConfig.SUPPORT_MAIL;
|
|
||||||
|
|
||||||
private Email() {}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class Package
|
public static class Package
|
||||||
{
|
{
|
||||||
public static final String FB_PACKAGE = "com.facebook.katana";
|
public static final String FB_PACKAGE = "com.facebook.katana";
|
||||||
|
|||||||
@@ -28,13 +28,13 @@ public class LocationUtils
|
|||||||
double correction = 0;
|
double correction = 0;
|
||||||
switch (displayOrientation)
|
switch (displayOrientation)
|
||||||
{
|
{
|
||||||
case Surface.ROTATION_0 ->
|
case Surface.ROTATION_0 ->
|
||||||
{
|
{
|
||||||
return angle;
|
return angle;
|
||||||
}
|
}
|
||||||
case Surface.ROTATION_90 -> correction = Math.PI / 2.0;
|
case Surface.ROTATION_90 -> correction = Math.PI / 2.0;
|
||||||
case Surface.ROTATION_180 -> correction = Math.PI;
|
case Surface.ROTATION_180 -> correction = Math.PI;
|
||||||
case Surface.ROTATION_270 -> correction = (3.0 * Math.PI / 2.0);
|
case Surface.ROTATION_270 -> correction = (3.0 * Math.PI / 2.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return correctAngle(angle, correction);
|
return correctAngle(angle, correction);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user