mirror of
https://codeberg.org/comaps/comaps
synced 2025-12-24 06:53:46 +00:00
Compare commits
91 Commits
2025.06.01
...
2025.06.10
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
99591d1e54 | ||
|
|
9d31c7f37f | ||
|
|
1f950d2c0b | ||
|
|
111bb0b94c | ||
|
|
5567e011db | ||
|
|
6cafc1da75 | ||
|
|
5eff4f56ca | ||
|
|
d38ffe2fa8 | ||
|
|
7d834beba5 | ||
|
|
0234be60a2 | ||
|
|
45bba5fb5e | ||
|
|
9e8accc8f5 | ||
|
|
5bb2569e76 | ||
|
|
8b096035df | ||
|
|
2861d9db2a | ||
|
|
f8996feb88 | ||
|
|
f201d0e3cd | ||
|
|
4cf5ec3c86 | ||
|
|
6d093a45cf | ||
|
|
09c704ee8f | ||
|
|
c5b02a6580 | ||
|
|
d2a9e6bd2d | ||
|
|
54455784b3 | ||
|
|
cb71ca995c | ||
|
|
b7ddc3090c | ||
|
|
5b7b69dca4 | ||
|
|
8ec407528f | ||
|
|
312e31c489 | ||
|
|
d59a7ea3fa | ||
|
|
e19c493c96 | ||
|
|
05cceec845 | ||
|
|
43a7826f51 | ||
|
|
bd563e6abb | ||
|
|
d327bc5b82 | ||
|
|
ae645c913d | ||
|
|
751b94948c | ||
|
|
8e6cdfeafc | ||
|
|
7f9b6f87c6 | ||
|
|
dd546fa630 | ||
|
|
1a034aa179 | ||
|
|
1475a7890a | ||
|
|
28d4ae23b4 | ||
|
|
0699eb8605 | ||
|
|
209b0d5d5b | ||
|
|
10bc524571 | ||
|
|
fad1da2f6c | ||
|
|
404361a594 | ||
|
|
0996917a1b | ||
|
|
c1b45828b0 | ||
|
|
5bc6e6ded6 | ||
|
|
d20a9e7ff8 | ||
|
|
25af0b1ebb | ||
|
|
f0d813d676 | ||
|
|
ff0e5cf3e8 | ||
|
|
28455e51a6 | ||
|
|
690ca53677 | ||
|
|
db275a4491 | ||
|
|
3d7d754785 | ||
|
|
fe766e50ac | ||
|
|
d1d81c6b48 | ||
|
|
c73f357375 | ||
|
|
8f5026aa08 | ||
|
|
b43c0b8f3e | ||
|
|
b9edb19dcb | ||
|
|
4627783725 | ||
|
|
12963fd4ef | ||
|
|
5e89613368 | ||
|
|
ff65e44202 | ||
|
|
f553379b72 | ||
|
|
48f0b9e737 | ||
|
|
88a5c8fd5b | ||
|
|
c648bc015e | ||
|
|
5151032606 | ||
|
|
8f4b9942da | ||
|
|
e8c5cc51fa | ||
|
|
a57cf5f764 | ||
|
|
ca2bfa995f | ||
|
|
64166140b2 | ||
|
|
af00325a77 | ||
|
|
31d065846a | ||
|
|
5092113459 | ||
|
|
0a685dc1c4 | ||
|
|
b12f346a24 | ||
|
|
6ab2fb94dd | ||
|
|
d5826b1e91 | ||
|
|
59e21ebac4 | ||
|
|
5f4e41348c | ||
|
|
246d4a252a | ||
|
|
787ed546ac | ||
|
|
b0355319bd | ||
|
|
856d16cfcb |
@@ -25,11 +25,7 @@ jobs:
|
||||
sudo apt install -y \
|
||||
flatpak
|
||||
sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||
sudo flatpak install -y org.freedesktop.appstream-glib org.flatpak.Builder
|
||||
|
||||
- name: Validate appstream data
|
||||
shell: bash
|
||||
run: flatpak run org.freedesktop.appstream-glib validate --nonet packaging/app.organicmaps.desktop.metainfo.xml
|
||||
sudo flatpak install -y org.flatpak.Builder
|
||||
|
||||
- name: Lint appstream data with flatpak Builder
|
||||
shell: bash
|
||||
|
||||
@@ -90,7 +90,7 @@ jobs:
|
||||
# -g1 should slightly reduce build time.
|
||||
run: |
|
||||
cmake . -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug \
|
||||
-DCMAKE_CXX_FLAGS=-g1 -DUNITY_DISABLE=ON
|
||||
-DCMAKE_CXX_FLAGS=-g1 -DCMAKE_UNITY_BUILD=OFF
|
||||
|
||||
- name: Compile
|
||||
shell: bash
|
||||
|
||||
2
.github/workflows/ios-check.yaml
vendored
2
.github/workflows/ios-check.yaml
vendored
@@ -28,8 +28,6 @@ jobs:
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
brew install qt \
|
||||
freetype \
|
||||
harfbuzz \
|
||||
optipng
|
||||
- name: Checkout sources
|
||||
uses: actions/checkout@v4
|
||||
|
||||
8
.gitmodules
vendored
8
.gitmodules
vendored
@@ -1,12 +1,12 @@
|
||||
[submodule "tools/osmctools"]
|
||||
path = tools/osmctools
|
||||
url = https://git.omaps.dev/organicmaps/osmctools.git
|
||||
url = https://github.com/organicmaps/osmctools.git
|
||||
[submodule "tools/kothic"]
|
||||
path = tools/kothic
|
||||
url = https://git.omaps.dev/organicmaps/kothic.git
|
||||
url = https://codeberg.org/comaps/kothic.git
|
||||
[submodule "3party/protobuf/protobuf"]
|
||||
path = 3party/protobuf/protobuf
|
||||
url = https://git.omaps.dev/organicmaps/protobuf.git
|
||||
url = https://codeberg.org/comaps/protobuf.git
|
||||
[submodule "3party/Vulkan-Headers"]
|
||||
path = 3party/Vulkan-Headers
|
||||
url = https://github.com/KhronosGroup/Vulkan-Headers.git
|
||||
@@ -17,7 +17,7 @@
|
||||
ignore = dirty
|
||||
[submodule "3party/just_gtfs"]
|
||||
path = 3party/just_gtfs
|
||||
url = https://git.omaps.dev/organicmaps/just_gtfs.git
|
||||
url = https://github.com/organicmaps/just_gtfs.git
|
||||
branch = for-usage-as-submodule
|
||||
[submodule "3party/expat"]
|
||||
path = 3party/expat
|
||||
|
||||
Submodule 3party/CMake-MetalShaderSupport updated: 989857d2e5...84209c32e5
@@ -31,9 +31,10 @@ if (NOT WITH_SYSTEM_PROVIDED_3PARTY)
|
||||
set(JANSSON_WITHOUT_TESTS ON)
|
||||
add_subdirectory(jansson/jansson/)
|
||||
target_include_directories(jansson INTERFACE "${PROJECT_BINARY_DIR}/3party/jansson/jansson/include")
|
||||
add_library(jansson::jansson ALIAS jansson)
|
||||
|
||||
# Add gflags library.
|
||||
set(GFLAGS_BUILD_TESTING OFF)
|
||||
set(GFLAGS_BUILD_PACKAGING OFF)
|
||||
add_subdirectory(gflags)
|
||||
target_compile_options(gflags_nothreads_static PRIVATE $<$<CXX_COMPILER_ID:GNU>:-Wno-subobject-linkage>)
|
||||
|
||||
|
||||
Submodule 3party/gflags updated: a738fdf933...52e94563eb
Submodule 3party/jansson/jansson updated: 61fc3d0e28...96d160df90
198
CMakeLists.txt
198
CMakeLists.txt
@@ -12,13 +12,27 @@ set(CMAKE_CXX_VISIBILITY_PRESET hidden)
|
||||
set(CMAKE_VISIBILITY_INLINES_HIDDEN ON)
|
||||
|
||||
# Disable build-id generation to make builds reproducible.
|
||||
add_link_options("LINKER:--build-id=none")
|
||||
if (NOT APPLE)
|
||||
add_link_options("LINKER:--build-id=none")
|
||||
endif()
|
||||
|
||||
# Fixes warning ld: warning: ignoring duplicate libraries on Mac and Windows.
|
||||
if (POLICY CMP0156)
|
||||
cmake_policy(SET CMP0156 NEW)
|
||||
endif()
|
||||
|
||||
set(OMIM_ROOT ${CMAKE_SOURCE_DIR})
|
||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${OMIM_ROOT}/cmake")
|
||||
|
||||
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
|
||||
|
||||
include(OmimPlatform)
|
||||
include(OmimOptions)
|
||||
include(OmimConfig)
|
||||
include(OmimHelpers)
|
||||
include(OmimTesting)
|
||||
|
||||
if (APPLE AND NOT ("${CMAKE_SYSTEM_NAME}" STREQUAL Android))
|
||||
# OBJC/OBJCXX are needed to skip m/mm files in Unity builds.
|
||||
# https://gitlab.kitware.com/cmake/cmake/-/issues/21963
|
||||
@@ -36,24 +50,14 @@ endif()
|
||||
|
||||
message(STATUS "Using compiler ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}")
|
||||
|
||||
option(COVERAGE_REPORT "Configure for coverage report" OFF)
|
||||
|
||||
option(UNITY_DISABLE "Disable unity build" OFF)
|
||||
if (NOT UNITY_DISABLE AND NOT DEFINED ENV{UNITY_DISABLE})
|
||||
set(CMAKE_UNITY_BUILD ON)
|
||||
if (DEFINED ENV{UNITY_BUILD_BATCH_SIZE})
|
||||
set(CMAKE_UNITY_BUILD_BATCH_SIZE $ENV{UNITY_BUILD_BATCH_SIZE})
|
||||
else()
|
||||
set(CMAKE_UNITY_BUILD_BATCH_SIZE 50)
|
||||
endif()
|
||||
message(STATUS "Using Unity Build with batch ${CMAKE_UNITY_BUILD_BATCH_SIZE}, export UNITY_DISABLE=1 or use -DUNITY_DISABLE=ON to disable it.")
|
||||
if (CMAKE_UNITY_BUILD)
|
||||
message(STATUS "Using Unity Build with batch ${CMAKE_UNITY_BUILD_BATCH_SIZE}, use -DCMAKE_UNITY_BUILD=OFF to disable it.")
|
||||
endif()
|
||||
|
||||
option(CCACHE_DISABLE "Disable ccache" OFF)
|
||||
if (NOT CCACHE_DISABLE AND NOT DEFINED ENV{CCACHE_DISABLE})
|
||||
if (USE_CCACHE)
|
||||
find_program(CCACHE_PROGRAM ccache HINTS /usr/local/bin/)
|
||||
if (CCACHE_PROGRAM)
|
||||
message(STATUS "Using ccache, export CCACHE_DISABLE=1 or use -DCCACHE_DISABLE=ON to disable it.")
|
||||
message(STATUS "Using ccache, use -DUSE_CCACHE=OFF to disable it.")
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "${CCACHE_PROGRAM}")
|
||||
set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
|
||||
@@ -61,44 +65,13 @@ if (NOT CCACHE_DISABLE AND NOT DEFINED ENV{CCACHE_DISABLE})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
option(COLORS_DISABLE "Disable colored compiler output" OFF)
|
||||
if (NOT DEFINED ENV{COLORS_DISABLE} AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
||||
message(STATUS "export COLORS_DISABLE=1 or use -DCOLORS_DISABLE=ON to disable colored compiler output.")
|
||||
add_compile_options($<$<CXX_COMPILER_ID:GNU>:-fdiagnostics-color=always> $<$<CXX_COMPILER_ID:Clang,AppleClang>:-fcolor-diagnostics>)
|
||||
add_link_options($<$<CXX_COMPILER_ID:GNU>:-fdiagnostics-color=always> $<$<CXX_COMPILER_ID:Clang,AppleClang>:-fcolor-diagnostics>)
|
||||
endif()
|
||||
|
||||
option(WITH_SYSTEM_PROVIDED_3PARTY "Enable compilation with system provided dependencies" OFF)
|
||||
set(OMIM_ROOT ${CMAKE_SOURCE_DIR})
|
||||
|
||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${OMIM_ROOT}/cmake")
|
||||
|
||||
include(OmimHelpers)
|
||||
include(OmimTesting)
|
||||
|
||||
set(PLATFORM_DESKTOP TRUE)
|
||||
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
set(PLATFORM_LINUX TRUE)
|
||||
elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
||||
set(PLATFORM_MAC TRUE)
|
||||
elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||
set(PLATFORM_WIN TRUE)
|
||||
elseif (CMAKE_SYSTEM_NAME STREQUAL "Android")
|
||||
set(PLATFORM_ANDROID TRUE)
|
||||
set(PLATFORM_DESKTOP FALSE)
|
||||
elseif (CMAKE_SYSTEM_NAME STREQUAL "iOS")
|
||||
set(PLATFORM_IPHONE TRUE)
|
||||
set(PLATFORM_DESKTOP FALSE)
|
||||
else()
|
||||
message(FATAL_ERROR "Unsupported platform: ${CMAKE_SYSTEM_NAME}")
|
||||
endif()
|
||||
|
||||
if(${PLATFORM_MAC})
|
||||
set(XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES)
|
||||
|
||||
# Metal language support
|
||||
list(APPEND CMAKE_MODULE_PATH ${OMIM_ROOT}/3party/CMake-MetalShaderSupport/cmake)
|
||||
include(CheckLanguage)
|
||||
include(CMakeMetalInformation)
|
||||
include(MetalShaderSupport)
|
||||
check_language(Metal)
|
||||
if(CMAKE_Metal_COMPILER)
|
||||
@@ -106,23 +79,6 @@ if(${PLATFORM_MAC})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Sanitizer
|
||||
if (PLATFORM_DESKTOP)
|
||||
# https://clang.llvm.org/docs/UsersManual.html#controlling-code-generation
|
||||
set(BUILD_WITH_SANITIZER None CACHE STRING "Set to 'address' or others to enable sanitizer")
|
||||
|
||||
if (NOT ${BUILD_WITH_SANITIZER} MATCHES "None")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=${BUILD_WITH_SANITIZER} -fno-omit-frame-pointer")
|
||||
set(CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} -fsanitize=${BUILD_WITH_SANITIZER} -fno-omit-frame-pointer")
|
||||
message(STATUS "Enable sanitizer: ${BUILD_WITH_SANITIZER}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Set build type:
|
||||
if (NOT CMAKE_BUILD_TYPE)
|
||||
set(CMAKE_BUILD_TYPE "Release")
|
||||
endif()
|
||||
|
||||
# Global compile options for all configurations.
|
||||
if (MSVC)
|
||||
add_compile_options(/utf-8)
|
||||
@@ -154,98 +110,6 @@ else()
|
||||
endif()
|
||||
|
||||
message(STATUS "Build type: " ${CMAKE_BUILD_TYPE})
|
||||
# End of setting build type
|
||||
|
||||
# Options
|
||||
|
||||
# Call `make package` after cmake to build design tool.
|
||||
option(BUILD_DESIGNER "Build application as design tool" OFF)
|
||||
if (BUILD_DESIGNER)
|
||||
message(STATUS "Designer tool building is enabled")
|
||||
add_definitions(-DBUILD_DESIGNER)
|
||||
endif()
|
||||
|
||||
option(BUILD_STANDALONE "Build standalone application" OFF)
|
||||
if (BUILD_STANDALONE)
|
||||
message(STATUS "Standalone building is enabled")
|
||||
add_definitions(-DBUILD_STANDALONE)
|
||||
endif()
|
||||
|
||||
option(USE_ASAN "Enable Address Sanitizer" OFF)
|
||||
option(USE_TSAN "Enable Thread Sanitizer" OFF)
|
||||
option(USE_LIBFUZZER "Enable LibFuzzer" OFF)
|
||||
option(PYBINDINGS "Create makefiles for building python bindings" OFF)
|
||||
option(SKIP_QT_GUI "Skip building of Qt GUI" OFF)
|
||||
option(USE_PCH "Use precompiled headers" OFF)
|
||||
option(NJOBS "Number of parallel processes" OFF)
|
||||
option(ENABLE_VULKAN_DIAGNOSTICS "Enable Vulkan diagnostics" OFF)
|
||||
option(ENABLE_TRACE "Enable Tracing" OFF)
|
||||
|
||||
if (NJOBS)
|
||||
message(STATUS "Number of parallel processes: ${NJOBS}")
|
||||
set(CMAKE_JOB_POOLS custom=${NJOBS})
|
||||
set(CMAKE_JOB_POOL_COMPILE custom)
|
||||
set(CMAKE_JOB_POOL_LINK custom)
|
||||
set(CMAKE_JOB_POOL_PRECOMPILE_HEADER custom)
|
||||
endif()
|
||||
|
||||
# GCC 10.0 is required to support <charconv> header inclusion in base/string_utils.hpp
|
||||
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.0)
|
||||
message(FATAL_ERROR "Minimum supported g++ version is 10.0, yours is ${CMAKE_CXX_COMPILER_VERSION}")
|
||||
endif()
|
||||
|
||||
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
set(PCH_EXTENSION "pch")
|
||||
endif()
|
||||
|
||||
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
||||
set(PCH_EXTENSION "gch")
|
||||
endif()
|
||||
|
||||
if (PLATFORM_LINUX)
|
||||
option(USE_PPROF "Enable Google Profiler" OFF)
|
||||
endif()
|
||||
|
||||
if (USE_ASAN)
|
||||
message(STATUS "Address Sanitizer is enabled")
|
||||
endif()
|
||||
|
||||
if (USE_TSAN)
|
||||
message(STATUS "Thread Sanitizer is enabled")
|
||||
endif()
|
||||
|
||||
if (USE_ASAN AND USE_TSAN)
|
||||
message(FATAL_ERROR "Can't use two different sanitizers together")
|
||||
endif()
|
||||
|
||||
if (USE_LIBFUZZER)
|
||||
message(STATUS "LibFuzzer is enabled")
|
||||
endif()
|
||||
|
||||
if (USE_PPROF)
|
||||
message(STATUS "Google Profiler is enabled")
|
||||
add_definitions(-DUSE_PPROF)
|
||||
endif()
|
||||
|
||||
if (USE_HEAPPROF)
|
||||
message(STATUS "Heap Profiler is enabled")
|
||||
endif()
|
||||
|
||||
if (ENABLE_VULKAN_DIAGNOSTICS)
|
||||
message(WARNING "Vulkan diagnostics are enabled. Be aware of performance impact!")
|
||||
add_definitions(-DENABLE_VULKAN_DIAGNOSTICS)
|
||||
endif()
|
||||
|
||||
if (ENABLE_TRACE)
|
||||
message(STATUS "Tracing is enabled")
|
||||
add_definitions(-DENABLE_TRACE)
|
||||
endif()
|
||||
|
||||
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||
|
||||
# Set environment variables
|
||||
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR})
|
||||
set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR})
|
||||
|
||||
if (PLATFORM_LINUX OR PLATFORM_ANDROID)
|
||||
find_program(LLD_FOUND ld.lld)
|
||||
@@ -303,28 +167,6 @@ endif()
|
||||
# To allow #include "base/file_name.hpp" in all sources.
|
||||
include_directories(${CMAKE_HOME_DIRECTORY})
|
||||
|
||||
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||
|
||||
if (USE_ASAN)
|
||||
add_compile_options(
|
||||
"-fsanitize=address"
|
||||
"-fno-omit-frame-pointer"
|
||||
)
|
||||
endif()
|
||||
|
||||
if (USE_TSAN)
|
||||
add_compile_options(
|
||||
"-fsanitize=thread"
|
||||
"-fno-omit-frame-pointer"
|
||||
)
|
||||
endif()
|
||||
|
||||
if (USE_LIBFUZZER)
|
||||
add_compile_options(
|
||||
"-fsanitize=fuzzer"
|
||||
)
|
||||
endif()
|
||||
|
||||
if (USE_PCH)
|
||||
message(STATUS "Precompiled headers are ON")
|
||||
set(OMIM_PCH_TARGET_NAME "omim_pch")
|
||||
|
||||
@@ -32,13 +32,14 @@ A community-led free & open source maps app based on [OpenStreetMap](https://www
|
||||
There are apps for Android and iOS (and ARM macOS).
|
||||
An alpha linux / macOS Qt desktop version, which is also suitable for linux phones.
|
||||
|
||||
**We're working on getting first app releases out soon, please stay tuned!**
|
||||
The first app release is available as an APK download now! We are still working on publishing on F-Droid, Google Play Store and iOS App Store as well, please stay tuned!
|
||||
|
||||
<!--
|
||||
[<img src="docs/badges/apple-appstore.png" alt="App Store" width="160">](https://apps.apple.com/app/comaps/id1567437057)
|
||||
[<img src="docs/badges/google-play.png" alt="Google Play" width="160">](https://play.google.com/store/apps/details?id=app.comaps)
|
||||
[<img src="docs/badges/fdroid.png" alt="F-Droid" width="160">](https://f-droid.org/en/packages/app.comaps/)
|
||||
-->
|
||||
[<img src="docs/badges/codeberg.png" alt="Codeberg" width="160">](https://codeberg.org/comaps/comaps/releases)
|
||||
|
||||
<p float="left">
|
||||
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/1.jpg" width="180" />
|
||||
|
||||
8
android/.idea/icon.svg
generated
8
android/.idea/icon.svg
generated
@@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg version="1.1" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
|
||||
<g inkscape:groupmode="layer" inkscape:label="Layer 1">
|
||||
<rect fill="#006c35" fill-opacity="1.0" x="0" y="0" width="1024" height="1024"/>
|
||||
<path fill="#ffffff" d="m861.3562052 256.9139426c18.220574 48.4374573-79.2585233 166.2022835-172.1806378 196.4226995-168.0803471-58.2153969-173.5457836 39.5504743-311.1096159 132.4296677 162.6149552 112.4329497 332.9737882 24.8856325 329.7844002-85.7673036-127.9956457 73.3254376-208.1650824 81.3238121-254.1719349 79.1032962 154.8710218-30.6636026 322.0404219-125.7633124 357.0667834-165.7616685 0.032202 1.7749817 0.049863 3.5523114 0.049863 5.33456 0 191.0905993-295.1650572 474.6148576-295.1650572 474.6148576s-154.5086464-147.95159-239.9499331-302.4701423c-11.943516-0.1614425-83.8230022 25.9633002-110.3310391-9.051445-29.6082623-39.1049397 80.1693081-170.2028122 175.3699196-209.3102117 170.3563508 77.3261904 263.7351577-123.0971499 317.0292402-134.2068293-158.9688193-94.2135154-316.1183714-55.5493358-333.8847017 84.4353407 88.3675802-50.2172465 196.7775505-78.65765 246.8822227-76.4346744-140.7606999 28.7623957-301.9981102 132.8752019-350.2809443 172.4255642 0-159.041983 132.1505407-287.9677052 295.1650569-287.9677052 96.4018995 0 182.0095151 45.0859887 235.8744518 114.8252613 0.00335 0 96.1884344-31.2834041 109.851981 11.3787329zm-33.7059144 14.218972c-12.6607646-17.2289278-56.7341326 2.8936807-56.7341326 2.8936807 6.1678152 10.3446685 11.7002555 21.0960758 16.5352245 32.2084942 4.8995467 11.2622344 9.0867303 22.8954305 12.5044868 34.8382086 0 0 45.0041042-46.3863227 27.6944213-69.9403835zm-629.5734431 294.3797539c13.6858848 18.6189721 61.3258973-3.1309266 61.3258973-3.1309266-6.6716772-11.1802827-12.6484216-22.8033047-17.8755617-34.8139472-5.2966478-12.1727565-9.8213865-24.7454316-13.5171072-37.6545218 0 0-48.6427553 50.1397674-29.9332284 75.5993956z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.0 KiB |
@@ -88,7 +88,6 @@ android {
|
||||
buildConfigField 'String', 'SUPPORT_MAIL', '"android@comaps.app"'
|
||||
// Should be customized in flavors.
|
||||
buildConfigField 'String', 'REVIEW_URL', '""'
|
||||
resourceConfigurations += [project.ext.supportedLocalizations]
|
||||
|
||||
externalNativeBuild {
|
||||
def pchFlag = 'OFF'
|
||||
@@ -216,7 +215,7 @@ android {
|
||||
android.applicationVariants.all { variant ->
|
||||
def task = variant.name.capitalize()
|
||||
project.task(type: Exec, "run${task}", dependsOn: "install${task}") {
|
||||
commandLine android.getAdbExe(), 'shell', 'am', 'start', '-n', "$applicationId/app.comaps.DownloadResourcesActivity", '-a', 'android.intent.action.MAIN', '-c', 'android.intent.category.LAUNCHER'
|
||||
commandLine android.getAdbExe(), 'shell', 'am', 'start', '-n', "$applicationId/app.organicmaps.DownloadResourcesActivity", '-a', 'android.intent.action.MAIN', '-c', 'android.intent.category.LAUNCHER'
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -336,6 +335,58 @@ android {
|
||||
androidResources {
|
||||
ignoreAssetsPattern '!.svn:!.git:!.DS_Store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~'
|
||||
noCompress = ['txt', 'bin', 'html', 'png', 'json', 'mwm', 'ttf', 'sdf', 'ui', 'config', 'csv', 'spv', 'obj']
|
||||
localeFilters += [
|
||||
"af",
|
||||
"ar",
|
||||
"az",
|
||||
"be",
|
||||
"bg",
|
||||
"ca",
|
||||
"cs",
|
||||
"da",
|
||||
"de",
|
||||
"el",
|
||||
"en",
|
||||
"en-rGB",
|
||||
"es",
|
||||
"es-rMX",
|
||||
"et",
|
||||
"eu",
|
||||
"fa",
|
||||
"fi",
|
||||
"fr",
|
||||
"fr-rCA",
|
||||
"iw",
|
||||
"hi",
|
||||
"hu",
|
||||
"in",
|
||||
"it",
|
||||
"ja",
|
||||
"ko",
|
||||
"lt",
|
||||
"lv",
|
||||
"mr",
|
||||
"mt",
|
||||
"nb",
|
||||
"nl",
|
||||
"pl",
|
||||
"pt",
|
||||
"pt-rBR",
|
||||
"ro",
|
||||
"ru",
|
||||
"sk",
|
||||
"sr",
|
||||
"sv",
|
||||
"sw",
|
||||
"th",
|
||||
"tr",
|
||||
"uk",
|
||||
"vi",
|
||||
"zh",
|
||||
"zh-rHK",
|
||||
"zh-rMO",
|
||||
"zh-rTW"
|
||||
]
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
@@ -390,7 +441,6 @@ dependencies {
|
||||
androidTestImplementation libs.androidx.test.junit
|
||||
testImplementation libs.junit
|
||||
testImplementation libs.mockito.core
|
||||
testImplementation libs.mockito.inline
|
||||
}
|
||||
|
||||
tasks.withType(JavaCompile) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
Komunitou vedené bezplatná a otevřená mapová aplikace založená na datech z projektu OpenStreetMap a posílená závazkem k transparentnosti, soukromí a neziskovosti. Aplikace CoMaps je fork/odnož aplikace Organic Maps, která je zase forkem aplikace Maps.ME.
|
||||
Komunitou vedená bezplatná a otevřená mapová aplikace založená na datech z projektu OpenStreetMap a posílená závazkem k transparentnosti, soukromí a neziskovosti. Aplikace CoMaps je fork/odnož aplikace Organic Maps, která je zase forkem aplikace Maps.ME.
|
||||
|
||||
Důvody vzniku projektu a jeho směr si můžete přečíst na adrese <b><i>codeberg.org/comaps</i></b>.
|
||||
Můžete se zde také připojit ke komunitě pomáhat s vytvářením nejlepší mapové aplikace
|
||||
|
||||
@@ -1,32 +1,33 @@
|
||||
Eine von der Community betriebene, kostenlose Open-Source Karten App, die auf OpenStreetMap Daten basiert. Transparent, Daten sparsam und nicht gewinnorientiert. CoMaps ist ein Fork/Abspaltung von Organic Maps, das wiederum ein Fork/Abspaltung von Maps.Me ist.
|
||||
Eine von der Community betriebene, kostenlose Open-Source Karten-App, die auf OpenStreetMap Daten basiert. Transparent, datensparsam und nicht gewinnorientiert. CoMaps ist ein Fork/Abspaltung von Organic Maps, die wiederum ein Fork/Abspaltung von Maps.Me ist.
|
||||
|
||||
Lese mehr über die Gründe und Ziele des Projekt unter <b><i>codeberg.org/comaps</i></b>.
|
||||
Lese mehr über die Gründe und Ziele des Projektes unter <b><i>codeberg.org/comaps</i></b>.
|
||||
Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
|
||||
• Nutze die App und erzähle anderen davon
|
||||
• Gib Feedback und melde Probleme
|
||||
• Aktualisiere Kartendaten in der App oder auf der OpenStreetMap Website
|
||||
• Aktualisiere Kartendaten in der App oder auf der OpenStreetMap-Webseite
|
||||
|
||||
‣ <b>Einfach und ausgereift</b>: Essenzielle, leicht zu bedienende Funktionen, die einfach funktionieren.
|
||||
‣ <b>Offline-orientiert</b>: Plane und navigiere im Ausland ohne Mobilfunkverbindung, finde Wegpunkte auf abgelegenen Wanderungen usw. Alle Funktionen sind für den Offline-Einsatz konzipiert.
|
||||
‣ <b>Datenschutzfreundlich</b>: Die App wurde mit Fokus auf Privatsphäre entwickelt – keine Personenidentifikation, kein Tracking, keine Erfassung persönlicher Daten, keine Werbung.
|
||||
‣ <b>Spart Akku und Speicherplatz</b>: Verbraucht nicht unnötig Akku wie andere Navi-Apps. Kompakte Karten sparen Speicherplatz auf deinem Gerät.
|
||||
‣ <b>Kostenlos und von der Community entwickelt</b>: Menschen wie du haben geholfen die App zu entwickeln – durch das Hinzufügen von Orten zu OpenStreetMap, Testen von neuen Funktionen, Software Entwicklung oder Spenden.
|
||||
‣ <b>Offen und transparent bei Entscheidungen und Finanzen, gemeinnützig und vollständig Open Source</b>
|
||||
‣ <b>Kostenlos und von der Community entwickelt</b>: Menschen wie du haben geholfen, diese App zu entwickeln – durch das Hinzufügen von Orten zu OpenStreetMap, Testen von neuen Funktionen, Softwareentwicklung oder Spenden.
|
||||
‣ <b>Offen und transparent bei Entscheidungen und Finanzen, gemeinnützig und vollständig Open-Source</b>
|
||||
|
||||
<b>Hauptfunktionen</b>:
|
||||
<ul>
|
||||
• Detaillierte, herunterladbare Karten mit Orten, die bei Google Maps oft fehlen
|
||||
• Outdoor-Modus mit hervorgehobenen Wanderwegen, Campingplätzen, Wasserquellen, Gipfeln, Höhenlinien usw.
|
||||
• Geh- und Radwege
|
||||
• Orte wie Restaurants, Tankstellen, Hotels, Geschäfte, Sehenswürdigkeiten und viele mehr
|
||||
• Suche nach Namen, Adressen oder Kategorien
|
||||
• Navigation mit Sprachausgabe für Fußgänger, Radfahrer und Autos
|
||||
• Sprachausgabe bei der Navigation zu Fuß, Rad oder Auto
|
||||
• Lesezeichen mit einem einzigen Tippen speichern
|
||||
• Offline verfügbare Wikipedia-Artikel
|
||||
• U- und S-Bahn Netze
|
||||
• Aufzeichnen von GPS Tracks
|
||||
• U- und S-Bahn-Netze
|
||||
• Aufzeichnen von GPS-Tracks
|
||||
• Import und Export von Favoriten und Routen im KML-, KMZ- oder GPX-Format
|
||||
• Darkmode für die Nutzung bei Nacht
|
||||
• Dunkler Modus für die Nutzung bei Nacht
|
||||
• Kartenbearbeitung direkt in der App mit einem einfachen Editor
|
||||
|
||||
<b>Freiheit beginnt hier</b>
|
||||
Entdecke deine Reise – navigiere die Welt mit Privatsphäre!
|
||||
Entdecke deine Reise – navigiere in der Welt mit Datenschutz!
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
Erster CoMaps Release!
|
||||
Was ist neu im Vergleich zu Organic Maps:
|
||||
• OpenStreetMap-Daten vom 15. Mai
|
||||
• OSM Login jetzt über den Webbrowser
|
||||
• Der halbtransparente Hintergrund in der U-Bahn-Ansicht wurde entfernt
|
||||
• Größe der lokalen Karte beim ersten Karten download anzeigen
|
||||
• Der Metaserver wurde durch eine feste Liste an Kartenservern ersetzt
|
||||
• Der Nachtmodus schaltet jetzt besser um, auch wenn kein GPS-Signal da ist
|
||||
• OpenStreetMap Daten vom 2. Juni
|
||||
• Neue Einstellungsoption zum Ändern oder Ausblenden der "Über CoMaps" Schaltfläche ganz links
|
||||
• Routen als GPS Track speichern
|
||||
• Qingdao Metro, Gärtnereien, Leitplanken, Leitern, Studios, Tanzsäle, Feuerstellen und Stundenhotels hinzugefügt
|
||||
• transparente Navigationsleiste im Light Mode
|
||||
• Mastodon und Bluesky Kontaktoptionen für POIs und im OSM-Editor hinzugefügt
|
||||
• Anzeige der Kompassgradzahl in der Richtungspfeilansicht
|
||||
• Übersetzungen aktualisiert
|
||||
• Rebranding – das Logo ist noch vorläufig
|
||||
|
||||
@@ -1 +1 @@
|
||||
Einfache Navigation - Entdecken Sie mehr von Ihrer Reise - Community basiert
|
||||
Einfache Navigation - Entdecken Sie mehr von Ihrer Reise - Community-Entwickelt
|
||||
|
||||
@@ -1 +1 @@
|
||||
CoMaps – Offline und privat navigieren
|
||||
CoMaps – Offline navigieren mit Datenschutz
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
Initial CoMaps release!
|
||||
Changes from the Organic Maps upstream:
|
||||
• OpenStreetMap data as of May 15
|
||||
• login to OSM account via a web browser
|
||||
• removed semi-transparent background in Subway layer
|
||||
• replaced metaserver with a static map servers list
|
||||
• add local map size to the startup download screen
|
||||
• improved auto night mode switch when there is no location fix
|
||||
• fix incorrect map info when tapping on a not downloaded region
|
||||
• OpenStreetMap data as of June 2
|
||||
• add a setting to change the leftmost button or hide it
|
||||
• save built routes as tracks
|
||||
• add Qingdao metro, plant nurseries, highway guard rails, ladders, studios, dance venues, firepits, love hotels
|
||||
• transparent system navigation bar in the light mode
|
||||
• add Mastodon and Bluesky contact options to POIs and OSM editor
|
||||
• display Azimuth angle in direction arrow view
|
||||
• update translations
|
||||
• rebranding - the logo is provisional still
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
Lanzamiento inicial de CoMaps
|
||||
|
||||
Cambios respecto a la versión de Organic Maps:
|
||||
• Datos nuevos al 15 de mayo
|
||||
• Inicio de sesión a OSM a través de navegador
|
||||
• Eliminado fondo semitransparente en la capa de Metro
|
||||
• Sustitución del metaserver por lista estática de servidores
|
||||
• Añadido tamaño del mapa local al inicio
|
||||
• Mejora del cambio automático al modo nocturno al no conocerse ubicación
|
||||
• Correcciones de fallos
|
||||
• Actualización de traducciones
|
||||
• Cambio de branding con logo provisional
|
||||
@@ -0,0 +1 @@
|
||||
Helppo karttanavigointi - Löydä lisää matkaltasi - Yhteisön voimin
|
||||
1
android/app/src/fdroid/play/listings/fi-FI/title.txt
Normal file
1
android/app/src/fdroid/play/listings/fi-FI/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
CoMaps - Patikoi, pyöräile, autoile ilman verkkoyhteyttä yksityisesti
|
||||
@@ -0,0 +1,34 @@
|
||||
Une application cartographique créée par la communauté, gratuite et open source basée sur les données OpenStreetMap et engagée pour la transparence, le respect de la vie privée et son but non lucratif.
|
||||
|
||||
Lisez-en plus sur le projet et sa direction sur <b><i>codeberg.org/comaps</i></b>.
|
||||
Rejoignez la communauté et aidez-nous à créer la meilleure application de navigation
|
||||
• Utilisez l'application et faites-la connaître
|
||||
• Donnez-nous votre avis et signalez les problèmes
|
||||
• Corrigez la carte dans l'application ou sur le site web d'OpenStreetMap
|
||||
|
||||
‣ <b>Centrée sur le hors-ligne</b> : Planifiez et effectuez votre trajet à l'étranger sans avoir besoin de réseau mobile, recherchez des points de passage lors d'une randonnée lointaine, etc. Toutes les fonctionnalités de l'application sont faites pour fonctionner hors-ligne.
|
||||
‣ <b>Respecte la vie privée</b> : L'application est conçue avec la vie privée en tête - elle n'identifie pas ses utilisateurs, ne les piste pas et ne collecte pas d'informations personnelles. Sans pub.
|
||||
‣ <b>Simple et soignée</b> : des fonctionnalités faciles à utiliser, essentielles et qui fonctionnent.
|
||||
‣ <b>Économise votre batterie et votre stockage</b> : Ne vide pas votre batterie comme les autres applications de navigation. Les cartes compactes économisent de l'espace sur votre téléphone.
|
||||
‣ <b>Gratuit et créé par la communauté</b> : Des gens comme vous ont aidé à créer l'application en ajoutant des lieux sur OpenStreetMap, en la testant, en donnant leur avis sur les fonctionnalités et en contribuant au développement et aux frais financiers.
|
||||
‣ <b>Prises de décisions et comptes clairs et transparents, but non lucratif et complètement open source.</b>
|
||||
|
||||
<b>Fonctionnalités principales :</b>
|
||||
<ul>
|
||||
<li>Cartes détaillées téléchargeables avec des lieux non disponibles sur Google Maps</li>
|
||||
<li>Mode extérieur avec sentiers de randonnée, campings, sources d'eau, sommets, courbes de niveau, etc. surlignés</li>
|
||||
<li>Chemins piétons et pistes cyclables</li>
|
||||
<li>Points d'intérêt comme des restaurants, stations-service, hôtels, magasins, lieux touristiques et bien plus</li>
|
||||
<li>Recherche par nom, adresse ou catégorie de point d'intérêt</li>
|
||||
<li>Navigation avec annonces vocales pour la marche, le vélo ou la conduite</li>
|
||||
<li>Mettez en favori vos lieux préférés en un seul clic</li>
|
||||
<li>Articles Wikipédia hors-ligne</li>
|
||||
<li>Plan de métro et indications pour s'y rendre</li>
|
||||
<li>Enregistrement des parcours</li>
|
||||
<li>Exportez et importez vos favoris aux formats KML, KMZ et GPX</li>
|
||||
<li>Mode sombre pour utiliser pendant la nuit</li>
|
||||
<li>Amélioration de la carte par tout le monde avec un éditeur simple intégré</li>
|
||||
</ul>
|
||||
|
||||
<b>La liberté est ici</b>
|
||||
Découvrez votre voyage, naviguez dans le monde en plaçant la vie privée et la communauté au premier plan !
|
||||
@@ -1,11 +1,8 @@
|
||||
Première version de CoMaps!
|
||||
Changements par rapport à Organic Maps:
|
||||
• Données OpenStreetMap du 15 mai
|
||||
• Connexion au compte OSM via le navigateur
|
||||
• Retrait du fond semi-transparent sur la couche Métro
|
||||
• Remplacement du metaserveur par une liste statique de serveurs
|
||||
• Ajout de la taille de la carte locale au premier démarrage
|
||||
• Amélioration du mode nuit automatique
|
||||
• Correction de la suggestion de téléchargements de cartes
|
||||
• Données OpenStreetMap du 02 juin
|
||||
• Ajout d'une option pour personnaliser le bouton tout à gauche sur l'écran principal
|
||||
• Ajout de la possibilité d'enregistrer un itinéraire en tant que traces GPS
|
||||
• Ajout du métro de Qingdao, et divers objets sur la carte
|
||||
• Support de la barre de navigation transparent en mode clair
|
||||
• Ajout des tags Mastodon et Bluesky sur les lieux et dans l'éditeur
|
||||
• Affichage de l'azimut
|
||||
• Mise à jour des traductions
|
||||
• Rebranding - le logo est encore provisoire
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
Navigation facile - Découvrez plus lors de votre voyage - Fait par la communauté
|
||||
1
android/app/src/fdroid/play/listings/fr-FR/title.txt
Normal file
1
android/app/src/fdroid/play/listings/fr-FR/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
CoMaps - Randonnée, vélo, conduite hors ligne en toute confidentialité
|
||||
34
android/app/src/fdroid/play/listings/hr/full-description.txt
Normal file
34
android/app/src/fdroid/play/listings/hr/full-description.txt
Normal file
@@ -0,0 +1,34 @@
|
||||
Besplatna aplikacija otvorenog koda koju vodi zajednica i temelji se na podacima OpenStreetMap-a, usmjerana transparentnosti, privatnosti i neprofitnosti. CoMaps je fork Organic Maps aplikacije, koja je pak fork Maps.ME.
|
||||
|
||||
Pročitajte o razlozima za projekt i njegovom smjeru na <b><i>codeberg.org/comaps</i></b>.
|
||||
Pridružite se otvorenoj zajednici i pomozite izraditi najbolju aplikaciju za karte
|
||||
• Koristite aplikaciju i proširite glas o njoj
|
||||
• Dajte povratne informacije i prijavite probleme
|
||||
• Ažurirajte podatke na karti u aplikaciji ili na web stranici OpenStreetMap-a
|
||||
|
||||
‣ <b>Fokusirana na Offline rad</b>: Planirajte i upravljajte svojim putovanjem u inozemstvo bez potrebe za mobilnom uslugom, tražite putne točke dok ste na udaljenom pješačenju itd. Sve funkcije aplikacije dizajnirane su za offline rad.
|
||||
‣ <b>Poštivanje privatnosti</b>: Aplikacija je dizajnirana imajući na umu privatnost - ne identificira ljude, ne prati i ne prikuplja osobne podatke. Bez reklama.
|
||||
‣ <b>Jednostavna i dotjerana</b>: aplikacija je trivijalna za korištenje i jednostavno radi.
|
||||
‣ <b>Štedi vašu bateriju i prostor</b>: Ne troši bateriju kao druge navigacijske aplikacije. Kompaktne karte štede dragocjeni prostor na vašem telefonu.
|
||||
‣ <b>Otvorena i izrađena od strane zajednice</b>: Ljudi poput vas pomogli su izraditi aplikaciju dodavanjem lokacija na OpenStreetMap-u, testiranjem i davanjem povratnih informacija o aplikaciji te doprinoseći svojim razvojnim vještinama i novcem.
|
||||
‣ <b>Otvoreno i transparentno donošenje odluka i korištenja financija, Neprofitna i potpuno Otvorenog koda.</b>
|
||||
|
||||
<b>Glavne značajke</b>:
|
||||
<ul>
|
||||
<li>Preuzimanje detaljnih karti s lokacijama koje nisu dostupne s Google kartama</li>
|
||||
<li>Karte za izlete s istaknutim pješačkim stazama, kampovima, izvorima vode, planinskim vrhovima, konturnim linijama itd.</li>
|
||||
<li>Pješačke i biciklističke staze</li>
|
||||
<li>Točke interesa kao što su restorani, benzinske crpke, hoteli, trgovine, vidikovci i još mnogo toga</li>
|
||||
<li>Pretražujte po nazivu ili adresi ili po kategoriji interesa</li>
|
||||
<li>Navigacija s glasovnim najavama za hodanje, vožnju biciklom ili automobilom</li>
|
||||
<li>Obilježite svoja omiljena mjesta jednim dodirom</li>
|
||||
<li>Offline članci Wikipedije</li>
|
||||
<li>Tranzitni sloj podzemne željeznice sa navigacijom</li>
|
||||
<li>Snimanje GPS tragova</li>
|
||||
<li>Izvoz i uvoz oznaka i staza u KML, KMZ, i GPX formatima</li>
|
||||
<li>Tamni način rada za korištenje tijekom noći</li>
|
||||
<li>Poboljšajte kartu za sve korisnike, koristeći osnovni ugrađeni uređivač karte</li>
|
||||
</ul>
|
||||
|
||||
<b>Sloboda je ovdje</b>
|
||||
Otkrijte svoje putovanje, navigirajte svijetom s privatnošću i zajednicom na prvom mjestu!
|
||||
@@ -0,0 +1 @@
|
||||
Jednostavna navigacija - Otkrijte više o svom putovanju - Pokreće zajednica
|
||||
1
android/app/src/fdroid/play/listings/hr/title.txt
Normal file
1
android/app/src/fdroid/play/listings/hr/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
CoMaps - Pješačite, biciklirajte, vozite Offline i privatno
|
||||
@@ -0,0 +1,8 @@
|
||||
• Data di OpenStreetmap fino a giugno 2°
|
||||
• Nuova impostazione per cambiare o modificare la positione del tasto sinistra
|
||||
• Salvare i percorsi costruiti come tracce
|
||||
• È stato aggiunto: metropolitana di Qingdao, giardinaggi, guardrail, scale, studio,
|
||||
sala da ballo, focolari, love hotel
|
||||
• Barra di navigatione transparente di sisteme in moda luce
|
||||
• Aggiungi le opzioni di contatto Mastodon e Bluesky ai POI e all'editor di OSM
|
||||
• Visualizza l'angolo di azimut nella freccia di direzione
|
||||
1
android/app/src/fdroid/play/listings/it-IT/title.txt
Normal file
1
android/app/src/fdroid/play/listings/it-IT/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
CoMaps - Navigazione Offline con Privacy
|
||||
@@ -1,11 +0,0 @@
|
||||
Pierwsze wydanie CoMaps!
|
||||
Zmiany w stosunku do Organic Maps:
|
||||
• dane OSM z 15.05,
|
||||
• logowanie do OSM przez przeglądarkę,
|
||||
• usunięto półprzezroczyste tło w warstwie Metra,
|
||||
• zastąpiono metaserver statyczną listą serwerów map,
|
||||
• dodano rozmiar mapy do ekranu pobierania przy uruchamianiu,
|
||||
• poprawiono przełączanie trybu nocnego bez lokalizacji,
|
||||
• poprawiono niepoprawne informacje o mapie po dotknięciu niepobranego regionu,
|
||||
• zaktualizowano tłumaczenia,
|
||||
• rebranding - logo wciąż tymczasowe.
|
||||
@@ -0,0 +1,35 @@
|
||||
Um aplicativo de mapas gratuito e de código aberto, liderado pela comunidade e baseado em dados do OpenStreetMap, reforçado pelo compromisso com a transparência, privacidade e sem fins lucrativos. O CoMaps é um fork/spin-off do Organic Maps, que por sua vez é um fork do Maps.Me.
|
||||
|
||||
Leia mais sobre os motivos do projeto e sua direção em <b><i>codeberg.org/comaps</i></b>.
|
||||
Junte-se à comunidade e ajude a criar o melhor aplicativo de mapas.
|
||||
• Use o aplicativo e divulgue-o.
|
||||
• Envie feedback e relate problemas.
|
||||
• Atualize os dados do mapa no aplicativo ou no site do OpenStreetMap.
|
||||
|
||||
‣ <b>Foco offline</b>: Planeje e navegue em sua viagem ao exterior sem a necessidade de sinal de celular, pesquise pontos de referência durante uma caminhada distante, etc. Todas as funções do aplicativo foram projetadas para funcionar offline.
|
||||
‣ <b>Respeito à privacidade</b>: O aplicativo foi projetado com a privacidade em mente - não identifica pessoas, não rastreia e não coleta informações pessoais. Livre de anúncios.
|
||||
|
||||
‣ <b>Simples e sofisticado</b>: recursos essenciais e fáceis de usar que simplesmente funcionam.
|
||||
‣ <b>Economiza bateria e espaço</b>: Não esgota a bateria como outros aplicativos de navegação. Mapas compactos economizam espaço precioso no seu celular.
|
||||
‣ <b>Gratuito e desenvolvido pela comunidade</b>: Pessoas como você ajudaram a desenvolver o aplicativo adicionando lugares ao OpenStreetMap, testando e dando feedback sobre os recursos e contribuindo com suas habilidades de desenvolvimento e dinheiro.
|
||||
‣ <b>Tomada de decisões e finanças abertas e transparentes, sem fins lucrativos e totalmente de código aberto.</b>
|
||||
|
||||
<b>Principais recursos</b>:
|
||||
<ul>
|
||||
<li>Mapas detalhados para download com locais não disponíveis no Google Maps</li>
|
||||
<li>Modo ao ar livre com trilhas em destaque, acampamentos, fontes de água, picos, curvas de nível, etc.</li>
|
||||
<li>Trilhas para caminhada e ciclovias</li>
|
||||
<li>Pontos de interesse como restaurantes, postos de gasolina, hotéis, lojas, pontos turísticos e muito mais</li>
|
||||
<li>Pesquise por nome, endereço ou categoria de ponto de interesse</li>
|
||||
<li>Navegação com anúncios de voz para caminhada, ciclismo ou direção</li>
|
||||
<li>Marque seus lugares favoritos com um único toque</li>
|
||||
<li>Artigos offline da Wikipédia</li>
|
||||
<li>Caminho de transporte e direções do metrô</li>
|
||||
<li>Gravação de trilhas</li>
|
||||
<li>Exporte e importe favoritos e trilhas em Formatos KML, KMZ, GPX</li>
|
||||
<li>Um modo escuro para usar à noite</li>
|
||||
<li>Aprimore os dados do mapa para todos usando um editor básico integrado</li>
|
||||
</ul>
|
||||
|
||||
<b>A Liberdade Chegou</b>
|
||||
Descubra sua jornada, navegue pelo mundo com privacidade e comunidade em primeiro lugar!
|
||||
@@ -1,9 +1,8 @@
|
||||
Lançamento inicial do CoMaps!
|
||||
Alterações em relação ao Organic Maps:
|
||||
• Dados do OSM de 15/05
|
||||
• Login na conta OSM por meio de autenticação no navegador
|
||||
• Remoção do fundo semitransparente na camada Metrô
|
||||
• Substituição do metaserver por uma lista estática de servidores de mapas
|
||||
• Melhoria na alternância automática do modo noturno quando não há localização
|
||||
• Dados do OSM de 2/06
|
||||
• Adicionada uma configuração para alterar ou ocultar o botão mais à esquerda
|
||||
• Salve rotas construídas como trilhas
|
||||
• Adicionado metrô de Qingdao, viveiros de plantas, guarda-corpos de rodovias, escadas, estúdios, casas de dança, fogueiras e motéis
|
||||
• Barra de navegação do sistema transparente no modo claro
|
||||
• Adicionadas opções de contato Mastodon e Bluesky aos POIs e ao editor OSM
|
||||
• Exibição de ângulo de azimute na visualização de seta de direção
|
||||
• Novas traduções
|
||||
• Rebranding - O logo ainda é provisório
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
Fácil navegação - Descubra mais sobre sua jornada - Desenvolvido pela comunidade
|
||||
1
android/app/src/fdroid/play/listings/pt-BR/title.txt
Normal file
1
android/app/src/fdroid/play/listings/pt-BR/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
CoMaps - Mapas com Privacidade
|
||||
@@ -1,9 +0,0 @@
|
||||
Lançamento inicial do CoMaps!
|
||||
Alterações em relação ao Organic Maps:
|
||||
• Dados do OSM de 15/05
|
||||
• Login na conta OSM através de um navegador web auth
|
||||
• Removido o fundo semi-transparente na camada do Metro
|
||||
• Substituído o metaserver por uma lista estática de servidores de mapas
|
||||
• Melhoria na mudança automática do modo noturno quando não há localização
|
||||
• Novas traduções
|
||||
• Rebranding - logótipo ainda provisório
|
||||
@@ -0,0 +1,7 @@
|
||||
• карты OpenStreetMap от 2 июня
|
||||
• настройка для изменения функции левой кнопки или её скрытия
|
||||
• сохранение построенных маршрутов в виде треков
|
||||
• добавлены: метро в Qingdao, питомники растений, отбойники на шоссе, постоянные лестницы-стремянки, студии, места для танцев, кострища, отели любви
|
||||
• прозрачная полоска с системными кнопками (в светлом режиме)
|
||||
• в объекты на карте (а также в их редактор) добавлены Mastodon и Bluesky контакты
|
||||
• к стрелке направления на выбранный объект добавлен азимут
|
||||
@@ -9,7 +9,7 @@
|
||||
‣ <b>以提供离线服务为核心</b>:无需移动网络即可规划和导航您的海外旅行,郊外远足时仍可搜索航点等等。所有功能均可离线使用。
|
||||
‣ <b>尊重隐私</b>:开发者们在设计 CoMaps 时,优先考虑的是保护用户隐私。CoMaps 无法识别用户身份、无法跟踪用户活动,也无法收集个人信息。此外,CoMaps 不会也不能显示任何广告。
|
||||
‣ <b>简洁精致</b>:轻便易用、不出差错的基本功能。
|
||||
‣ <b>节省电池和空间</b>:不会像其他导航应用那样耗电。精简的地图可以节省宝贵的手机空间。
|
||||
‣ <b>节省电池电量和空间</b>:不会像其他导航应用那样耗电。精简的地图可以节省宝贵的手机空间。
|
||||
‣ <b>由社区合作创建的免费应用</b>:如同您一样的用户通过向 OpenStreetMap 添加地点、测试功能并提供反馈、无私地贡献自己的编程技能和资金,协力开发了 CoMaps。
|
||||
‣ <b>决策问责、财务透明、非营利性、完全开源。</b>
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
‣ <b>以提供離線服務為核心</b>:無需行動網路即可規劃和導航您的海外旅行,郊外遠足時仍可搜尋航點等等。所有功能均可離線使用。
|
||||
‣ <b>尊重隱私</b>:開發人員在設計 CoMaps 時,優先考慮的是保護使用者隱私。CoMaps 無法辨識使用者身分、無法追蹤使用者活動、無法收集個人資訊,也無法顯示任何廣告。
|
||||
‣ <b>簡潔精緻</b>:易上手、不出錯的基本功能。
|
||||
‣ <b>節省電池和空間</b>:不會像其他導航應用那樣耗電。精簡的地圖可以節省寶貴的手機空間。
|
||||
‣ <b>節省電池電力和空間</b>:不會像其他導航應用那樣耗電。精簡的地圖可以節省寶貴的手機空間。
|
||||
‣ <b>由社群合作創建的免費應用</b>:如同您一樣的使用者透過向 OpenStreetMap 添加地點、測試功能並提供回饋、無私地貢獻自己的編碼技能和資金,協力開發了 CoMaps。
|
||||
‣ <b>決策問責、財務透明、非營利性、完全開源。</b>
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
version: 2025.03.02-7-FDroid+25030207
|
||||
version: 2025.06.10-4-FDroid+25061004
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
Komunitou vedená bezplatná a otevřená mapová aplikace založená na datech z projektu OpenStreetMap a posílená závazkem k transparentnosti, soukromí a neziskovosti.
|
||||
|
||||
Připojte se ke komunitě a pomáhejte s vytvářením nejlepší mapové aplikace
|
||||
• Používejte aplikaci a sdílejte ji se známými
|
||||
• Poskytujte zpětnou vazbu a nahlašujte problémy
|
||||
• Aktualizujte mapová data v aplikaci nebo na webu OpenStreetMap
|
||||
|
||||
<i>Vaše zpětná vazba a 5hvězdičkové hodnocení jsou pro nás nejlepší podporou!</i>
|
||||
|
||||
• <b>Jednoduché a vyladěné</b>: Základní, snadno použitelné funkce, které prostě fungují.
|
||||
• <b>Zaměřené na offline použití</b>: Plánujte a navigujte své cesty do zahraničí bez nutnosti mobilních dat, hledejte body na vzdálených túrách apod. Všechny funkce aplikace jsou navrženy tak, aby fungovaly offline.
|
||||
• <b>S ohledem na soukromí</b>: Aplikace je navržená s důrazem na soukromí – neidentifikuje lidi, nesleduje vás a nesbírá osobní údaje. Bez reklam.
|
||||
• <b>Šetří vaši baterii a místo</b>: Nevybíjí vaší baterii, jako ostatní navigační aplikace. Kompaktní mapy šetří cenné místo ve vašem telefonu.
|
||||
• <b>Bezplatné a vytvořené komunitou</b>: S vytvářením aplikace pomáhají lidé, jako jste vy, přidáváním míst do projektu OpenStreetMap, testováním a poskytováním zpětné vazby k funkcím a přispíváním svými vývojářskými schopnostmi a penězi.
|
||||
• <b>Otevřené a transparentní rozhodování a nakládání s financemi, neziskovost a plně otevřený zdrojový kód.</b>
|
||||
|
||||
<b>Hlavní funkce</b>:
|
||||
• Stahovatelné podrobné mapy s místy, která nenajdete ani v Mapách Google
|
||||
• Outdoorový režim se zvýrazněnými turistickými trasami, tábořišti, vodními zdroji, vrcholy, vrstevnicemi atd.
|
||||
• Pěší trasy a cyklostezky
|
||||
• Body zájmu, jako jsou restaurace, čerpací stanice, hotely, obchody, vyhlídky a mnoho dalšího
|
||||
• Hledání podle názvu nebo adresy nebo podle kategorie bodů zájmu
|
||||
• Navigace s hlasovými pokyny pro chůzi, jízdu na kole nebo řízení
|
||||
• Uložení oblíbených míst jedním klepnutím
|
||||
• Offline články z Wikipedie
|
||||
• Vrstva metra a navigace v něm
|
||||
• Záznam tras
|
||||
• Export a import záložek a tras ve formátech KML, KMZ a GPX
|
||||
• Tmavý režim k použití během noci
|
||||
• Zlepšování mapových dat pro všechny pomocí jednoduchého vestavěného editoru
|
||||
• Podpora Android Auto
|
||||
|
||||
Nahlaste problémy s aplikací, navrhněte funkce a připojte se k naší komunitě na webu <b><i>comaps.app</i></b>.
|
||||
|
||||
<b>Svoboda je tady</b>
|
||||
Objevujte své cesty, navigujte se světem se soukromím a komunitou na prvním místě!
|
||||
@@ -0,0 +1 @@
|
||||
Jednoduchá navigace v mapě – Objevte více na své cestě – Vyvíjeno komunitou
|
||||
1
android/app/src/google/play/listings/cs-CZ/title.txt
Normal file
1
android/app/src/google/play/listings/cs-CZ/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
CoMaps – Navigace se soukromím
|
||||
@@ -1,17 +1,17 @@
|
||||
Eine von der Community betriebene, kostenlose Open-Source Karten App, die auf OpenStreetMap Daten basiert. Transparent, Daten sparsam und nicht gewinnorientiert.
|
||||
Eine von der Community betriebene, kostenlose Open-Source Karten App, die auf OpenStreetMap-Daten basiert. Transparent, datensparsam und nicht gewinnorientiert.
|
||||
|
||||
Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
|
||||
• Nutze die App und erzähle anderen davon
|
||||
• Gib Feedback und melde Probleme
|
||||
• Aktualisiere Kartendaten in der App oder auf der OpenStreetMap Website
|
||||
|
||||
<i>Dein Feedback und deine 5 Sterne Bewertung sind die beste Unterstützung für uns!</i>
|
||||
<i>Dein Feedback und deine 5-Sterne-Bewertung sind die beste Unterstützung für uns!</i>
|
||||
|
||||
‣ <b>Einfach und ausgereift</b>: Essenzielle, leicht zu bedienende Funktionen, die einfach funktionieren.
|
||||
‣ <b>Offline-orientiert</b>: Plane und navigiere im Ausland ohne Mobilfunkverbindung, finde Wegpunkte auf abgelegenen Wanderungen usw. Alle Funktionen sind für den Offline-Einsatz konzipiert.
|
||||
‣ <b>Datenschutzfreundlich</b>: Die App wurde mit Fokus auf Privatsphäre entwickelt – keine Personenidentifikation, kein Tracking, keine Erfassung persönlicher Daten, keine Werbung.
|
||||
‣ <b>Spart Akku und Speicherplatz</b>: Verbraucht nicht unnötig Akku wie andere Navi-Apps. Kompakte Karten sparen Speicherplatz auf deinem Gerät.
|
||||
‣ <b>Kostenlos und von der Community entwickelt</b>: Menschen wie du haben geholfen die App zu entwickeln – durch das Hinzufügen von Orten zu OpenStreetMap, Testen von neuen Funktionen, Software Entwicklung oder Spenden.
|
||||
‣ <b>Spart Akku und Speicherplatz</b>: Verbraucht nicht unnötig Akku wie andere Navi-Apps. Kompakte Karten sparen Speicherplatz auf Deinem Gerät.
|
||||
‣ <b>Kostenlos und von der Community entwickelt</b>: Menschen wie du haben geholfen, die App zu entwickeln – durch das Hinzufügen von Orten zu OpenStreetMap, Testen von neuen Funktionen, Softwareentwicklung oder Spenden.
|
||||
‣ <b>Offen und transparent bei Entscheidungen und Finanzen, gemeinnützig und vollständig Open Source</b>
|
||||
|
||||
<b>Hauptfunktionen</b>:
|
||||
@@ -20,17 +20,17 @@ Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
|
||||
• Geh- und Radwege
|
||||
• Orte wie Restaurants, Tankstellen, Hotels, Geschäfte, Sehenswürdigkeiten und viele mehr
|
||||
• Suche nach Namen, Adressen oder Kategorien
|
||||
• Navigation mit Sprachausgabe für Fußgänger, Radfahrer und Autos
|
||||
• Sprachausgabe bei der Navigation zu Fuß, Rad oder Auto
|
||||
• Lesezeichen mit einem einzigen Tippen speichern
|
||||
• Offline verfügbare Wikipedia-Artikel
|
||||
• U- und S-Bahn Netze
|
||||
• U- und S-Bahn-Netze
|
||||
• Aufzeichnen von GPS Tracks
|
||||
• Import und Export von Favoriten und Routen im KML-, KMZ- oder GPX-Format
|
||||
• Darkmode für die Nutzung bei Nacht
|
||||
• Dunkler Modus für die Nutzung bei Nacht
|
||||
• Kartenbearbeitung direkt in der App mit einem einfachen Editor
|
||||
• Unterstützung für Android Auto
|
||||
|
||||
Bitte melde Probleme, schlage neue Funktionen vor und werde Teil der Community auf unserer Website: <b><i>comaps.app</i></b>
|
||||
|
||||
<b>Freiheit beginnt hier</b>
|
||||
Entdecke deine Reise – navigiere die Welt mit Privatsphäre!
|
||||
Entdecke deine Reise – navigiere in der Welt mit Datenschutz!
|
||||
|
||||
@@ -1 +1 @@
|
||||
Einfache Navigation - Entdecken Sie mehr von Ihrer Reise - Community basiert
|
||||
Einfache Navigation - Entdecken Sie mehr von Ihrer Reise - Community-Entwickelt
|
||||
|
||||
@@ -1 +1 @@
|
||||
CoMaps – Privat navigieren
|
||||
CoMaps: Navigation Datenschutz
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
Helppo karttanavigointi - Löydä lisää matkaltasi - Yhteisön voimin
|
||||
1
android/app/src/google/play/listings/fi-FI/title.txt
Normal file
1
android/app/src/google/play/listings/fi-FI/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
CoMaps - Navigoi yksityisesti
|
||||
@@ -0,0 +1,36 @@
|
||||
Une application cartographique créée par la communauté, gratuite et open source basée sur les données OpenStreetMap et engagée pour la transparence, le respect de la vie privée et son but non lucratif.
|
||||
|
||||
Rejoignez la communauté et aidez-nous à créer la meilleure application de navigation
|
||||
• Utilisez l'application et faites-la connaître
|
||||
• Donnez-nous votre avis et signalez les problèmes
|
||||
• Corrigez la carte dans l'application ou sur le site web d'OpenStreetMap
|
||||
|
||||
<i>Vos commentaires et une note de 5 étoiles sont notre meilleur soutien !</i>
|
||||
|
||||
‣ <b>Simple et soignée</b> : des fonctionnalités faciles à utiliser, essentielles et qui fonctionnent.
|
||||
‣ <b>Centrée sur le hors-ligne</b> : Planifiez et effectuez votre trajet à l'étranger sans avoir besoin de réseau mobile, recherchez des points de passage lors d'une randonnée lointaine, etc. Toutes les fonctionnalités de l'application sont faites pour fonctionner hors-ligne.
|
||||
‣ <b>Respecte la vie privée</b> : L'application est conçue avec la vie privée en tête - elle n'identifie pas ses utilisateurs, ne les piste pas et ne collecte pas d'informations personnelles. Sans pub.
|
||||
‣ <b>Économise votre batterie et votre stockage</b> : Ne vide pas votre batterie comme les autres applications de navigation. Les cartes compactes économisent de l'espace sur votre téléphone.
|
||||
‣ <b>Gratuit et créé par la communauté</b> : Des gens comme vous ont aidé à créer l'application en ajoutant des lieux sur OpenStreetMap, en la testant, en donnant leur avis sur les fonctionnalités et en contribuant au développement et aux frais financiers.
|
||||
‣ <b>Prises de décisions et comptes clairs et transparents, but non lucratif et complètement open source.</b>
|
||||
|
||||
<b>Fonctionnalités principales :</b>
|
||||
• Cartes détaillées téléchargeables avec des lieux non disponibles sur Google Maps
|
||||
• Mode extérieur avec sentiers de randonnée, campings, sources d'eau, sommets, courbes de niveau, etc. surlignés
|
||||
• Chemins piétons et pistes cyclables
|
||||
• Points d'intérêt comme des restaurants, stations-service, hôtels, magasins, lieux touristiques et bien plus
|
||||
• Recherche par nom, adresse ou catégorie de point d'intérêt
|
||||
• Navigation avec annonces vocales pour la marche, le vélo ou la conduite
|
||||
• Mettez en favori vos lieux préférés en un seul clic
|
||||
• Articles Wikipédia hors-ligne
|
||||
• Plan de métro et indications pour s'y rendre
|
||||
• Enregistrement des parcours
|
||||
• Exportez et importez vos favoris aux formats KML, KMZ et GPX
|
||||
• Mode sombre pour utiliser pendant la nuit
|
||||
• Amélioration de la carte par tout le monde avec un éditeur simple intégré
|
||||
• Support pour Android Auto
|
||||
|
||||
Veuillez signaler les problèmes, suggérer des idées et rejoindre notre communauté sur le site <b><i>comaps.app</i></b>.
|
||||
|
||||
<b>La liberté est ici</b>
|
||||
Découvrez votre voyage, naviguez dans le monde en plaçant la vie privée et la communauté au premier plan !
|
||||
@@ -0,0 +1 @@
|
||||
Navigation facile - Découvrez plus lors de votre voyage - Fait par la communauté
|
||||
1
android/app/src/google/play/listings/fr-FR/title.txt
Normal file
1
android/app/src/google/play/listings/fr-FR/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
CoMaps - Naviguer sans suivi
|
||||
36
android/app/src/google/play/listings/hr/full-description.txt
Normal file
36
android/app/src/google/play/listings/hr/full-description.txt
Normal file
@@ -0,0 +1,36 @@
|
||||
Besplatna aplikacija otvorenog koda koju vodi zajednica i temelji se na podacima OpenStreetMap-a, usmjerana transparentnosti, privatnosti i neprofitnosti.
|
||||
|
||||
Pridružite se otvorenoj zajednici i pomozite izraditi najbolju aplikaciju za karte
|
||||
• Koristite aplikaciju i proširite glas o njoj
|
||||
• Dajte povratne informacije i prijavite probleme
|
||||
• Ažurirajte podatke na karti u aplikaciji ili na web stranici OpenStreetMap-a
|
||||
|
||||
<i>Vaše povratne informacije i recenzije s 5 zvjezdica najbolja su nam podrška!</i>
|
||||
|
||||
‣ <b>Jednostavna i dotjerana</b>: aplikacija je trivijalna za korištenje i jednostavno radi.
|
||||
‣ <b>Fokusirana na Offline rad</b>: Planirajte i upravljajte svojim putovanjem u inozemstvo bez potrebe za mobilnom uslugom, tražite putne točke dok ste na udaljenom pješačenju itd. Sve funkcije aplikacije dizajnirane su za offline rad.
|
||||
‣ <b>Poštivanje privatnosti</b>: Aplikacija je dizajnirana imajući na umu privatnost - ne identificira ljude, ne prati i ne prikuplja osobne podatke. Bez reklama.
|
||||
‣ <b>Štedi vašu bateriju i prostor</b>: Ne troši bateriju kao druge navigacijske aplikacije. Kompaktne karte štede dragocjeni prostor na vašem telefonu.
|
||||
‣ <b>Otvorena i izrađena od strane zajednice</b>: Ljudi poput vas pomogli su izraditi aplikaciju dodavanjem lokacija na OpenStreetMap-u, testiranjem i davanjem povratnih informacija o aplikaciji te doprinoseći svojim razvojnim vještinama i novcem.
|
||||
‣ <b>Otvoreno i transparentno donošenje odluka i korištenja financija, Neprofitna i potpuno Otvorenog koda.</b>
|
||||
|
||||
<b>Glavne značajke</b>:
|
||||
• Preuzimanje detaljnih karti s lokacijama koje nisu dostupne s Google kartama
|
||||
• Karte za izlete s istaknutim pješačkim stazama, kampovima, izvorima vode, planinskim vrhovima, konturnim linijama itd.
|
||||
• Pješačke i biciklističke staze
|
||||
• Točke interesa kao što su restorani, benzinske crpke, hoteli, trgovine, vidikovci i još mnogo toga
|
||||
• Pretražujte po nazivu ili adresi ili po kategoriji interesa
|
||||
• Navigacija s glasovnim najavama za hodanje, vožnju biciklom ili automobilom
|
||||
• Obilježite svoja omiljena mjesta jednim dodirom
|
||||
• Offline članci Wikipedije
|
||||
• Tranzitni sloj podzemne željeznice sa navigacijom
|
||||
• Snimanje GPS tragova
|
||||
• Izvoz i uvoz oznaka i staza u KML, KMZ, i GPX formatima
|
||||
• Tamni način rada za korištenje tijekom noći
|
||||
• Poboljšajte kartu za sve korisnike, koristeći osnovni ugrađeni uređivač karte
|
||||
• Android Auto podrška
|
||||
|
||||
Prijavite probleme s aplikacijom, predložite ideje i pridružite se našoj zajednici na web stranici <b><i>comaps.app</i></b>.
|
||||
|
||||
<b>Sloboda je ovdje</b>
|
||||
Otkrijte svoje putovanje, navigirajte svijetom s privatnošću i zajednicom na prvom mjestu!
|
||||
@@ -0,0 +1 @@
|
||||
Jednostavna navigacija - Otkrijte više o svom putovanju - Pokreće zajednica
|
||||
1
android/app/src/google/play/listings/hr/title.txt
Normal file
1
android/app/src/google/play/listings/hr/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
CoMaps - Navigirajte Privatno
|
||||
@@ -0,0 +1,36 @@
|
||||
Una app sviluppata dalla comunità, gratuita e open-source, basata su OpenStreetMap e sull'impegno alla trasparenza, al rispetto della Privacy senza scopo di lucro. CoMaps è uno spin-off di Organic Maps, che a sua volta deriva da Maps.ME.
|
||||
|
||||
Unisciti alla nostra comunità e aiutaci a creare la migliore app di mappe.
|
||||
• usa l'app e consigliala
|
||||
• Dacci il tuo parere e riporta eventuali problemi
|
||||
• Aggiorna i dati delle mappe direttamente nell'app o sul sito OpenStreetMap
|
||||
|
||||
<i>Il vostro feedback e le vostre recensioni a 5 stelle sono il miglior supporto per noi!</i>
|
||||
|
||||
‣ <b>Semplice ed Elegante</b>: funzionalità semplici e affidabili.
|
||||
‣ <b>Offline</b>: Pianifica e percorri il tuo viaggio senza necessità di essere connesso alla rete, cerca tappe mentre sei in una escursione etc. Tutte le funzionalità dell'app sono pensate per operare senza rete.
|
||||
‣ <b>Rispetta la Privacy</b>: L'app è pensata per rispettare la tua Privacy, non identifica le persone e non registra o colleziona i tuoi dati personali. Senza pubblicità.
|
||||
‣ <b>Preserva la Batteria e lo Spazio in Memoria</b>: Non consuma batteria come altre app di navigazione. Le mappe compatte salvano il prezioso spazio del tuo telefono.
|
||||
‣ <b>Gratis e Sviluppata dalla Comunità</b>: Persone come te posso aiutare a migliorare l'app aggiungendo luoghi su OpenStreetMap, testando e dando opinioni sulle funzionalità dell'app e contribuendo al loro sviluppo e sostentamento economico.
|
||||
‣ <b>Aperta e Trasparente nel Processo Decisionale e Finanziario, Senza Scopo di Lucro e Completamente Open Source</b>
|
||||
|
||||
<b>Funzionalità principali</b>:
|
||||
• Scarica mappe dettagliate di luoghi che non sono disponibili su Google Maps
|
||||
• Modalità Outdoor con percorsi escursionistici, campeggi, sorgenti d'acqua, picchi, dislivelli ed altro evidenziati
|
||||
• Strade pedonali e piste ciclabili
|
||||
• Punti d'interesse come ristoranti, stazioni di benzina, hotel, negozi, luoghi turistici e molto altro
|
||||
• Cerca per nome, indirizzo o categoria
|
||||
• Navigazione con assistente vocale a piedi, in bici o in macchina
|
||||
• Salva i tuoi luoghi preferiti con un tocco
|
||||
• Leggi gli articoli Wikipedia Offline
|
||||
• Cartina delle metropolitane con direzioni
|
||||
• Registrazione del percorso
|
||||
• Esporta ed importa i tuoi luoghi preferiti e percorsi nei formati KML, KMZ o GPX
|
||||
• Modalità notturna per la notte
|
||||
• Migliora le mappe per tutti usando l'editor interno
|
||||
• Supporto Android Auto
|
||||
|
||||
Segnalate i problemi delle app, suggerite idee e unitevi alla nostra comunità sul sito <b><i>comaps.app</i></b>.
|
||||
|
||||
<b>La Libertà è Qui</b>
|
||||
Esplora la tua nuova avventura, naviga il mondo con Privacy e la comunità in prima linea!
|
||||
@@ -0,0 +1 @@
|
||||
Navigazione semplice - Immergiti nella tua avventura - Sviluppato dalla comunità
|
||||
1
android/app/src/google/play/listings/it-IT/title.txt
Normal file
1
android/app/src/google/play/listings/it-IT/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
CoMaps - Viaggia con privacy
|
||||
@@ -0,0 +1,45 @@
|
||||
Um aplicativo de mapas gratuito e de código aberto, liderado pela comunidade e baseado em dados do OpenStreetMap, reforçado pelo compromisso com a transparência, privacidade e sem fins lucrativos.
|
||||
|
||||
Junte-se à comunidade e ajude a criar o melhor aplicativo de mapas.
|
||||
|
||||
• Use o aplicativo e divulgue-o.
|
||||
• Envie feedback e relate problemas.
|
||||
• Atualize os dados do mapa no aplicativo ou no site do OpenStreetMap.
|
||||
|
||||
<i>Seu feedback e avaliações 5 estrelas são o nosso melhor suporte!</i>
|
||||
|
||||
‣ <b>Simples e refinado</b>: recursos essenciais e fáceis de usar que simplesmente funcionam.
|
||||
‣ <b>Foco offline</b>: Planeje e navegue em sua viagem ao exterior sem a necessidade de sinal de celular, pesquise pontos de referência durante uma caminhada distante, etc. Todas as funções do aplicativo foram projetadas para funcionar offline.
|
||||
‣ <b>Respeitando a privacidade</b>: O aplicativo foi projetado com a privacidade em mente - não identifica pessoas, não rastreia e não coleta informações pessoais. Livre de anúncios.
|
||||
‣ <b>Economiza bateria e espaço</b>: Não esgota a bateria como outros aplicativos de navegação. Mapas compactos economizam espaço precioso no seu celular.
|
||||
‣ <b>Gratuito e desenvolvido pela comunidade</b>: Pessoas como você ajudaram a desenvolver o aplicativo adicionando locais ao OpenStreetMap, testando e dando feedback sobre os recursos, além de contribuir com suas habilidades de desenvolvimento e recursos financeiros.
|
||||
‣ <b>Tomada de decisões e finanças abertas e transparentes, sem fins lucrativos e totalmente de código aberto.</b>
|
||||
|
||||
‣ Simples e sofisticado: recursos essenciais e fáceis de usar que simplesmente funcionam.
|
||||
‣ Foco offline: Planeje e navegue em sua viagem ao exterior sem a necessidade de sinal de celular, pesquise pontos de referência durante uma caminhada distante, etc. Todas as funções do aplicativo foram projetadas para funcionar offline.
|
||||
‣ Respeito à privacidade: O aplicativo foi projetado com a privacidade em mente - não identifica pessoas, não rastreia e não coleta informações pessoais. Livre de anúncios.
|
||||
‣ Economiza bateria e espaço: Não consome bateria como outros aplicativos de navegação. Mapas compactos economizam espaço precioso no seu celular.
|
||||
‣ Gratuito e desenvolvido pela comunidade: Pessoas como você ajudaram a desenvolver o aplicativo adicionando lugares ao OpenStreetMap, testando e dando feedback sobre os recursos e contribuindo com dinheiro e habilidades de desenvolvimento.
|
||||
‣ Tomada de decisões e finanças abertas e transparentes, sem fins lucrativos e totalmente de código aberto.
|
||||
|
||||
Principais recursos:
|
||||
• Mapas detalhados para download com locais que não estão disponíveis em muitos mapas comerciais
|
||||
• Modo ao ar livre com trilhas destacadas, acampamentos, fontes de água, picos, curvas de nível, etc.
|
||||
• Trilhas para caminhada e ciclovias
|
||||
• Pontos de interesse como restaurantes, postos de gasolina, hotéis, lojas, pontos turísticos e muito mais
|
||||
• Pesquise por nome, endereço ou categoria de ponto de interesse
|
||||
• Navegação com anúncios de voz para caminhada, ciclismo ou direção
|
||||
• Marque seus lugares favoritos com um único toque
|
||||
• Sincronização com iCloud para seus favoritos e trilhas
|
||||
• Artigos offline da Wikipédia
|
||||
• Camada e direções de transporte público de metrô
|
||||
• Gravação de trilhas
|
||||
• Exporte e importe favoritos e trilhas nos formatos KML, KMZ e GPX
|
||||
• Modo escuro para usar à noite
|
||||
• Aprimore os dados do mapa para todos usando um editor básico integrado
|
||||
• Suporte para Android Auto
|
||||
|
||||
Por favor, reporte problemas com o aplicativo, sugira ideias e junte-se à nossa comunidade no site <b><i>comaps.app</i></b>.
|
||||
|
||||
<b>A Liberdade Chegou</b>
|
||||
Descubra sua jornada, navegue pelo mundo com privacidade e comunidade em primeiro lugar!
|
||||
@@ -0,0 +1 @@
|
||||
Fácil navegação - Descubra mais sobre sua jornada - Desenvolvido pela comunidade
|
||||
1
android/app/src/google/play/listings/pt-BR/title.txt
Normal file
1
android/app/src/google/play/listings/pt-BR/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
CoMaps - Navegue privadamente
|
||||
@@ -10,7 +10,7 @@
|
||||
‣ <b>简洁精致</b>:轻便易用、不出差错的基本功能。
|
||||
‣ <b>以提供离线服务为核心</b>:无需移动网络即可规划和导航您的海外旅行,郊外远足时仍可搜索航点等等。所有功能均可离线使用。
|
||||
‣ <b>尊重隐私</b>:开发者们在设计 CoMaps 时,优先考虑的是保护用户隐私。CoMaps 无法识别用户身份、无法跟踪用户活动,也无法收集个人信息。此外,CoMaps 不会也不能显示任何广告。
|
||||
‣ <b>节省电池和空间</b>:不会像其他导航应用那样耗电。精简的地图可以节省宝贵的手机空间。
|
||||
‣ <b>节省电池电量和空间</b>:不会像其他导航应用那样耗电。精简的地图可以节省宝贵的手机空间。
|
||||
‣ <b>由社区合作创建的免费应用</b>:如同您一样的用户通过向 OpenStreetMap 添加地点、测试功能并提供反馈、无私地贡献自己的编程技能和资金,协力开发了 CoMaps。
|
||||
‣ <b>决策问责、财务透明、非营利性、完全开源。</b>
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
‣ <b>簡潔精緻</b>:易上手、不出錯的基本功能。
|
||||
‣ <b>以提供離線服務為核心</b>:無需行動網路即可規劃和導航您的海外旅行,郊外遠足時仍可搜尋航點等等。所有功能均可離線使用。
|
||||
‣ <b>尊重隱私</b>:開發人員在設計 CoMaps 時,優先考慮的是保護使用者隱私。CoMaps 無法辨識使用者身分、無法追蹤使用者活動、無法收集個人資訊,也無法顯示任何廣告。
|
||||
‣ <b>節省電池和空間</b>:不會像其他導航應用那樣耗電。精簡的地圖可以節省寶貴的手機空間。
|
||||
‣ <b>節省電池電力和空間</b>:不會像其他導航應用那樣耗電。精簡的地圖可以節省寶貴的手機空間。
|
||||
‣ <b>由社群合作創建的免費應用</b>:如同您一樣的使用者透過向 OpenStreetMap 添加地點、測試功能並提供回饋、無私地貢獻自己的編碼技能和資金,協力開發了 CoMaps。
|
||||
‣ <b>決策問責、財務透明、非營利性、完全開源。</b>
|
||||
|
||||
|
||||
@@ -25,6 +25,20 @@ set(SRC
|
||||
app/organicmaps/sdk/search/DisplayedCategories.cpp
|
||||
app/organicmaps/sdk/search/SearchEngine.cpp
|
||||
app/organicmaps/sdk/search/SearchRecents.cpp
|
||||
app/organicmaps/sdk/routing/JunctionInfo.hpp
|
||||
app/organicmaps/sdk/routing/RouteMarkData.hpp
|
||||
app/organicmaps/sdk/routing/RouteMarkType.hpp
|
||||
app/organicmaps/sdk/routing/RoutePointInfo.hpp
|
||||
app/organicmaps/sdk/routing/RouteRecommendationType.hpp
|
||||
app/organicmaps/sdk/routing/RoutingInfo.hpp
|
||||
app/organicmaps/sdk/routing/RoutingOptions.cpp
|
||||
app/organicmaps/sdk/routing/SingleLaneInfo.hpp
|
||||
app/organicmaps/sdk/routing/TransitRouteInfo.hpp
|
||||
app/organicmaps/sdk/routing/TransitStepInfo.hpp
|
||||
app/organicmaps/sdk/ChoosePositionMode.cpp
|
||||
app/organicmaps/sdk/MapStyle.cpp
|
||||
app/organicmaps/sdk/OrganicMaps.cpp
|
||||
app/organicmaps/sdk/Router.cpp
|
||||
app/organicmaps/core/jni_helper.cpp
|
||||
app/organicmaps/core/jni_java_methods.cpp
|
||||
app/organicmaps/core/logging.cpp
|
||||
@@ -38,8 +52,6 @@ set(SRC
|
||||
app/organicmaps/LocationState.cpp
|
||||
app/organicmaps/Map.cpp
|
||||
app/organicmaps/MapManager.cpp
|
||||
app/organicmaps/MwmApplication.cpp
|
||||
app/organicmaps/routing/RoutingOptions.cpp
|
||||
app/organicmaps/settings/UnitLocale.cpp
|
||||
app/organicmaps/settings/MapLanguageCode.cpp
|
||||
app/organicmaps/sound/tts.cpp
|
||||
|
||||
@@ -4,6 +4,12 @@
|
||||
#include "app/organicmaps/UserMarkHelper.hpp"
|
||||
#include "app/organicmaps/opengl/androidoglcontextfactory.hpp"
|
||||
#include "app/organicmaps/platform/AndroidPlatform.hpp"
|
||||
#include "app/organicmaps/sdk/routing/JunctionInfo.hpp"
|
||||
#include "app/organicmaps/sdk/routing/RouteMarkData.hpp"
|
||||
#include "app/organicmaps/sdk/routing/RouteMarkType.hpp"
|
||||
#include "app/organicmaps/sdk/routing/RouteRecommendationType.hpp"
|
||||
#include "app/organicmaps/sdk/routing/RoutingInfo.hpp"
|
||||
#include "app/organicmaps/sdk/routing/TransitRouteInfo.hpp"
|
||||
#include "app/organicmaps/util/Distance.hpp"
|
||||
#include "app/organicmaps/util/FeatureIdBuilder.hpp"
|
||||
#include "app/organicmaps/util/NetworkPolicy.hpp"
|
||||
@@ -803,8 +809,8 @@ void CallRouteRecommendationListener(shared_ptr<jobject> listener,
|
||||
RoutingManager::Recommendation recommendation)
|
||||
{
|
||||
JNIEnv * env = jni::GetEnv();
|
||||
jmethodID const methodId = jni::GetMethodID(env, *listener, "onRecommend", "(I)V");
|
||||
env->CallVoidMethod(*listener, methodId, static_cast<int>(recommendation));
|
||||
jmethodID const methodId = jni::GetMethodID(env, *listener, "onRecommend", "(Lapp/organicmaps/sdk/routing/RouteRecommendationType;)V");
|
||||
env->CallVoidMethod(*listener, methodId, GetRouteRecommendationType(env, recommendation));
|
||||
}
|
||||
|
||||
void CallSetRoutingLoadPointsListener(shared_ptr<jobject> listener, bool success)
|
||||
@@ -1137,6 +1143,12 @@ Java_app_organicmaps_Framework_nativeShowTrackRect(JNIEnv * env, jclass, jlong t
|
||||
frm()->ShowTrack(static_cast<kml::TrackId>(track));
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_Framework_nativeSaveRoute(JNIEnv *, jclass)
|
||||
{
|
||||
frm()->SaveRoute();
|
||||
}
|
||||
|
||||
JNIEXPORT jstring JNICALL
|
||||
Java_app_organicmaps_Framework_nativeGetBookmarkDir(JNIEnv * env, jclass)
|
||||
{
|
||||
@@ -1240,7 +1252,7 @@ Java_app_organicmaps_Framework_nativeDisableFollowing(JNIEnv * env, jclass)
|
||||
}
|
||||
|
||||
JNIEXPORT jobjectArray JNICALL
|
||||
Java_app_organicmaps_Framework_nativeGenerateNotifications(JNIEnv * env, jclass, bool announceStreets)
|
||||
Java_app_organicmaps_Framework_nativeGenerateNotifications(JNIEnv * env, jclass, jboolean announceStreets)
|
||||
{
|
||||
::Framework * fr = frm();
|
||||
if (!fr->GetRoutingManager().IsRoutingActive())
|
||||
@@ -1270,64 +1282,16 @@ Java_app_organicmaps_Framework_nativeGetSpeedCamManagerMode(JNIEnv * env, jclass
|
||||
JNIEXPORT jobject JNICALL
|
||||
Java_app_organicmaps_Framework_nativeGetRouteFollowingInfo(JNIEnv * env, jclass)
|
||||
{
|
||||
::Framework * fr = frm();
|
||||
if (!fr->GetRoutingManager().IsRoutingActive())
|
||||
RoutingManager & rm = frm()->GetRoutingManager();
|
||||
if (!rm.IsRoutingActive())
|
||||
return nullptr;
|
||||
|
||||
routing::FollowingInfo info;
|
||||
fr->GetRoutingManager().GetRouteFollowingInfo(info);
|
||||
rm.GetRouteFollowingInfo(info);
|
||||
if (!info.IsValid())
|
||||
return nullptr;
|
||||
|
||||
static jclass const klass = jni::GetGlobalClassRef(env, "app/organicmaps/routing/RoutingInfo");
|
||||
// Java signature : RoutingInfo(Distance distToTarget, Distance distToTurn,
|
||||
// String currentStreet, String nextStreet, String nextNextStreet,
|
||||
// double completionPercent, int vehicleTurnOrdinal, int
|
||||
// vehicleNextTurnOrdinal, int pedestrianTurnOrdinal, int exitNum,
|
||||
// int totalTime, SingleLaneInfo[] lanes)
|
||||
static jmethodID const ctorRouteInfoID =
|
||||
jni::GetConstructorID(env, klass,
|
||||
"(Lapp/organicmaps/util/Distance;Lapp/organicmaps/util/Distance;"
|
||||
"Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;DIIIII"
|
||||
"[Lapp/organicmaps/routing/SingleLaneInfo;DZZ)V");
|
||||
|
||||
vector<routing::FollowingInfo::SingleLaneInfoClient> const & lanes = info.m_lanes;
|
||||
jobjectArray jLanes = nullptr;
|
||||
if (!lanes.empty())
|
||||
{
|
||||
static jclass const laneClass = jni::GetGlobalClassRef(env, "app/organicmaps/routing/SingleLaneInfo");
|
||||
auto const lanesSize = static_cast<jsize>(lanes.size());
|
||||
jLanes = env->NewObjectArray(lanesSize, laneClass, nullptr);
|
||||
ASSERT(jLanes, (jni::DescribeException()));
|
||||
static jmethodID const ctorSingleLaneInfoID = jni::GetConstructorID(env, laneClass, "([BZ)V");
|
||||
|
||||
for (jsize j = 0; j < lanesSize; ++j)
|
||||
{
|
||||
auto const laneSize = static_cast<jsize>(lanes[j].m_lane.size());
|
||||
jni::TScopedLocalByteArrayRef singleLane(env, env->NewByteArray(laneSize));
|
||||
ASSERT(singleLane.get(), (jni::DescribeException()));
|
||||
env->SetByteArrayRegion(singleLane.get(), 0, laneSize, lanes[j].m_lane.data());
|
||||
|
||||
jni::TScopedLocalRef singleLaneInfo(
|
||||
env, env->NewObject(laneClass, ctorSingleLaneInfoID, singleLane.get(),
|
||||
lanes[j].m_isRecommended));
|
||||
ASSERT(singleLaneInfo.get(), (jni::DescribeException()));
|
||||
env->SetObjectArrayElement(jLanes, j, singleLaneInfo.get());
|
||||
}
|
||||
}
|
||||
|
||||
auto const & rm = frm()->GetRoutingManager();
|
||||
auto const isSpeedCamLimitExceeded = rm.IsRoutingActive() ? rm.IsSpeedCamLimitExceeded() : false;
|
||||
auto const shouldPlaySignal = frm()->GetRoutingManager().GetSpeedCamManager().ShouldPlayBeepSignal();
|
||||
jobject const result = env->NewObject(
|
||||
klass, ctorRouteInfoID, ToJavaDistance(env, info.m_distToTarget),
|
||||
ToJavaDistance(env, info.m_distToTurn), jni::ToJavaString(env, info.m_currentStreetName),
|
||||
jni::ToJavaString(env, info.m_nextStreetName), jni::ToJavaString(env, info.m_nextNextStreetName),
|
||||
info.m_completionPercent, info.m_turn, info.m_nextTurn, info.m_pedestrianTurn, info.m_exitNum,
|
||||
info.m_time, jLanes, info.m_speedLimitMps, static_cast<jboolean>(isSpeedCamLimitExceeded),
|
||||
static_cast<jboolean>(shouldPlaySignal));
|
||||
ASSERT(result, (jni::DescribeException()));
|
||||
return result;
|
||||
return CreateRoutingInfo(env, info, rm);
|
||||
}
|
||||
|
||||
JNIEXPORT jobjectArray JNICALL
|
||||
@@ -1340,17 +1304,7 @@ Java_app_organicmaps_Framework_nativeGetRouteJunctionPoints(JNIEnv * env, jclass
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static jclass const junctionClazz = jni::GetGlobalClassRef(env, "app/organicmaps/routing/JunctionInfo");
|
||||
// Java signature : JunctionInfo(double lat, double lon)
|
||||
static jmethodID const junctionConstructor = jni::GetConstructorID(env, junctionClazz, "(DD)V");
|
||||
|
||||
return jni::ToJavaArray(env, junctionClazz, junctionPoints,
|
||||
[](JNIEnv * env, m2::PointD const & point)
|
||||
{
|
||||
return env->NewObject(junctionClazz, junctionConstructor,
|
||||
mercator::YToLat(point.y),
|
||||
mercator::XToLon(point.x));
|
||||
});
|
||||
return CreateJunctionInfoArray(env, junctionPoints);
|
||||
}
|
||||
|
||||
JNIEXPORT jintArray JNICALL
|
||||
@@ -1499,82 +1453,23 @@ Java_app_organicmaps_Framework_nativeDeactivateMapSelectionCircle(JNIEnv * env,
|
||||
return g_framework->DeactivateMapSelectionCircle();
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_Framework_nativeSetMapStyle(JNIEnv * env, jclass, jint mapStyle)
|
||||
{
|
||||
MapStyle const val = static_cast<MapStyle>(mapStyle);
|
||||
if (val != g_framework->GetMapStyle())
|
||||
g_framework->SetMapStyle(val);
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
Java_app_organicmaps_Framework_nativeGetMapStyle(JNIEnv * env, jclass)
|
||||
{
|
||||
return g_framework->GetMapStyle();
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_Framework_nativeMarkMapStyle(JNIEnv * env, jclass, jint mapStyle)
|
||||
{
|
||||
MapStyle const val = static_cast<MapStyle>(mapStyle);
|
||||
if (val != g_framework->GetMapStyle())
|
||||
g_framework->MarkMapStyle(val);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_Framework_nativeSetRouter(JNIEnv * env, jclass, jint routerType)
|
||||
{
|
||||
using Type = routing::RouterType;
|
||||
Type type = Type::Vehicle;
|
||||
switch (routerType)
|
||||
{
|
||||
case 0: break;
|
||||
case 1: type = Type::Pedestrian; break;
|
||||
case 2: type = Type::Bicycle; break;
|
||||
case 3: type = Type::Transit; break;
|
||||
case 4: type = Type::Ruler; break;
|
||||
default: assert(false); break;
|
||||
}
|
||||
g_framework->GetRoutingManager().SetRouter(type);
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
Java_app_organicmaps_Framework_nativeGetRouter(JNIEnv * env, jclass)
|
||||
{
|
||||
return static_cast<jint>(g_framework->GetRoutingManager().GetRouter());
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
Java_app_organicmaps_Framework_nativeGetLastUsedRouter(JNIEnv * env, jclass)
|
||||
{
|
||||
return static_cast<jint>(g_framework->GetRoutingManager().GetLastUsedRouter());
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
Java_app_organicmaps_Framework_nativeGetBestRouter(JNIEnv * env, jclass,
|
||||
jdouble srcLat, jdouble srcLon,
|
||||
jdouble dstLat, jdouble dstLon)
|
||||
{
|
||||
return static_cast<jint>(frm()->GetRoutingManager().GetBestRouter(
|
||||
mercator::FromLatLon(srcLat, srcLon), mercator::FromLatLon(dstLat, dstLon)));
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_Framework_nativeAddRoutePoint(JNIEnv * env, jclass, jstring title,
|
||||
jstring subtitle, jint markType,
|
||||
jstring subtitle, jobject markType,
|
||||
jint intermediateIndex,
|
||||
jboolean isMyPosition,
|
||||
jdouble lat, jdouble lon)
|
||||
jdouble lat, jdouble lon,
|
||||
jboolean reorderIntermediatePoints)
|
||||
{
|
||||
RouteMarkData data;
|
||||
data.m_title = jni::ToNativeString(env, title);
|
||||
data.m_subTitle = jni::ToNativeString(env, subtitle);
|
||||
data.m_pointType = static_cast<RouteMarkType>(markType);
|
||||
data.m_pointType = GetRouteMarkType(env, markType);
|
||||
data.m_intermediateIndex = static_cast<size_t>(intermediateIndex);
|
||||
data.m_isMyPosition = static_cast<bool>(isMyPosition);
|
||||
data.m_position = m2::PointD(mercator::FromLatLon(lat, lon));
|
||||
|
||||
frm()->GetRoutingManager().AddRoutePoint(std::move(data));
|
||||
frm()->GetRoutingManager().AddRoutePoint(std::move(data), reorderIntermediatePoints);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
@@ -1584,10 +1479,9 @@ Java_app_organicmaps_Framework_nativeRemoveRoutePoints(JNIEnv * env, jclass)
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_Framework_nativeRemoveRoutePoint(JNIEnv * env, jclass,
|
||||
jint markType, jint intermediateIndex)
|
||||
Java_app_organicmaps_Framework_nativeRemoveRoutePoint(JNIEnv * env, jclass, jobject markType, jint intermediateIndex)
|
||||
{
|
||||
frm()->GetRoutingManager().RemoveRoutePoint(static_cast<RouteMarkType>(markType),
|
||||
frm()->GetRoutingManager().RemoveRoutePoint(GetRouteMarkType(env, markType),
|
||||
static_cast<size_t>(intermediateIndex));
|
||||
}
|
||||
|
||||
@@ -1606,30 +1500,7 @@ Java_app_organicmaps_Framework_nativeCouldAddIntermediatePoint(JNIEnv * env, jcl
|
||||
JNIEXPORT jobjectArray JNICALL
|
||||
Java_app_organicmaps_Framework_nativeGetRoutePoints(JNIEnv * env, jclass)
|
||||
{
|
||||
auto const points = frm()->GetRoutingManager().GetRoutePoints();
|
||||
|
||||
static jclass const pointClazz = jni::GetGlobalClassRef(env,
|
||||
"app/organicmaps/routing/RouteMarkData");
|
||||
// Java signature : RouteMarkData(String title, String subtitle,
|
||||
// @RoutePointInfo.RouteMarkType int pointType,
|
||||
// int intermediateIndex, boolean isVisible, boolean isMyPosition,
|
||||
// boolean isPassed, double lat, double lon)
|
||||
static jmethodID const pointConstructor = jni::GetConstructorID(env, pointClazz,
|
||||
"(Ljava/lang/String;Ljava/lang/String;IIZZZDD)V");
|
||||
return jni::ToJavaArray(env, pointClazz, points, [&](JNIEnv * jEnv, RouteMarkData const & data)
|
||||
{
|
||||
jni::TScopedLocalRef const title(env, jni::ToJavaString(env, data.m_title));
|
||||
jni::TScopedLocalRef const subtitle(env, jni::ToJavaString(env, data.m_subTitle));
|
||||
return env->NewObject(pointClazz, pointConstructor,
|
||||
title.get(), subtitle.get(),
|
||||
static_cast<jint>(data.m_pointType),
|
||||
static_cast<jint>(data.m_intermediateIndex),
|
||||
static_cast<jboolean>(data.m_isVisible),
|
||||
static_cast<jboolean>(data.m_isMyPosition),
|
||||
static_cast<jboolean>(data.m_isPassed),
|
||||
mercator::YToLat(data.m_position.y),
|
||||
mercator::XToLon(data.m_position.x));
|
||||
});
|
||||
return CreateRouteMarkDataArray(env, frm()->GetRoutingManager().GetRoutePoints());
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
@@ -1642,49 +1513,7 @@ Java_app_organicmaps_Framework_nativeMoveRoutePoint(JNIEnv * env, jclass,
|
||||
JNIEXPORT jobject JNICALL
|
||||
Java_app_organicmaps_Framework_nativeGetTransitRouteInfo(JNIEnv * env, jclass)
|
||||
{
|
||||
auto const routeInfo = frm()->GetRoutingManager().GetTransitRouteInfo();
|
||||
|
||||
static jclass const transitStepClass = jni::GetGlobalClassRef(env,
|
||||
"app/organicmaps/routing/TransitStepInfo");
|
||||
// Java signature : TransitStepInfo(@TransitType int type, @Nullable String distance, @Nullable String distanceUnits,
|
||||
// int timeInSec, @Nullable String number, int color, int intermediateIndex)
|
||||
static jmethodID const transitStepConstructor = jni::GetConstructorID(env, transitStepClass,
|
||||
"(ILjava/lang/String;Ljava/lang/String;ILjava/lang/String;II)V");
|
||||
|
||||
jni::TScopedLocalRef const steps(env, jni::ToJavaArray(env, transitStepClass,
|
||||
routeInfo.m_steps,
|
||||
[&](JNIEnv * jEnv, TransitStepInfo const & stepInfo)
|
||||
{
|
||||
jni::TScopedLocalRef const distance(env, jni::ToJavaString(env, stepInfo.m_distanceStr));
|
||||
jni::TScopedLocalRef const distanceUnits(env, jni::ToJavaString(env, stepInfo.m_distanceUnitsSuffix));
|
||||
jni::TScopedLocalRef const number(env, jni::ToJavaString(env, stepInfo.m_number));
|
||||
return env->NewObject(transitStepClass, transitStepConstructor,
|
||||
static_cast<jint>(stepInfo.m_type),
|
||||
distance.get(),
|
||||
distanceUnits.get(),
|
||||
static_cast<jint>(stepInfo.m_timeInSec),
|
||||
number.get(),
|
||||
static_cast<jint>(stepInfo.m_colorARGB),
|
||||
static_cast<jint>(stepInfo.m_intermediateIndex));
|
||||
}));
|
||||
|
||||
static jclass const transitRouteInfoClass = jni::GetGlobalClassRef(env,
|
||||
"app/organicmaps/routing/TransitRouteInfo");
|
||||
// Java signature : TransitRouteInfo(@NonNull String totalDistance, @NonNull String totalDistanceUnits, int totalTimeInSec,
|
||||
// @NonNull String totalPedestrianDistance, @NonNull String totalPedestrianDistanceUnits,
|
||||
// int totalPedestrianTimeInSec, @NonNull TransitStepInfo[] steps)
|
||||
static jmethodID const transitRouteInfoConstructor = jni::GetConstructorID(env, transitRouteInfoClass,
|
||||
"(Ljava/lang/String;Ljava/lang/String;I"
|
||||
"Ljava/lang/String;Ljava/lang/String;I"
|
||||
"[Lapp/organicmaps/routing/TransitStepInfo;)V");
|
||||
jni::TScopedLocalRef const distance(env, jni::ToJavaString(env, routeInfo.m_totalDistanceStr));
|
||||
jni::TScopedLocalRef const distanceUnits(env, jni::ToJavaString(env, routeInfo.m_totalDistanceUnitsSuffix));
|
||||
jni::TScopedLocalRef const distancePedestrian(env, jni::ToJavaString(env, routeInfo.m_totalPedestrianDistanceStr));
|
||||
jni::TScopedLocalRef const distancePedestrianUnits(env, jni::ToJavaString(env, routeInfo.m_totalPedestrianUnitsSuffix));
|
||||
return env->NewObject(transitRouteInfoClass, transitRouteInfoConstructor,
|
||||
distance.get(), distanceUnits.get(), static_cast<jint>(routeInfo.m_totalTimeInSec),
|
||||
distancePedestrian.get(), distancePedestrianUnits.get(), static_cast<jint>(routeInfo.m_totalPedestrianTimeInSec),
|
||||
steps.get());
|
||||
return CreateTransitRouteInfo(env, frm()->GetRoutingManager().GetTransitRouteInfo());
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
@@ -1820,25 +1649,6 @@ Java_app_organicmaps_Framework_nativeGetPoiContactUrl(JNIEnv *env, jclass, jint
|
||||
return jni::ToJavaString(env, value);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_Framework_nativeSetChoosePositionMode(JNIEnv *, jclass, jint mode, jboolean isBusiness,
|
||||
jboolean applyPosition)
|
||||
{
|
||||
// TODO(AB): Move this code into the Framework to share with iOS and other platforms.
|
||||
auto const f = frm();
|
||||
if (applyPosition && f->HasPlacePageInfo())
|
||||
g_framework->SetChoosePositionMode(static_cast<android::ChoosePositionMode>(mode), isBusiness,
|
||||
&f->GetCurrentPlacePageInfo().GetMercator());
|
||||
else
|
||||
g_framework->SetChoosePositionMode(static_cast<android::ChoosePositionMode>(mode), isBusiness, nullptr);
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
Java_app_organicmaps_Framework_nativeGetChoosePositionMode(JNIEnv *, jclass)
|
||||
{
|
||||
return static_cast<jint>(g_framework->GetChoosePositionMode());
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean JNICALL
|
||||
Java_app_organicmaps_Framework_nativeIsDownloadedMapAtScreenCenter(JNIEnv *, jclass)
|
||||
{
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
#include "app/organicmaps/Framework.hpp"
|
||||
|
||||
#include "app/organicmaps/platform/AndroidPlatform.hpp"
|
||||
|
||||
#include "app/organicmaps/core/jni_helper.hpp"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
// static void nativeSetSettingsDir(String settingsPath);
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_MwmApplication_nativeSetSettingsDir(JNIEnv * env, jclass clazz, jstring settingsPath)
|
||||
{
|
||||
android::Platform::Instance().SetSettingsDir(jni::ToNativeString(env, settingsPath));
|
||||
}
|
||||
|
||||
// static void nativeInitPlatform(Context context, String apkPath, String storagePath, String privatePath, String tmpPath,
|
||||
// String flavorName, String buildType, boolean isTablet);
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_MwmApplication_nativeInitPlatform(JNIEnv * env, jclass clazz, jobject context,
|
||||
jstring apkPath, jstring writablePath,
|
||||
jstring privatePath, jstring tmpPath,
|
||||
jstring flavorName, jstring buildType,
|
||||
jboolean isTablet)
|
||||
{
|
||||
android::Platform::Instance().Initialize(env, context, apkPath, writablePath, privatePath, tmpPath,
|
||||
flavorName, buildType, isTablet);
|
||||
}
|
||||
|
||||
// static void nativeInitFramework(@NonNull Runnable onComplete);
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_MwmApplication_nativeInitFramework(JNIEnv * env, jclass clazz, jobject onComplete)
|
||||
{
|
||||
if (!g_framework)
|
||||
{
|
||||
g_framework = std::make_unique<android::Framework>([onComplete = jni::make_global_ref(onComplete)]()
|
||||
{
|
||||
JNIEnv * env = jni::GetEnv();
|
||||
jmethodID const methodId = jni::GetMethodID(env, *onComplete, "run", "()V");
|
||||
env->CallVoidMethod(*onComplete, methodId);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// static void nativeAddLocalization(String name, String value);
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_MwmApplication_nativeAddLocalization(JNIEnv * env, jclass clazz, jstring name, jstring value)
|
||||
{
|
||||
g_framework->AddString(jni::ToNativeString(env, name),
|
||||
jni::ToNativeString(env, value));
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_MwmApplication_nativeOnTransit(JNIEnv *, jclass, jboolean foreground)
|
||||
{
|
||||
if (static_cast<bool>(foreground))
|
||||
g_framework->NativeFramework()->EnterForeground();
|
||||
else
|
||||
g_framework->NativeFramework()->EnterBackground();
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
#include "UserMarkHelper.hpp"
|
||||
|
||||
#include "app/organicmaps/sdk/routing/RoutePointInfo.hpp"
|
||||
|
||||
#include "map/elevation_info.hpp"
|
||||
#include "map/place_page_info.hpp"
|
||||
|
||||
@@ -47,7 +49,7 @@ jobject CreateMapObject(JNIEnv * env, place_page::Info const & info, int mapObje
|
||||
static jmethodID const ctorId = jni::GetConstructorID(
|
||||
env, g_mapObjectClazz,
|
||||
"("
|
||||
"Lapp/organicmaps/bookmarks/data/FeatureId;" // featureId
|
||||
"Lapp/organicmaps/bookmarks/data/FeatureId;" // featureId
|
||||
"I" // mapObjectType
|
||||
"Ljava/lang/String;" // title
|
||||
"Ljava/lang/String;" // secondaryTitle
|
||||
@@ -55,7 +57,7 @@ jobject CreateMapObject(JNIEnv * env, place_page::Info const & info, int mapObje
|
||||
"Ljava/lang/String;" // address
|
||||
"DD" // lat, lon
|
||||
"Ljava/lang/String;" // appId
|
||||
"Lapp/organicmaps/routing/RoutePointInfo;" // routePointInfo
|
||||
"Lapp/organicmaps/sdk/routing/RoutePointInfo;" // routePointInfo
|
||||
"I" // openingMode
|
||||
"Lapp/organicmaps/sdk/search/Popularity;" // popularity
|
||||
"Ljava/lang/String;" // description
|
||||
@@ -104,7 +106,7 @@ jobject CreateBookmark(JNIEnv *env, const place_page::Info &info,
|
||||
jni::GetConstructorID(env, g_bookmarkClazz,
|
||||
"(Lapp/organicmaps/bookmarks/data/FeatureId;JJLjava/lang/String;"
|
||||
"Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;"
|
||||
"Lapp/organicmaps/routing/RoutePointInfo;"
|
||||
"Lapp/organicmaps/sdk/routing/RoutePointInfo;"
|
||||
"ILapp/organicmaps/sdk/search/Popularity;Ljava/lang/String;"
|
||||
"[Ljava/lang/String;)V");
|
||||
static jmethodID const featureCtorId =
|
||||
@@ -213,14 +215,6 @@ jobject CreateMapObject(JNIEnv * env, place_page::Info const & info)
|
||||
routingPointInfo.get(), popularity, jrawTypes.get());
|
||||
}
|
||||
|
||||
jobject CreateRoutePointInfo(JNIEnv * env, place_page::Info const & info)
|
||||
{
|
||||
static jclass const clazz = jni::GetGlobalClassRef(env, "app/organicmaps/routing/RoutePointInfo");
|
||||
static jmethodID const ctorId = jni::GetConstructorID(env, clazz, "(II)V");
|
||||
int const markType = static_cast<int>(info.GetRouteMarkType());
|
||||
return env->NewObject(clazz, ctorId, markType, info.GetIntermediateIndex());
|
||||
}
|
||||
|
||||
jobject CreateFeatureId(JNIEnv * env, FeatureID const & fid)
|
||||
{
|
||||
static jmethodID const featureCtorId =
|
||||
|
||||
@@ -40,8 +40,6 @@ jobjectArray ToRatingArray(JNIEnv * env, std::vector<std::string> const & rating
|
||||
|
||||
jobject CreateLocalAdInfo(JNIEnv * env, place_page::Info const & info);
|
||||
|
||||
jobject CreateRoutePointInfo(JNIEnv * env, place_page::Info const & info);
|
||||
|
||||
jobject CreateFeatureId(JNIEnv * env, FeatureID const & fid);
|
||||
jobjectArray ToFeatureIdArray(JNIEnv * env, std::vector<FeatureID> const & ids);
|
||||
} // namespace usermark_helper
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
#include "app/organicmaps/core/jni_helper.hpp"
|
||||
|
||||
#include "app/organicmaps/Framework.hpp"
|
||||
|
||||
#include "indexer/map_style.hpp"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_ChoosePositionMode_nativeSet(JNIEnv *, jclass, jint mode,
|
||||
jboolean isBusiness,
|
||||
jboolean applyPosition)
|
||||
{
|
||||
// TODO(AB): Move this code into the Framework to share with iOS and other platforms.
|
||||
auto const f = frm();
|
||||
if (applyPosition && f->HasPlacePageInfo())
|
||||
g_framework->SetChoosePositionMode(static_cast<android::ChoosePositionMode>(mode), isBusiness,
|
||||
&f->GetCurrentPlacePageInfo().GetMercator());
|
||||
else
|
||||
g_framework->SetChoosePositionMode(static_cast<android::ChoosePositionMode>(mode), isBusiness, nullptr);
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_ChoosePositionMode_nativeGet(JNIEnv *, jclass)
|
||||
{
|
||||
return static_cast<jint>(g_framework->GetChoosePositionMode());
|
||||
}
|
||||
}
|
||||
27
android/app/src/main/cpp/app/organicmaps/sdk/MapStyle.cpp
Normal file
27
android/app/src/main/cpp/app/organicmaps/sdk/MapStyle.cpp
Normal file
@@ -0,0 +1,27 @@
|
||||
#include "app/organicmaps/core/jni_helper.hpp"
|
||||
|
||||
#include "app/organicmaps/Framework.hpp"
|
||||
|
||||
#include "indexer/map_style.hpp"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_MapStyle_nativeSet(JNIEnv *, jclass, jint mapStyle)
|
||||
{
|
||||
auto const val = static_cast<MapStyle>(mapStyle);
|
||||
if (val != g_framework->GetMapStyle())
|
||||
g_framework->SetMapStyle(val);
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_MapStyle_nativeGet(JNIEnv *, jclass)
|
||||
{
|
||||
return g_framework->GetMapStyle();
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_MapStyle_nativeMark(JNIEnv *, jclass, jint mapStyle)
|
||||
{
|
||||
auto const val = static_cast<MapStyle>(mapStyle);
|
||||
if (val != g_framework->GetMapStyle())
|
||||
g_framework->MarkMapStyle(val);
|
||||
}
|
||||
}
|
||||
56
android/app/src/main/cpp/app/organicmaps/sdk/OrganicMaps.cpp
Normal file
56
android/app/src/main/cpp/app/organicmaps/sdk/OrganicMaps.cpp
Normal file
@@ -0,0 +1,56 @@
|
||||
#include "app/organicmaps/Framework.hpp"
|
||||
|
||||
#include "app/organicmaps/platform/AndroidPlatform.hpp"
|
||||
|
||||
#include "app/organicmaps/core/jni_helper.hpp"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
// static void nativeSetSettingsDir(String settingsPath);
|
||||
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_OrganicMaps_nativeSetSettingsDir(JNIEnv * env, jclass clazz,
|
||||
jstring settingsPath)
|
||||
{
|
||||
android::Platform::Instance().SetSettingsDir(jni::ToNativeString(env, settingsPath));
|
||||
}
|
||||
|
||||
// static void nativeInitPlatform(Context context, String apkPath, String storagePath, String privatePath, String
|
||||
// tmpPath, String flavorName, String buildType, boolean isTablet);
|
||||
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_OrganicMaps_nativeInitPlatform(
|
||||
JNIEnv * env, jclass clazz, jobject context, jstring apkPath, jstring writablePath, jstring privatePath,
|
||||
jstring tmpPath, jstring flavorName, jstring buildType, jboolean isTablet)
|
||||
{
|
||||
android::Platform::Instance().Initialize(env, context, apkPath, writablePath, privatePath, tmpPath, flavorName,
|
||||
buildType, isTablet);
|
||||
}
|
||||
|
||||
// static void nativeInitFramework(@NonNull Runnable onComplete);
|
||||
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_OrganicMaps_nativeInitFramework(JNIEnv * env, jclass clazz,
|
||||
jobject onComplete)
|
||||
{
|
||||
if (!g_framework)
|
||||
{
|
||||
g_framework = std::make_unique<android::Framework>(
|
||||
[onComplete = jni::make_global_ref(onComplete)]()
|
||||
{
|
||||
JNIEnv * env = jni::GetEnv();
|
||||
jmethodID const methodId = jni::GetMethodID(env, *onComplete, "run", "()V");
|
||||
env->CallVoidMethod(*onComplete, methodId);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// static void nativeAddLocalization(String name, String value);
|
||||
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_OrganicMaps_nativeAddLocalization(JNIEnv * env, jclass clazz,
|
||||
jstring name, jstring value)
|
||||
{
|
||||
g_framework->AddString(jni::ToNativeString(env, name), jni::ToNativeString(env, value));
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_OrganicMaps_nativeOnTransit(JNIEnv *, jclass, jboolean foreground)
|
||||
{
|
||||
if (static_cast<bool>(foreground))
|
||||
g_framework->NativeFramework()->EnterForeground();
|
||||
else
|
||||
g_framework->NativeFramework()->EnterBackground();
|
||||
}
|
||||
}
|
||||
41
android/app/src/main/cpp/app/organicmaps/sdk/Router.cpp
Normal file
41
android/app/src/main/cpp/app/organicmaps/sdk/Router.cpp
Normal file
@@ -0,0 +1,41 @@
|
||||
#include "app/organicmaps/core/jni_helper.hpp"
|
||||
|
||||
#include "app/organicmaps/Framework.hpp"
|
||||
|
||||
#include "indexer/map_style.hpp"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Router_nativeSet(JNIEnv *, jclass, jint routerType)
|
||||
{
|
||||
using Type = routing::RouterType;
|
||||
Type type;
|
||||
switch (routerType)
|
||||
{
|
||||
case 0: type = Type::Vehicle; break;
|
||||
case 1: type = Type::Pedestrian; break;
|
||||
case 2: type = Type::Bicycle; break;
|
||||
case 3: type = Type::Transit; break;
|
||||
case 4: type = Type::Ruler; break;
|
||||
default: assert(false); break;
|
||||
}
|
||||
frm()->GetRoutingManager().SetRouter(type);
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_Router_nativeGet(JNIEnv *, jclass)
|
||||
{
|
||||
return static_cast<jint>(frm()->GetRoutingManager().GetRouter());
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_Router_nativeGetLastUsed(JNIEnv *, jclass)
|
||||
{
|
||||
return static_cast<jint>(frm()->GetRoutingManager().GetLastUsedRouter());
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_Router_nativeGetBest(JNIEnv *, jclass, jdouble srcLat, jdouble srcLon,
|
||||
jdouble dstLat, jdouble dstLon)
|
||||
{
|
||||
return static_cast<jint>(frm()->GetRoutingManager().GetBestRouter(mercator::FromLatLon(srcLat, srcLon),
|
||||
mercator::FromLatLon(dstLat, dstLon)));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
#pragma once
|
||||
|
||||
#include "app/organicmaps/core/jni_helper.hpp"
|
||||
|
||||
#include "geometry/point2d.hpp"
|
||||
|
||||
#include <vector>
|
||||
|
||||
jobjectArray CreateJunctionInfoArray(JNIEnv * env, std::vector<m2::PointD> const & junctionPoints)
|
||||
{
|
||||
static jclass const junctionClazz = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/routing/JunctionInfo");
|
||||
// Java signature : JunctionInfo(double lat, double lon)
|
||||
static jmethodID const junctionConstructor = jni::GetConstructorID(env, junctionClazz, "(DD)V");
|
||||
|
||||
return jni::ToJavaArray(env, junctionClazz, junctionPoints,
|
||||
[](JNIEnv * env, m2::PointD const & point)
|
||||
{
|
||||
return env->NewObject(junctionClazz, junctionConstructor, mercator::YToLat(point.y),
|
||||
mercator::XToLon(point.x));
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
#pragma once
|
||||
|
||||
#include "app/organicmaps/core/jni_helper.hpp"
|
||||
|
||||
#include "geometry/point2d.hpp"
|
||||
|
||||
#include <vector>
|
||||
|
||||
jobjectArray CreateRouteMarkDataArray(JNIEnv * env, std::vector<RouteMarkData> const & points)
|
||||
{
|
||||
static jclass const pointClazz = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/routing/RouteMarkData");
|
||||
// Java signature : RouteMarkData(String title, String subtitle, int pointType,
|
||||
// int intermediateIndex, boolean isVisible, boolean isMyPosition,
|
||||
// boolean isPassed, double lat, double lon)
|
||||
static jmethodID const pointConstructor =
|
||||
jni::GetConstructorID(env, pointClazz, "(Ljava/lang/String;Ljava/lang/String;IIZZZDD)V");
|
||||
return jni::ToJavaArray(env, pointClazz, points,
|
||||
[&](JNIEnv * jEnv, RouteMarkData const & data)
|
||||
{
|
||||
jni::TScopedLocalRef const title(env, jni::ToJavaString(env, data.m_title));
|
||||
jni::TScopedLocalRef const subtitle(env, jni::ToJavaString(env, data.m_subTitle));
|
||||
return env->NewObject(
|
||||
pointClazz, pointConstructor, title.get(), subtitle.get(),
|
||||
static_cast<jint>(data.m_pointType), static_cast<jint>(data.m_intermediateIndex),
|
||||
static_cast<jboolean>(data.m_isVisible), static_cast<jboolean>(data.m_isMyPosition),
|
||||
static_cast<jboolean>(data.m_isPassed), mercator::YToLat(data.m_position.y),
|
||||
mercator::XToLon(data.m_position.x));
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include "app/organicmaps/sdk/routing/RouteMarkType.hpp"
|
||||
|
||||
#include "map/routing_mark.hpp"
|
||||
|
||||
RouteMarkType GetRouteMarkType(JNIEnv * env, jobject markType)
|
||||
{
|
||||
static jmethodID const ordinal = jni::GetMethodID(env, markType, "ordinal", "()I");
|
||||
|
||||
return static_cast<RouteMarkType>(env->CallIntMethod(markType, ordinal));
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
#pragma once
|
||||
|
||||
#include "app/organicmaps/core/jni_helper.hpp"
|
||||
|
||||
#include "map/place_page_info.hpp"
|
||||
|
||||
jobject CreateRoutePointInfo(JNIEnv * env, place_page::Info const & info)
|
||||
{
|
||||
static jclass const clazz = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/routing/RoutePointInfo");
|
||||
static jmethodID const ctorId = jni::GetConstructorID(env, clazz, "(II)V");
|
||||
int const markType = static_cast<int>(info.GetRouteMarkType());
|
||||
return env->NewObject(clazz, ctorId, markType, info.GetIntermediateIndex());
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
#pragma once
|
||||
|
||||
#include "app/organicmaps/core/jni_helper.hpp"
|
||||
|
||||
jobject GetRebuildAfterPointsLoading(JNIEnv * env)
|
||||
{
|
||||
static jobject rebuildAfterPointsLoading = nullptr;
|
||||
if (rebuildAfterPointsLoading)
|
||||
return rebuildAfterPointsLoading;
|
||||
|
||||
// Find the RouteRecommendationType class
|
||||
jclass routeRecommendationTypeClass = env->FindClass("app/organicmaps/sdk/routing/RouteRecommendationType");
|
||||
ASSERT(routeRecommendationTypeClass, ());
|
||||
|
||||
// Get the values() method of RouteRecommendationType
|
||||
jmethodID valuesMethod = env->GetStaticMethodID(routeRecommendationTypeClass, "values",
|
||||
"()[Lapp/organicmaps/sdk/routing/RouteRecommendationType;");
|
||||
ASSERT(valuesMethod, ());
|
||||
|
||||
// Call values() to get all enum constants
|
||||
jobjectArray enumConstants = (jobjectArray)env->CallStaticObjectMethod(routeRecommendationTypeClass, valuesMethod);
|
||||
ASSERT(enumConstants, ());
|
||||
|
||||
// Retrieve the first (and only) constant, RebuildAfterPointsLoading
|
||||
rebuildAfterPointsLoading = env->NewGlobalRef(env->GetObjectArrayElement(enumConstants, 0));
|
||||
ASSERT(rebuildAfterPointsLoading, ());
|
||||
|
||||
return rebuildAfterPointsLoading;
|
||||
}
|
||||
|
||||
jobject GetRouteRecommendationType(JNIEnv * env, RoutingManager::Recommendation recommendation)
|
||||
{
|
||||
switch (recommendation)
|
||||
{
|
||||
case RoutingManager::Recommendation::RebuildAfterPointsLoading: return GetRebuildAfterPointsLoading(env);
|
||||
default: ASSERT_FAIL("Unknown recommendation type");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
#pragma once
|
||||
|
||||
#include "app/organicmaps/core/jni_helper.hpp"
|
||||
#include "app/organicmaps/sdk/routing/SingleLaneInfo.hpp"
|
||||
#include "app/organicmaps/util/Distance.hpp"
|
||||
|
||||
#include "map/routing_manager.hpp"
|
||||
|
||||
jobject CreateRoutingInfo(JNIEnv * env, routing::FollowingInfo const & info, RoutingManager & rm)
|
||||
{
|
||||
static jclass const klass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/routing/RoutingInfo");
|
||||
// Java signature : RoutingInfo(Distance distToTarget, Distance distToTurn,
|
||||
// String currentStreet, String nextStreet, String nextNextStreet,
|
||||
// double completionPercent, int vehicleTurnOrdinal, int
|
||||
// vehicleNextTurnOrdinal, int pedestrianTurnOrdinal, int exitNum,
|
||||
// int totalTime, SingleLaneInfo[] lanes)
|
||||
static jmethodID const ctorRouteInfoID =
|
||||
jni::GetConstructorID(env, klass,
|
||||
"(Lapp/organicmaps/util/Distance;Lapp/organicmaps/util/Distance;"
|
||||
"Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;DIIIII"
|
||||
"[Lapp/organicmaps/sdk/routing/SingleLaneInfo;DZZ)V");
|
||||
|
||||
jobjectArray jLanes = CreateLanesInfo(env, info.m_lanes);
|
||||
|
||||
auto const isSpeedCamLimitExceeded = rm.IsSpeedCamLimitExceeded();
|
||||
auto const shouldPlaySignal = rm.GetSpeedCamManager().ShouldPlayBeepSignal();
|
||||
jobject const result = env->NewObject(
|
||||
klass, ctorRouteInfoID, ToJavaDistance(env, info.m_distToTarget), ToJavaDistance(env, info.m_distToTurn),
|
||||
jni::ToJavaString(env, info.m_currentStreetName), jni::ToJavaString(env, info.m_nextStreetName),
|
||||
jni::ToJavaString(env, info.m_nextNextStreetName), info.m_completionPercent, info.m_turn, info.m_nextTurn,
|
||||
info.m_pedestrianTurn, info.m_exitNum, info.m_time, jLanes, info.m_speedLimitMps,
|
||||
static_cast<jboolean>(isSpeedCamLimitExceeded), static_cast<jboolean>(shouldPlaySignal));
|
||||
ASSERT(result, (jni::DescribeException()));
|
||||
return result;
|
||||
}
|
||||
@@ -5,16 +5,15 @@
|
||||
|
||||
routing::RoutingOptions::Road makeValue(jint option)
|
||||
{
|
||||
uint8_t const road = static_cast<uint8_t>(1u << static_cast<int>(option));
|
||||
auto const road = static_cast<uint8_t>(1u << static_cast<int>(option));
|
||||
CHECK_LESS(road, static_cast<uint8_t>(routing::RoutingOptions::Road::Max), ());
|
||||
return static_cast<routing::RoutingOptions::Road>(road);
|
||||
}
|
||||
|
||||
extern "C"
|
||||
{
|
||||
|
||||
JNIEXPORT jboolean JNICALL
|
||||
Java_app_organicmaps_routing_RoutingOptions_nativeHasOption(JNIEnv * env, jclass clazz, jint option)
|
||||
JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_routing_RoutingOptions_nativeHasOption(JNIEnv *, jclass,
|
||||
jint option)
|
||||
{
|
||||
CHECK(g_framework, ("Framework isn't created yet!"));
|
||||
routing::RoutingOptions routingOptions = routing::RoutingOptions::LoadCarOptionsFromSettings();
|
||||
@@ -22,8 +21,7 @@ Java_app_organicmaps_routing_RoutingOptions_nativeHasOption(JNIEnv * env, jclass
|
||||
return static_cast<jboolean>(routingOptions.Has(road));
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_routing_RoutingOptions_nativeAddOption(JNIEnv * env, jclass clazz, jint option)
|
||||
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_routing_RoutingOptions_nativeAddOption(JNIEnv *, jclass, jint option)
|
||||
{
|
||||
CHECK(g_framework, ("Framework isn't created yet!"));
|
||||
routing::RoutingOptions routingOptions = routing::RoutingOptions::LoadCarOptionsFromSettings();
|
||||
@@ -32,9 +30,7 @@ Java_app_organicmaps_routing_RoutingOptions_nativeAddOption(JNIEnv * env, jclass
|
||||
routing::RoutingOptions::SaveCarOptionsToSettings(routingOptions);
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_routing_RoutingOptions_nativeRemoveOption(JNIEnv * env, jclass clazz, jint option)
|
||||
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_routing_RoutingOptions_nativeRemoveOption(JNIEnv *, jclass, jint option)
|
||||
{
|
||||
CHECK(g_framework, ("Framework isn't created yet!"));
|
||||
routing::RoutingOptions routingOptions = routing::RoutingOptions::LoadCarOptionsFromSettings();
|
||||
@@ -0,0 +1,34 @@
|
||||
#pragma once
|
||||
|
||||
#include "app/organicmaps/core/jni_helper.hpp"
|
||||
|
||||
#include "routing/following_info.hpp"
|
||||
|
||||
#include <vector>
|
||||
|
||||
jobjectArray CreateLanesInfo(JNIEnv * env, std::vector<routing::FollowingInfo::SingleLaneInfoClient> const & lanes)
|
||||
{
|
||||
if (lanes.empty())
|
||||
return nullptr;
|
||||
|
||||
static jclass const laneClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/routing/SingleLaneInfo");
|
||||
auto const lanesSize = static_cast<jsize>(lanes.size());
|
||||
jobjectArray jLanes = env->NewObjectArray(lanesSize, laneClass, nullptr);
|
||||
ASSERT(jLanes, (jni::DescribeException()));
|
||||
static jmethodID const ctorSingleLaneInfoID = jni::GetConstructorID(env, laneClass, "([BZ)V");
|
||||
|
||||
for (jsize j = 0; j < lanesSize; ++j)
|
||||
{
|
||||
auto const laneSize = static_cast<jsize>(lanes[j].m_lane.size());
|
||||
jni::TScopedLocalByteArrayRef singleLane(env, env->NewByteArray(laneSize));
|
||||
ASSERT(singleLane.get(), (jni::DescribeException()));
|
||||
env->SetByteArrayRegion(singleLane.get(), 0, laneSize, lanes[j].m_lane.data());
|
||||
|
||||
jni::TScopedLocalRef singleLaneInfo(
|
||||
env, env->NewObject(laneClass, ctorSingleLaneInfoID, singleLane.get(), lanes[j].m_isRecommended));
|
||||
ASSERT(singleLaneInfo.get(), (jni::DescribeException()));
|
||||
env->SetObjectArrayElement(jLanes, j, singleLaneInfo.get());
|
||||
}
|
||||
|
||||
return jLanes;
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
#pragma once
|
||||
|
||||
#include "app/organicmaps/core/jni_helper.hpp"
|
||||
|
||||
#include "app/organicmaps/sdk/routing/TransitStepInfo.hpp"
|
||||
|
||||
#include "map/transit/transit_display.hpp"
|
||||
|
||||
jobject CreateTransitRouteInfo(JNIEnv * env, TransitRouteInfo const & routeInfo)
|
||||
{
|
||||
jobjectArray steps = CreateTransitStepInfoArray(env, routeInfo.m_steps);
|
||||
|
||||
static jclass const transitRouteInfoClass =
|
||||
jni::GetGlobalClassRef(env, "app/organicmaps/sdk/routing/TransitRouteInfo");
|
||||
// Java signature : TransitRouteInfo(@NonNull String totalDistance, @NonNull String totalDistanceUnits,
|
||||
// int totalTimeInSec, @NonNull String totalPedestrianDistance, @NonNull String
|
||||
// totalPedestrianDistanceUnits, int totalPedestrianTimeInSec, @NonNull
|
||||
// TransitStepInfo[] steps)
|
||||
static jmethodID const transitRouteInfoConstructor =
|
||||
jni::GetConstructorID(env, transitRouteInfoClass,
|
||||
"(Ljava/lang/String;Ljava/lang/String;I"
|
||||
"Ljava/lang/String;Ljava/lang/String;I"
|
||||
"[Lapp/organicmaps/sdk/routing/TransitStepInfo;)V");
|
||||
jni::TScopedLocalRef const distance(env, jni::ToJavaString(env, routeInfo.m_totalDistanceStr));
|
||||
jni::TScopedLocalRef const distanceUnits(env, jni::ToJavaString(env, routeInfo.m_totalDistanceUnitsSuffix));
|
||||
jni::TScopedLocalRef const distancePedestrian(env, jni::ToJavaString(env, routeInfo.m_totalPedestrianDistanceStr));
|
||||
jni::TScopedLocalRef const distancePedestrianUnits(env,
|
||||
jni::ToJavaString(env, routeInfo.m_totalPedestrianUnitsSuffix));
|
||||
return env->NewObject(transitRouteInfoClass, transitRouteInfoConstructor, distance.get(), distanceUnits.get(),
|
||||
static_cast<jint>(routeInfo.m_totalTimeInSec), distancePedestrian.get(),
|
||||
distancePedestrianUnits.get(), static_cast<jint>(routeInfo.m_totalPedestrianTimeInSec), steps);
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
#pragma once
|
||||
|
||||
#include "app/organicmaps/core/jni_helper.hpp"
|
||||
|
||||
#include "map/transit/transit_display.hpp"
|
||||
|
||||
#include <vector>
|
||||
|
||||
jobjectArray CreateTransitStepInfoArray(JNIEnv * env, std::vector<TransitStepInfo> const & steps)
|
||||
{
|
||||
static jclass const transitStepClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/routing/TransitStepInfo");
|
||||
// Java signature : TransitStepInfo(int type, @Nullable String distance, @Nullable String distanceUnits,
|
||||
// int timeInSec, @Nullable String number, int color, int intermediateIndex)
|
||||
static jmethodID const transitStepConstructor =
|
||||
jni::GetConstructorID(env, transitStepClass, "(ILjava/lang/String;Ljava/lang/String;ILjava/lang/String;II)V");
|
||||
|
||||
return jni::ToJavaArray(
|
||||
env, transitStepClass, steps,
|
||||
[&](JNIEnv * jEnv, TransitStepInfo const & stepInfo)
|
||||
{
|
||||
jni::TScopedLocalRef const distance(env, jni::ToJavaString(env, stepInfo.m_distanceStr));
|
||||
jni::TScopedLocalRef const distanceUnits(env, jni::ToJavaString(env, stepInfo.m_distanceUnitsSuffix));
|
||||
jni::TScopedLocalRef const number(env, jni::ToJavaString(env, stepInfo.m_number));
|
||||
return env->NewObject(transitStepClass, transitStepConstructor, static_cast<jint>(stepInfo.m_type),
|
||||
distance.get(), distanceUnits.get(), static_cast<jint>(stepInfo.m_timeInSec), number.get(),
|
||||
static_cast<jint>(stepInfo.m_colorARGB), static_cast<jint>(stepInfo.m_intermediateIndex));
|
||||
});
|
||||
}
|
||||
@@ -8,9 +8,6 @@ import android.location.Location;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.activity.result.contract.ActivityResultContracts;
|
||||
@@ -33,8 +30,12 @@ import app.organicmaps.util.StringUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
||||
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.checkbox.MaterialCheckBox;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.progressindicator.LinearProgressIndicator;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
@@ -53,10 +54,10 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
||||
private static final int ERR_NO_MORE_FILES = -5;
|
||||
private static final int ERR_FILE_IN_PROGRESS = -6;
|
||||
|
||||
private TextView mTvMessage;
|
||||
private MaterialTextView mTvMessage;
|
||||
private LinearProgressIndicator mProgress;
|
||||
private Button mBtnDownload;
|
||||
private CheckBox mChbDownloadCountry;
|
||||
private MaterialButton mBtnDownload;
|
||||
private MaterialCheckBox mChbDownloadCountry;
|
||||
|
||||
private String mCurrentCountry;
|
||||
|
||||
@@ -110,17 +111,17 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
||||
return;
|
||||
}
|
||||
|
||||
int status = MapManager.nativeGetStatus(mCurrentCountry);
|
||||
CountryItem item = CountryItem.fill(mCurrentCountry);
|
||||
String fileSizeString = StringUtils.getFileSizeString(getApplicationContext(), item.totalSize);
|
||||
|
||||
if (status != CountryItem.STATUS_DONE)
|
||||
if (item.status != CountryItem.STATUS_DONE)
|
||||
{
|
||||
String name = getFormattedCountryName(mCurrentCountry);
|
||||
UiUtils.show(mChbDownloadCountry);
|
||||
String checkBoxText;
|
||||
if (status == CountryItem.STATUS_UPDATABLE)
|
||||
checkBoxText = String.format(getString(R.string.update_country_ask), name);
|
||||
if (item.status == CountryItem.STATUS_UPDATABLE)
|
||||
checkBoxText = String.format(getString(R.string.update_country_ask), item.name, fileSizeString);
|
||||
else
|
||||
checkBoxText = String.format(getString(R.string.download_country_ask), name);
|
||||
checkBoxText = String.format(getString(R.string.download_country_ask), item.name, fileSizeString);
|
||||
|
||||
mChbDownloadCountry.setText(checkBoxText);
|
||||
}
|
||||
@@ -129,18 +130,6 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
||||
}
|
||||
};
|
||||
|
||||
private String getFormattedCountryName(String mCurrentCountry) {
|
||||
String name = MapManager.nativeGetName(mCurrentCountry);
|
||||
CountryItem country = CountryItem.fill(mCurrentCountry);
|
||||
String sizeText = StringUtils.getFileSizeString(DownloadResourcesLegacyActivity.this, country.totalSize);
|
||||
|
||||
if (!TextUtils.isEmpty(sizeText)) {
|
||||
name = name + " (" + sizeText + ")";
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
private final Listener mResourcesDownloadListener = new Listener()
|
||||
{
|
||||
@Override
|
||||
@@ -395,9 +384,10 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
||||
|
||||
if (mCurrentCountry != null && mChbDownloadCountry.isChecked())
|
||||
{
|
||||
CountryItem item = CountryItem.fill(mCurrentCountry);
|
||||
UiUtils.hide(mChbDownloadCountry);
|
||||
mTvMessage.setText(getString(R.string.downloading_country_can_proceed, item.name));
|
||||
CountryItem item = CountryItem.fill(mCurrentCountry);
|
||||
String fileSizeString = StringUtils.getFileSizeString(this, item.totalSize);
|
||||
mTvMessage.setText(getString(R.string.downloading_country_can_proceed, item.name, fileSizeString));
|
||||
mProgress.setMax((int)item.totalSize);
|
||||
mProgress.setProgressCompat(0, true);
|
||||
|
||||
|
||||
@@ -2,9 +2,7 @@ package app.organicmaps;
|
||||
|
||||
import android.graphics.Bitmap;
|
||||
|
||||
import androidx.annotation.IntDef;
|
||||
import androidx.annotation.Keep;
|
||||
import androidx.annotation.MainThread;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.Size;
|
||||
@@ -15,19 +13,20 @@ import app.organicmaps.api.RequestType;
|
||||
import app.organicmaps.bookmarks.data.DistanceAndAzimut;
|
||||
import app.organicmaps.bookmarks.data.FeatureId;
|
||||
import app.organicmaps.bookmarks.data.MapObject;
|
||||
import app.organicmaps.products.Product;
|
||||
import app.organicmaps.products.ProductsConfig;
|
||||
import app.organicmaps.routing.JunctionInfo;
|
||||
import app.organicmaps.routing.RouteMarkData;
|
||||
import app.organicmaps.routing.RoutePointInfo;
|
||||
import app.organicmaps.routing.RoutingInfo;
|
||||
import app.organicmaps.routing.TransitRouteInfo;
|
||||
import app.organicmaps.sdk.routing.JunctionInfo;
|
||||
import app.organicmaps.sdk.routing.RouteMarkData;
|
||||
import app.organicmaps.sdk.routing.RouteMarkType;
|
||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||
import app.organicmaps.sdk.routing.TransitRouteInfo;
|
||||
import app.organicmaps.sdk.PlacePageActivationListener;
|
||||
import app.organicmaps.sdk.routing.RoutingListener;
|
||||
import app.organicmaps.sdk.routing.RoutingLoadPointsListener;
|
||||
import app.organicmaps.sdk.routing.RoutingProgressListener;
|
||||
import app.organicmaps.sdk.routing.RoutingRecommendationListener;
|
||||
import app.organicmaps.settings.SettingsPrefsFragment;
|
||||
import app.organicmaps.widget.placepage.PlacePageData;
|
||||
import app.organicmaps.util.Constants;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
@@ -39,87 +38,6 @@ import java.util.Locale;
|
||||
*/
|
||||
public class Framework
|
||||
{
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@IntDef({MAP_STYLE_CLEAR, MAP_STYLE_DARK, MAP_STYLE_VEHICLE_CLEAR, MAP_STYLE_VEHICLE_DARK, MAP_STYLE_OUTDOORS_CLEAR, MAP_STYLE_OUTDOORS_DARK})
|
||||
|
||||
public @interface MapStyle {}
|
||||
|
||||
public static final int MAP_STYLE_CLEAR = 0;
|
||||
public static final int MAP_STYLE_DARK = 1;
|
||||
public static final int MAP_STYLE_VEHICLE_CLEAR = 3;
|
||||
public static final int MAP_STYLE_VEHICLE_DARK = 4;
|
||||
public static final int MAP_STYLE_OUTDOORS_CLEAR = 5;
|
||||
public static final int MAP_STYLE_OUTDOORS_DARK = 6;
|
||||
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@IntDef({ ROUTER_TYPE_VEHICLE, ROUTER_TYPE_PEDESTRIAN, ROUTER_TYPE_BICYCLE, ROUTER_TYPE_TRANSIT, ROUTER_TYPE_RULER })
|
||||
|
||||
public @interface RouterType {}
|
||||
|
||||
public static final int ROUTER_TYPE_VEHICLE = 0;
|
||||
public static final int ROUTER_TYPE_PEDESTRIAN = 1;
|
||||
public static final int ROUTER_TYPE_BICYCLE = 2;
|
||||
public static final int ROUTER_TYPE_TRANSIT = 3;
|
||||
public static final int ROUTER_TYPE_RULER = 4;
|
||||
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@IntDef({ROUTE_REBUILD_AFTER_POINTS_LOADING})
|
||||
public @interface RouteRecommendationType {}
|
||||
|
||||
public static final int ROUTE_REBUILD_AFTER_POINTS_LOADING = 0;
|
||||
|
||||
public interface PlacePageActivationListener
|
||||
{
|
||||
// Called from JNI.
|
||||
@Keep
|
||||
@SuppressWarnings("unused")
|
||||
void onPlacePageActivated(@NonNull PlacePageData data);
|
||||
|
||||
// Called from JNI
|
||||
@Keep
|
||||
@SuppressWarnings("unused")
|
||||
void onPlacePageDeactivated();
|
||||
|
||||
// Called from JNI
|
||||
@Keep
|
||||
@SuppressWarnings("unused")
|
||||
void onSwitchFullScreenMode();
|
||||
}
|
||||
|
||||
public interface RoutingListener
|
||||
{
|
||||
// Called from JNI
|
||||
@Keep
|
||||
@SuppressWarnings("unused")
|
||||
@MainThread
|
||||
void onRoutingEvent(int resultCode, String[] missingMaps);
|
||||
}
|
||||
|
||||
public interface RoutingProgressListener
|
||||
{
|
||||
// Called from JNI.
|
||||
@Keep
|
||||
@SuppressWarnings("unused")
|
||||
@MainThread
|
||||
void onRouteBuildingProgress(float progress);
|
||||
}
|
||||
|
||||
public interface RoutingRecommendationListener
|
||||
{
|
||||
// Called from JNI.
|
||||
@Keep
|
||||
@SuppressWarnings("unused")
|
||||
void onRecommend(@RouteRecommendationType int recommendation);
|
||||
}
|
||||
|
||||
public interface RoutingLoadPointsListener
|
||||
{
|
||||
// Called from JNI.
|
||||
@Keep
|
||||
@SuppressWarnings("unused")
|
||||
void onRoutePointsLoaded(boolean success);
|
||||
}
|
||||
|
||||
// Used by JNI.
|
||||
@Keep
|
||||
@SuppressWarnings("unused")
|
||||
@@ -301,54 +219,36 @@ public class Framework
|
||||
|
||||
private static native void nativeSetSpeedCamManagerMode(int mode);
|
||||
|
||||
public static native void nativeSetRoutingListener(RoutingListener listener);
|
||||
public static native void nativeSetRoutingListener(@NonNull RoutingListener listener);
|
||||
|
||||
public static native void nativeSetRouteProgressListener(RoutingProgressListener listener);
|
||||
public static native void nativeSetRouteProgressListener(@NonNull RoutingProgressListener listener);
|
||||
|
||||
public static native void nativeSetRoutingRecommendationListener(RoutingRecommendationListener listener);
|
||||
public static native void nativeSetRoutingRecommendationListener(@NonNull RoutingRecommendationListener listener);
|
||||
|
||||
public static native void nativeSetRoutingLoadPointsListener(
|
||||
@Nullable RoutingLoadPointsListener listener);
|
||||
public static native void nativeSetRoutingLoadPointsListener(@NonNull RoutingLoadPointsListener listener);
|
||||
|
||||
public static native void nativeShowCountry(String countryId, boolean zoomToDownloadButton);
|
||||
|
||||
public static native void nativeSetMapStyle(int mapStyle);
|
||||
|
||||
@MapStyle
|
||||
public static native int nativeGetMapStyle();
|
||||
|
||||
/**
|
||||
* This method allows to set new map style without immediate applying. It can be used before
|
||||
* engine recreation instead of nativeSetMapStyle to avoid huge flow of OpenGL invocations.
|
||||
* @param mapStyle style index
|
||||
*/
|
||||
public static native void nativeMarkMapStyle(int mapStyle);
|
||||
|
||||
public static native void nativeSetRouter(@RouterType int routerType);
|
||||
@RouterType
|
||||
public static native int nativeGetRouter();
|
||||
@RouterType
|
||||
public static native int nativeGetLastUsedRouter();
|
||||
@RouterType
|
||||
public static native int nativeGetBestRouter(double srcLat, double srcLon,
|
||||
double dstLat, double dstLon);
|
||||
|
||||
public static void addRoutePoint(RouteMarkData point)
|
||||
{
|
||||
addRoutePoint(point, true);
|
||||
}
|
||||
|
||||
public static void addRoutePoint(RouteMarkData point, boolean reorderIntermediatePoints)
|
||||
{
|
||||
Framework.nativeAddRoutePoint(point.mTitle, point.mSubtitle, point.mPointType,
|
||||
point.mIntermediateIndex, point.mIsMyPosition,
|
||||
point.mLat, point.mLon);
|
||||
point.mLat, point.mLon, reorderIntermediatePoints);
|
||||
}
|
||||
|
||||
public static native void nativeAddRoutePoint(String title, String subtitle,
|
||||
@RoutePointInfo.RouteMarkType int markType,
|
||||
public static native void nativeAddRoutePoint(String title, String subtitle, @NonNull RouteMarkType markType,
|
||||
int intermediateIndex, boolean isMyPosition,
|
||||
double lat, double lon);
|
||||
double lat, double lon,
|
||||
boolean reorderIntermediatePoints);
|
||||
|
||||
public static native void nativeRemoveRoutePoints();
|
||||
|
||||
public static native void nativeRemoveRoutePoint(@RoutePointInfo.RouteMarkType int markType,
|
||||
int intermediateIndex);
|
||||
public static native void nativeRemoveRoutePoint(@NonNull RouteMarkType markType, int intermediateIndex);
|
||||
|
||||
public static native void nativeRemoveIntermediateRoutePoints();
|
||||
|
||||
@@ -404,23 +304,6 @@ public class Framework
|
||||
|
||||
public static native void nativeZoomToPoint(double lat, double lon, int zoom, boolean animate);
|
||||
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@IntDef({ChoosePositionMode.NONE, ChoosePositionMode.EDITOR, ChoosePositionMode.API})
|
||||
public @interface ChoosePositionMode
|
||||
{
|
||||
// Keep in sync with `enum ChoosePositionMode` in Framework.hpp.
|
||||
public static final int NONE = 0;
|
||||
public static final int EDITOR = 1;
|
||||
public static final int API = 2;
|
||||
}
|
||||
/**
|
||||
* @param mode - see ChoosePositionMode values.
|
||||
* @param isBusiness selection area will be bounded by building borders, if its true (eg. true for businesses in buildings).
|
||||
* @param applyPosition if true, map'll be animated to currently selected object.
|
||||
*/
|
||||
public static native void nativeSetChoosePositionMode(@ChoosePositionMode int mode, boolean isBusiness,
|
||||
boolean applyPosition);
|
||||
public static native @ChoosePositionMode int nativeGetChoosePositionMode();
|
||||
public static native boolean nativeIsDownloadedMapAtScreenCenter();
|
||||
|
||||
public static native String nativeGetActiveObjectFormattedCuisine();
|
||||
@@ -446,7 +329,7 @@ public class Framework
|
||||
|
||||
public static native void nativeMakeCrash();
|
||||
|
||||
public static native void nativeSetPowerManagerFacility(int facilityType, boolean state);
|
||||
public static native void nativeSetPowerManagerFacility(int facilityType, boolean state);
|
||||
public static native int nativeGetPowerManagerScheme();
|
||||
public static native void nativeSetPowerManagerScheme(int schemeType);
|
||||
public static native void nativeSetViewportCenter(double lat, double lon, int zoom);
|
||||
@@ -473,4 +356,6 @@ public class Framework
|
||||
public static native void nativeDidCloseProductsPopup(String reason);
|
||||
|
||||
public static native void nativeDidSelectProduct(String title, String link);
|
||||
|
||||
public static native void nativeSaveRoute();
|
||||
}
|
||||
|
||||
@@ -7,7 +7,9 @@ import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.content.res.Configuration;
|
||||
import android.graphics.Color;
|
||||
import android.location.Location;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
@@ -17,6 +19,7 @@ import android.text.method.LinkMovementMethod;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
@@ -33,6 +36,7 @@ import androidx.annotation.StyleRes;
|
||||
import androidx.annotation.UiThread;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.core.app.ActivityCompat;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.core.view.WindowInsetsCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
@@ -40,7 +44,6 @@ import androidx.fragment.app.FragmentFactory;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import app.organicmaps.Framework.PlacePageActivationListener;
|
||||
import app.organicmaps.api.Const;
|
||||
import app.organicmaps.base.BaseMwmFragmentActivity;
|
||||
import app.organicmaps.base.OnBackPressListener;
|
||||
@@ -80,13 +83,16 @@ import app.organicmaps.maplayer.isolines.IsolinesState;
|
||||
import app.organicmaps.routing.ManageRouteBottomSheet;
|
||||
import app.organicmaps.routing.NavigationController;
|
||||
import app.organicmaps.routing.NavigationService;
|
||||
import app.organicmaps.routing.RoutePointInfo;
|
||||
import app.organicmaps.sdk.routing.RouteMarkType;
|
||||
import app.organicmaps.routing.RoutingBottomMenuListener;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.routing.RoutingErrorDialogFragment;
|
||||
import app.organicmaps.routing.RoutingOptions;
|
||||
import app.organicmaps.sdk.routing.RoutingOptions;
|
||||
import app.organicmaps.routing.RoutingPlanFragment;
|
||||
import app.organicmaps.routing.RoutingPlanInplaceController;
|
||||
import app.organicmaps.sdk.ChoosePositionMode;
|
||||
import app.organicmaps.sdk.PlacePageActivationListener;
|
||||
import app.organicmaps.sdk.Router;
|
||||
import app.organicmaps.search.FloatingSearchToolbarController;
|
||||
import app.organicmaps.search.SearchActivity;
|
||||
import app.organicmaps.sdk.search.SearchEngine;
|
||||
@@ -95,6 +101,9 @@ import app.organicmaps.settings.DrivingOptionsActivity;
|
||||
import app.organicmaps.settings.RoadType;
|
||||
import app.organicmaps.settings.SettingsActivity;
|
||||
import app.organicmaps.settings.UnitLocale;
|
||||
import app.organicmaps.leftbutton.LeftButton;
|
||||
import app.organicmaps.leftbutton.LeftButtonsHolder;
|
||||
import app.organicmaps.leftbutton.LeftToggleButton;
|
||||
import app.organicmaps.util.Config;
|
||||
import app.organicmaps.util.LocationUtils;
|
||||
import app.organicmaps.util.PowerManagment;
|
||||
@@ -112,6 +121,7 @@ import app.organicmaps.widget.placepage.PlacePageController;
|
||||
import app.organicmaps.widget.placepage.PlacePageData;
|
||||
import app.organicmaps.widget.placepage.PlacePageViewModel;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Objects;
|
||||
@@ -123,6 +133,10 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||
import static app.organicmaps.location.LocationState.FOLLOW;
|
||||
import static app.organicmaps.location.LocationState.FOLLOW_AND_ROTATE;
|
||||
import static app.organicmaps.location.LocationState.LOCATION_TAG;
|
||||
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_ADD_PLACE_CODE;
|
||||
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_HELP_CODE;
|
||||
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_RECORD_TRACK_CODE;
|
||||
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_SETTINGS_CODE;
|
||||
import static app.organicmaps.util.PowerManagment.POWER_MANAGEMENT_TAG;
|
||||
|
||||
public class MwmActivity extends BaseMwmFragmentActivity
|
||||
@@ -196,6 +210,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
|
||||
private int mNavBarHeight;
|
||||
|
||||
private LeftButtonsHolder buttonsHolder;
|
||||
|
||||
private PlacePageViewModel mPlacePageViewModel;
|
||||
private MapButtonsViewModel mMapButtonsViewModel;
|
||||
private MapButtonsController.LayoutMode mPreviousMapLayoutMode;
|
||||
@@ -228,6 +244,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
@NonNull
|
||||
private ActivityResultLauncher<Intent> mPowerSaveSettings;
|
||||
@NonNull
|
||||
private ActivityResultLauncher<Intent> mSettingsLauncher;
|
||||
@NonNull
|
||||
private boolean mPowerSaveDisclaimerShown = false;
|
||||
|
||||
@SuppressWarnings("NotNullFieldNotInitialized")
|
||||
@@ -411,6 +429,11 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
BookmarkCategoriesActivity.start(this);
|
||||
}
|
||||
|
||||
private void onAddPlace()
|
||||
{
|
||||
showPositionChooserForEditor(false, false);
|
||||
}
|
||||
|
||||
private void showHelp()
|
||||
{
|
||||
Intent intent = new Intent(this, HelpActivity.class);
|
||||
@@ -511,6 +534,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
|
||||
if (newUiModeIsCarConnected || newUiModeIsCarDisconnected)
|
||||
return;
|
||||
|
||||
makeNavigationBarTransparentInLightMode();
|
||||
recreate();
|
||||
}
|
||||
|
||||
@@ -527,6 +552,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
|
||||
|
||||
setContentView(R.layout.activity_map);
|
||||
makeNavigationBarTransparentInLightMode();
|
||||
|
||||
mPlacePageViewModel = new ViewModelProvider(this).get(PlacePageViewModel.class);
|
||||
mMapButtonsViewModel = new ViewModelProvider(this).get(MapButtonsViewModel.class);
|
||||
@@ -548,6 +574,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
mPowerSaveSettings = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
|
||||
this::onPowerSaveResult);
|
||||
|
||||
mSettingsLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
|
||||
this::onSettingsResult);
|
||||
|
||||
mShareLauncher = SharingUtils.RegisterLauncher(this);
|
||||
|
||||
mDisplayManager = DisplayManager.from(this);
|
||||
@@ -579,12 +608,28 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
onRenderingInitializationFinished();
|
||||
}
|
||||
|
||||
private void onSettingsResult(ActivityResult activityResult)
|
||||
{
|
||||
if (activityResult.getResultCode() == Activity.RESULT_OK)
|
||||
{
|
||||
Intent data = activityResult.getData();
|
||||
if (data != null && data.hasExtra(MwmActivity.this.getString(R.string.pref_left_button)))
|
||||
{
|
||||
MapButtonsController mMapButtonsController = (MapButtonsController) getSupportFragmentManager().findFragmentById(R.id.map_buttons);
|
||||
if (mMapButtonsController != null)
|
||||
{
|
||||
mMapButtonsController.reloadLeftButton(buttonsHolder.getActiveButton());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void refreshLightStatusBar()
|
||||
{
|
||||
UiUtils.setLightStatusBar(this, !(
|
||||
ThemeUtils.isNightTheme(this)
|
||||
|| RoutingController.get().isPlanning()
|
||||
|| Framework.nativeGetChoosePositionMode() != Framework.ChoosePositionMode.NONE
|
||||
|| ChoosePositionMode.get() != ChoosePositionMode.None
|
||||
));
|
||||
}
|
||||
|
||||
@@ -645,9 +690,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
mPointChooser.findViewById(R.id.done).setOnClickListener(
|
||||
v ->
|
||||
{
|
||||
switch (Framework.nativeGetChoosePositionMode())
|
||||
switch (ChoosePositionMode.get())
|
||||
{
|
||||
case Framework.ChoosePositionMode.API:
|
||||
case Api:
|
||||
final Intent apiResult = new Intent();
|
||||
final double[] center = Framework.nativeGetScreenRectCenter();
|
||||
apiResult.putExtra(Const.EXTRA_POINT_LAT, center[0]);
|
||||
@@ -656,7 +701,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
setResult(Activity.RESULT_OK, apiResult);
|
||||
finish();
|
||||
break;
|
||||
case Framework.ChoosePositionMode.EDITOR:
|
||||
case Editor:
|
||||
if (Framework.nativeIsDownloadedMapAtScreenCenter())
|
||||
startActivity(new Intent(MwmActivity.this, FeatureCategoryActivity.class));
|
||||
else
|
||||
@@ -669,7 +714,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
.show();
|
||||
}
|
||||
break;
|
||||
case Framework.ChoosePositionMode.NONE:
|
||||
case None:
|
||||
throw new IllegalStateException("Unexpected Framework.nativeGetChoosePositionMode()");
|
||||
}
|
||||
closePositionChooser();
|
||||
@@ -715,7 +760,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
|
||||
public void showPositionChooserForAPI(@Nullable String appName)
|
||||
{
|
||||
showPositionChooser(Framework.ChoosePositionMode.API, false, false);
|
||||
showPositionChooser(ChoosePositionMode.Api, false, false);
|
||||
if (!TextUtils.isEmpty(appName))
|
||||
{
|
||||
setTitle(appName);
|
||||
@@ -725,26 +770,26 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
|
||||
public void showPositionChooserForEditor(boolean isBusiness, boolean applyPosition)
|
||||
{
|
||||
showPositionChooser(Framework.ChoosePositionMode.EDITOR, isBusiness, applyPosition);
|
||||
showPositionChooser(ChoosePositionMode.Editor, isBusiness, applyPosition);
|
||||
}
|
||||
|
||||
private void showPositionChooser(@Framework.ChoosePositionMode int mode, boolean isBusiness, boolean applyPosition)
|
||||
private void showPositionChooser(ChoosePositionMode mode, boolean isBusiness, boolean applyPosition)
|
||||
{
|
||||
closeFloatingToolbarsAndPanels(false);
|
||||
UiUtils.show(mPointChooser);
|
||||
mMapButtonsViewModel.setButtonsHidden(true);
|
||||
Framework.nativeSetChoosePositionMode(mode, isBusiness, applyPosition);
|
||||
ChoosePositionMode.set(mode, isBusiness, applyPosition);
|
||||
refreshLightStatusBar();
|
||||
}
|
||||
|
||||
private void hidePositionChooser()
|
||||
{
|
||||
UiUtils.hide(mPointChooser);
|
||||
@Framework.ChoosePositionMode int mode = Framework.nativeGetChoosePositionMode();
|
||||
Framework.nativeSetChoosePositionMode(Framework.ChoosePositionMode.NONE, false, false);
|
||||
ChoosePositionMode mode = ChoosePositionMode.get();
|
||||
ChoosePositionMode.set(ChoosePositionMode.None, false, false);
|
||||
mMapButtonsViewModel.setButtonsHidden(false);
|
||||
refreshLightStatusBar();
|
||||
if (mode == Framework.ChoosePositionMode.API)
|
||||
if (mode == ChoosePositionMode.Api)
|
||||
finish();
|
||||
}
|
||||
|
||||
@@ -774,16 +819,147 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
|
||||
private void initNavigationButtons()
|
||||
{
|
||||
prepareNavigationButtons();
|
||||
initNavigationButtons(mMapButtonsViewModel.getLayoutMode().getValue());
|
||||
}
|
||||
|
||||
private void prepareNavigationButtons()
|
||||
{
|
||||
buttonsHolder = LeftButtonsHolder.getInstance(this);
|
||||
buttonsHolder.registerButton(new LeftButton()
|
||||
{
|
||||
@Override
|
||||
public String getCode()
|
||||
{
|
||||
return BUTTON_HELP_CODE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPrefsName()
|
||||
{
|
||||
return getString(R.string.help);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawIcon(FloatingActionButton imageView)
|
||||
{
|
||||
imageView.setImageResource(R.drawable.ic_question_mark);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(FloatingActionButton left)
|
||||
{
|
||||
Intent intent = new Intent(MwmActivity.this, HelpActivity.class);
|
||||
MwmActivity.this.startActivity(intent);
|
||||
}
|
||||
});
|
||||
buttonsHolder.registerButton(new LeftButton()
|
||||
{
|
||||
@Override
|
||||
public String getCode()
|
||||
{
|
||||
return BUTTON_ADD_PLACE_CODE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPrefsName()
|
||||
{
|
||||
return getString(R.string.placepage_add_place_button);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawIcon(FloatingActionButton imageView)
|
||||
{
|
||||
imageView.setImageResource(R.drawable.ic_plus);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(FloatingActionButton left)
|
||||
{
|
||||
onAddPlace();
|
||||
}
|
||||
});
|
||||
buttonsHolder.registerButton(new LeftButton()
|
||||
{
|
||||
@Override
|
||||
public String getCode()
|
||||
{
|
||||
return BUTTON_SETTINGS_CODE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPrefsName()
|
||||
{
|
||||
return getString(R.string.settings);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawIcon(FloatingActionButton imageView)
|
||||
{
|
||||
imageView.setImageResource(R.drawable.ic_settings);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(FloatingActionButton left)
|
||||
{
|
||||
onOpenSettings();
|
||||
}
|
||||
});
|
||||
|
||||
buttonsHolder.registerButton(new LeftToggleButton()
|
||||
{
|
||||
private boolean isRecording = TrackRecorder.nativeIsTrackRecordingEnabled();
|
||||
|
||||
@Override
|
||||
public void setChecked(boolean checked)
|
||||
{
|
||||
isRecording = checked;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCode()
|
||||
{
|
||||
return BUTTON_RECORD_TRACK_CODE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPrefsName()
|
||||
{
|
||||
return getString(R.string.start_track_recording);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawIcon(FloatingActionButton imageView)
|
||||
{
|
||||
imageView.setImageResource(R.drawable.ic_track_recording_off);
|
||||
|
||||
int color = isRecording
|
||||
? ContextCompat.getColor(MwmActivity.this, R.color.active_track_recording)
|
||||
: ThemeUtils.getColor(MwmActivity.this, R.attr.iconTint);
|
||||
|
||||
ColorStateList colorStateList = ColorStateList.valueOf(color);
|
||||
imageView.setImageTintList(colorStateList);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(FloatingActionButton left)
|
||||
{
|
||||
onTrackRecordingOptionSelected();
|
||||
drawIcon(left);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void initNavigationButtons(MapButtonsController.LayoutMode layoutMode)
|
||||
{
|
||||
// Recreate the navigation buttons with the correct layout when it changes
|
||||
if (mPreviousMapLayoutMode != layoutMode)
|
||||
{
|
||||
MapButtonsController mapButtonsController = new MapButtonsController();
|
||||
mapButtonsController.setLeftButton(buttonsHolder.getActiveButton());
|
||||
|
||||
FragmentTransaction transaction = getSupportFragmentManager()
|
||||
.beginTransaction().replace(R.id.map_buttons, new MapButtonsController());
|
||||
.beginTransaction().replace(R.id.map_buttons, mapButtonsController);
|
||||
transaction.commit();
|
||||
mPreviousMapLayoutMode = layoutMode;
|
||||
}
|
||||
@@ -1100,7 +1276,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
ThemeSwitcher.INSTANCE.restart(isMapRendererActive());
|
||||
refreshSearchToolbar();
|
||||
setFullscreen(isFullscreen());
|
||||
if (Framework.nativeGetChoosePositionMode() != Framework.ChoosePositionMode.NONE)
|
||||
makeNavigationBarTransparentInLightMode();
|
||||
if (ChoosePositionMode.get() != ChoosePositionMode.None)
|
||||
{
|
||||
UiUtils.show(mPointChooser);
|
||||
mMapButtonsViewModel.setButtonsHidden(true);
|
||||
@@ -1314,7 +1491,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
{
|
||||
// Buttons are hidden in position chooser mode but we are not in fullscreen
|
||||
return Boolean.TRUE.equals(mMapButtonsViewModel.getButtonsHidden().getValue()) &&
|
||||
Framework.nativeGetChoosePositionMode() == Framework.ChoosePositionMode.NONE;
|
||||
ChoosePositionMode.get() == ChoosePositionMode.None;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1578,7 +1755,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateBuildProgress(int progress, @Framework.RouterType int router)
|
||||
public void updateBuildProgress(int progress, Router router)
|
||||
{
|
||||
if (mIsTabletLayout)
|
||||
{
|
||||
@@ -2106,7 +2283,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSearchRoutePoint(@RoutePointInfo.RouteMarkType int pointType)
|
||||
public void onSearchRoutePoint(@NonNull RouteMarkType pointType)
|
||||
{
|
||||
RoutingController.get().waitForPoiPick(pointType);
|
||||
closeSearchToolbar(true, true);
|
||||
@@ -2279,7 +2456,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
public void onAddPlaceOptionSelected()
|
||||
{
|
||||
closeFloatingPanels();
|
||||
showPositionChooserForEditor(false, false);
|
||||
onAddPlace();
|
||||
}
|
||||
|
||||
public void onDownloadMapsOptionSelected()
|
||||
@@ -2296,9 +2473,14 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
|
||||
public void onSettingsOptionSelected()
|
||||
{
|
||||
Intent intent = new Intent(this, SettingsActivity.class);
|
||||
closeFloatingPanels();
|
||||
startActivity(intent);
|
||||
onOpenSettings();
|
||||
}
|
||||
|
||||
private void onOpenSettings()
|
||||
{
|
||||
Intent intent = new Intent(this, SettingsActivity.class);
|
||||
mSettingsLauncher.launch(intent);
|
||||
}
|
||||
|
||||
private boolean startTrackRecording()
|
||||
@@ -2376,9 +2558,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
.setTitle(R.string.track_recording_alert_title)
|
||||
.setCancelable(false)
|
||||
// Negative/Positive/Neutral do not have their usual meaning here.
|
||||
.setNegativeButton(R.string.continue_recording, (dialog, which) -> {
|
||||
mAlertDialog = null;
|
||||
})
|
||||
.setNegativeButton(R.string.continue_recording, (dialog, which) -> mAlertDialog = null)
|
||||
.setNeutralButton(R.string.stop_without_saving, (dialog, which) -> {
|
||||
stopTrackRecording();
|
||||
mAlertDialog = null;
|
||||
@@ -2447,4 +2627,26 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
if (level >= TRIM_MEMORY_RUNNING_LOW)
|
||||
Framework.nativeMemoryWarning();
|
||||
}
|
||||
|
||||
private void makeNavigationBarTransparentInLightMode()
|
||||
{
|
||||
int nightMask = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
|
||||
if (nightMask == Configuration.UI_MODE_NIGHT_NO) // if light mode
|
||||
{
|
||||
Window window = getWindow();
|
||||
window.setNavigationBarColor(Color.TRANSPARENT);
|
||||
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
|
||||
|
||||
int flags = window.getDecorView().getSystemUiVisibility();
|
||||
flags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1)
|
||||
flags |= View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
|
||||
|
||||
window.getDecorView().setSystemUiVisibility(flags);
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
|
||||
window.setNavigationBarContrastEnforced(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,10 +20,9 @@ import java.io.IOException;
|
||||
import java.lang.ref.WeakReference;
|
||||
|
||||
import app.organicmaps.background.OsmUploadWork;
|
||||
import app.organicmaps.bookmarks.data.BookmarkManager;
|
||||
import app.organicmaps.display.DisplayManager;
|
||||
import app.organicmaps.downloader.Android7RootCertificateWorkaround;
|
||||
import app.organicmaps.downloader.DownloaderNotifier;
|
||||
import app.organicmaps.display.DisplayManager;
|
||||
import app.organicmaps.location.LocationHelper;
|
||||
import app.organicmaps.location.LocationState;
|
||||
import app.organicmaps.location.SensorHelper;
|
||||
@@ -31,18 +30,11 @@ import app.organicmaps.location.TrackRecorder;
|
||||
import app.organicmaps.location.TrackRecordingService;
|
||||
import app.organicmaps.maplayer.isolines.IsolinesManager;
|
||||
import app.organicmaps.maplayer.subway.SubwayManager;
|
||||
import app.organicmaps.maplayer.traffic.TrafficManager;
|
||||
import app.organicmaps.routing.NavigationService;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.search.SearchEngine;
|
||||
import app.organicmaps.settings.StoragePathManager;
|
||||
import app.organicmaps.sound.TtsPlayer;
|
||||
import app.organicmaps.sdk.OrganicMaps;
|
||||
import app.organicmaps.util.Config;
|
||||
import app.organicmaps.util.ConnectionState;
|
||||
import app.organicmaps.util.SharedPropertiesUtils;
|
||||
import app.organicmaps.util.StorageUtils;
|
||||
import app.organicmaps.util.ThemeSwitcher;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.log.Logger;
|
||||
import app.organicmaps.util.log.LogsManager;
|
||||
@@ -52,6 +44,10 @@ public class MwmApplication extends Application implements Application.ActivityL
|
||||
@NonNull
|
||||
private static final String TAG = MwmApplication.class.getSimpleName();
|
||||
|
||||
@SuppressWarnings("NotNullFieldNotInitialized")
|
||||
@NonNull
|
||||
private OrganicMaps mOrganicMaps;
|
||||
|
||||
@SuppressWarnings("NotNullFieldNotInitialized")
|
||||
@NonNull
|
||||
private SubwayManager mSubwayManager;
|
||||
@@ -72,9 +68,6 @@ public class MwmApplication extends Application implements Application.ActivityL
|
||||
@NonNull
|
||||
private DisplayManager mDisplayManager;
|
||||
|
||||
private volatile boolean mFrameworkInitialized;
|
||||
private volatile boolean mPlatformInitialized;
|
||||
|
||||
@Nullable
|
||||
private WeakReference<Activity> mTopActivity;
|
||||
|
||||
@@ -115,6 +108,12 @@ public class MwmApplication extends Application implements Application.ActivityL
|
||||
return mDisplayManager;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public OrganicMaps getOrganicMaps()
|
||||
{
|
||||
return mOrganicMaps;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static MwmApplication from(@NonNull Context context)
|
||||
{
|
||||
@@ -138,20 +137,12 @@ public class MwmApplication extends Application implements Application.ActivityL
|
||||
|
||||
sInstance = this;
|
||||
|
||||
mOrganicMaps = new OrganicMaps(getApplicationContext());
|
||||
|
||||
LogsManager.INSTANCE.initFileLogging(this);
|
||||
|
||||
Android7RootCertificateWorkaround.initializeIfNeeded(this);
|
||||
|
||||
// Set configuration directory as early as possible.
|
||||
// Other methods may explicitly use Config, which requires settingsDir to be set.
|
||||
final String settingsPath = StorageUtils.getSettingsPath(this);
|
||||
if (!StorageUtils.createDirectory(settingsPath))
|
||||
throw new AssertionError("Can't create settingsDir " + settingsPath);
|
||||
Logger.d(TAG, "Settings path = " + settingsPath);
|
||||
nativeSetSettingsDir(settingsPath);
|
||||
|
||||
Config.init(this);
|
||||
|
||||
ConnectionState.INSTANCE.initialize(this);
|
||||
|
||||
DownloaderNotifier.createNotificationChannel(this);
|
||||
@@ -166,117 +157,16 @@ public class MwmApplication extends Application implements Application.ActivityL
|
||||
mDisplayManager = new DisplayManager();
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize native core of application: platform and framework.
|
||||
*
|
||||
* @throws IOException - if failed to create directories. Caller must handle
|
||||
* the exception and do nothing with native code if initialization is failed.
|
||||
*/
|
||||
public boolean init(@NonNull Runnable onComplete) throws IOException
|
||||
public boolean initOrganicMaps(@NonNull Runnable onComplete) throws IOException
|
||||
{
|
||||
initNativePlatform();
|
||||
return initNativeFramework(onComplete);
|
||||
return mOrganicMaps.init(() -> {
|
||||
ProcessLifecycleOwner.get().getLifecycle().addObserver(mProcessLifecycleObserver);
|
||||
onComplete.run();
|
||||
});
|
||||
}
|
||||
|
||||
private void initNativePlatform() throws IOException
|
||||
private final LifecycleObserver mProcessLifecycleObserver = new DefaultLifecycleObserver()
|
||||
{
|
||||
if (mPlatformInitialized)
|
||||
return;
|
||||
|
||||
final String apkPath = StorageUtils.getApkPath(this);
|
||||
Logger.d(TAG, "Apk path = " + apkPath);
|
||||
// Note: StoragePathManager uses Config, which requires SettingsDir to be set.
|
||||
final String writablePath = StoragePathManager.findMapsStorage(this);
|
||||
Logger.d(TAG, "Writable path = " + writablePath);
|
||||
final String privatePath = StorageUtils.getPrivatePath(this);
|
||||
Logger.d(TAG, "Private path = " + privatePath);
|
||||
final String tempPath = StorageUtils.getTempPath(this);
|
||||
Logger.d(TAG, "Temp path = " + tempPath);
|
||||
|
||||
// If platform directories are not created it means that native part of app will not be able
|
||||
// to work at all. So, we just ignore native part initialization in this case, e.g. when the
|
||||
// external storage is damaged or not available (read-only).
|
||||
createPlatformDirectories(writablePath, privatePath, tempPath);
|
||||
|
||||
nativeInitPlatform(getApplicationContext(),
|
||||
apkPath,
|
||||
writablePath,
|
||||
privatePath,
|
||||
tempPath,
|
||||
app.organicmaps.BuildConfig.FLAVOR,
|
||||
app.organicmaps.BuildConfig.BUILD_TYPE, UiUtils.isTablet(this));
|
||||
Config.setStoragePath(writablePath);
|
||||
Config.setStatisticsEnabled(SharedPropertiesUtils.isStatisticsEnabled(this));
|
||||
|
||||
mPlatformInitialized = true;
|
||||
Logger.i(TAG, "Platform initialized");
|
||||
}
|
||||
|
||||
private void createPlatformDirectories(@NonNull String writablePath,
|
||||
@NonNull String privatePath,
|
||||
@NonNull String tempPath) throws IOException
|
||||
{
|
||||
SharedPropertiesUtils.emulateBadExternalStorage(this);
|
||||
|
||||
StorageUtils.requireDirectory(writablePath);
|
||||
StorageUtils.requireDirectory(privatePath);
|
||||
StorageUtils.requireDirectory(tempPath);
|
||||
}
|
||||
|
||||
private boolean initNativeFramework(@NonNull Runnable onComplete)
|
||||
{
|
||||
if (mFrameworkInitialized)
|
||||
return false;
|
||||
|
||||
nativeInitFramework(onComplete);
|
||||
|
||||
initNativeStrings();
|
||||
ThemeSwitcher.INSTANCE.initialize(this);
|
||||
SearchEngine.INSTANCE.initialize();
|
||||
BookmarkManager.loadBookmarks();
|
||||
TtsPlayer.INSTANCE.initialize(this);
|
||||
ThemeSwitcher.INSTANCE.restart(false);
|
||||
RoutingController.get().initialize(this);
|
||||
TrafficManager.INSTANCE.initialize();
|
||||
SubwayManager.from(this).initialize();
|
||||
IsolinesManager.from(this).initialize();
|
||||
ProcessLifecycleOwner.get().getLifecycle().addObserver(mProcessLifecycleObserver);
|
||||
|
||||
Logger.i(TAG, "Framework initialized");
|
||||
mFrameworkInitialized = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
private void initNativeStrings()
|
||||
{
|
||||
nativeAddLocalization("core_entrance", getString(R.string.core_entrance));
|
||||
nativeAddLocalization("core_exit", getString(R.string.core_exit));
|
||||
nativeAddLocalization("core_my_places", getString(R.string.core_my_places));
|
||||
nativeAddLocalization("core_my_position", getString(R.string.core_my_position));
|
||||
nativeAddLocalization("core_placepage_unknown_place", getString(R.string.core_placepage_unknown_place));
|
||||
nativeAddLocalization("postal_code", getString(R.string.postal_code));
|
||||
nativeAddLocalization("wifi", getString(R.string.category_wifi));
|
||||
}
|
||||
|
||||
public boolean arePlatformAndCoreInitialized()
|
||||
{
|
||||
return mFrameworkInitialized && mPlatformInitialized;
|
||||
}
|
||||
|
||||
static
|
||||
{
|
||||
System.loadLibrary("organicmaps");
|
||||
}
|
||||
|
||||
private static native void nativeSetSettingsDir(String settingsPath);
|
||||
private static native void nativeInitPlatform(Context context, String apkPath, String writablePath,
|
||||
String privatePath, String tmpPath, String flavorName,
|
||||
String buildType, boolean isTablet);
|
||||
private static native void nativeInitFramework(@NonNull Runnable onComplete);
|
||||
private static native void nativeAddLocalization(String name, String value);
|
||||
private static native void nativeOnTransit(boolean foreground);
|
||||
|
||||
private final LifecycleObserver mProcessLifecycleObserver = new DefaultLifecycleObserver() {
|
||||
@Override
|
||||
public void onStart(@NonNull LifecycleOwner owner)
|
||||
{
|
||||
@@ -334,8 +224,6 @@ public class MwmApplication extends Application implements Application.ActivityL
|
||||
{
|
||||
Logger.d(TAG);
|
||||
|
||||
nativeOnTransit(true);
|
||||
|
||||
mLocationHelper.resumeLocationInForeground();
|
||||
}
|
||||
|
||||
@@ -343,8 +231,6 @@ public class MwmApplication extends Application implements Application.ActivityL
|
||||
{
|
||||
Logger.d(TAG);
|
||||
|
||||
nativeOnTransit(false);
|
||||
|
||||
OsmUploadWork.startActionUploadOsmChanges(this);
|
||||
|
||||
if (!mDisplayManager.isDeviceDisplayUsed())
|
||||
|
||||
@@ -2,7 +2,6 @@ package app.organicmaps;
|
||||
|
||||
import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
|
||||
import static android.Manifest.permission.ACCESS_FINE_LOCATION;
|
||||
import static app.organicmaps.api.Const.EXTRA_PICK_POINT;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
@@ -146,7 +145,7 @@ public class SplashActivity extends AppCompatActivity
|
||||
boolean asyncContinue = false;
|
||||
try
|
||||
{
|
||||
asyncContinue = app.init(this::processNavigation);
|
||||
asyncContinue = app.initOrganicMaps(this::processNavigation);
|
||||
} catch (IOException error)
|
||||
{
|
||||
showFatalErrorDialog(R.string.dialog_error_storage_title, R.string.dialog_error_storage_message, error);
|
||||
|
||||
@@ -2,7 +2,7 @@ package app.organicmaps.api;
|
||||
|
||||
import androidx.annotation.Keep;
|
||||
|
||||
import app.organicmaps.Framework;
|
||||
import app.organicmaps.sdk.Router;
|
||||
|
||||
/**
|
||||
* Represents Framework::ParsedRoutingData from core.
|
||||
@@ -13,11 +13,10 @@ import app.organicmaps.Framework;
|
||||
public class ParsedRoutingData
|
||||
{
|
||||
public final RoutePoint[] mPoints;
|
||||
@Framework.RouterType
|
||||
public final int mRouterType;
|
||||
public final Router mRouterType;
|
||||
|
||||
public ParsedRoutingData(RoutePoint[] points, int routerType) {
|
||||
this.mPoints = points;
|
||||
this.mRouterType = routerType;
|
||||
this.mRouterType = Router.valueOf(routerType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ public class OsmUploadWork extends Worker
|
||||
public Result doWork()
|
||||
{
|
||||
final MwmApplication app = MwmApplication.from(mContext);
|
||||
if (!app.arePlatformAndCoreInitialized())
|
||||
if (!app.getOrganicMaps().arePlatformAndCoreInitialized())
|
||||
{
|
||||
Logger.w(TAG, "Application is not initialized, ignoring " + mWorkerParameters);
|
||||
return Result.failure();
|
||||
|
||||
@@ -69,7 +69,7 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity
|
||||
setTheme(getThemeResourceId(mThemeName));
|
||||
EdgeToEdge.enable(this, SystemBarStyle.dark(Color.TRANSPARENT));
|
||||
RtlUtils.manageRtl(this);
|
||||
if (!MwmApplication.from(this).arePlatformAndCoreInitialized())
|
||||
if (!MwmApplication.from(this).getOrganicMaps().arePlatformAndCoreInitialized())
|
||||
{
|
||||
final Intent intent = Objects.requireNonNull(getIntent());
|
||||
intent.setComponent(new ComponentName(this, SplashActivity.class));
|
||||
|
||||
@@ -10,7 +10,7 @@ import androidx.annotation.Nullable;
|
||||
import androidx.core.os.ParcelCompat;
|
||||
|
||||
import app.organicmaps.Framework;
|
||||
import app.organicmaps.routing.RoutePointInfo;
|
||||
import app.organicmaps.sdk.routing.RoutePointInfo;
|
||||
import app.organicmaps.sdk.search.Popularity;
|
||||
import app.organicmaps.util.Constants;
|
||||
|
||||
|
||||
@@ -923,7 +923,7 @@ public enum BookmarkManager
|
||||
public interface BookmarksSortingListener
|
||||
{
|
||||
void onBookmarksSortingCompleted(@NonNull SortedBlock[] sortedBlocks, long timestamp);
|
||||
default void onBookmarksSortingCancelled(long timestamp) {};
|
||||
default void onBookmarksSortingCancelled(long timestamp) {}
|
||||
}
|
||||
|
||||
public interface BookmarksSharingListener
|
||||
|
||||
@@ -5,7 +5,6 @@ import android.os.Parcelable;
|
||||
|
||||
import androidx.annotation.DrawableRes;
|
||||
import androidx.annotation.IntDef;
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.google.common.base.Objects;
|
||||
|
||||
|
||||
@@ -10,16 +10,12 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.os.ParcelCompat;
|
||||
|
||||
import app.organicmaps.Framework;
|
||||
import app.organicmaps.routing.RoutePointInfo;
|
||||
import app.organicmaps.sdk.routing.RoutePointInfo;
|
||||
import app.organicmaps.sdk.search.Popularity;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.widget.placepage.PlacePageData;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.time.Instant;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
@@ -67,7 +67,9 @@ public class Metadata implements Parcelable
|
||||
FMD_WEBSITE_MENU(46),
|
||||
FMD_SELF_SERVICE(47),
|
||||
FMD_OUTDOOR_SEATING(48),
|
||||
FMD_NETWORK(49);
|
||||
FMD_NETWORK(49),
|
||||
FMD_CONTACT_FEDIVERSE(50),
|
||||
FMD_CONTACT_BLUESKY(51);
|
||||
private final int mMetaType;
|
||||
|
||||
MetadataType(int metadataType)
|
||||
|
||||
@@ -35,6 +35,7 @@ import app.organicmaps.display.DisplayManager;
|
||||
import app.organicmaps.display.DisplayType;
|
||||
import app.organicmaps.location.LocationState;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.PlacePageActivationListener;
|
||||
import app.organicmaps.util.Config;
|
||||
import app.organicmaps.util.LocationUtils;
|
||||
import app.organicmaps.util.log.Logger;
|
||||
@@ -45,7 +46,7 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public final class CarAppSession extends Session implements DefaultLifecycleObserver,
|
||||
LocationState.ModeChangeListener, DisplayChangedListener, Framework.PlacePageActivationListener
|
||||
LocationState.ModeChangeListener, DisplayChangedListener, PlacePageActivationListener
|
||||
{
|
||||
private static final String TAG = CarAppSession.class.getSimpleName();
|
||||
|
||||
@@ -163,7 +164,7 @@ public final class CarAppSession extends Session implements DefaultLifecycleObse
|
||||
mInitFailed = false;
|
||||
try
|
||||
{
|
||||
MwmApplication.from(getCarContext()).init(() -> {
|
||||
MwmApplication.from(getCarContext()).initOrganicMaps(() -> {
|
||||
Config.setFirstStartDialogSeen(getCarContext());
|
||||
if (DownloaderHelpers.isWorldMapsDownloadNeeded())
|
||||
mScreenManager.push(new DownloadMapsScreenBuilder(getCarContext()).setDownloaderType(DownloadMapsScreenBuilder.DownloaderType.FirstLaunch).build());
|
||||
|
||||
@@ -30,10 +30,10 @@ import app.organicmaps.car.util.ThemeUtils;
|
||||
import app.organicmaps.car.util.UiHelpers;
|
||||
import app.organicmaps.location.LocationHelper;
|
||||
import app.organicmaps.location.LocationListener;
|
||||
import app.organicmaps.routing.JunctionInfo;
|
||||
import app.organicmaps.sdk.routing.JunctionInfo;
|
||||
import app.organicmaps.routing.NavigationService;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.routing.RoutingInfo;
|
||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||
import app.organicmaps.sound.TtsPlayer;
|
||||
import app.organicmaps.util.LocationUtils;
|
||||
import app.organicmaps.util.log.Logger;
|
||||
|
||||
@@ -41,14 +41,15 @@ import app.organicmaps.car.util.UiHelpers;
|
||||
import app.organicmaps.location.LocationHelper;
|
||||
import app.organicmaps.routing.ResultCodesHelper;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.routing.RoutingInfo;
|
||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||
import app.organicmaps.sdk.Router;
|
||||
import app.organicmaps.util.Config;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class PlaceScreen extends BaseMapScreen implements OnBackPressedCallback.Callback, RoutingController.Container
|
||||
{
|
||||
private static final int ROUTER_TYPE = Framework.ROUTER_TYPE_VEHICLE;
|
||||
private static final Router ROUTER = Router.Vehicle;
|
||||
|
||||
@Nullable
|
||||
private MapObject mMapObject;
|
||||
@@ -83,7 +84,7 @@ public class PlaceScreen extends BaseMapScreen implements OnBackPressedCallback.
|
||||
public void onCreate(@NonNull LifecycleOwner owner)
|
||||
{
|
||||
mRoutingController.restore();
|
||||
if (mRoutingController.isNavigating() && mRoutingController.getLastRouterType() == ROUTER_TYPE)
|
||||
if (mRoutingController.isNavigating() && mRoutingController.getLastRouterType() == ROUTER)
|
||||
{
|
||||
showNavigation(true);
|
||||
return;
|
||||
@@ -95,11 +96,11 @@ public class PlaceScreen extends BaseMapScreen implements OnBackPressedCallback.
|
||||
else
|
||||
{
|
||||
final boolean hasIncorrectEndPoint = mRoutingController.isPlanning() && (!MapObject.same(mMapObject, mRoutingController.getEndPoint()));
|
||||
final boolean hasIncorrectRouterType = mRoutingController.getLastRouterType() != ROUTER_TYPE;
|
||||
final boolean hasIncorrectRouterType = mRoutingController.getLastRouterType() != ROUTER;
|
||||
final boolean isNotPlanningMode = !mRoutingController.isPlanning();
|
||||
if (hasIncorrectRouterType)
|
||||
{
|
||||
mRoutingController.setRouterType(ROUTER_TYPE);
|
||||
mRoutingController.setRouterType(ROUTER);
|
||||
mRoutingController.rebuildLastRoute();
|
||||
}
|
||||
else if (hasIncorrectEndPoint || isNotPlanningMode)
|
||||
|
||||
@@ -18,7 +18,7 @@ import app.organicmaps.car.SurfaceRenderer;
|
||||
import app.organicmaps.car.screens.base.BaseMapScreen;
|
||||
import app.organicmaps.car.util.Toggle;
|
||||
import app.organicmaps.car.util.UiHelpers;
|
||||
import app.organicmaps.routing.RoutingOptions;
|
||||
import app.organicmaps.sdk.routing.RoutingOptions;
|
||||
import app.organicmaps.settings.RoadType;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
@@ -8,8 +8,8 @@ import androidx.car.app.navigation.model.LaneDirection;
|
||||
import androidx.car.app.navigation.model.Maneuver;
|
||||
import androidx.core.graphics.drawable.IconCompat;
|
||||
|
||||
import app.organicmaps.routing.RoutingInfo;
|
||||
import app.organicmaps.routing.SingleLaneInfo;
|
||||
import app.organicmaps.sdk.routing.CarDirection;
|
||||
import app.organicmaps.sdk.routing.LaneWay;
|
||||
|
||||
public final class RoutingHelpers
|
||||
{
|
||||
@@ -30,7 +30,7 @@ public final class RoutingHelpers
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static LaneDirection createLaneDirection(@NonNull SingleLaneInfo.LaneWay laneWay, boolean isRecommended)
|
||||
public static LaneDirection createLaneDirection(@NonNull LaneWay laneWay, boolean isRecommended)
|
||||
{
|
||||
int shape = LaneDirection.SHAPE_UNKNOWN;
|
||||
switch (laneWay)
|
||||
@@ -67,7 +67,7 @@ public final class RoutingHelpers
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static Maneuver createManeuver(@NonNull final CarContext context, @NonNull RoutingInfo.CarDirection carDirection, int roundaboutExitNum)
|
||||
public static Maneuver createManeuver(@NonNull final CarContext context, @NonNull CarDirection carDirection, int roundaboutExitNum)
|
||||
{
|
||||
int maneuverType = switch (carDirection)
|
||||
{
|
||||
|
||||
@@ -15,8 +15,9 @@ import androidx.car.app.navigation.model.Trip;
|
||||
import androidx.core.graphics.drawable.IconCompat;
|
||||
|
||||
import app.organicmaps.bookmarks.data.MapObject;
|
||||
import app.organicmaps.routing.RoutingInfo;
|
||||
import app.organicmaps.routing.SingleLaneInfo;
|
||||
import app.organicmaps.sdk.routing.LaneWay;
|
||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||
import app.organicmaps.sdk.routing.SingleLaneInfo;
|
||||
import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.widget.LanesDrawable;
|
||||
|
||||
@@ -71,7 +72,7 @@ public final class RoutingUtils
|
||||
for (final SingleLaneInfo laneInfo : info.lanes)
|
||||
{
|
||||
final Lane.Builder laneBuilder = new Lane.Builder();
|
||||
for (final SingleLaneInfo.LaneWay laneWay : laneInfo.mLane)
|
||||
for (final LaneWay laneWay : laneInfo.mLane)
|
||||
laneBuilder.addDirection(RoutingHelpers.createLaneDirection(laneWay, laneInfo.mIsActive));
|
||||
builder.addLane(laneBuilder.build());
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user