forked from organicmaps/organicmaps
Compare commits
25 commits
master
...
alpha/2025
Author | SHA1 | Date | |
---|---|---|---|
|
a9ccca0c27 | ||
f9af1f82a7 | |||
952f7860a2 | |||
ab4f921da2 | |||
039d5574c2 | |||
c85b570a68 | |||
29c9b931c0 | |||
|
8184cc6f1a | ||
|
36c4d5e8a9 | ||
|
f05edb3d16 | ||
f323f9328a | |||
4d303fac48 | |||
bd06510794 | |||
50f3877279 | |||
445aa8c14d | |||
c9bf7551dd | |||
ef574973d9 | |||
cf75ec6f71 | |||
|
76c9df706a | ||
|
f2f9ee6873 | ||
34fcdbd3e3 | |||
51fe7b5662 | |||
118cf8ad30 | |||
8309a8d037 | |||
9d88d1f3c9 |
717 changed files with 209106 additions and 152491 deletions
92
.github/CODEOWNERS
vendored
92
.github/CODEOWNERS
vendored
|
@ -1,69 +1,67 @@
|
|||
# All non-assigned.
|
||||
* @organicmaps/mergers
|
||||
# Visual design.
|
||||
/android/app/src/main/res/drawable*/ @organicmaps/design
|
||||
/android/app/src/main/res/font/ @organicmaps/design
|
||||
/android/app/src/main/res/mipmap*/ @organicmaps/design
|
||||
/data/*.ttf @organicmaps/design
|
||||
/data/resources-svg/ @organicmaps/design
|
||||
/data/search-icons/ @organicmaps/design
|
||||
/iphone/Maps/Images.xcassets/ @organicmaps/design
|
||||
android/app/src/main/res/drawable*/ @organicmaps/design
|
||||
android/app/src/main/res/font/ @organicmaps/design
|
||||
android/app/src/main/res/mipmap*/ @organicmaps/design
|
||||
data/*.ttf @organicmaps/design
|
||||
data/resources*/ @organicmaps/design
|
||||
data/search-icons/ @organicmaps/design
|
||||
iphone/Maps/Images.xcassets/ @organicmaps/design
|
||||
# Android.
|
||||
/android/ @organicmaps/android
|
||||
/android/app/src/main/java/app/organicmaps/car/ @organicmaps/android-auto
|
||||
/docs/ANDROID_LOCATION_TEST.md @organicmaps/android
|
||||
/docs/JAVA_STYLE.md @organicmaps/android
|
||||
android/ @organicmaps/android
|
||||
android/app/src/main/java/app/organicmaps/car/ @organicmaps/android-auto
|
||||
docs/ANDROID_LOCATION_TEST.md @organicmaps/android
|
||||
docs/JAVA_STYLE.md @organicmaps/android
|
||||
# no owner for translation changes
|
||||
/android/app/src/main/res/values*/strings.xml
|
||||
# iOS.
|
||||
/iphone/ @organicmaps/ios
|
||||
/xcode/ @organicmaps/ios
|
||||
/docs/OBJC_STYLE.md @organicmaps/ios
|
||||
iphone/ @organicmaps/ios
|
||||
xcode/ @organicmaps/ios
|
||||
docs/OBJC_STYLE.md @organicmaps/ios
|
||||
# no owner for translation changes
|
||||
/iphone/plist.txt
|
||||
/iphone/Maps/LocalizedStrings/
|
||||
# Qt
|
||||
/qt/ @organicmaps/qt
|
||||
qt/ @organicmaps/qt
|
||||
# Rendering
|
||||
/drape/ @organicmaps/rendering
|
||||
/drape_frontend/ @organicmaps/rendering
|
||||
drape/ @organicmaps/rendering
|
||||
drape_frontend/ @organicmaps/rendering
|
||||
# Map Data.
|
||||
/tools/python/maps_generator/ @organicmaps/data
|
||||
/generator/ @organicmaps/data
|
||||
/topography_generator/ @organicmaps/data
|
||||
/data/borders/ @organicmaps/data
|
||||
/data/conf/isolines/ @organicmaps/data
|
||||
/docs/SUBWAY_GENERATION.md @organicmaps/data
|
||||
/docs/MAPS.md @organicmaps/data
|
||||
/docs/EXPERIMENTAL_PUBLIC_TRANSPORT_SUPPORT.md @organicmaps/data
|
||||
# no owner (changed often to add a new POI)
|
||||
/generator/generator_tests/osm_type_test.cpp
|
||||
tools/python/maps_generator/ @organicmaps/data
|
||||
generator/ @organicmaps/data
|
||||
topography_generator/ @organicmaps/data
|
||||
data/borders/ @organicmaps/data
|
||||
data/conf/isolines/ @organicmaps/data
|
||||
docs/SUBWAY_GENERATION.md @organicmaps/data
|
||||
docs/MAPS.md @organicmaps/data
|
||||
docs/EXPERIMENTAL_PUBLIC_TRANSPORT_SUPPORT.md @organicmaps/data
|
||||
# Map Styles.
|
||||
/data/styles/ @organicmaps/styles
|
||||
/data/types.txt @organicmaps/styles
|
||||
/data/visibility.txt @organicmaps/styles
|
||||
/data/mapcss-mapping.csv @organicmaps/styles
|
||||
/data/replaced_tags.txt @organicmaps/styles
|
||||
/data/classificator.txt @organicmaps/styles
|
||||
/data/drules_* @organicmaps/styles
|
||||
/docs/STYLES.md
|
||||
/tools/kothic/ @organicmaps/styles
|
||||
data/styles/ @organicmaps/styles
|
||||
data/types.txt @organicmaps/styles
|
||||
data/visibility.txt @organicmaps/styles
|
||||
data/mapcss-mapping.csv @organicmaps/styles
|
||||
data/replaced_tags.txt @organicmaps/styles
|
||||
data/classificator.txt @organicmaps/styles
|
||||
data/drules_* @organicmaps/styles
|
||||
docs/STYLES.md
|
||||
tools/kothic/ @organicmaps/styles
|
||||
# DevOps.
|
||||
/.github/workflows @organicmaps/devops
|
||||
/android/*gradle* @organicmaps/devops
|
||||
/docs/RELEASE_MANAGEMENT.md @organicmaps/devops
|
||||
/xcode/fastlane/ @organicmaps/devops
|
||||
.github/workflows @organicmaps/devops
|
||||
android/*gradle* @organicmaps/devops
|
||||
docs/RELEASE_MANAGEMENT.md @organicmaps/devops
|
||||
xcode/fastlane/ @organicmaps/devops
|
||||
# Growth.
|
||||
README.md @organicmaps/growth
|
||||
/.github/FUNDING.yml @organicmaps/growth
|
||||
/android/app/src/fdroid/play/ @organicmaps/growth
|
||||
/android/app/src/google/play/ @organicmaps/growth
|
||||
/iphone/metadata/ @organicmaps/growth
|
||||
.github/FUNDING.yml @organicmaps/growth
|
||||
android/app/src/fdroid/play/ @organicmaps/growth
|
||||
android/app/src/google/play/ @organicmaps/growth
|
||||
iphone/metadata/ @organicmaps/growth
|
||||
# Legal.
|
||||
LEGAL @organicmaps/legal
|
||||
LICENSE @organicmaps/legal
|
||||
NOTICE @organicmaps/legal
|
||||
CONTRIBUTORS @organicmaps/legal
|
||||
/docs/CODE_OF_CONDUCT.md @organicmaps/legal
|
||||
/docs/DCO.md @organicmaps/legal
|
||||
/docs/GOVERNANCE.md @organicmaps/legal
|
||||
docs/CODE_OF_CONDUCT.md @organicmaps/legal
|
||||
docs/DCO.md @organicmaps/legal
|
||||
docs/GOVERNANCE.md @organicmaps/legal
|
||||
|
|
8
.github/workflows/linux-check.yaml
vendored
8
.github/workflows/linux-check.yaml
vendored
|
@ -61,10 +61,6 @@ jobs:
|
|||
libgl1-mesa-dev \
|
||||
libglvnd-dev \
|
||||
libharfbuzz-dev \
|
||||
libxrandr-dev \
|
||||
libxinerama-dev \
|
||||
libxcursor-dev \
|
||||
libxi-dev \
|
||||
qt6-base-dev \
|
||||
libqt6svg6-dev \
|
||||
qt6-positioning-dev \
|
||||
|
@ -132,10 +128,6 @@ jobs:
|
|||
libgl1-mesa-dev \
|
||||
libglvnd-dev \
|
||||
libharfbuzz-dev \
|
||||
libxrandr-dev \
|
||||
libxinerama-dev \
|
||||
libxcursor-dev \
|
||||
libxi-dev \
|
||||
qt6-base-dev \
|
||||
libqt6svg6-dev \
|
||||
qt6-positioning-dev \
|
||||
|
|
22
.github/workflows/stale.yml
vendored
22
.github/workflows/stale.yml
vendored
|
@ -1,22 +0,0 @@
|
|||
name: Close stale PRs
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 0 * * *" # Runs every day at midnight
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/stale@v9
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
days-before-pr-stale: 180 # 6 months before warning
|
||||
days-before-pr-close: 365 # Closed after 12 months
|
||||
stale-pr-label: "stale"
|
||||
stale-pr-message: "Hi! This PR has been inactive for 6 months. If it's still relevant, please update it to let us know you’d like to keep it open 😊"
|
||||
close-pr-message: "This PR has been automatically closed after 12 months of inactivity."
|
||||
days-before-issue-stale: -1 # Issues are never stale
|
||||
days-before-issue-close: -1 # Issues are never closed
|
||||
remove-stale-when-updated: true
|
31
.github/workflows/strings-check.yaml
vendored
Normal file
31
.github/workflows/strings-check.yaml
vendored
Normal file
|
@ -0,0 +1,31 @@
|
|||
name: Validate translation strings
|
||||
on:
|
||||
workflow_dispatch: # Manual trigger
|
||||
pull_request:
|
||||
paths:
|
||||
- .github/workflows/strings-check.yaml # Run check on self change
|
||||
- data/strings/strings.txt
|
||||
- data/strings/types_strings.txt
|
||||
- data/strings/sound.txt
|
||||
- data/countries_names.txt
|
||||
- iphone/plist.txt
|
||||
- tools/python/strings_utils.py
|
||||
|
||||
jobs:
|
||||
validate-translation-strings:
|
||||
name: Validate translation strings
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3'
|
||||
|
||||
- name: Validate string files
|
||||
shell: bash
|
||||
run: |
|
||||
for f in data/strings/strings.txt data/strings/types_strings.txt data/strings/sound.txt data/countries_names.txt iphone/plist.txt; do
|
||||
./tools/python/strings_utils.py --validate $f -o
|
||||
done;
|
||||
git diff --exit-code
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -20,7 +20,6 @@ data/drules_proto_default_design.bin
|
|||
data/colors_design.txt
|
||||
data/patterns_design.txt
|
||||
data/bookmarks
|
||||
data/edits.xml
|
||||
|
||||
# Compiled Python
|
||||
*.pyc
|
||||
|
|
48
.gitmodules
vendored
48
.gitmodules
vendored
|
@ -1,67 +1,61 @@
|
|||
[submodule "tools/osmctools"]
|
||||
path = tools/osmctools
|
||||
url = ../osmctools.git
|
||||
url = https://github.com/organicmaps/osmctools.git
|
||||
[submodule "tools/kothic"]
|
||||
path = tools/kothic
|
||||
url = ../kothic.git
|
||||
url = https://github.com/organicmaps/kothic.git
|
||||
[submodule "3party/protobuf/protobuf"]
|
||||
path = 3party/protobuf/protobuf
|
||||
url = ../protobuf.git
|
||||
url = https://github.com/organicmaps/protobuf.git
|
||||
[submodule "tools/twine"]
|
||||
path = tools/twine
|
||||
url = https://github.com/organicmaps/twine.git
|
||||
[submodule "3party/Vulkan-Headers"]
|
||||
path = 3party/Vulkan-Headers
|
||||
url = ../Vulkan-Headers.git
|
||||
url = https://github.com/KhronosGroup/Vulkan-Headers.git
|
||||
[submodule "3party/boost"]
|
||||
path = 3party/boost
|
||||
url = ../boost.git
|
||||
url = https://github.com/boostorg/boost.git
|
||||
branch = boost-1.76.0
|
||||
ignore = dirty
|
||||
[submodule "3party/just_gtfs"]
|
||||
path = 3party/just_gtfs
|
||||
url = ../just_gtfs.git
|
||||
url = https://github.com/organicmaps/just_gtfs.git
|
||||
branch = for-usage-as-submodule
|
||||
[submodule "3party/expat"]
|
||||
path = 3party/expat
|
||||
url = ../libexpat.git
|
||||
url = https://github.com/libexpat/libexpat.git
|
||||
branch = R_2_2_9
|
||||
[submodule "3party/glm"]
|
||||
path = 3party/glm
|
||||
url = ../glm.git
|
||||
url = https://github.com/g-truc/glm.git
|
||||
[submodule "3party/icu/icu"]
|
||||
path = 3party/icu/icu
|
||||
url = ../icu.git
|
||||
url = https://github.com/unicode-org/icu.git
|
||||
[submodule "3party/freetype/freetype"]
|
||||
path = 3party/freetype/freetype
|
||||
url = ../freetype.git
|
||||
url = https://github.com/organicmaps/freetype.git
|
||||
[submodule "3party/googletest"]
|
||||
path = 3party/googletest
|
||||
url = ../googletest.git
|
||||
url = https://github.com/google/googletest.git
|
||||
[submodule "3party/fast_double_parser"]
|
||||
path = 3party/fast_double_parser
|
||||
url = ../fast_double_parser.git
|
||||
url = https://github.com/lemire/fast_double_parser.git
|
||||
[submodule "3party/pugixml/pugixml"]
|
||||
path = 3party/pugixml/pugixml
|
||||
url = ../pugixml.git
|
||||
url = https://github.com/zeux/pugixml.git
|
||||
[submodule "3party/jansson/jansson"]
|
||||
path = 3party/jansson/jansson
|
||||
url = ../jansson.git
|
||||
url = https://github.com/akheron/jansson.git
|
||||
[submodule "3party/gflags"]
|
||||
path = 3party/gflags
|
||||
url = ../gflags
|
||||
url = https://github.com/gflags/gflags
|
||||
[submodule "3party/fast_obj"]
|
||||
path = 3party/fast_obj
|
||||
url = ../fast_obj
|
||||
url = https://github.com/thisistherk/fast_obj
|
||||
[submodule "3party/harfbuzz/harfbuzz"]
|
||||
path = 3party/harfbuzz/harfbuzz
|
||||
url = ../harfbuzz.git
|
||||
url = https://github.com/harfbuzz/harfbuzz.git
|
||||
[submodule "3party/utfcpp"]
|
||||
path = 3party/utfcpp
|
||||
url = ../utfcpp.git
|
||||
[submodule "3party/glfw"]
|
||||
path = 3party/glfw
|
||||
url = ../glfw.git
|
||||
[submodule "3party/CMake-MetalShaderSupport"]
|
||||
path = 3party/CMake-MetalShaderSupport
|
||||
url = ../CMake-MetalShaderSupport.git
|
||||
[submodule "3party/imgui/imgui"]
|
||||
path = 3party/imgui/imgui
|
||||
url = ../imgui.git
|
||||
url = https://github.com/nemtrif/utfcpp.git
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
Subproject commit 989857d2e5e54869c35ad06fb21a67d12a2dbc67
|
|
@ -66,19 +66,4 @@ add_subdirectory(vulkan_wrapper)
|
|||
|
||||
if (PLATFORM_DESKTOP)
|
||||
add_subdirectory(libtess2)
|
||||
|
||||
set(GLFW_BUILD_DOCS OFF CACHE BOOL "")
|
||||
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "")
|
||||
set(GLFW_BUILD_TESTS OFF CACHE BOOL "")
|
||||
set(GLFW_INSTALL OFF CACHE BOOL "")
|
||||
set(GLFW_VULKAN_STATIC OFF CACHE BOOL "")
|
||||
set(GLFW_BUILD_WAYLAND OFF CACHE BOOL "")
|
||||
# Disable ARC for glfw and re-enable after it because it's globally set in the root CMakeLists.txt
|
||||
set(CMAKE_OBJC_FLAGS "")
|
||||
add_subdirectory(glfw)
|
||||
set_target_properties(glfw PROPERTIES UNITY_BUILD OFF)
|
||||
set_target_properties(glfw PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC NO)
|
||||
set(CMAKE_OBJC_FLAGS -fobjc-arc)
|
||||
|
||||
add_subdirectory(imgui)
|
||||
endif()
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
Subproject commit 21fea01161e0d6b70c0c5c1f52dc8e7a7df14a50
|
|
@ -1,16 +0,0 @@
|
|||
project(imgui)
|
||||
|
||||
set(SRC
|
||||
imgui/imgui_draw.cpp
|
||||
imgui/imgui_tables.cpp
|
||||
imgui/imgui_widgets.cpp
|
||||
imgui/imgui.cpp
|
||||
imgui/backends/imgui_impl_glfw.cpp
|
||||
)
|
||||
|
||||
add_library(${PROJECT_NAME} ${SRC})
|
||||
target_include_directories(${PROJECT_NAME}
|
||||
PRIVATE ${OMIM_ROOT}/3party/glfw/include
|
||||
PUBLIC ${OMIM_ROOT}/3party/imgui/imgui
|
||||
PUBLIC .
|
||||
)
|
|
@ -1 +0,0 @@
|
|||
Subproject commit 6982ce43f5b143c5dce5fab0ce07dd4867b705ae
|
|
@ -90,19 +90,6 @@ 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(MetalShaderSupport)
|
||||
check_language(Metal)
|
||||
if(CMAKE_Metal_COMPILER)
|
||||
enable_language(Metal)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Sanitizer
|
||||
if (PLATFORM_DESKTOP)
|
||||
# https://clang.llvm.org/docs/UsersManual.html#controlling-code-generation
|
||||
|
@ -278,6 +265,16 @@ find_package(Threads REQUIRED)
|
|||
|
||||
# Scripts
|
||||
|
||||
if (NOT CMAKE_HOST_WIN32)
|
||||
execute_process(
|
||||
COMMAND "${OMIM_ROOT}/tools/unix/check_cert.sh"
|
||||
RESULT_VARIABLE CheckCertResult
|
||||
)
|
||||
if (CheckCertResult)
|
||||
message(FATAL_ERROR "Certificate check failed")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (NOT PLATFORM_IPHONE AND NOT PLATFORM_ANDROID)
|
||||
list(APPEND qt_components Core Network)
|
||||
if (NOT SKIP_QT_GUI OR NOT SKIP_TESTS OR PYBINDINGS)
|
||||
|
@ -397,7 +394,6 @@ if (PLATFORM_DESKTOP)
|
|||
add_subdirectory(qt)
|
||||
omim_add_tool_subdirectory(skin_generator)
|
||||
endif()
|
||||
add_subdirectory(dev_sandbox)
|
||||
endif()
|
||||
|
||||
omim_add_test_subdirectory(qt_tstfrm)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<div align="center">
|
||||
<img src="qt/res/logo.png" height="100"/>
|
||||
<img src="/qt/res/logo.png" height="100"/>
|
||||
</div>
|
||||
<h1 align="center"">Organic Maps</h1>
|
||||
|
||||
|
@ -167,8 +167,9 @@ Please join our beta program, suggest your features, and report bugs:
|
|||
|
||||
- **Rate us on the [App Store](https://apps.apple.com/app/organic-maps/id1567437057)
|
||||
and [Google Play](https://play.google.com/store/apps/details?id=app.organicmaps)**.
|
||||
- **Star us on Forgejo**.
|
||||
- Report bugs or issues to [the issue tracker](https://git.omaps.dev/organicmaps/organicmaps/issues).
|
||||
- **Star us on GitHub**.
|
||||
- Report bugs or issues to [the issue tracker](https://github.com/organicmaps/organicmaps/issues).
|
||||
- [Discuss](https://github.com/organicmaps/organicmaps/discussions/categories/ideas) ideas or propose feature requests.
|
||||
- Subscribe to our [Telegram Channel](https://t.me/OrganicMapsApp) or to the [[matrix] space](https://matrix.to/#/#organicmaps:matrix.org) for updates.
|
||||
- Join our [Telegram Group](https://t.me/OrganicMaps) to discuss with other users.
|
||||
- Присоединяйтесь к нашей [русскоязычной группе в Telegram](https://t.me/OrganicMapsRu) для обратной связи и помощи.
|
||||
|
@ -178,7 +179,7 @@ and [Google Play](https://play.google.com/store/apps/details?id=app.organicmaps)
|
|||
- Follow our updates in
|
||||
[Mastodon](https://fosstodon.org/@organicmaps),
|
||||
[Facebook](https://facebook.com/OrganicMaps),
|
||||
[X (Twitter)](https://x.com/OrganicMapsApp),
|
||||
[Twitter](https://twitter.com/OrganicMapsApp),
|
||||
[Instagram](https://instagram.com/organicmaps.app/).
|
||||
- Güncellemelerimizi [Instagram](https://instagram.com/organicmapstr/) üzerinden takip edin.
|
||||
|
||||
|
|
|
@ -407,6 +407,7 @@ dependencies {
|
|||
implementation 'androidx.recyclerview:recyclerview:1.3.2'
|
||||
implementation 'androidx.work:work-runtime:2.10.0'
|
||||
implementation 'androidx.lifecycle:lifecycle-process:2.8.7'
|
||||
implementation 'androidx.media:media:1.7.0'
|
||||
implementation 'com.google.android.material:material:1.12.0'
|
||||
// Fix for app/organicmaps/util/FileUploadWorker.java:14: error: cannot access ListenableFuture
|
||||
// https://github.com/organicmaps/organicmaps/issues/6106
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• Новыя дадзеныя OpenStreetMap ад 27 лютага
|
||||
• Магчымасць уручную расстаўляць прамежкавыя кропкі маршруту
|
||||
• Экспарт аднаго абранага трэка са спісу
|
||||
• Палепшаная маршрутызацыя для веласіпедыстаў
|
||||
• Дададзена сістэмнае апавяшчэнне пры загрузцы карт, фонавыя загрузкі больш не перарываюцца
|
||||
• Дададзены мігатлівы віджэт запісу трэка
|
||||
• Новыя дадзеныя OpenStreetMap ад 21 студзеня
|
||||
• Адлюстраванне абмежавання хуткасці ў рэжыме навігацыі
|
||||
• Android Auto: сартаванне метак, палепшаны запыты на дазвол месцазнаходжання
|
||||
• На карту дададзены вежы
|
||||
• Дададзена настройка для адключэння спасылак на гатэлі з Kayak.com і магчымасць адмовы пры першым выкарыстанні
|
||||
• Дададзены сербская (кірыліца) і латышская мовы
|
||||
|
||||
…і шматлікае іншае на omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• Neue OpenStreetMap-Daten vom 27. Februar
|
||||
• Möglichkeit, Zwischenroutenpunkte manuell zu arrangieren
|
||||
• Einen einzelnen ausgewählten Track aus der Liste teilen
|
||||
• Verbesserte Routenführung für Fahrräder
|
||||
• Beim Herunterladen von Karten eine Systembenachrichtigung anzeigen und Hintergrunddownloads nicht unterbrechen
|
||||
• Ein blinkendes Trackaufzeichnungs-Widget hinzugefügt
|
||||
• Neue OpenStreetMap-Daten vom 21. Januar
|
||||
• Anzeige eines Geschwindigkeitsbegrenzungsschildes im Navigationsmodus
|
||||
• Serbische (Kyrillisch) und Lettische Sprachen hinzugefügt
|
||||
• Android Auto: Lesezeichen sortieren, verbessertes Erlebnis bei der Anforderung von Standortberechtigungen
|
||||
• Turm-POIs hinzugefügt
|
||||
• Eine Einstellung für Kayak.com-Hotellinks und eine Opt-out-Option bei der ersten Nutzung hinzugefügt.
|
||||
|
||||
…weitere Details unter omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a Track Recording indicator on the main screen
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• Nuevos datos de OpenStreetMap del 21 de enero
|
||||
• Límite de velocidad en el modo de navegación
|
||||
• Añadidos idiomas serbio (cirílico) y letón
|
||||
• Android Auto: opción de ordenar marcadores, mejorada la experiencia al solicitar ubicación
|
||||
• Añadidos PDI de torres
|
||||
• Añadidas opciones para enlaces de hotel de Kayak.com y de exclusión al primer uso
|
||||
|
||||
…more details at omaps.org/news
|
||||
…más detalles en omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• Urtarrilaren 21ko OpenStreetMap-eko datu berriak
|
||||
• Abiadura muga erakusten da nabigazio moduan
|
||||
• Serbiera (zirilikoa) eta letoniera hizkuntzak gehitu dira
|
||||
• Android Auto: gogokoak ordena daitezke, kokapen permisuaren eskaeraren esperientzia hobetu da
|
||||
• Dorreen interes puntuak gehitu dira
|
||||
• Kayak.com-eko hotelen estekak eta lehenengo erabileran ez erakusteko aukera gehitu dira
|
||||
|
||||
…more details at omaps.org/news
|
||||
…zehaztasun gehiago omaps.org/news webgunean
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• Nouvelles données OpenStreetMap du 27 février
|
||||
• Possibilité d'organiser manuellement les points d'itinéraire intermédiaires
|
||||
• Partager une seule piste sélectionnée dans la liste
|
||||
• Amélioration du routage pour les vélos
|
||||
• Afficher une notification système lors du téléchargement de cartes et ne pas interrompre les téléchargements en arrière-plan
|
||||
• Ajout d'un widget d'enregistrement de piste clignotant
|
||||
• Nouvelles données OpenStreetMap du 21 janvier
|
||||
• Afficher un panneau de limitation de vitesse en mode navigation
|
||||
• Ajout des langues serbe (cyrillique) et lettone
|
||||
• Android Auto : trier les signets, expérience de demande d'autorisation de localisation améliorée
|
||||
• Ajout de POI de tour
|
||||
• Ajout d'un paramètre pour les liens d'hôtel Kayak.com et d'une option de désinscription lors de la première utilisation
|
||||
|
||||
…plus de détails sur omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• Nowe dane OpenStreetMap z 21 stycznia
|
||||
• Wyświetlanie znaku ograniczenia prędkości w trybie nawigacji
|
||||
• Dodano języki serbski (cyrylica) i łotewski
|
||||
• Android Auto: sortowanie zakładek, ulepszono prośbę o pozwolenie na lokalizację
|
||||
• Dodano POI dla wieży
|
||||
• Dodano ustawienie dla linków do hoteli na Kayak.com oraz możliwość wyłączenia ich przy pierwszym uruchomieniu
|
||||
|
||||
…more details at omaps.org/news
|
||||
…więcej szczegółów na omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• Novos dados do OpenStreetMap de 21 de janeiro
|
||||
• Exibe um sinal de limite de velocidade no modo de navegação
|
||||
• Adicionados os idiomas sérvio (cirílico) e letão
|
||||
• Android Auto: classificar favoritos, experiência aprimorada de solicitação de permissão de localização
|
||||
• Adicionados POIs de torre
|
||||
• Adicionada uma configuração para links de hotéis Kayak.com e uma opção de cancelamento de primeiro uso
|
||||
|
||||
…more details at omaps.org/news
|
||||
…mais detalhes em omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• Novos dados do OpenStreetMap a 21 de janeiro
|
||||
• Exibir um sinal de limite de velocidade no modo de navegação
|
||||
• Adicionados os idiomas sérvio (cirílico) e letão
|
||||
• Android Auto: classificar favoritos, experiência melhorada de pedido de permissão de localização
|
||||
• Adicionados POIs de torre
|
||||
• Foi adicionada uma configuração para o Kayak.com Hotel Links e uma opção de cancelamento de primeira utilização
|
||||
|
||||
…more details at omaps.org/news
|
||||
…mais detalhes em omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• Новые данные OpenStreetMap от 27 февраля
|
||||
• Возможность вручную расставлять промежуточные точки маршрута
|
||||
• Экспорт одного выбранного трека из списка
|
||||
• Улучшенная маршрутизация для велосипедистов
|
||||
• Добавлено системное уведомление при загрузке карт, фоновые загрузки больше не прерываются
|
||||
• Добавлен мигающий виджет записи трека
|
||||
• Новые данные OpenStreetMap от 21 января
|
||||
• Отображение ограничения скорости в режиме навигации
|
||||
• Android Auto: сортировка меток, улучшены запросы на разрешение местоположения
|
||||
• На карту добавлены башни
|
||||
• Добавлена настройка для отключения ссылок на отели с Kayak.com и возможность отказа при первом использовании
|
||||
• Добавлены сербский (кириллица) и латышский языки
|
||||
|
||||
…и многое другое на omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• Нові дані OpenStreetMap від 27 лютого
|
||||
• Можливість вручну розставляти проміжні точки маршруту
|
||||
• Експорт одного вибраного треку зі списку
|
||||
• Покращена маршрутизація для велосипедистів
|
||||
• Додано системне повідомлення під час завантаження карт, фонові завантаження більше не перериваються
|
||||
• Додано миготливий віджет запису треку
|
||||
• Нові дані OpenStreetMap від 21 січня
|
||||
• Знак перевищення швидкості підчас навігації
|
||||
• Додано перклади сербською (кирилиця) та латиською мовами
|
||||
• Android Auto: сортування міток, покращено процес запиту на отримання дозволу на розміщення
|
||||
• Вежі відображаються на мапі
|
||||
• Додано налаштування для посилань до Kayak.com для готелів та демонструється запит при першому використанні
|
||||
|
||||
…більше подробиць на omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
• New OpenStreetMap data as of February 27
|
||||
• Ability to manually arrange intermediate route points
|
||||
• Share a single selected track from the list
|
||||
• Improved routing for bicycles
|
||||
• Display a system notification when downloading maps and don't interrupt background downloads
|
||||
• Added a flashing Track Recording widget
|
||||
• New OpenStreetMap data as of January 21
|
||||
• Dispay a speed limit sign in the navigation mode
|
||||
• Added Serbian (Cyrillic) and Latvian languages
|
||||
• Android Auto: sort bookmarks, improved location permission request experience
|
||||
• Added tower POIs
|
||||
• Added a setting for Kayak.com Hotel Links and a first-use opt-out option
|
||||
|
||||
…more details at omaps.org/news
|
||||
|
|
|
@ -1 +1 @@
|
|||
version: 2025.03.02-7-FDroid+25030207
|
||||
version: 2025.01.26-9-FDroid+25012609
|
||||
|
|
|
@ -37,7 +37,6 @@
|
|||
<uses-permission android:name="android.permission.WAKE_LOCK"/>
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION"/>
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC"/>
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE"/>
|
||||
<!--
|
||||
Android 13 (API level 33) and higher supports a runtime permission for sending non-exempt (including Foreground
|
||||
|
@ -490,13 +489,6 @@
|
|||
android:stopWithTask="false"
|
||||
/>
|
||||
|
||||
<service
|
||||
android:name=".downloader.DownloaderService"
|
||||
android:foregroundServiceType="dataSync"
|
||||
android:exported="false"
|
||||
android:enabled="true"
|
||||
android:stopWithTask="false"/>
|
||||
|
||||
<provider
|
||||
android:name="androidx.core.content.FileProvider"
|
||||
android:authorities="${FILE_PROVIDER_PLACEHOLDER}"
|
||||
|
|
|
@ -22,13 +22,11 @@ set(SRC
|
|||
app/organicmaps/vulkan/android_vulkan_context_factory.hpp
|
||||
|
||||
# JNI sources
|
||||
app/organicmaps/sdk/search/DisplayedCategories.cpp
|
||||
app/organicmaps/sdk/search/SearchEngine.cpp
|
||||
app/organicmaps/sdk/search/SearchRecents.cpp
|
||||
app/organicmaps/core/jni_helper.cpp
|
||||
app/organicmaps/core/jni_java_methods.cpp
|
||||
app/organicmaps/core/logging.cpp
|
||||
app/organicmaps/bookmarks/data/BookmarkManager.cpp
|
||||
app/organicmaps/DisplayedCategories.cpp
|
||||
app/organicmaps/DownloadResourcesLegacyActivity.cpp
|
||||
app/organicmaps/editor/Editor.cpp
|
||||
app/organicmaps/editor/OpeningHours.cpp
|
||||
|
@ -40,6 +38,8 @@ set(SRC
|
|||
app/organicmaps/MapManager.cpp
|
||||
app/organicmaps/MwmApplication.cpp
|
||||
app/organicmaps/routing/RoutingOptions.cpp
|
||||
app/organicmaps/SearchEngine.cpp
|
||||
app/organicmaps/SearchRecents.cpp
|
||||
app/organicmaps/settings/UnitLocale.cpp
|
||||
app/organicmaps/settings/MapLanguageCode.cpp
|
||||
app/organicmaps/sound/tts.cpp
|
||||
|
|
|
@ -5,7 +5,8 @@
|
|||
|
||||
extern "C"
|
||||
{
|
||||
JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_sdk_search_DisplayedCategories_nativeGetKeys(JNIEnv * env, jclass)
|
||||
JNIEXPORT jobjectArray JNICALL
|
||||
Java_app_organicmaps_search_DisplayedCategories_nativeGetKeys(JNIEnv * env, jclass clazz)
|
||||
{
|
||||
::Framework * fr = g_framework->NativeFramework();
|
||||
ASSERT(fr, ());
|
|
@ -39,7 +39,7 @@ Results g_results;
|
|||
|
||||
// Timestamp of last search query. Results with older stamps are ignored.
|
||||
jlong g_queryTimestamp;
|
||||
// Implements 'SearchListener' java interface.
|
||||
// Implements 'NativeSearchListener' java interface.
|
||||
jobject g_javaListener;
|
||||
jmethodID g_updateResultsId;
|
||||
jmethodID g_endResultsId;
|
||||
|
@ -52,7 +52,7 @@ jmethodID g_descriptionConstructor;
|
|||
jclass g_popularityClass;
|
||||
jmethodID g_popularityConstructor;
|
||||
|
||||
// Implements 'MapSearchListener' java interface.
|
||||
// Implements 'NativeMapSearchListener' java interface.
|
||||
jmethodID g_mapResultsMethod;
|
||||
jclass g_mapResultClass;
|
||||
jmethodID g_mapResultCtor;
|
||||
|
@ -232,21 +232,21 @@ void OnBookmarksSearchResults(search::BookmarksSearchParams::Results results,
|
|||
extern "C"
|
||||
{
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_sdk_search_SearchEngine_nativeInit(JNIEnv * env, jobject thiz)
|
||||
Java_app_organicmaps_search_SearchEngine_nativeInit(JNIEnv * env, jobject thiz)
|
||||
{
|
||||
g_javaListener = env->NewGlobalRef(thiz);
|
||||
// public void onResultsUpdate(@NonNull SearchResult[] results, long timestamp)
|
||||
g_updateResultsId = jni::GetMethodID(env, g_javaListener, "onResultsUpdate",
|
||||
"([Lapp/organicmaps/sdk/search/SearchResult;J)V");
|
||||
"([Lapp/organicmaps/search/SearchResult;J)V");
|
||||
// public void onResultsEnd(long timestamp)
|
||||
g_endResultsId = jni::GetMethodID(env, g_javaListener, "onResultsEnd", "(J)V");
|
||||
g_resultClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/search/SearchResult");
|
||||
g_resultClass = jni::GetGlobalClassRef(env, "app/organicmaps/search/SearchResult");
|
||||
g_resultConstructor = jni::GetConstructorID(
|
||||
env, g_resultClass,
|
||||
"(Ljava/lang/String;Lapp/organicmaps/sdk/search/SearchResult$Description;DD[I[I"
|
||||
"Lapp/organicmaps/sdk/search/Popularity;)V");
|
||||
"(Ljava/lang/String;Lapp/organicmaps/search/SearchResult$Description;DD[I[I"
|
||||
"Lapp/organicmaps/search/Popularity;)V");
|
||||
g_suggestConstructor = jni::GetConstructorID(env, g_resultClass, "(Ljava/lang/String;Ljava/lang/String;DD[I[I)V");
|
||||
g_descriptionClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/search/SearchResult$Description");
|
||||
g_descriptionClass = jni::GetGlobalClassRef(env, "app/organicmaps/search/SearchResult$Description");
|
||||
/*
|
||||
Description(FeatureId featureId, String featureType, String region, Distance distance,
|
||||
String description, int openNow, int minutesUntilOpen, int minutesUntilClosed,
|
||||
|
@ -257,12 +257,12 @@ extern "C"
|
|||
"Ljava/lang/String;Ljava/lang/String;Lapp/organicmaps/util/Distance;"
|
||||
"Ljava/lang/String;IIIZ)V");
|
||||
|
||||
g_popularityClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/search/Popularity");
|
||||
g_popularityClass = jni::GetGlobalClassRef(env, "app/organicmaps/search/Popularity");
|
||||
g_popularityConstructor = jni::GetConstructorID(env, g_popularityClass, "(I)V");
|
||||
|
||||
g_mapResultsMethod = jni::GetMethodID(env, g_javaListener, "onMapSearchResults",
|
||||
"([Lapp/organicmaps/sdk/search/MapSearchListener$Result;JZ)V");
|
||||
g_mapResultClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/search/MapSearchListener$Result");
|
||||
"([Lapp/organicmaps/search/NativeMapSearchListener$Result;JZ)V");
|
||||
g_mapResultClass = jni::GetGlobalClassRef(env, "app/organicmaps/search/NativeMapSearchListener$Result");
|
||||
g_mapResultCtor = jni::GetConstructorID(env, g_mapResultClass, "(Ljava/lang/String;Ljava/lang/String;)V");
|
||||
|
||||
g_updateBookmarksResultsId =
|
||||
|
@ -271,7 +271,7 @@ extern "C"
|
|||
jni::GetMethodID(env, g_javaListener, "onBookmarkSearchResultsEnd", "([JJ)V");
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_search_SearchEngine_nativeRunSearch(
|
||||
JNIEXPORT jboolean JNICALL Java_app_organicmaps_search_SearchEngine_nativeRunSearch(
|
||||
JNIEnv * env, jclass clazz, jbyteArray bytes, jboolean isCategory,
|
||||
jstring lang, jlong timestamp, jboolean hasPosition, jdouble lat, jdouble lon)
|
||||
{
|
||||
|
@ -288,7 +288,7 @@ extern "C"
|
|||
return searchStarted;
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_search_SearchEngine_nativeRunInteractiveSearch(
|
||||
JNIEXPORT void JNICALL Java_app_organicmaps_search_SearchEngine_nativeRunInteractiveSearch(
|
||||
JNIEnv * env, jclass clazz, jbyteArray bytes, jboolean isCategory,
|
||||
jstring lang, jlong timestamp, jboolean isMapAndTable, jboolean hasPosition, jdouble lat, jdouble lon)
|
||||
{
|
||||
|
@ -321,7 +321,7 @@ extern "C"
|
|||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_search_SearchEngine_nativeRunSearchMaps(
|
||||
JNIEXPORT void JNICALL Java_app_organicmaps_search_SearchEngine_nativeRunSearchMaps(
|
||||
JNIEnv * env, jclass clazz, jbyteArray bytes, jstring lang, jlong timestamp)
|
||||
{
|
||||
storage::DownloaderSearchParams params{
|
||||
|
@ -334,7 +334,7 @@ extern "C"
|
|||
g_queryTimestamp = timestamp;
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_search_SearchEngine_nativeRunSearchInBookmarks(
|
||||
JNIEXPORT jboolean JNICALL Java_app_organicmaps_search_SearchEngine_nativeRunSearchInBookmarks(
|
||||
JNIEnv * env, jclass clazz, jbyteArray query, jlong catId, jlong timestamp)
|
||||
{
|
||||
search::BookmarksSearchParams params{
|
||||
|
@ -350,25 +350,25 @@ extern "C"
|
|||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_sdk_search_SearchEngine_nativeShowResult(JNIEnv * env, jclass clazz, jint index)
|
||||
Java_app_organicmaps_search_SearchEngine_nativeShowResult(JNIEnv * env, jclass clazz, jint index)
|
||||
{
|
||||
g_framework->NativeFramework()->ShowSearchResult(g_results[index]);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_sdk_search_SearchEngine_nativeCancelInteractiveSearch(JNIEnv * env, jclass clazz)
|
||||
Java_app_organicmaps_search_SearchEngine_nativeCancelInteractiveSearch(JNIEnv * env, jclass clazz)
|
||||
{
|
||||
g_framework->NativeFramework()->GetSearchAPI().CancelSearch(search::Mode::Viewport);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_sdk_search_SearchEngine_nativeCancelEverywhereSearch(JNIEnv * env, jclass clazz)
|
||||
Java_app_organicmaps_search_SearchEngine_nativeCancelEverywhereSearch(JNIEnv * env, jclass clazz)
|
||||
{
|
||||
g_framework->NativeFramework()->GetSearchAPI().CancelSearch(search::Mode::Everywhere);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_sdk_search_SearchEngine_nativeCancelAllSearches(JNIEnv * env, jclass clazz)
|
||||
Java_app_organicmaps_search_SearchEngine_nativeCancelAllSearches(JNIEnv * env, jclass clazz)
|
||||
{
|
||||
g_framework->NativeFramework()->GetSearchAPI().CancelAllSearches();
|
||||
}
|
40
android/app/src/main/cpp/app/organicmaps/SearchRecents.cpp
Normal file
40
android/app/src/main/cpp/app/organicmaps/SearchRecents.cpp
Normal file
|
@ -0,0 +1,40 @@
|
|||
#include "Framework.hpp"
|
||||
|
||||
#include "search/result.hpp"
|
||||
|
||||
#include "app/organicmaps/core/jni_helper.hpp"
|
||||
#include "app/organicmaps/core/jni_java_methods.hpp"
|
||||
|
||||
using SearchRequest = search::QuerySaver::SearchRequest;
|
||||
|
||||
extern "C"
|
||||
{
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_search_SearchRecents_nativeGetList(JNIEnv * env, jclass thiz, jobject result)
|
||||
{
|
||||
auto const & items = g_framework->NativeFramework()->GetSearchAPI().GetLastSearchQueries();
|
||||
if (items.empty())
|
||||
return;
|
||||
|
||||
auto const listAddMethod = jni::ListBuilder::Instance(env).m_add;
|
||||
|
||||
for (SearchRequest const & item : items)
|
||||
{
|
||||
jni::TScopedLocalRef str(env, jni::ToJavaString(env, item.second));
|
||||
env->CallBooleanMethod(result, listAddMethod, str.get());
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_search_SearchRecents_nativeAdd(JNIEnv * env, jclass thiz, jstring locale, jstring query)
|
||||
{
|
||||
SearchRequest const sr(jni::ToNativeString(env, locale), jni::ToNativeString(env, query));
|
||||
g_framework->NativeFramework()->GetSearchAPI().SaveSearchQuery(sr);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_search_SearchRecents_nativeClear(JNIEnv * env, jclass thiz)
|
||||
{
|
||||
g_framework->NativeFramework()->GetSearchAPI().ClearSearchHistory();
|
||||
}
|
||||
}
|
|
@ -28,7 +28,7 @@ void InjectMetadata(JNIEnv * env, jclass const clazz, jobject const mapObject, o
|
|||
//jobject CreatePopularity(JNIEnv * env, place_page::Info const & info)
|
||||
//{
|
||||
// static jclass const popularityClass =
|
||||
// jni::GetGlobalClassRef(env, "app/organicmaps/sdk/search/Popularity");
|
||||
// jni::GetGlobalClassRef(env, "app/organicmaps/search/Popularity");
|
||||
// static jmethodID const popularityConstructor =
|
||||
// jni::GetConstructorID(env, popularityClass, "(I)V");
|
||||
// auto const popularityValue = info.GetPopularity();
|
||||
|
@ -57,7 +57,7 @@ jobject CreateMapObject(JNIEnv * env, place_page::Info const & info, int mapObje
|
|||
"Ljava/lang/String;" // appId
|
||||
"Lapp/organicmaps/routing/RoutePointInfo;" // routePointInfo
|
||||
"I" // openingMode
|
||||
"Lapp/organicmaps/sdk/search/Popularity;" // popularity
|
||||
"Lapp/organicmaps/search/Popularity;" // popularity
|
||||
"Ljava/lang/String;" // description
|
||||
"I" // roadWarnType
|
||||
"[Ljava/lang/String;" // rawTypes
|
||||
|
@ -105,7 +105,7 @@ jobject CreateBookmark(JNIEnv *env, const place_page::Info &info,
|
|||
"(Lapp/organicmaps/bookmarks/data/FeatureId;JJLjava/lang/String;"
|
||||
"Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;"
|
||||
"Lapp/organicmaps/routing/RoutePointInfo;"
|
||||
"ILapp/organicmaps/sdk/search/Popularity;Ljava/lang/String;"
|
||||
"ILapp/organicmaps/search/Popularity;Ljava/lang/String;"
|
||||
"[Ljava/lang/String;)V");
|
||||
static jmethodID const featureCtorId =
|
||||
jni::GetConstructorID(env, g_featureIdClazz, "(Ljava/lang/String;JI)V");
|
||||
|
|
|
@ -1,37 +0,0 @@
|
|||
#include "app/organicmaps/Framework.hpp"
|
||||
#include "app/organicmaps/core/jni_helper.hpp"
|
||||
#include "app/organicmaps/core/jni_java_methods.hpp"
|
||||
|
||||
#include "search/result.hpp"
|
||||
|
||||
using SearchRequest = search::QuerySaver::SearchRequest;
|
||||
|
||||
extern "C"
|
||||
{
|
||||
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_search_SearchRecents_nativeGetList(JNIEnv * env, jclass, jobject result)
|
||||
{
|
||||
auto const & items = g_framework->NativeFramework()->GetSearchAPI().GetLastSearchQueries();
|
||||
if (items.empty())
|
||||
return;
|
||||
|
||||
auto const listAddMethod = jni::ListBuilder::Instance(env).m_add;
|
||||
|
||||
for (SearchRequest const & item : items)
|
||||
{
|
||||
jni::TScopedLocalRef str(env, jni::ToJavaString(env, item.second));
|
||||
env->CallBooleanMethod(result, listAddMethod, str.get());
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_search_SearchRecents_nativeAdd(JNIEnv * env, jclass, jstring locale,
|
||||
jstring query)
|
||||
{
|
||||
SearchRequest const sr(jni::ToNativeString(env, locale), jni::ToNativeString(env, query));
|
||||
g_framework->NativeFramework()->GetSearchAPI().SaveSearchQuery(sr);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_search_SearchRecents_nativeClear(JNIEnv * env, jclass)
|
||||
{
|
||||
g_framework->NativeFramework()->GetSearchAPI().ClearSearchHistory();
|
||||
}
|
||||
}
|
|
@ -390,7 +390,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
|||
mProgress.setProgressCompat(0, true);
|
||||
|
||||
mCountryDownloadListenerSlot = MapManager.nativeSubscribe(mCountryDownloadListener);
|
||||
MapManager.startDownload(mCurrentCountry);
|
||||
MapManager.nativeDownload(mCurrentCountry);
|
||||
setAction(PROCEED_TO_MAP);
|
||||
}
|
||||
else
|
||||
|
|
|
@ -77,6 +77,7 @@ import app.organicmaps.maplayer.MapButtonsViewModel;
|
|||
import app.organicmaps.maplayer.ToggleMapLayerFragment;
|
||||
import app.organicmaps.maplayer.isolines.IsolinesManager;
|
||||
import app.organicmaps.maplayer.isolines.IsolinesState;
|
||||
import app.organicmaps.maplayer.subway.SubwayManager;
|
||||
import app.organicmaps.routing.ManageRouteBottomSheet;
|
||||
import app.organicmaps.routing.NavigationController;
|
||||
import app.organicmaps.routing.NavigationService;
|
||||
|
@ -89,7 +90,7 @@ import app.organicmaps.routing.RoutingPlanFragment;
|
|||
import app.organicmaps.routing.RoutingPlanInplaceController;
|
||||
import app.organicmaps.search.FloatingSearchToolbarController;
|
||||
import app.organicmaps.search.SearchActivity;
|
||||
import app.organicmaps.sdk.search.SearchEngine;
|
||||
import app.organicmaps.search.SearchEngine;
|
||||
import app.organicmaps.search.SearchFragment;
|
||||
import app.organicmaps.settings.DrivingOptionsActivity;
|
||||
import app.organicmaps.settings.RoadType;
|
||||
|
@ -111,6 +112,7 @@ import app.organicmaps.widget.menu.MainMenu;
|
|||
import app.organicmaps.widget.placepage.PlacePageController;
|
||||
import app.organicmaps.widget.placepage.PlacePageData;
|
||||
import app.organicmaps.widget.placepage.PlacePageViewModel;
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
@ -593,12 +595,14 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
ViewCompat.setOnApplyWindowInsetsListener(mPointChooser, (view, windowInsets) -> {
|
||||
UiUtils.setViewInsetsPaddingBottom(mPointChooser, windowInsets);
|
||||
UiUtils.setViewInsetsPaddingNoBottom(mPointChooserToolbar, windowInsets);
|
||||
final int trackRecorderOffset = TrackRecorder.nativeIsTrackRecordingEnabled() ? UiUtils.dimen(this, R.dimen.map_button_size) : 0;
|
||||
int trackRecorderOffset = TrackRecorder.nativeIsTrackRecordingEnabled() ? UiUtils.dimen(this, R.dimen.map_button_size) : 0;
|
||||
Logger.d("kavi", "offset: " + trackRecorderOffset + "px");
|
||||
mNavBarHeight = isFullscreen() ? 0 : windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).bottom;
|
||||
// For the first loading, set compass top margin to status bar size
|
||||
// The top inset will be then be updated by the routing controller
|
||||
if (mCurrentWindowInsets == null)
|
||||
{
|
||||
Logger.d("kavi", "it is null");
|
||||
updateCompassOffset(trackRecorderOffset + windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top, windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).right);
|
||||
}
|
||||
refreshLightStatusBar();
|
||||
|
@ -1348,6 +1352,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
|
||||
void updateCompassOffset(int offsetY, int offsetX)
|
||||
{
|
||||
Logger.d("kavi", "y: " + offsetY + " x: " + offsetX);
|
||||
if (mMapFragment == null || !mMapFragment.isAdded())
|
||||
return;
|
||||
|
||||
|
@ -1512,19 +1517,19 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
if (height != 0)
|
||||
offsetY = height;
|
||||
}
|
||||
final int orientation = getResources().getConfiguration().orientation;
|
||||
final boolean isTrackRecordingEnabled = TrackRecorder.nativeIsTrackRecordingEnabled();
|
||||
if (isTrackRecordingEnabled && (orientation != Configuration.ORIENTATION_LANDSCAPE))
|
||||
int orientation = getResources().getConfiguration().orientation;
|
||||
if (TrackRecorder.nativeIsTrackRecordingEnabled() && (orientation != Configuration.ORIENTATION_LANDSCAPE))
|
||||
offsetY += UiUtils.dimen(this, R.dimen.map_button_size);
|
||||
if (orientation == Configuration.ORIENTATION_LANDSCAPE)
|
||||
{
|
||||
if (show)
|
||||
{
|
||||
final boolean isSmallScreen = UiUtils.getDisplayTotalHeight(this) < UiUtils.dimen(this, R.dimen.dp_400);
|
||||
if (!isSmallScreen || TrackRecorder.nativeIsTrackRecordingEnabled())
|
||||
offsetX += UiUtils.dimen(this, R.dimen.map_button_size);
|
||||
offsetX += UiUtils.dimen(this, R.dimen.map_button_size);
|
||||
boolean isSmallScreen = UiUtils.getDisplayTotalHeight(this) < UiUtils.dimen(this, R.dimen.dp_400);
|
||||
if (isSmallScreen && !TrackRecorder.nativeIsTrackRecordingEnabled())
|
||||
offsetX -= UiUtils.dimen(this, R.dimen.map_button_size);
|
||||
}
|
||||
else if (isTrackRecordingEnabled)
|
||||
else if (TrackRecorder.nativeIsTrackRecordingEnabled())
|
||||
offsetY += UiUtils.dimen(this, R.dimen.map_button_size);
|
||||
}
|
||||
updateCompassOffset(offsetY, offsetX);
|
||||
|
@ -1694,6 +1699,12 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
mRoutingPlanInplaceController.showDrivingOptionView();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSubwayEnabled()
|
||||
{
|
||||
return SubwayManager.from(this).isEnabled();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCommonBuildError(int lastResultCode, @NonNull String[] lastMissingMaps)
|
||||
{
|
||||
|
@ -2342,7 +2353,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
|
||||
if (mCurrentWindowInsets != null)
|
||||
{
|
||||
final int offset = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top;
|
||||
int offset = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top;
|
||||
updateCompassOffset(offset + UiUtils.dimen(this, R.dimen.map_button_size));
|
||||
}
|
||||
Toast.makeText(this, R.string.track_recording, Toast.LENGTH_SHORT).show();
|
||||
|
@ -2356,7 +2367,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
if (mCurrentWindowInsets != null)
|
||||
{
|
||||
int offsetY = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top;
|
||||
final int offsetX = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).right;
|
||||
int offsetX = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).right;
|
||||
if (RoutingController.get().isPlanning() && mRoutingPlanInplaceController != null)
|
||||
{
|
||||
final int height = mRoutingPlanInplaceController.calcHeight();
|
||||
|
|
|
@ -16,14 +16,13 @@ import androidx.lifecycle.LifecycleObserver;
|
|||
import androidx.lifecycle.LifecycleOwner;
|
||||
import androidx.lifecycle.ProcessLifecycleOwner;
|
||||
|
||||
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.bookmarks.data.BookmarkManager;
|
||||
import app.organicmaps.display.DisplayManager;
|
||||
import app.organicmaps.downloader.CountryItem;
|
||||
import app.organicmaps.downloader.MapManager;
|
||||
import app.organicmaps.location.LocationHelper;
|
||||
import app.organicmaps.location.LocationState;
|
||||
import app.organicmaps.location.SensorHelper;
|
||||
|
@ -34,7 +33,7 @@ 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.search.SearchEngine;
|
||||
import app.organicmaps.settings.StoragePathManager;
|
||||
import app.organicmaps.sound.TtsPlayer;
|
||||
import app.organicmaps.util.Config;
|
||||
|
@ -47,6 +46,10 @@ import app.organicmaps.util.Utils;
|
|||
import app.organicmaps.util.log.Logger;
|
||||
import app.organicmaps.util.log.LogsManager;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.List;
|
||||
|
||||
public class MwmApplication extends Application implements Application.ActivityLifecycleCallbacks
|
||||
{
|
||||
@NonNull
|
||||
|
@ -75,6 +78,9 @@ public class MwmApplication extends Application implements Application.ActivityL
|
|||
private volatile boolean mFrameworkInitialized;
|
||||
private volatile boolean mPlatformInitialized;
|
||||
|
||||
@NonNull
|
||||
private final MapManager.StorageCallback mStorageCallbacks = new StorageCallbackImpl();
|
||||
|
||||
@Nullable
|
||||
private WeakReference<Activity> mTopActivity;
|
||||
|
||||
|
@ -121,9 +127,6 @@ public class MwmApplication extends Application implements Application.ActivityL
|
|||
return (MwmApplication) context.getApplicationContext();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static MwmApplication sInstance;
|
||||
|
||||
@NonNull
|
||||
public static SharedPreferences prefs(@NonNull Context context)
|
||||
{
|
||||
|
@ -135,9 +138,6 @@ public class MwmApplication extends Application implements Application.ActivityL
|
|||
{
|
||||
super.onCreate();
|
||||
Logger.i(TAG, "Initializing application");
|
||||
|
||||
sInstance = this;
|
||||
|
||||
LogsManager.INSTANCE.initFileLogging(this);
|
||||
|
||||
Android7RootCertificateWorkaround.initializeIfNeeded(this);
|
||||
|
@ -230,6 +230,8 @@ public class MwmApplication extends Application implements Application.ActivityL
|
|||
|
||||
nativeInitFramework(onComplete);
|
||||
|
||||
MapManager.nativeSubscribe(mStorageCallbacks);
|
||||
|
||||
initNativeStrings();
|
||||
ThemeSwitcher.INSTANCE.initialize(this);
|
||||
SearchEngine.INSTANCE.initialize();
|
||||
|
@ -361,4 +363,25 @@ public class MwmApplication extends Application implements Application.ActivityL
|
|||
mLocationHelper.stop();
|
||||
}
|
||||
}
|
||||
|
||||
private class StorageCallbackImpl implements MapManager.StorageCallback
|
||||
{
|
||||
@Override
|
||||
public void onStatusChanged(List<MapManager.StorageCallbackData> data)
|
||||
{
|
||||
for (MapManager.StorageCallbackData item : data)
|
||||
if (item.isLeafNode && item.newStatus == CountryItem.STATUS_FAILED)
|
||||
{
|
||||
if (MapManager.nativeIsAutoretryFailed())
|
||||
{
|
||||
DownloaderNotifier.notifyDownloadFailed(MwmApplication.this, item.countryId);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onProgress(String countryId, long localSize, long remoteSize) {}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -39,8 +39,8 @@ import app.organicmaps.bookmarks.data.KmlFileType;
|
|||
import app.organicmaps.bookmarks.data.SortedBlock;
|
||||
import app.organicmaps.bookmarks.data.Track;
|
||||
import app.organicmaps.location.LocationHelper;
|
||||
import app.organicmaps.sdk.search.BookmarkSearchListener;
|
||||
import app.organicmaps.sdk.search.SearchEngine;
|
||||
import app.organicmaps.search.NativeBookmarkSearchListener;
|
||||
import app.organicmaps.search.SearchEngine;
|
||||
import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.util.SharingUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
|
@ -62,7 +62,7 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
|
|||
implements BookmarkManager.BookmarksSharingListener,
|
||||
BookmarkManager.BookmarksSortingListener,
|
||||
BookmarkManager.BookmarksLoadingListener,
|
||||
BookmarkSearchListener,
|
||||
NativeBookmarkSearchListener,
|
||||
ChooseBookmarksSortingTypeFragment.ChooseSortingTypeListener,
|
||||
MenuBottomSheetFragment.MenuBottomSheetInterface
|
||||
{
|
||||
|
|
|
@ -11,7 +11,7 @@ import androidx.core.os.ParcelCompat;
|
|||
|
||||
import app.organicmaps.Framework;
|
||||
import app.organicmaps.routing.RoutePointInfo;
|
||||
import app.organicmaps.sdk.search.Popularity;
|
||||
import app.organicmaps.search.Popularity;
|
||||
import app.organicmaps.util.Constants;
|
||||
|
||||
// TODO consider refactoring to remove hack with MapObject unmarshalling itself and Bookmark at the same time.
|
||||
|
|
|
@ -12,7 +12,7 @@ import androidx.core.os.ParcelCompat;
|
|||
|
||||
import app.organicmaps.Framework;
|
||||
import app.organicmaps.routing.RoutePointInfo;
|
||||
import app.organicmaps.sdk.search.Popularity;
|
||||
import app.organicmaps.search.Popularity;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.widget.placepage.PlacePageData;
|
||||
|
||||
|
|
|
@ -109,7 +109,7 @@ class DownloaderScreen extends BaseScreen
|
|||
for (final var item : mMissingMaps.entrySet())
|
||||
{
|
||||
item.getValue().update();
|
||||
MapManager.startDownload(item.getKey());
|
||||
MapManager.nativeDownload(item.getKey());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -113,7 +113,7 @@ public class RequestPermissionsScreenWithNotification extends BaseScreen impleme
|
|||
.setOngoing(true)
|
||||
.setShowWhen(false)
|
||||
.setOnlyAlertOnce(true)
|
||||
.setSmallIcon(R.drawable.ic_location_crosshair)
|
||||
.setSmallIcon(R.drawable.ic_my_location)
|
||||
.setColor(ContextCompat.getColor(getCarContext(), R.color.notification))
|
||||
.setContentTitle(getCarContext().getString(R.string.aa_request_permission_notification))
|
||||
.setContentIntent(pendingIntent);
|
||||
|
|
|
@ -23,13 +23,13 @@ import app.organicmaps.car.SurfaceRenderer;
|
|||
import app.organicmaps.car.screens.base.BaseMapScreen;
|
||||
import app.organicmaps.car.util.UiHelpers;
|
||||
import app.organicmaps.location.LocationHelper;
|
||||
import app.organicmaps.sdk.search.SearchListener;
|
||||
import app.organicmaps.sdk.search.SearchEngine;
|
||||
import app.organicmaps.sdk.search.SearchRecents;
|
||||
import app.organicmaps.sdk.search.SearchResult;
|
||||
import app.organicmaps.search.NativeSearchListener;
|
||||
import app.organicmaps.search.SearchEngine;
|
||||
import app.organicmaps.search.SearchRecents;
|
||||
import app.organicmaps.search.SearchResult;
|
||||
import app.organicmaps.util.Language;
|
||||
|
||||
public class SearchOnMapScreen extends BaseMapScreen implements SearchListener
|
||||
public class SearchOnMapScreen extends BaseMapScreen implements NativeSearchListener
|
||||
{
|
||||
private final int MAX_RESULTS_SIZE;
|
||||
|
||||
|
|
|
@ -21,13 +21,13 @@ import app.organicmaps.bookmarks.data.MapObject;
|
|||
import app.organicmaps.car.SurfaceRenderer;
|
||||
import app.organicmaps.car.screens.base.BaseMapScreen;
|
||||
import app.organicmaps.location.LocationHelper;
|
||||
import app.organicmaps.sdk.search.SearchListener;
|
||||
import app.organicmaps.sdk.search.SearchEngine;
|
||||
import app.organicmaps.sdk.search.SearchRecents;
|
||||
import app.organicmaps.sdk.search.SearchResult;
|
||||
import app.organicmaps.search.NativeSearchListener;
|
||||
import app.organicmaps.search.SearchEngine;
|
||||
import app.organicmaps.search.SearchRecents;
|
||||
import app.organicmaps.search.SearchResult;
|
||||
import app.organicmaps.util.Language;
|
||||
|
||||
public class SearchScreen extends BaseMapScreen implements SearchTemplate.SearchCallback, SearchListener
|
||||
public class SearchScreen extends BaseMapScreen implements SearchTemplate.SearchCallback, NativeSearchListener
|
||||
{
|
||||
private final int MAX_RESULTS_SIZE;
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ import androidx.car.app.model.ForegroundCarColorSpan;
|
|||
import app.organicmaps.R;
|
||||
import app.organicmaps.car.util.Colors;
|
||||
import app.organicmaps.car.util.RoutingHelpers;
|
||||
import app.organicmaps.sdk.search.SearchResult;
|
||||
import app.organicmaps.search.SearchResult;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
|
|
@ -8,7 +8,7 @@ import androidx.car.app.suggestion.model.Suggestion;
|
|||
import androidx.core.graphics.drawable.IconCompat;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.search.SearchRecents;
|
||||
import app.organicmaps.search.SearchRecents;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
package app.organicmaps.dialog;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.DialogInterface;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import app.organicmaps.R;
|
||||
|
||||
public class ProgressDialogFragment extends DialogFragment
|
||||
{
|
||||
private static final String ARG_MESSAGE = "title";
|
||||
private static final String ARG_CANCELABLE = "cancelable";
|
||||
private static final String ARG_RETAIN_INSTANCE = "retain_instance";
|
||||
|
||||
public ProgressDialogFragment()
|
||||
{
|
||||
// Do nothing by default.
|
||||
}
|
||||
|
||||
protected void setCancelResult()
|
||||
{
|
||||
Fragment targetFragment = getTargetFragment();
|
||||
if (targetFragment != null)
|
||||
targetFragment.onActivityResult(getTargetRequestCode(), Activity.RESULT_CANCELED, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Bundle args = requireArguments();
|
||||
setRetainInstance(args.getBoolean(ARG_RETAIN_INSTANCE, true));
|
||||
setCancelable(args.getBoolean(ARG_CANCELABLE, false));
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable
|
||||
Bundle savedInstanceState)
|
||||
{
|
||||
View view = inflater.inflate(R.layout.indeterminated_progress_dialog, container, false);
|
||||
Bundle args = requireArguments();
|
||||
TextView messageView = view.findViewById(R.id.message);
|
||||
messageView.setText(args.getString(ARG_MESSAGE));
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCancel(DialogInterface dialog)
|
||||
{
|
||||
setCancelResult();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView()
|
||||
{
|
||||
if (getDialog() != null && getRetainInstance())
|
||||
getDialog().setDismissMessage(null);
|
||||
super.onDestroyView();
|
||||
}
|
||||
}
|
|
@ -30,7 +30,7 @@ class BottomPanel
|
|||
public void onClick(View v)
|
||||
{
|
||||
final String country = mFragment.getCurrentRoot();
|
||||
MapManager.warnOn3gUpdate(mFragment.requireActivity(), country, () -> MapManager.startUpdate(country));
|
||||
MapManager.warnOn3gUpdate(mFragment.requireActivity(), country, () -> MapManager.nativeUpdate(country));
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -91,7 +91,7 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
|||
item.update();
|
||||
if (item.status != CountryItem.STATUS_UPDATABLE)
|
||||
return;
|
||||
MapManager.warnOn3gUpdate(adapter.mActivity, item.id, () -> MapManager.startUpdate(item.id));
|
||||
MapManager.warnOn3gUpdate(adapter.mActivity, item.id, () -> MapManager.nativeUpdate(item.id));
|
||||
}
|
||||
|
||||
private void onExploreActionSelected(CountryItem item, DownloaderAdapter adapter)
|
||||
|
@ -382,10 +382,12 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
|||
}
|
||||
case CountryItem.STATUS_FAILED ->
|
||||
{
|
||||
MapManager.warn3gAndRetry(mActivity, mItem.id, null);
|
||||
RetryFailedDownloadConfirmationListener listener =
|
||||
new RetryFailedDownloadConfirmationListener(mActivity.getApplication());
|
||||
MapManager.warn3gAndRetry(mActivity, mItem.id, listener);
|
||||
}
|
||||
case CountryItem.STATUS_UPDATABLE ->
|
||||
MapManager.warnOn3gUpdate(mActivity, mItem.id, () -> MapManager.startUpdate(mItem.id));
|
||||
MapManager.warnOn3gUpdate(mActivity, mItem.id, () -> MapManager.nativeUpdate(mItem.id));
|
||||
default -> throw new IllegalArgumentException("Inappropriate item status: " + mItem.status);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,8 +17,8 @@ import androidx.recyclerview.widget.RecyclerView;
|
|||
import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmRecyclerFragment;
|
||||
import app.organicmaps.base.OnBackPressListener;
|
||||
import app.organicmaps.sdk.search.MapSearchListener;
|
||||
import app.organicmaps.sdk.search.SearchEngine;
|
||||
import app.organicmaps.search.NativeMapSearchListener;
|
||||
import app.organicmaps.search.SearchEngine;
|
||||
import app.organicmaps.widget.PlaceholderView;
|
||||
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
|
||||
import app.organicmaps.util.bottomsheet.MenuBottomSheetItem;
|
||||
|
@ -52,13 +52,13 @@ public class DownloaderFragment extends BaseMwmRecyclerFragment<DownloaderAdapte
|
|||
}
|
||||
};
|
||||
|
||||
private final MapSearchListener mSearchListener = new MapSearchListener()
|
||||
private final NativeMapSearchListener mSearchListener = new NativeMapSearchListener()
|
||||
{
|
||||
// Called from JNI.
|
||||
@Keep
|
||||
@SuppressWarnings("unused")
|
||||
@Override
|
||||
public void onMapSearchResults(@NonNull Result[] results, long timestamp, boolean isLast)
|
||||
public void onMapSearchResults(Result[] results, long timestamp, boolean isLast)
|
||||
{
|
||||
if (!mSearchRunning || timestamp != mCurrentSearch)
|
||||
return;
|
||||
|
@ -66,8 +66,8 @@ public class DownloaderFragment extends BaseMwmRecyclerFragment<DownloaderAdapte
|
|||
List<CountryItem> rs = new ArrayList<>();
|
||||
for (Result result : results)
|
||||
{
|
||||
CountryItem item = CountryItem.fill(result.countryId());
|
||||
item.searchResultName = result.matchedString();
|
||||
CountryItem item = CountryItem.fill(result.countryId);
|
||||
item.searchResultName = result.matchedString;
|
||||
rs.add(item);
|
||||
}
|
||||
|
||||
|
|
|
@ -22,26 +22,18 @@ import app.organicmaps.R;
|
|||
import app.organicmaps.util.StringUtils;
|
||||
import app.organicmaps.util.log.Logger;
|
||||
|
||||
public class DownloaderNotifier
|
||||
public abstract class DownloaderNotifier
|
||||
{
|
||||
private static final String TAG = DownloaderNotifier.class.getSimpleName();
|
||||
|
||||
private static final String CHANNEL_ID = "downloader";
|
||||
public static final int NOTIFICATION_ID = 1;
|
||||
|
||||
private final Context mContext;
|
||||
private NotificationCompat.Builder mProgressNotificationBuilder;
|
||||
|
||||
public DownloaderNotifier(Context context)
|
||||
{
|
||||
mContext = context;
|
||||
}
|
||||
private static final int NOTIFICATION_ID = 1;
|
||||
|
||||
public static void createNotificationChannel(@NonNull Context context)
|
||||
{
|
||||
final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
|
||||
final NotificationChannelCompat channel = new NotificationChannelCompat.Builder(CHANNEL_ID,
|
||||
NotificationManagerCompat.IMPORTANCE_LOW)
|
||||
NotificationManagerCompat.IMPORTANCE_DEFAULT)
|
||||
.setName(context.getString(R.string.notification_channel_downloader))
|
||||
.setShowBadge(true)
|
||||
.setVibrationEnabled(false)
|
||||
|
@ -50,93 +42,49 @@ public class DownloaderNotifier
|
|||
notificationManager.createNotificationChannel(channel);
|
||||
}
|
||||
|
||||
public void notifyDownloadFailed(@Nullable String countryId)
|
||||
public static void notifyDownloadFailed(@NonNull Context context, @Nullable String countryId)
|
||||
{
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
|
||||
ContextCompat.checkSelfPermission(mContext, POST_NOTIFICATIONS) != PERMISSION_GRANTED)
|
||||
ContextCompat.checkSelfPermission(context, POST_NOTIFICATIONS) != PERMISSION_GRANTED)
|
||||
{
|
||||
Logger.w(TAG, "Permission POST_NOTIFICATIONS is not granted, skipping notification");
|
||||
return;
|
||||
}
|
||||
|
||||
final String title = mContext.getString(R.string.app_name);
|
||||
final String title = context.getString(R.string.app_name);
|
||||
final String countryName = MapManager.nativeGetName(countryId);
|
||||
final String content = mContext.getString(R.string.download_country_failed, countryName);
|
||||
final String content = context.getString(R.string.download_country_failed, countryName);
|
||||
|
||||
var contentPendingIntent = getNotificationPendingIntent(countryId);
|
||||
final int FLAG_IMMUTABLE = Build.VERSION.SDK_INT < Build.VERSION_CODES.M ? 0 : PendingIntent.FLAG_IMMUTABLE;
|
||||
final Intent contentIntent = MwmActivity.createShowMapIntent(context, countryId);
|
||||
contentIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
final PendingIntent contentPendingIntent = PendingIntent.getActivity(context, 0, contentIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT | FLAG_IMMUTABLE);
|
||||
|
||||
final Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID)
|
||||
final Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
|
||||
.setAutoCancel(true)
|
||||
.setCategory(NotificationCompat.CATEGORY_ERROR)
|
||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||
.setSmallIcon(R.drawable.ic_splash)
|
||||
.setColor(ContextCompat.getColor(mContext, R.color.notification))
|
||||
.setColor(ContextCompat.getColor(context, R.color.notification))
|
||||
.setContentTitle(title)
|
||||
.setContentText(content)
|
||||
.setShowWhen(true)
|
||||
.setTicker(getTicker(mContext, title, content))
|
||||
.setTicker(getTicker(context, title, content))
|
||||
.setContentIntent(contentPendingIntent)
|
||||
.setOnlyAlertOnce(true)
|
||||
.build();
|
||||
|
||||
Logger.i(TAG, "Notifying about failed map download");
|
||||
final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(mContext);
|
||||
final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
|
||||
notificationManager.notify(NOTIFICATION_ID, notification);
|
||||
}
|
||||
|
||||
public void notifyProgress() {
|
||||
notifyProgress(null, 0, 0);
|
||||
}
|
||||
|
||||
public void notifyProgress(@Nullable String countryId, int maxProgress, int progress) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
|
||||
ContextCompat.checkSelfPermission(mContext, POST_NOTIFICATIONS) != PERMISSION_GRANTED)
|
||||
{
|
||||
Logger.w(TAG, "Permission POST_NOTIFICATIONS is not granted, skipping notification");
|
||||
return;
|
||||
}
|
||||
|
||||
NotificationManagerCompat.from(mContext).notify(NOTIFICATION_ID, buildProgressNotification(countryId, maxProgress, progress));
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public Notification buildProgressNotification()
|
||||
static void cancelNotification(@NonNull Context context)
|
||||
{
|
||||
return buildProgressNotification(null, 0, 0);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public Notification buildProgressNotification(@Nullable String countryId, int maxProgress, int progress)
|
||||
{
|
||||
var builder = startNotification(countryId);
|
||||
|
||||
builder.setProgress(maxProgress, progress, maxProgress == 0);
|
||||
builder.setContentText("Download in progress");
|
||||
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private NotificationCompat.Builder startNotification(@Nullable String countryId)
|
||||
{
|
||||
final String title = mContext.getString(R.string.app_name);
|
||||
|
||||
return new NotificationCompat.Builder(mContext, CHANNEL_ID)
|
||||
.setAutoCancel(true)
|
||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||
.setSmallIcon(R.drawable.ic_splash)
|
||||
.setColor(ContextCompat.getColor(mContext, R.color.notification))
|
||||
.setShowWhen(true)
|
||||
.setContentTitle(title)
|
||||
.setContentIntent(getNotificationPendingIntent(countryId));
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private PendingIntent getNotificationPendingIntent(@Nullable String countryId) {
|
||||
final int FLAG_IMMUTABLE = Build.VERSION.SDK_INT < Build.VERSION_CODES.M ? 0 : PendingIntent.FLAG_IMMUTABLE;
|
||||
final Intent contentIntent = MwmActivity.createShowMapIntent(mContext, countryId);
|
||||
contentIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
return PendingIntent.getActivity(mContext, 0, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT | FLAG_IMMUTABLE);
|
||||
Logger.i(TAG, "Cancelling notification about failed map download");
|
||||
final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
|
||||
notificationManager.cancel(NOTIFICATION_ID);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
|
|
|
@ -1,142 +0,0 @@
|
|||
package app.organicmaps.downloader;
|
||||
|
||||
import static android.Manifest.permission.POST_NOTIFICATIONS;
|
||||
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||
|
||||
import android.app.ForegroundServiceStartNotAllowedException;
|
||||
import android.app.Service;
|
||||
import android.content.Intent;
|
||||
import android.os.Build;
|
||||
import android.os.IBinder;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.util.log.Logger;
|
||||
|
||||
public class DownloaderService extends Service implements MapManager.StorageCallback
|
||||
{
|
||||
private static final String TAG = DownloaderService.class.getSimpleName();
|
||||
|
||||
private final DownloaderNotifier mNotifier = new DownloaderNotifier(this);
|
||||
private int mSubscriptionSlot;
|
||||
|
||||
@Override
|
||||
public void onCreate()
|
||||
{
|
||||
super.onCreate();
|
||||
|
||||
Logger.i(TAG);
|
||||
|
||||
mSubscriptionSlot = MapManager.nativeSubscribe(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int onStartCommand(Intent intent, int flags, int startId)
|
||||
{
|
||||
Logger.i(TAG, "Downloading: " + MapManager.nativeIsDownloading());
|
||||
|
||||
var notification = mNotifier.buildProgressNotification();
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
|
||||
{
|
||||
try
|
||||
{
|
||||
startForeground(DownloaderNotifier.NOTIFICATION_ID, notification);
|
||||
} catch (ForegroundServiceStartNotAllowedException e)
|
||||
{
|
||||
Logger.e(TAG, "Oops! ForegroundService is not allowed", e);
|
||||
}
|
||||
} else
|
||||
{
|
||||
startForeground(DownloaderNotifier.NOTIFICATION_ID, notification);
|
||||
}
|
||||
|
||||
return START_NOT_STICKY;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public IBinder onBind(Intent intent)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStatusChanged(List<MapManager.StorageCallbackData> data)
|
||||
{
|
||||
var isDownloading = MapManager.nativeIsDownloading();
|
||||
var hasFailed = hasDownloadFailed(data);
|
||||
|
||||
Logger.i(TAG, "Downloading: " + isDownloading + " failure: " + hasFailed);
|
||||
|
||||
if (!isDownloading)
|
||||
{
|
||||
if (hasFailed)
|
||||
{
|
||||
// Detach service from the notification to keep after the service is stopped.
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
|
||||
{
|
||||
stopForeground(Service.STOP_FOREGROUND_DETACH);
|
||||
} else
|
||||
{
|
||||
stopForeground(false);
|
||||
}
|
||||
}
|
||||
stopSelf();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onProgress(String countryId, long localSize, long remoteSize)
|
||||
{
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
|
||||
ContextCompat.checkSelfPermission(this, POST_NOTIFICATIONS) != PERMISSION_GRANTED)
|
||||
{
|
||||
Logger.w(TAG, "Permission POST_NOTIFICATIONS is not granted, skipping notification");
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: How to calculate progress?
|
||||
mNotifier.notifyProgress();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy()
|
||||
{
|
||||
super.onDestroy();
|
||||
|
||||
Logger.i(TAG, "onDestroy");
|
||||
|
||||
MapManager.nativeUnsubscribe(mSubscriptionSlot);
|
||||
}
|
||||
|
||||
/**
|
||||
* Start the foreground service to keep the user informed about the status of region downloads.
|
||||
*/
|
||||
public static void startForegroundService()
|
||||
{
|
||||
Logger.i(TAG);
|
||||
var context = MwmApplication.sInstance;
|
||||
ContextCompat.startForegroundService(context, new Intent(context, DownloaderService.class));
|
||||
}
|
||||
|
||||
private boolean hasDownloadFailed(List<MapManager.StorageCallbackData> data)
|
||||
{
|
||||
for (MapManager.StorageCallbackData item : data)
|
||||
{
|
||||
if (item.isLeafNode && item.newStatus == CountryItem.STATUS_FAILED)
|
||||
{
|
||||
if (MapManager.nativeIsAutoretryFailed())
|
||||
{
|
||||
mNotifier.notifyDownloadFailed(item.countryId);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -1,22 +1,28 @@
|
|||
package app.organicmaps.downloader;
|
||||
|
||||
import android.app.Application;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import app.organicmaps.util.Utils;
|
||||
|
||||
class ExpandRetryConfirmationListener implements Runnable
|
||||
class ExpandRetryConfirmationListener extends RetryFailedDownloadConfirmationListener
|
||||
{
|
||||
@Nullable
|
||||
private final Utils.Proc<Boolean> mDialogClickListener;
|
||||
|
||||
ExpandRetryConfirmationListener(@Nullable Utils.Proc<Boolean> dialogClickListener)
|
||||
ExpandRetryConfirmationListener(@NonNull Application app,
|
||||
@Nullable Utils.Proc<Boolean> dialogClickListener)
|
||||
{
|
||||
super(app);
|
||||
mDialogClickListener = dialogClickListener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
super.run();
|
||||
if (mDialogClickListener == null)
|
||||
return;
|
||||
mDialogClickListener.invoke(true);
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue