forked from organicmaps/organicmaps
Compare commits
1 commit
master
...
github/for
Author | SHA1 | Date | |
---|---|---|---|
18f7827c83 |
1063 changed files with 280764 additions and 171823 deletions
101
.github/CODEOWNERS
vendored
101
.github/CODEOWNERS
vendored
|
@ -1,69 +1,66 @@
|
|||
# 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
|
||||
data/styles/default/light/**/*.png @organicmaps/design
|
||||
data/styles/default/light/**/*.svg @organicmaps/design
|
||||
data/styles/default/dark/**/*.png @organicmaps/design
|
||||
data/styles/default/dark/**/*.svg @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
|
||||
# no owner for translation changes
|
||||
/android/app/src/main/res/values*/strings.xml
|
||||
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
|
||||
# iOS.
|
||||
/iphone/ @organicmaps/ios
|
||||
/xcode/ @organicmaps/ios
|
||||
/docs/OBJC_STYLE.md @organicmaps/ios
|
||||
# no owner for translation changes
|
||||
/iphone/plist.txt
|
||||
/iphone/Maps/LocalizedStrings/
|
||||
iphone/ @organicmaps/ios
|
||||
xcode/ @organicmaps/ios
|
||||
docs/OBJC_STYLE.md @organicmaps/ios
|
||||
# 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
|
||||
|
|
2
.github/workflows/android-release.yaml
vendored
2
.github/workflows/android-release.yaml
vendored
|
@ -29,7 +29,7 @@ jobs:
|
|||
version=$(tools/unix/version.sh ios_version)
|
||||
# +1 because below a "Bump versions" commit is created.
|
||||
# TODO: Find a way to refactor FDroid versioning without that additional commit.
|
||||
build=$(($(tools/unix/version.sh count) + 1))
|
||||
build=$(($(tools/unix/version.sh ios_build) + 1))
|
||||
code=$(($(tools/unix/version.sh android_code) + 1))
|
||||
tag=$version-$build-android
|
||||
echo "::set-output name=version::$version"
|
||||
|
|
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
|
|
@ -17,9 +17,6 @@ endif()
|
|||
|
||||
target_include_directories(${PROJECT_NAME} PUBLIC .)
|
||||
|
||||
if (PLATFORM_LINUX)
|
||||
target_compile_definitions(${PROJECT_NAME} PRIVATE VK_USE_PLATFORM_XLIB_KHR)
|
||||
endif()
|
||||
|
||||
# dlopen
|
||||
target_link_libraries(${PROJECT_NAME} $<$<BOOL:CMAKE_DL_LIBS>:${CMAKE_DL_LIBS}>)
|
||||
|
|
|
@ -22,20 +22,7 @@ extern "C" {
|
|||
#include <dlfcn.h>
|
||||
|
||||
int InitVulkan(void) {
|
||||
#if defined(__APPLE__)
|
||||
void* libvulkan = dlopen("libvulkan.dylib", RTLD_NOW | RTLD_LOCAL);
|
||||
if (!libvulkan) {
|
||||
libvulkan = dlopen("libvulkan.1.dylib", RTLD_NOW | RTLD_LOCAL);
|
||||
}
|
||||
if (!libvulkan) {
|
||||
libvulkan = dlopen("libMoltenVK.dylib", RTLD_NOW | RTLD_LOCAL);
|
||||
}
|
||||
#else
|
||||
void* libvulkan = dlopen("libvulkan.so.1", RTLD_NOW | RTLD_LOCAL);
|
||||
if (!libvulkan) {
|
||||
libvulkan = dlopen("libvulkan.so", RTLD_NOW | RTLD_LOCAL);
|
||||
}
|
||||
#endif
|
||||
void* libvulkan = dlopen("libvulkan.so", RTLD_NOW | RTLD_LOCAL);
|
||||
if (!libvulkan) return 0;
|
||||
|
||||
// Vulkan supported, set function addresses
|
||||
|
@ -558,10 +545,6 @@ int InitVulkan(void) {
|
|||
vkDestroyDebugReportCallbackEXT = reinterpret_cast<PFN_vkDestroyDebugReportCallbackEXT>(dlsym(libvulkan, "vkDestroyDebugReportCallbackEXT"));
|
||||
vkDebugReportMessageEXT = reinterpret_cast<PFN_vkDebugReportMessageEXT>(dlsym(libvulkan, "vkDebugReportMessageEXT"));
|
||||
|
||||
#if defined(__APPLE__)
|
||||
vkCreateMacOSSurfaceMVK = reinterpret_cast<PFN_vkCreateMacOSSurfaceMVK>(dlsym(libvulkan, "vkCreateMacOSSurfaceMVK"));
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -1154,10 +1137,6 @@ PFN_vkCmdDecodeVideoKHR vkCmdDecodeVideoKHR;
|
|||
PFN_vkCmdEncodeVideoKHR vkCmdEncodeVideoKHR;
|
||||
#endif
|
||||
|
||||
#if defined(__APPLE__)
|
||||
PFN_vkCreateMacOSSurfaceMVK vkCreateMacOSSurfaceMVK;
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -25,10 +25,6 @@ extern "C" {
|
|||
#define VK_USE_PLATFORM_ANDROID_KHR 1
|
||||
#include <vulkan/vulkan.h>
|
||||
|
||||
#if defined(__APPLE__)
|
||||
#include <vulkan/vulkan_macos.h>
|
||||
#endif
|
||||
|
||||
/* Initialize the Vulkan function pointer variables declared in this header.
|
||||
* Returns 0 if vulkan is not available, non-zero if it is available.
|
||||
*/
|
||||
|
@ -504,10 +500,6 @@ extern PFN_vkCreateDebugReportCallbackEXT vkCreateDebugReportCallbackEXT;
|
|||
extern PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT;
|
||||
extern PFN_vkDebugReportMessageEXT vkDebugReportMessageEXT;
|
||||
|
||||
#if defined(__APPLE__)
|
||||
extern PFN_vkCreateMacOSSurfaceMVK vkCreateMacOSSurfaceMVK;
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -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)
|
||||
|
|
98
CONTRIBUTORS
98
CONTRIBUTORS
|
@ -1,73 +1,35 @@
|
|||
This file contains a list of people who have contributed to this project.
|
||||
Its not neccesarily comprehensive.
|
||||
Feel free to add yourself here along with your first contribution!
|
||||
This file contains a list of people who have contributed to the
|
||||
public version of MAPS.ME and Organic Maps.
|
||||
|
||||
Original MAPS.ME (MapsWithMe) design and implementation:
|
||||
Yury Melnichek <yury@melnichek.com>
|
||||
Alexander Borsuk <me@alex.bio>
|
||||
Viktor Govako <viktor.govako@gmail.com>
|
||||
Siarhei Rachytski <siarhei.rachytski@gmail.com>
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
Organic Maps (formerly OMaps) contributors:
|
||||
(in alphabetic order)
|
||||
Organic Maps contributions:
|
||||
--------------------------------------------------------------------------------
|
||||
Alexander Borsuk <me@alex.bio>
|
||||
Roman Tsisyk <roman@tsisyk.com>
|
||||
Viktor Govako <viktor.govako@gmail.com>
|
||||
Caspar Nuël <casparnuel@yandex.com>
|
||||
Konstantin Pastbin
|
||||
Nishant Bhandari <nishantbhandari0019@gmail.com>
|
||||
Sebastiao Sousa <sebastiao.sousa@tecnico.ulisboa.pt>
|
||||
Harry Bond <me@hbond.xyz>
|
||||
|
||||
Organic Maps translations:
|
||||
Karina Kordon
|
||||
Konstantin Pastbin
|
||||
Metehan Özyürek
|
||||
Joan Montané
|
||||
Luna Rose
|
||||
|
||||
Alexander Borsuk <me@alex.bio>
|
||||
Alexey Krasilnikov
|
||||
Andrew Shkrob
|
||||
Anton Makouski
|
||||
Arnaud Vergnet
|
||||
Arthur-GYT
|
||||
Atemu
|
||||
Caspar Nuël <casparnuel@yandex.com>
|
||||
cyber-toad
|
||||
David Martinez
|
||||
dbf
|
||||
Dzmitry Strekha
|
||||
Dzmitry Yarmolenka
|
||||
Fabian Wüthrich
|
||||
Ferenc Géczi
|
||||
Filip Czaplicki
|
||||
FinixFighter
|
||||
fparri
|
||||
Francesco Gazzetta
|
||||
gallegonovato
|
||||
Gonzalo Pesquero
|
||||
Harry Bond <me@hbond.xyz>
|
||||
Jaime Marquinez Ferrandiz
|
||||
Jean-Baptiste Charron
|
||||
Jenny Em
|
||||
Joan Montané
|
||||
Karina Kordon
|
||||
Kavi Khalique
|
||||
Kiryl Kaveryn
|
||||
Kiryl Razhdzestvenski
|
||||
Konstantin Pastbin
|
||||
Loïc Hernaut
|
||||
Lukas Hamm
|
||||
Lukas Kronberger
|
||||
Luna Rose
|
||||
map-per
|
||||
Markku Huotari
|
||||
Mateusz Konieczny
|
||||
Matheus Gomes
|
||||
MbTy1
|
||||
Meenbeese
|
||||
Metehan Özyürek
|
||||
Michał Brzozowski
|
||||
Nishant Bhandari <nishantbhandari0019@gmail.com>
|
||||
Ognjen Blagojevic
|
||||
Osyotr
|
||||
renderexpert
|
||||
Roman Kuznetsov
|
||||
Roman Tsisyk <roman@tsisyk.com>
|
||||
Rudo Kemper
|
||||
Sebastiao Sousa <sebastiao.sousa@tecnico.ulisboa.pt>
|
||||
Sergiy Kozyr
|
||||
Tobias G. <tobi.goergens@gmail.com>
|
||||
Veniamin Gvozdikov <g.veniamin@googlemail.com>
|
||||
Viktor Govako <viktor.govako@gmail.com>
|
||||
Will Bradley
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
MAPS.ME at Mail.Ru Group (prior to the Organic Maps (OMaps) fork in 2020/2021):
|
||||
MAPS.ME contributions (before Organic Maps was forked in 2020-2021):
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Code contributions:
|
||||
Dmitry Yunitski
|
||||
Lev Dragunov
|
||||
|
@ -138,13 +100,3 @@ Special thanks to:
|
|||
Yuri Gurski
|
||||
Dmitry Matveev
|
||||
Anna Yakovleva
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
MAPS.ME (originally MapsWithMe) design and implementation at MapsWithMe GmbH
|
||||
(from 2010 till the acquisition by Mail.ru Group in 2014):
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Yury Melnichek <yury@melnichek.com>
|
||||
Alexander Borsuk <me@alex.bio>
|
||||
Viktor Govako <viktor.govako@gmail.com>
|
||||
Siarhei Rachytski <siarhei.rachytski@gmail.com>
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ buildscript {
|
|||
googleFirebaseServicesDefault
|
||||
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:8.7.3'
|
||||
classpath 'com.android.tools.build:gradle:8.7.2'
|
||||
|
||||
if (googleFirebaseServicesEnabled) {
|
||||
println('Building with Google Firebase Services')
|
||||
|
@ -100,7 +100,7 @@ android {
|
|||
// All properties are read from gradle.properties file
|
||||
compileSdk propCompileSdkVersion.toInteger()
|
||||
|
||||
ndkVersion '27.2.12479018'
|
||||
ndkVersion '27.1.12297006'
|
||||
|
||||
defaultConfig {
|
||||
// Default package name is taken from the manifest and should be app.organicmaps
|
||||
|
@ -363,7 +363,7 @@ android {
|
|||
}
|
||||
|
||||
dependencies {
|
||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4'
|
||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.3'
|
||||
|
||||
// Google Play Location Services
|
||||
//
|
||||
|
@ -379,7 +379,7 @@ dependencies {
|
|||
huaweiImplementation 'com.google.android.gms:play-services-location:21.3.0'
|
||||
// This is the microG project's re-implementation which is permissible on
|
||||
// F-droid because it's Apache-2.0.
|
||||
fdroidImplementation 'org.microg.gms:play-services-location:0.3.6.244735'
|
||||
fdroidImplementation 'org.microg.gms:play-services-location:0.3.4.240913'
|
||||
|
||||
// Google Firebase Services
|
||||
if (googleFirebaseServicesEnabled) {
|
||||
|
@ -396,11 +396,11 @@ dependencies {
|
|||
// We don't use Kotlin, but some dependencies are actively using it.
|
||||
// See https://stackoverflow.com/a/75719642
|
||||
implementation 'androidx.core:core:1.15.0'
|
||||
implementation(platform('org.jetbrains.kotlin:kotlin-bom:2.1.10'))
|
||||
implementation(platform('org.jetbrains.kotlin:kotlin-bom:2.0.21'))
|
||||
implementation 'androidx.annotation:annotation:1.9.1'
|
||||
implementation 'androidx.appcompat:appcompat:1.7.0'
|
||||
implementation 'androidx.car.app:app:1.7.0-rc01'
|
||||
implementation 'androidx.car.app:app-projected:1.7.0-rc01'
|
||||
implementation 'androidx.car.app:app:1.7.0-beta03'
|
||||
implementation 'androidx.car.app:app-projected:1.7.0-beta03'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.2.0'
|
||||
implementation 'androidx.fragment:fragment:1.8.5'
|
||||
implementation 'androidx.preference:preference:1.2.1'
|
||||
|
@ -417,7 +417,7 @@ dependencies {
|
|||
// Test Dependencies
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
testImplementation 'org.mockito:mockito-core:5.15.2'
|
||||
testImplementation 'org.mockito:mockito-core:5.12.0'
|
||||
testImplementation 'org.mockito:mockito-inline:5.2.0'
|
||||
}
|
||||
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• Новыя дадзеныя OpenStreetMap ад 27 лютага
|
||||
• Магчымасць уручную расстаўляць прамежкавыя кропкі маршруту
|
||||
• Экспарт аднаго абранага трэка са спісу
|
||||
• Палепшаная маршрутызацыя для веласіпедыстаў
|
||||
• Дададзена сістэмнае апавяшчэнне пры загрузцы карт, фонавыя загрузкі больш не перарываюцца
|
||||
• Дададзены мігатлівы віджэт запісу трэка
|
||||
|
||||
…і шматлікае іншае на omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…weitere Details unter omaps.org/news
|
||||
• Neue OpenStreetMap-Daten vom 22. November
|
||||
• Hervorhebung des übereinstimmenden Teils der Adresse in Suchergebnissen
|
||||
• Sortierung des Suchverlaufs nach letzter Nutzung
|
||||
• Behobene Startabstürze bei einigen älteren Geräten mit Mali-T-GPUs
|
||||
• Weitere Suchverbesserungen, Übersetzungs-Updates und Fehlerbehebungen
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• Nuevos datos de OpenStreetMap del 22 de noviembre
|
||||
• Resaltado de la parte coincidente de la dirección en los resultados de búsqueda
|
||||
• Ordenar el historial de búsquedas por la última vez de uso
|
||||
• Solucionados los bloqueos al inicio en algunos dispositivos antiguos con GPU Mali-T
|
||||
• Otras mejoras en la búsqueda, actualizaciones de traducción y correcciones de errores
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…plus de détails sur omaps.org/news
|
||||
• Nouvelles données OpenStreetMap du 22 novembre
|
||||
• Mise en évidence de la partie correspondante de l'adresse dans les résultats de recherche
|
||||
• Tri de l'historique des recherches par dernier temps d'utilisation
|
||||
• Correction des plantages au démarrage sur certains anciens appareils avec des GPU Mali-T
|
||||
• Autres améliorations de recherche, mises à jour de traduction et corrections de bugs
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• Новые данные OpenStreetMap от 27 февраля
|
||||
• Возможность вручную расставлять промежуточные точки маршрута
|
||||
• Экспорт одного выбранного трека из списка
|
||||
• Улучшенная маршрутизация для велосипедистов
|
||||
• Добавлено системное уведомление при загрузке карт, фоновые загрузки больше не прерываются
|
||||
• Добавлен мигающий виджет записи трека
|
||||
|
||||
…и многое другое на omaps.org/news
|
||||
• Новые данные OpenStreetMap от 22 ноября
|
||||
• В результатах поиска выделяется совпавшая часть адреса
|
||||
• История поиска всегда сортируется по времени последнего использования
|
||||
• Исправлена проблема запуска на некоторых старых устройствах с GPU Mali-T
|
||||
• Различные улучшения поиска, обновления переводов и исправления ошибок
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• Нови OpenStreetMap подаци са стањем на дан 22. новембра
|
||||
• Назначен пронађени део адресе у резултатима претраге
|
||||
• Сортирање историје претраге по времену последњег коришћења
|
||||
• Исправке грешака при покретању на неким старијим уређајима са графичким процесорима Mali-T GPUs.
|
||||
• Друга побољшања за претрагу, исправке превода и исправке грешака
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• Нові дані OpenStreetMap від 27 лютого
|
||||
• Можливість вручну розставляти проміжні точки маршруту
|
||||
• Експорт одного вибраного треку зі списку
|
||||
• Покращена маршрутизація для велосипедистів
|
||||
• Додано системне повідомлення під час завантаження карт, фонові завантаження більше не перериваються
|
||||
• Додано миготливий віджет запису треку
|
||||
|
||||
…більше подробиць на omaps.org/news
|
||||
• Нові дані OpenStreetMap від 22 листопада
|
||||
• Адреса підсвічюється в результатах пошуку
|
||||
• Історія пошука сортується за часом останнього використання
|
||||
• Виправлення падіння на деяких старих девайсах із Mali-T GPU
|
||||
• Деякі покращення якості пошуку, уточнення перекладів, виправлення помилок
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
• 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
|
||||
|
||||
…more details at omaps.org/news
|
||||
• New OpenStreetMap data as of November 22
|
||||
• Highlight matched part of the address in search results
|
||||
• Sort search history by last usage time
|
||||
• Fixed start-up crashes for some older devices with Mali-T GPUs
|
||||
• Other search improvements, translation updates & bug fixes
|
||||
|
|
|
@ -1 +1 @@
|
|||
version: 2025.03.02-7-FDroid+25030207
|
||||
version: 2024.11.27-12-FDroid+24112712
|
||||
|
|
|
@ -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
|
||||
|
@ -80,14 +79,12 @@
|
|||
android:resizeableActivity="true"
|
||||
android:supportsRtl="true"
|
||||
android:networkSecurityConfig="@xml/network_security_config"
|
||||
android:manageSpaceActivity="${applicationId}.ManageSpaceActivity"
|
||||
tools:targetApi="33">
|
||||
|
||||
<!-- Allows for config and orientation change without killing/restarting main activity -->
|
||||
<activity
|
||||
android:name="app.organicmaps.SplashActivity"
|
||||
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation"
|
||||
android:screenOrientation="fullUser"
|
||||
android:exported="true">
|
||||
|
||||
<intent-filter>
|
||||
|
@ -122,7 +119,7 @@
|
|||
<data android:scheme="https"/>
|
||||
<data android:host="omaps.app"/>
|
||||
</intent-filter>
|
||||
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
|
||||
|
@ -346,8 +343,7 @@
|
|||
|
||||
<activity
|
||||
android:name="app.organicmaps.DownloadResourcesLegacyActivity"
|
||||
android:configChanges="orientation|screenLayout|screenSize"
|
||||
android:screenOrientation="fullUser"/>
|
||||
android:configChanges="orientation|screenLayout|screenSize"/>
|
||||
|
||||
<activity-alias
|
||||
android:name="app.organicmaps.DownloadResourcesActivity"
|
||||
|
@ -364,18 +360,11 @@
|
|||
android:name="app.organicmaps.MwmActivity"
|
||||
android:launchMode="singleTask"
|
||||
android:configChanges="uiMode"
|
||||
android:screenOrientation="fullUser"
|
||||
android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>
|
||||
|
||||
<activity-alias
|
||||
android:name="${applicationId}.ManageSpaceActivity"
|
||||
android:exported="true"
|
||||
android:targetActivity=".SplashActivity" />
|
||||
|
||||
<activity
|
||||
android:name="app.organicmaps.downloader.DownloaderActivity"
|
||||
android:configChanges="orientation|screenLayout|screenSize"
|
||||
android:screenOrientation="fullUser"
|
||||
android:label="@string/download_maps"
|
||||
android:parentActivityName="app.organicmaps.MwmActivity"
|
||||
android:windowSoftInputMode="adjustResize" />
|
||||
|
@ -383,7 +372,6 @@
|
|||
<activity
|
||||
android:name="app.organicmaps.search.SearchActivity"
|
||||
android:configChanges="orientation|screenLayout|screenSize"
|
||||
android:screenOrientation="fullUser"
|
||||
android:label="@string/search_map"
|
||||
android:parentActivityName="app.organicmaps.MwmActivity"
|
||||
android:windowSoftInputMode="stateVisible|adjustResize" />
|
||||
|
@ -391,7 +379,6 @@
|
|||
<activity
|
||||
android:name="app.organicmaps.settings.SettingsActivity"
|
||||
android:configChanges="orientation|screenLayout|screenSize"
|
||||
android:screenOrientation="fullUser"
|
||||
android:label="@string/settings"
|
||||
android:parentActivityName="app.organicmaps.MwmActivity" />
|
||||
|
||||
|
@ -409,7 +396,6 @@
|
|||
<activity
|
||||
android:name="app.organicmaps.bookmarks.BookmarkCategoriesActivity"
|
||||
android:configChanges="orientation|screenLayout|screenSize"
|
||||
android:screenOrientation="fullUser"
|
||||
android:label="@string/bookmarks_and_tracks"
|
||||
android:parentActivityName="app.organicmaps.MwmActivity"
|
||||
android:windowSoftInputMode="adjustResize" />
|
||||
|
@ -417,7 +403,6 @@
|
|||
<activity
|
||||
android:name="app.organicmaps.bookmarks.BookmarkListActivity"
|
||||
android:configChanges="orientation|screenLayout|screenSize"
|
||||
android:screenOrientation="fullUser"
|
||||
android:label="@string/bookmarks"
|
||||
android:parentActivityName="app.organicmaps.bookmarks.BookmarkCategoriesActivity"
|
||||
android:windowSoftInputMode="adjustResize" />
|
||||
|
@ -425,7 +410,6 @@
|
|||
<activity
|
||||
android:name="app.organicmaps.editor.EditorActivity"
|
||||
android:configChanges="orientation|screenLayout|screenSize"
|
||||
android:screenOrientation="fullUser"
|
||||
android:label="@string/edit_place"
|
||||
android:parentActivityName="app.organicmaps.MwmActivity"
|
||||
android:windowSoftInputMode="adjustResize" />
|
||||
|
@ -464,16 +448,14 @@
|
|||
<service
|
||||
android:name="app.organicmaps.car.CarAppService"
|
||||
android:exported="true"
|
||||
android:foregroundServiceType="specialUse"
|
||||
tools:ignore="ExportedService">
|
||||
<intent-filter>
|
||||
<action android:name="androidx.car.app.CarAppService" />
|
||||
<category android:name="androidx.car.app.category.NAVIGATION" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="androidx.car.app.action.NAVIGATE" />
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
<data android:scheme="geo" />
|
||||
</intent-filter>
|
||||
<property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
|
||||
android:value="@string/android_auto_fgs_explanation_for_special_use"/>
|
||||
</service>
|
||||
|
||||
<service
|
||||
|
@ -490,13 +472,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}"
|
||||
|
@ -512,8 +487,8 @@
|
|||
<meta-data android:name="android.webkit.WebView.EnableSafeBrowsing" android:value="false" />
|
||||
<!-- Disable Google's anonymous stats collection -->
|
||||
<meta-data android:name="android.webkit.WebView.MetricsOptOut" android:value="true" />
|
||||
|
||||
<!-- Version >= 3.0. Dex Dual Mode support for compatible Samsung devices.
|
||||
|
||||
<!-- Version >= 3.0. Dex Dual Mode support for compatible Samsung devices.
|
||||
See the documentation: https://developer.samsung.com/samsung-dex/modify-optimizing.html //-->
|
||||
<meta-data android:name="com.samsung.android.multidisplay.keep_process_alive" android:value="true" />
|
||||
|
||||
|
|
|
@ -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, ());
|
|
@ -1578,12 +1578,6 @@ Java_app_organicmaps_Framework_nativeAddRoutePoint(JNIEnv * env, jclass, jstring
|
|||
frm()->GetRoutingManager().AddRoutePoint(std::move(data));
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_Framework_nativeRemoveRoutePoints(JNIEnv * env, jclass)
|
||||
{
|
||||
frm()->GetRoutingManager().RemoveRoutePoints();
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_Framework_nativeRemoveRoutePoint(JNIEnv * env, jclass,
|
||||
jint markType, jint intermediateIndex)
|
||||
|
@ -1633,13 +1627,6 @@ Java_app_organicmaps_Framework_nativeGetRoutePoints(JNIEnv * env, jclass)
|
|||
});
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_Framework_nativeMoveRoutePoint(JNIEnv * env, jclass,
|
||||
jint currentIndex, jint targetIndex)
|
||||
{
|
||||
frm()->GetRoutingManager().MoveRoutePoint(currentIndex, targetIndex);
|
||||
}
|
||||
|
||||
JNIEXPORT jobject JNICALL
|
||||
Java_app_organicmaps_Framework_nativeGetTransitRouteInfo(JNIEnv * env, jclass)
|
||||
{
|
||||
|
@ -2006,74 +1993,4 @@ Java_app_organicmaps_Framework_nativeGetKayakHotelLink(JNIEnv * env, jclass, jst
|
|||
return url.empty() ? nullptr : jni::ToJavaString(env, url);
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean JNICALL
|
||||
Java_app_organicmaps_Framework_nativeShouldShowProducts(JNIEnv * env, jclass)
|
||||
{
|
||||
return frm()->ShouldShowProducts();
|
||||
}
|
||||
|
||||
JNIEXPORT jobject JNICALL
|
||||
Java_app_organicmaps_Framework_nativeGetProductsConfiguration(JNIEnv * env, jclass)
|
||||
{
|
||||
auto config = frm()->GetProductsConfiguration();
|
||||
if (!config) return nullptr;
|
||||
|
||||
static jclass const productClass = jni::GetGlobalClassRef(
|
||||
env,
|
||||
"app/organicmaps/products/Product"
|
||||
);
|
||||
static jmethodID const productConstructor = jni::GetConstructorID(
|
||||
env,
|
||||
productClass,
|
||||
"(Ljava/lang/String;Ljava/lang/String;)V"
|
||||
);
|
||||
|
||||
jobjectArray products = jni::ToJavaArray(
|
||||
env,
|
||||
productClass,
|
||||
config->GetProducts(),
|
||||
[](JNIEnv * env, products::ProductsConfig::Product const & product)
|
||||
{
|
||||
jni::TScopedLocalRef const title(env, jni::ToJavaString(env, product.GetTitle()));
|
||||
jni::TScopedLocalRef const link(env, jni::ToJavaString(env, product.GetLink()));
|
||||
|
||||
return env->NewObject(
|
||||
productClass,
|
||||
productConstructor,
|
||||
title.get(),
|
||||
link.get()
|
||||
);
|
||||
});
|
||||
|
||||
static jclass const productsConfigClass = jni::GetGlobalClassRef(
|
||||
env,
|
||||
"app/organicmaps/products/ProductsConfig"
|
||||
);
|
||||
static jmethodID const productsConfigConstructor = jni::GetConstructorID(
|
||||
env,
|
||||
productsConfigClass,
|
||||
"(Ljava/lang/String;[Lapp/organicmaps/products/Product;)V"
|
||||
);
|
||||
|
||||
jni::TScopedLocalRef const placePagePrompt(env, jni::ToJavaString(env, config->GetPlacePagePrompt()));
|
||||
return env->NewObject(productsConfigClass, productsConfigConstructor, placePagePrompt.get(), products);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_Framework_nativeDidCloseProductsPopup(JNIEnv * env, jclass, jstring reason)
|
||||
{
|
||||
frm()->DidCloseProductsPopup(frm()->FromString(jni::ToNativeString(env, reason)));
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_Framework_nativeDidSelectProduct(JNIEnv * env, jclass, jstring title, jstring link)
|
||||
{
|
||||
products::ProductsConfig::Product product(
|
||||
jni::ToNativeString(env, title),
|
||||
jni::ToNativeString(env, link)
|
||||
);
|
||||
|
||||
frm()->DidSelectProduct(product);
|
||||
}
|
||||
|
||||
} // extern "C"
|
||||
|
|
|
@ -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");
|
||||
|
@ -165,13 +165,12 @@ jobject CreateElevationInfo(JNIEnv * env, ElevationInfo const & info)
|
|||
"[Lapp/organicmaps/bookmarks/data/ElevationInfo$Point;"
|
||||
"IIIIIJ)V");
|
||||
jni::TScopedLocalObjectArrayRef jPoints(env, ToElevationPointArray(env, info.GetPoints()));
|
||||
// TODO (KK): elevation info should have only the elevation data - see the https://github.com/organicmaps/organicmaps/pull/10063
|
||||
return env->NewObject(g_elevationInfoClazz, ctorId,
|
||||
jPoints.get(),
|
||||
// static_cast<jint>(info.GetAscent()),
|
||||
// static_cast<jint>(info.GetDescent()),
|
||||
// static_cast<jint>(info.GetMinAltitude()),
|
||||
// static_cast<jint>(info.GetMaxAltitude()),
|
||||
static_cast<jint>(info.GetAscent()),
|
||||
static_cast<jint>(info.GetDescent()),
|
||||
static_cast<jint>(info.GetMinAltitude()),
|
||||
static_cast<jint>(info.GetMaxAltitude()),
|
||||
static_cast<jint>(info.GetDifficulty()));
|
||||
}
|
||||
|
||||
|
|
|
@ -591,15 +591,6 @@ Java_app_organicmaps_bookmarks_data_BookmarkManager_nativeSetAllCategoriesVisibi
|
|||
frm()->GetBookmarkManager().SetAllCategoriesVisibility(static_cast<bool>(visible));
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_bookmarks_data_BookmarkManager_nativePrepareTrackFileForSharing(JNIEnv * env, jclass, jlong trackId, jint kmlFileType)
|
||||
{
|
||||
frm()->GetBookmarkManager().PrepareTrackFileForSharing(static_cast<kml::TrackId>(trackId), [env](BookmarkManager::SharingResult const & result)
|
||||
{
|
||||
OnPreparedFileForSharing(env, result);
|
||||
}, static_cast<KmlFileType>(kmlFileType));
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_bookmarks_data_BookmarkManager_nativePrepareFileForSharing(JNIEnv * env, jclass, jlongArray catIds, jint kmlFileType)
|
||||
{
|
||||
|
|
|
@ -149,8 +149,7 @@ Java_app_organicmaps_editor_Editor_nativeHasWifi(JNIEnv *, jclass)
|
|||
JNIEXPORT void JNICALL
|
||||
Java_app_organicmaps_editor_Editor_nativeSetHasWifi(JNIEnv *, jclass, jboolean hasWifi)
|
||||
{
|
||||
if (hasWifi != (g_editableMapObject.GetInternet() == feature::Internet::Wlan))
|
||||
g_editableMapObject.SetInternet(hasWifi ? feature::Internet::Wlan : feature::Internet::Unknown);
|
||||
g_editableMapObject.SetInternet(hasWifi ? feature::Internet::Wlan : feature::Internet::Unknown);
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean JNICALL
|
||||
|
@ -363,11 +362,7 @@ Java_app_organicmaps_editor_Editor_nativeStartEdit(JNIEnv *, jclass)
|
|||
{
|
||||
::Framework * frm = g_framework->NativeFramework();
|
||||
if (!frm->HasPlacePageInfo())
|
||||
{
|
||||
ASSERT(g_editableMapObject.GetEditingLifecycle() == osm::EditingLifecycle::CREATED,
|
||||
("PlacePageInfo should only be empty for new features."));
|
||||
return;
|
||||
}
|
||||
|
||||
place_page::Info const & info = g_framework->GetPlacePageInfo();
|
||||
CHECK(frm->GetEditableMapObject(info.GetID(), g_editableMapObject), ("Invalid feature in the place page."));
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -49,12 +49,6 @@ Java_app_organicmaps_util_StringUtils_nativeFilterContainsNormalized(JNIEnv * en
|
|||
return jni::ToJavaStringArray(env, filtered);
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL Java_app_organicmaps_util_StringUtils_nativeFormatSpeed(
|
||||
JNIEnv * env, jclass thiz, jdouble metersPerSecond)
|
||||
{
|
||||
return measurement_utils::FormatSpeed(metersPerSecond, measurement_utils::GetMeasurementUnits());
|
||||
}
|
||||
|
||||
JNIEXPORT jobject JNICALL Java_app_organicmaps_util_StringUtils_nativeFormatSpeedAndUnits(
|
||||
JNIEnv * env, jclass thiz, jdouble metersPerSecond)
|
||||
{
|
||||
|
|
|
@ -2,16 +2,274 @@
|
|||
|
||||
#include "app/organicmaps/platform/AndroidPlatform.hpp"
|
||||
|
||||
#include "drape/drape_diagnostics.hpp"
|
||||
#include "drape/support_manager.hpp"
|
||||
#include "drape/vulkan/vulkan_pipeline.hpp"
|
||||
#include "drape/vulkan/vulkan_utils.hpp"
|
||||
|
||||
#include "base/assert.hpp"
|
||||
#include "base/logging.hpp"
|
||||
#include "base/macros.hpp"
|
||||
#include "base/src_point.hpp"
|
||||
|
||||
#include <array>
|
||||
#include <vector>
|
||||
|
||||
namespace android
|
||||
{
|
||||
namespace
|
||||
{
|
||||
class DrawVulkanContext : public dp::vulkan::VulkanBaseContext
|
||||
{
|
||||
public:
|
||||
DrawVulkanContext(VkInstance vulkanInstance, VkPhysicalDevice gpu,
|
||||
VkPhysicalDeviceProperties const & gpuProperties, VkDevice device,
|
||||
uint32_t renderingQueueFamilyIndex,
|
||||
ref_ptr<dp::vulkan::VulkanObjectManager> objectManager, uint32_t appVersionCode,
|
||||
bool hasPartialTextureUpdates)
|
||||
: dp::vulkan::VulkanBaseContext(
|
||||
vulkanInstance, gpu, gpuProperties, device, renderingQueueFamilyIndex, objectManager,
|
||||
make_unique_dp<dp::vulkan::VulkanPipeline>(device, appVersionCode),
|
||||
hasPartialTextureUpdates)
|
||||
{
|
||||
VkQueue queue;
|
||||
vkGetDeviceQueue(device, renderingQueueFamilyIndex, 0, &queue);
|
||||
SetRenderingQueue(queue);
|
||||
CreateCommandPool();
|
||||
}
|
||||
|
||||
void MakeCurrent() override
|
||||
{
|
||||
m_objectManager->RegisterThread(dp::vulkan::VulkanObjectManager::Frontend);
|
||||
}
|
||||
};
|
||||
|
||||
class UploadVulkanContext : public dp::vulkan::VulkanBaseContext
|
||||
{
|
||||
public:
|
||||
UploadVulkanContext(VkInstance vulkanInstance, VkPhysicalDevice gpu,
|
||||
VkPhysicalDeviceProperties const & gpuProperties, VkDevice device,
|
||||
uint32_t renderingQueueFamilyIndex,
|
||||
ref_ptr<dp::vulkan::VulkanObjectManager> objectManager,
|
||||
bool hasPartialTextureUpdates)
|
||||
: dp::vulkan::VulkanBaseContext(vulkanInstance, gpu, gpuProperties, device,
|
||||
renderingQueueFamilyIndex, objectManager,
|
||||
nullptr /* pipeline */, hasPartialTextureUpdates)
|
||||
{}
|
||||
|
||||
void MakeCurrent() override
|
||||
{
|
||||
m_objectManager->RegisterThread(dp::vulkan::VulkanObjectManager::Backend);
|
||||
}
|
||||
|
||||
void Present() override {}
|
||||
|
||||
void Resize(int w, int h) override {}
|
||||
void SetFramebuffer(ref_ptr<dp::BaseFramebuffer> framebuffer) override {}
|
||||
void Init(dp::ApiVersion apiVersion) override
|
||||
{
|
||||
CHECK_EQUAL(apiVersion, dp::ApiVersion::Vulkan, ());
|
||||
}
|
||||
|
||||
void SetClearColor(dp::Color const & color) override {}
|
||||
void Clear(uint32_t clearBits, uint32_t storeBits) override {}
|
||||
void Flush() override {}
|
||||
void SetDepthTestEnabled(bool enabled) override {}
|
||||
void SetDepthTestFunction(dp::TestFunction depthFunction) override {}
|
||||
void SetStencilTestEnabled(bool enabled) override {}
|
||||
void SetStencilFunction(dp::StencilFace face,
|
||||
dp::TestFunction stencilFunction) override {}
|
||||
void SetStencilActions(dp::StencilFace face,
|
||||
dp::StencilAction stencilFailAction,
|
||||
dp::StencilAction depthFailAction,
|
||||
dp::StencilAction passAction) override {}
|
||||
};
|
||||
} // namespace
|
||||
|
||||
AndroidVulkanContextFactory::AndroidVulkanContextFactory(uint32_t appVersionCode, int sdkVersion, bool isCustomROM)
|
||||
: dp::vulkan::VulkanContextFactory(appVersionCode, sdkVersion, isCustomROM)
|
||||
{}
|
||||
{
|
||||
if (InitVulkan() == 0)
|
||||
{
|
||||
LOG_ERROR_VK("Could not initialize Vulkan library.");
|
||||
return;
|
||||
}
|
||||
|
||||
VkApplicationInfo appInfo = {};
|
||||
appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
|
||||
appInfo.pNext = nullptr;
|
||||
appInfo.apiVersion = VK_MAKE_VERSION(1, 0, 0);
|
||||
appInfo.applicationVersion = appVersionCode;
|
||||
appInfo.engineVersion = appVersionCode;
|
||||
appInfo.pApplicationName = "OMaps";
|
||||
appInfo.pEngineName = "Drape Engine";
|
||||
|
||||
bool enableDiagnostics = false;
|
||||
#ifdef ENABLE_VULKAN_DIAGNOSTICS
|
||||
enableDiagnostics = true;
|
||||
#endif
|
||||
m_layers = make_unique_dp<dp::vulkan::Layers>(enableDiagnostics);
|
||||
|
||||
VkInstanceCreateInfo instanceCreateInfo = {};
|
||||
instanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
|
||||
instanceCreateInfo.pNext = nullptr;
|
||||
instanceCreateInfo.pApplicationInfo = &appInfo;
|
||||
instanceCreateInfo.enabledExtensionCount = m_layers->GetInstanceExtensionsCount();
|
||||
instanceCreateInfo.ppEnabledExtensionNames = m_layers->GetInstanceExtensions();
|
||||
instanceCreateInfo.enabledLayerCount = m_layers->GetInstanceLayersCount();
|
||||
instanceCreateInfo.ppEnabledLayerNames = m_layers->GetInstanceLayers();
|
||||
|
||||
// Enable extra validation features.
|
||||
VkValidationFeaturesEXT validationFeatures = {};
|
||||
const VkValidationFeatureEnableEXT validationFeaturesEnabled[] = {
|
||||
VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT};
|
||||
if (m_layers->IsValidationFeaturesEnabled())
|
||||
{
|
||||
validationFeatures.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
|
||||
validationFeatures.pNext = nullptr;
|
||||
validationFeatures.enabledValidationFeatureCount = ARRAY_SIZE(validationFeaturesEnabled),
|
||||
validationFeatures.pEnabledValidationFeatures = validationFeaturesEnabled;
|
||||
|
||||
instanceCreateInfo.pNext = &validationFeatures;
|
||||
}
|
||||
|
||||
VkResult statusCode;
|
||||
statusCode = vkCreateInstance(&instanceCreateInfo, nullptr, &m_vulkanInstance);
|
||||
if (statusCode != VK_SUCCESS)
|
||||
{
|
||||
LOG_ERROR_VK_CALL(vkCreateInstance, statusCode);
|
||||
return;
|
||||
}
|
||||
|
||||
uint32_t gpuCount = 0;
|
||||
statusCode = vkEnumeratePhysicalDevices(m_vulkanInstance, &gpuCount, nullptr);
|
||||
if (statusCode != VK_SUCCESS || gpuCount == 0)
|
||||
{
|
||||
LOG_ERROR_VK_CALL(vkEnumeratePhysicalDevices, statusCode);
|
||||
return;
|
||||
}
|
||||
|
||||
std::vector<VkPhysicalDevice> tmpGpus(gpuCount);
|
||||
statusCode = vkEnumeratePhysicalDevices(m_vulkanInstance, &gpuCount, tmpGpus.data());
|
||||
if (statusCode != VK_SUCCESS)
|
||||
{
|
||||
LOG_ERROR_VK_CALL(vkEnumeratePhysicalDevices, statusCode);
|
||||
return;
|
||||
}
|
||||
m_gpu = tmpGpus[0];
|
||||
|
||||
VkPhysicalDeviceProperties gpuProperties;
|
||||
vkGetPhysicalDeviceProperties(m_gpu, &gpuProperties);
|
||||
dp::SupportManager::Version apiVersion{VK_VERSION_MAJOR(gpuProperties.apiVersion),
|
||||
VK_VERSION_MINOR(gpuProperties.apiVersion),
|
||||
VK_VERSION_PATCH(gpuProperties.apiVersion)};
|
||||
dp::SupportManager::Version driverVersion{VK_VERSION_MAJOR(gpuProperties.driverVersion),
|
||||
VK_VERSION_MINOR(gpuProperties.driverVersion),
|
||||
VK_VERSION_PATCH(gpuProperties.driverVersion)};
|
||||
if (dp::SupportManager::Instance().IsVulkanForbidden(gpuProperties.deviceName, apiVersion, driverVersion, isCustomROM))
|
||||
{
|
||||
LOG_ERROR_VK("GPU/Driver configuration is not supported.");
|
||||
return;
|
||||
}
|
||||
|
||||
uint32_t queueFamilyCount;
|
||||
vkGetPhysicalDeviceQueueFamilyProperties(m_gpu, &queueFamilyCount, nullptr);
|
||||
if (queueFamilyCount == 0)
|
||||
{
|
||||
LOG_ERROR_VK("Any queue family wasn't found.");
|
||||
return;
|
||||
}
|
||||
|
||||
std::vector<VkQueueFamilyProperties> queueFamilyProperties(queueFamilyCount);
|
||||
vkGetPhysicalDeviceQueueFamilyProperties(m_gpu, &queueFamilyCount,
|
||||
queueFamilyProperties.data());
|
||||
|
||||
uint32_t renderingQueueFamilyIndex = 0;
|
||||
for (; renderingQueueFamilyIndex < queueFamilyCount; ++renderingQueueFamilyIndex)
|
||||
{
|
||||
if (queueFamilyProperties[renderingQueueFamilyIndex].queueFlags & VK_QUEUE_GRAPHICS_BIT)
|
||||
break;
|
||||
}
|
||||
if (renderingQueueFamilyIndex == queueFamilyCount)
|
||||
{
|
||||
LOG_ERROR_VK("Any queue family with VK_QUEUE_GRAPHICS_BIT wasn't found.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!dp::vulkan::VulkanFormatUnpacker::Init(m_gpu))
|
||||
return;
|
||||
|
||||
if (!m_layers->Initialize(m_vulkanInstance, m_gpu))
|
||||
return;
|
||||
|
||||
float priorities[] = {1.0f};
|
||||
VkDeviceQueueCreateInfo queueCreateInfo = {};
|
||||
queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
|
||||
queueCreateInfo.pNext = nullptr;
|
||||
queueCreateInfo.flags = 0;
|
||||
queueCreateInfo.queueCount = 1;
|
||||
queueCreateInfo.queueFamilyIndex = renderingQueueFamilyIndex;
|
||||
queueCreateInfo.pQueuePriorities = priorities;
|
||||
|
||||
VkDeviceCreateInfo deviceCreateInfo = {};
|
||||
VkPhysicalDeviceFeatures enabledFeatures = {};
|
||||
deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
|
||||
deviceCreateInfo.pNext = nullptr;
|
||||
deviceCreateInfo.queueCreateInfoCount = 1;
|
||||
deviceCreateInfo.pQueueCreateInfos = &queueCreateInfo;
|
||||
deviceCreateInfo.enabledLayerCount = m_layers->GetDeviceLayersCount();
|
||||
deviceCreateInfo.ppEnabledLayerNames = m_layers->GetDeviceLayers();
|
||||
deviceCreateInfo.enabledExtensionCount = m_layers->GetDeviceExtensionsCount();
|
||||
deviceCreateInfo.ppEnabledExtensionNames = m_layers->GetDeviceExtensions();
|
||||
deviceCreateInfo.pEnabledFeatures = nullptr;
|
||||
if (enableDiagnostics)
|
||||
{
|
||||
enabledFeatures.robustBufferAccess = VK_TRUE;
|
||||
deviceCreateInfo.pEnabledFeatures = &enabledFeatures;
|
||||
}
|
||||
|
||||
statusCode = vkCreateDevice(m_gpu, &deviceCreateInfo, nullptr, &m_device);
|
||||
if (statusCode != VK_SUCCESS)
|
||||
{
|
||||
LOG_ERROR_VK_CALL(vkCreateDevice, statusCode);
|
||||
return;
|
||||
}
|
||||
|
||||
VkPhysicalDeviceMemoryProperties memoryProperties;
|
||||
vkGetPhysicalDeviceMemoryProperties(m_gpu, &memoryProperties);
|
||||
m_objectManager = make_unique_dp<dp::vulkan::VulkanObjectManager>(m_device, gpuProperties.limits,
|
||||
memoryProperties,
|
||||
renderingQueueFamilyIndex);
|
||||
|
||||
bool const hasPartialTextureUpdates =
|
||||
!dp::SupportManager::Instance().IsVulkanTexturePartialUpdateBuggy(
|
||||
sdkVersion, gpuProperties.deviceName, apiVersion, driverVersion);
|
||||
|
||||
m_drawContext = make_unique_dp<DrawVulkanContext>(
|
||||
m_vulkanInstance, m_gpu, gpuProperties, m_device, renderingQueueFamilyIndex,
|
||||
make_ref(m_objectManager), appVersionCode, hasPartialTextureUpdates);
|
||||
m_uploadContext = make_unique_dp<UploadVulkanContext>(
|
||||
m_vulkanInstance, m_gpu, gpuProperties, m_device, renderingQueueFamilyIndex,
|
||||
make_ref(m_objectManager), hasPartialTextureUpdates);
|
||||
}
|
||||
|
||||
AndroidVulkanContextFactory::~AndroidVulkanContextFactory()
|
||||
{
|
||||
m_drawContext.reset();
|
||||
m_uploadContext.reset();
|
||||
m_objectManager.reset();
|
||||
|
||||
if (m_device != nullptr)
|
||||
{
|
||||
vkDeviceWaitIdle(m_device);
|
||||
vkDestroyDevice(m_device, nullptr);
|
||||
}
|
||||
|
||||
if (m_vulkanInstance != nullptr)
|
||||
{
|
||||
m_layers->Uninitialize(m_vulkanInstance);
|
||||
vkDestroyInstance(m_vulkanInstance, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
void AndroidVulkanContextFactory::SetSurface(JNIEnv * env, jobject jsurface)
|
||||
{
|
||||
|
@ -69,6 +327,56 @@ void AndroidVulkanContextFactory::SetVulkanSurface()
|
|||
m_windowSurfaceValid = true;
|
||||
}
|
||||
|
||||
bool AndroidVulkanContextFactory::QuerySurfaceSize()
|
||||
{
|
||||
auto statusCode = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(m_gpu, m_surface,
|
||||
&m_surfaceCapabilities);
|
||||
if (statusCode != VK_SUCCESS)
|
||||
{
|
||||
LOG_ERROR_VK_CALL(vkGetPhysicalDeviceSurfaceCapabilitiesKHR, statusCode);
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32_t formatCount = 0;
|
||||
statusCode = vkGetPhysicalDeviceSurfaceFormatsKHR(m_gpu, m_surface, &formatCount, nullptr);
|
||||
if (statusCode != VK_SUCCESS)
|
||||
{
|
||||
LOG_ERROR_VK_CALL(vkGetPhysicalDeviceSurfaceFormatsKHR, statusCode);
|
||||
return false;
|
||||
}
|
||||
|
||||
std::vector<VkSurfaceFormatKHR> formats(formatCount);
|
||||
statusCode = vkGetPhysicalDeviceSurfaceFormatsKHR(m_gpu, m_surface, &formatCount, formats.data());
|
||||
if (statusCode != VK_SUCCESS)
|
||||
{
|
||||
LOG_ERROR_VK_CALL(vkGetPhysicalDeviceSurfaceFormatsKHR, statusCode);
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32_t chosenFormat;
|
||||
for (chosenFormat = 0; chosenFormat < formatCount; chosenFormat++)
|
||||
{
|
||||
if (formats[chosenFormat].format == VK_FORMAT_R8G8B8A8_UNORM)
|
||||
break;
|
||||
}
|
||||
if (chosenFormat == formatCount)
|
||||
{
|
||||
LOG_ERROR_VK("Any supported surface format wasn't found.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!(m_surfaceCapabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR))
|
||||
{
|
||||
LOG_ERROR_VK("Alpha channel is not supported.");
|
||||
return false;
|
||||
}
|
||||
|
||||
m_surfaceFormat = formats[chosenFormat];
|
||||
m_surfaceWidth = static_cast<int>(m_surfaceCapabilities.currentExtent.width);
|
||||
m_surfaceHeight = static_cast<int>(m_surfaceCapabilities.currentExtent.height);
|
||||
return true;
|
||||
}
|
||||
|
||||
void AndroidVulkanContextFactory::ResetSurface(bool allowPipelineDump)
|
||||
{
|
||||
ResetVulkanSurface(allowPipelineDump);
|
||||
|
@ -118,8 +426,51 @@ void AndroidVulkanContextFactory::ChangeSurface(JNIEnv * env, jobject jsurface,
|
|||
LOG(LINFO, ("Surface changed", m_surfaceWidth, m_surfaceHeight));
|
||||
}
|
||||
|
||||
bool AndroidVulkanContextFactory::IsVulkanSupported() const
|
||||
{
|
||||
return m_vulkanInstance != nullptr && m_gpu != nullptr && m_device != nullptr;
|
||||
}
|
||||
|
||||
bool AndroidVulkanContextFactory::IsValid() const
|
||||
{
|
||||
return IsVulkanSupported() && m_windowSurfaceValid;
|
||||
}
|
||||
|
||||
int AndroidVulkanContextFactory::GetWidth() const
|
||||
{
|
||||
ASSERT(IsValid(), ());
|
||||
return m_surfaceWidth;
|
||||
}
|
||||
|
||||
int AndroidVulkanContextFactory::GetHeight() const
|
||||
{
|
||||
ASSERT(IsValid(), ());
|
||||
return m_surfaceHeight;
|
||||
}
|
||||
|
||||
dp::GraphicsContext * AndroidVulkanContextFactory::GetDrawContext()
|
||||
{
|
||||
return m_drawContext.get();
|
||||
}
|
||||
|
||||
dp::GraphicsContext * AndroidVulkanContextFactory::GetResourcesUploadContext()
|
||||
{
|
||||
return m_uploadContext.get();
|
||||
}
|
||||
|
||||
bool AndroidVulkanContextFactory::IsDrawContextCreated() const
|
||||
{
|
||||
return m_drawContext != nullptr;
|
||||
}
|
||||
|
||||
bool AndroidVulkanContextFactory::IsUploadContextCreated() const
|
||||
{
|
||||
return m_uploadContext != nullptr;
|
||||
}
|
||||
|
||||
void AndroidVulkanContextFactory::SetPresentAvailable(bool available)
|
||||
{
|
||||
if (m_drawContext)
|
||||
m_drawContext->SetPresentAvailable(available);
|
||||
}
|
||||
} // namespace android
|
||||
|
|
|
@ -2,7 +2,11 @@
|
|||
|
||||
#include "app/organicmaps/core/jni_helper.hpp"
|
||||
|
||||
#include "drape/vulkan/vulkan_context_factory.hpp"
|
||||
#include "drape/graphics_context_factory.hpp"
|
||||
#include "drape/vulkan/vulkan_base_context.hpp"
|
||||
#include "drape/vulkan/vulkan_object_manager.hpp"
|
||||
#include "drape/vulkan/vulkan_layers.hpp"
|
||||
#include "drape/pointers.hpp"
|
||||
|
||||
#include <vulkan/vulkan_android.h>
|
||||
|
||||
|
@ -11,22 +15,48 @@
|
|||
|
||||
namespace android
|
||||
{
|
||||
class AndroidVulkanContextFactory : public dp::vulkan::VulkanContextFactory
|
||||
class AndroidVulkanContextFactory : public dp::GraphicsContextFactory
|
||||
{
|
||||
public:
|
||||
AndroidVulkanContextFactory(uint32_t appVersionCode, int sdkVersion, bool isCustomROM);
|
||||
~AndroidVulkanContextFactory();
|
||||
|
||||
bool IsVulkanSupported() const;
|
||||
bool IsValid() const;
|
||||
|
||||
dp::GraphicsContext * GetDrawContext() override;
|
||||
dp::GraphicsContext * GetResourcesUploadContext() override;
|
||||
bool IsDrawContextCreated() const override;
|
||||
bool IsUploadContextCreated() const override;
|
||||
void SetPresentAvailable(bool available) override;
|
||||
|
||||
void SetSurface(JNIEnv * env, jobject jsurface);
|
||||
void ResetSurface(bool allowPipelineDump);
|
||||
void ChangeSurface(JNIEnv * env, jobject jsurface, int w, int h);
|
||||
|
||||
int GetWidth() const;
|
||||
int GetHeight() const;
|
||||
|
||||
private:
|
||||
void SetVulkanSurface();
|
||||
void ResetVulkanSurface(bool allowPipelineDump);
|
||||
bool QuerySurfaceSize();
|
||||
|
||||
VkInstance m_vulkanInstance = nullptr;
|
||||
drape_ptr<dp::vulkan::Layers> m_layers;
|
||||
VkPhysicalDevice m_gpu = nullptr;
|
||||
VkDevice m_device = nullptr;
|
||||
drape_ptr<dp::vulkan::VulkanObjectManager> m_objectManager;
|
||||
drape_ptr<dp::vulkan::VulkanBaseContext> m_drawContext;
|
||||
drape_ptr<dp::vulkan::VulkanBaseContext> m_uploadContext;
|
||||
|
||||
ANativeWindow * m_nativeWindow = nullptr;
|
||||
bool m_windowSurfaceValid = false;
|
||||
VkSurfaceKHR m_surface = 0;
|
||||
VkSurfaceFormatKHR m_surfaceFormat;
|
||||
VkSurfaceCapabilitiesKHR m_surfaceCapabilities;
|
||||
|
||||
int m_surfaceWidth = 0;
|
||||
int m_surfaceHeight = 0;
|
||||
};
|
||||
} // namespace android
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -15,8 +15,6 @@ import app.organicmaps.api.RequestType;
|
|||
import app.organicmaps.bookmarks.data.DistanceAndAzimut;
|
||||
import app.organicmaps.bookmarks.data.FeatureId;
|
||||
import app.organicmaps.bookmarks.data.MapObject;
|
||||
import app.organicmaps.products.Product;
|
||||
import app.organicmaps.products.ProductsConfig;
|
||||
import app.organicmaps.routing.JunctionInfo;
|
||||
import app.organicmaps.routing.RouteMarkData;
|
||||
import app.organicmaps.routing.RoutePointInfo;
|
||||
|
@ -333,20 +331,11 @@ public class Framework
|
|||
public static native int nativeGetBestRouter(double srcLat, double srcLon,
|
||||
double dstLat, double dstLon);
|
||||
|
||||
public static void addRoutePoint(RouteMarkData point)
|
||||
{
|
||||
Framework.nativeAddRoutePoint(point.mTitle, point.mSubtitle, point.mPointType,
|
||||
point.mIntermediateIndex, point.mIsMyPosition,
|
||||
point.mLat, point.mLon);
|
||||
}
|
||||
|
||||
public static native void nativeAddRoutePoint(String title, String subtitle,
|
||||
@RoutePointInfo.RouteMarkType int markType,
|
||||
int intermediateIndex, boolean isMyPosition,
|
||||
double lat, double lon);
|
||||
|
||||
public static native void nativeRemoveRoutePoints();
|
||||
|
||||
public static native void nativeRemoveRoutePoint(@RoutePointInfo.RouteMarkType int markType,
|
||||
int intermediateIndex);
|
||||
|
||||
|
@ -355,9 +344,6 @@ public class Framework
|
|||
public static native boolean nativeCouldAddIntermediatePoint();
|
||||
@NonNull
|
||||
public static native RouteMarkData[] nativeGetRoutePoints();
|
||||
|
||||
public static native void nativeMoveRoutePoint(int currentIndex, int targetIndex);
|
||||
|
||||
@NonNull
|
||||
public static native TransitRouteInfo nativeGetTransitRouteInfo();
|
||||
/**
|
||||
|
@ -475,13 +461,4 @@ public class Framework
|
|||
@Nullable
|
||||
public static native String nativeGetKayakHotelLink(@NonNull String countryIsoCode, @NonNull String uri,
|
||||
long firstDaySec, long lastDaySec);
|
||||
|
||||
public static native boolean nativeShouldShowProducts();
|
||||
|
||||
@Nullable
|
||||
public static native ProductsConfig nativeGetProductsConfiguration();
|
||||
|
||||
public static native void nativeDidCloseProductsPopup(String reason);
|
||||
|
||||
public static native void nativeDidSelectProduct(String title, String link);
|
||||
}
|
||||
|
|
|
@ -77,7 +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.routing.ManageRouteBottomSheet;
|
||||
import app.organicmaps.maplayer.subway.SubwayManager;
|
||||
import app.organicmaps.routing.NavigationController;
|
||||
import app.organicmaps.routing.NavigationService;
|
||||
import app.organicmaps.routing.RoutePointInfo;
|
||||
|
@ -89,7 +89,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;
|
||||
|
@ -150,7 +150,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
public static final String EXTRA_TRACK_ID = "track_id";
|
||||
public static final String EXTRA_UPDATE_THEME = "update_theme";
|
||||
private static final String EXTRA_CONSUMED = "mwm.extra.intent.processed";
|
||||
private boolean mPreciseLocationDialogShown = false;
|
||||
|
||||
private static final String[] DOCKED_FRAGMENTS = { SearchFragment.class.getName(),
|
||||
DownloaderFragment.class.getName(),
|
||||
|
@ -158,11 +157,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
EditorHostFragment.class.getName(),
|
||||
ReportFragment.class.getName() };
|
||||
|
||||
public final ActivityResultLauncher<Intent> startDrivingOptionsForResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), activityResult ->
|
||||
{
|
||||
if( activityResult.getResultCode() == Activity.RESULT_OK)
|
||||
rebuildLastRoute();
|
||||
});
|
||||
public static final int REQ_CODE_DRIVING_OPTIONS = 6;
|
||||
|
||||
private static final String MAIN_MENU_ID = "MAIN_MENU_BOTTOM_SHEET";
|
||||
private static final String LAYERS_MENU_ID = "LAYERS_MENU_BOTTOM_SHEET";
|
||||
|
@ -234,8 +229,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
@NonNull
|
||||
private DisplayManager mDisplayManager;
|
||||
|
||||
ManageRouteBottomSheet mManageRouteBottomSheet;
|
||||
|
||||
private boolean mRemoveDisplayListener = true;
|
||||
private int mLastUiMode = Configuration.UI_MODE_TYPE_UNDEFINED;
|
||||
|
||||
|
@ -593,14 +586,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;
|
||||
|
||||
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)
|
||||
{
|
||||
updateCompassOffset(trackRecorderOffset + windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top, windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).right);
|
||||
}
|
||||
updateCompassOffset(windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top, windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).right);
|
||||
else
|
||||
updateCompassOffset(-1, windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).right);
|
||||
refreshLightStatusBar();
|
||||
updateBottomWidgetsOffset(windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).left);
|
||||
mCurrentWindowInsets = windowInsets;
|
||||
|
@ -621,7 +614,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
|
||||
if (!mIsTabletLayout)
|
||||
{
|
||||
mRoutingPlanInplaceController = new RoutingPlanInplaceController(this, startDrivingOptionsForResult, this, this);
|
||||
mRoutingPlanInplaceController = new RoutingPlanInplaceController(this, this, this);
|
||||
removeCurrentFragment(false);
|
||||
}
|
||||
|
||||
|
@ -698,16 +691,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
}
|
||||
}
|
||||
|
||||
/** Hides/shows UI while keeping state
|
||||
* @param isUiHidden True to hide the UI
|
||||
**/
|
||||
public void hideOrShowUIWithoutClosingPlacePage(boolean isUiHidden)
|
||||
{
|
||||
// Used instead of closeBottomSheet to preserve state and hide instantly
|
||||
UiUtils.showIf(!isUiHidden, findViewById(R.id.place_page_container_fragment));
|
||||
mMapButtonsViewModel.setButtonsHidden(isUiHidden);
|
||||
}
|
||||
|
||||
private void showSearchToolbar()
|
||||
{
|
||||
mSearchController.show();
|
||||
|
@ -817,7 +800,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
showBottomSheet(MAIN_MENU_ID);
|
||||
}
|
||||
case help -> showHelp();
|
||||
case trackRecordingStatus -> showTrackSaveDialog();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1036,6 +1018,18 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
mPowerSaveDisclaimerShown = savedInstanceState.getBoolean(POWER_SAVE_DISCLAIMER_SHOWN, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data)
|
||||
{
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
|
||||
if (resultCode != Activity.RESULT_OK)
|
||||
return;
|
||||
|
||||
if (requestCode == REQ_CODE_DRIVING_OPTIONS)
|
||||
rebuildLastRoute();
|
||||
}
|
||||
|
||||
private void rebuildLastRoute()
|
||||
{
|
||||
RoutingController.get().attach(this);
|
||||
|
@ -1317,16 +1311,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
Framework.nativeGetChoosePositionMode() == Framework.ChoosePositionMode.NONE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean dispatchGenericMotionEvent(MotionEvent event) {
|
||||
if (event.getActionMasked() == MotionEvent.ACTION_SCROLL) {
|
||||
int exponent = event.getAxisValue(MotionEvent.AXIS_VSCROLL) < 0 ? -1 : 1;
|
||||
Map.onScale(Math.pow(1.7f, exponent), event.getX(), event.getY(), true);
|
||||
return true;
|
||||
}
|
||||
return super.onGenericMotionEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouch(View view, MotionEvent event)
|
||||
{
|
||||
|
@ -1504,30 +1488,14 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
if (mCurrentWindowInsets == null) {
|
||||
return;
|
||||
}
|
||||
int offsetY = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top;
|
||||
int offsetX = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).right;
|
||||
int offset = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top;
|
||||
if (show && mRoutingPlanInplaceController != null)
|
||||
{
|
||||
final int height = mRoutingPlanInplaceController.calcHeight();
|
||||
if (height != 0)
|
||||
offsetY = height;
|
||||
offset = height;
|
||||
}
|
||||
final int orientation = getResources().getConfiguration().orientation;
|
||||
final boolean isTrackRecordingEnabled = TrackRecorder.nativeIsTrackRecordingEnabled();
|
||||
if (isTrackRecordingEnabled && (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);
|
||||
}
|
||||
else if (isTrackRecordingEnabled)
|
||||
offsetY += UiUtils.dimen(this, R.dimen.map_button_size);
|
||||
}
|
||||
updateCompassOffset(offsetY, offsetX);
|
||||
updateCompassOffset(offset);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1694,6 +1662,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)
|
||||
{
|
||||
|
@ -1709,7 +1683,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
||||
.setTitle(R.string.unable_to_calc_alert_title)
|
||||
.setMessage(R.string.unable_to_calc_alert_subtitle)
|
||||
.setPositiveButton(R.string.settings, (dialog, which) -> DrivingOptionsActivity.start(this, startDrivingOptionsForResult))
|
||||
.setPositiveButton(R.string.settings, (dialog, which) -> DrivingOptionsActivity.start(this))
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.setOnDismissListener(dialog -> mAlertDialog = null)
|
||||
.show();
|
||||
|
@ -1822,7 +1796,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
}
|
||||
|
||||
// Check for any location permissions.
|
||||
if (!LocationUtils.checkLocationPermission(this))
|
||||
if (!LocationUtils.checkCoarseLocationPermission(this))
|
||||
{
|
||||
Logger.w(LOCATION_TAG, "Permissions ACCESS_COARSE_LOCATION and ACCESS_FINE_LOCATION are not granted");
|
||||
// Calls onMyPositionModeChanged(NOT_FOLLOW_NO_POSITION).
|
||||
|
@ -1960,50 +1934,12 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
mLocationPermissionRequestedForRecording = false;
|
||||
if (LocationUtils.checkLocationPermission(this))
|
||||
{
|
||||
final boolean hasFineLocationPermission = LocationUtils.checkFineLocationPermission(this);
|
||||
|
||||
if (LocationState.getMode() == LocationState.NOT_FOLLOW_NO_POSITION)
|
||||
LocationState.nativeSwitchToNextMode();
|
||||
|
||||
if (requestedForRecording && hasFineLocationPermission)
|
||||
if (requestedForRecording && LocationUtils.checkFineLocationPermission(this))
|
||||
startTrackRecording();
|
||||
|
||||
if (hasFineLocationPermission)
|
||||
{
|
||||
Logger.i(LOCATION_TAG, "ACCESS_FINE_LOCATION permission granted");
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.w(LOCATION_TAG, "Only ACCESS_COARSE_LOCATION permission granted");
|
||||
if (mLocationErrorDialog != null && mLocationErrorDialog.isShowing())
|
||||
{
|
||||
Logger.w(LOCATION_TAG, "Don't show 'Precise Location denied' dialog because another dialog is in progress");
|
||||
return;
|
||||
}
|
||||
if (!mPreciseLocationDialogShown)
|
||||
{
|
||||
mPreciseLocationDialogShown = true;
|
||||
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
||||
.setTitle("⚠ " + getString(R.string.limited_accuracy))
|
||||
.setMessage(R.string.precise_location_is_disabled_long_text)
|
||||
.setNegativeButton(R.string.close, (dialog, which) -> dialog.dismiss())
|
||||
.setCancelable(true)
|
||||
.setOnDismissListener(dialog -> mLocationErrorDialog = null);
|
||||
final Intent intent = Utils.makeSystemLocationSettingIntent(this);
|
||||
if (intent != null)
|
||||
{
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
|
||||
builder.setPositiveButton(R.string.location_settings, (dialog, which) -> startActivity(intent));
|
||||
}
|
||||
mLocationErrorDialog = builder.show();
|
||||
}
|
||||
else
|
||||
{
|
||||
Toast.makeText(this, R.string.precise_location_is_disabled_long_text, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -2154,15 +2090,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
RoutingController.get().start();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onManageRouteOpen()
|
||||
{
|
||||
// Create and show 'Manage Route' Bottom Sheet panel.
|
||||
mManageRouteBottomSheet = new ManageRouteBottomSheet();
|
||||
mManageRouteBottomSheet.setCancelable(false);
|
||||
mManageRouteBottomSheet.show(getSupportFragmentManager(), "ManageRouteBottomSheet");
|
||||
}
|
||||
|
||||
private boolean requestBatterySaverPermission()
|
||||
{
|
||||
if (!PowerManagment.isSystemPowerSaveMode(this))
|
||||
|
@ -2340,11 +2267,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
|
||||
requestPostNotificationsPermission();
|
||||
|
||||
if (mCurrentWindowInsets != null)
|
||||
{
|
||||
final 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();
|
||||
TrackRecordingService.startForegroundService(getApplicationContext());
|
||||
mMapButtonsViewModel.setTrackRecorderState(true);
|
||||
|
@ -2353,18 +2275,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
|
||||
private void stopTrackRecording()
|
||||
{
|
||||
if (mCurrentWindowInsets != null)
|
||||
{
|
||||
int offsetY = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top;
|
||||
final int offsetX = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).right;
|
||||
if (RoutingController.get().isPlanning() && mRoutingPlanInplaceController != null)
|
||||
{
|
||||
final int height = mRoutingPlanInplaceController.calcHeight();
|
||||
if (height != 0)
|
||||
offsetY = height;
|
||||
}
|
||||
updateCompassOffset(offsetY, offsetX);
|
||||
}
|
||||
TrackRecordingService.stopService(getApplicationContext());
|
||||
mMapButtonsViewModel.setTrackRecorderState(false);
|
||||
}
|
||||
|
@ -2399,15 +2309,15 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
mAlertDialog = new StackedButtonsDialog.Builder(this)
|
||||
.setTitle(R.string.track_recording_alert_title)
|
||||
.setCancelable(false)
|
||||
// Negative/Positive/Neutral do not have their usual meaning here.
|
||||
.setNegativeButton(R.string.continue_recording, (dialog, which) -> {
|
||||
// Negative/Positive/Neutral doesn't do not have the usual meaning here.
|
||||
.setPositiveButton(R.string.continue_recording, (dialog, which) -> {
|
||||
mAlertDialog = null;
|
||||
})
|
||||
.setNeutralButton(R.string.stop_without_saving, (dialog, which) -> {
|
||||
stopTrackRecording();
|
||||
mAlertDialog = null;
|
||||
})
|
||||
.setPositiveButton(R.string.save, (dialog, which) -> {
|
||||
.setNegativeButton(R.string.save, (dialog, which) -> {
|
||||
saveAndStopTrackRecording();
|
||||
mAlertDialog = null;
|
||||
})
|
||||
|
|
|
@ -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) {}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,15 +11,13 @@ import androidx.annotation.NonNull;
|
|||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import org.chromium.base.ObserverList;
|
||||
|
||||
import app.organicmaps.util.Listeners;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
|
||||
class PanelAnimator
|
||||
{
|
||||
private final MwmActivity mActivity;
|
||||
private final ObserverList<MwmActivity.LeftAnimationTrackListener> mAnimationTrackListeners = new ObserverList<>();
|
||||
private final ObserverList.RewindableIterator<MwmActivity.LeftAnimationTrackListener> mAnimationTrackIterator = mAnimationTrackListeners.rewindableIterator();
|
||||
private final Listeners<MwmActivity.LeftAnimationTrackListener> mAnimationTrackListeners = new Listeners<>();
|
||||
private final View mPanel;
|
||||
private final int mWidth;
|
||||
@IntegerRes
|
||||
|
@ -35,7 +33,7 @@ class PanelAnimator
|
|||
|
||||
void registerListener(@NonNull MwmActivity.LeftAnimationTrackListener animationTrackListener)
|
||||
{
|
||||
mAnimationTrackListeners.addObserver(animationTrackListener);
|
||||
mAnimationTrackListeners.register(animationTrackListener);
|
||||
}
|
||||
|
||||
private void track(ValueAnimator animation)
|
||||
|
@ -44,9 +42,9 @@ class PanelAnimator
|
|||
mPanel.setTranslationX(offset);
|
||||
mPanel.setAlpha(offset / mWidth + 1.0f);
|
||||
|
||||
mAnimationTrackIterator.rewind();
|
||||
while (mAnimationTrackIterator.hasNext())
|
||||
mAnimationTrackIterator.next().onTrackLeftAnimation(offset + mWidth);
|
||||
for (MwmActivity.LeftAnimationTrackListener listener: mAnimationTrackListeners)
|
||||
listener.onTrackLeftAnimation(offset + mWidth);
|
||||
mAnimationTrackListeners.finishIterate();
|
||||
}
|
||||
|
||||
/** @param completionListener will be called before the fragment becomes actually visible */
|
||||
|
@ -72,9 +70,9 @@ class PanelAnimator
|
|||
|
||||
UiUtils.show(mPanel);
|
||||
|
||||
mAnimationTrackIterator.rewind();
|
||||
while (mAnimationTrackIterator.hasNext())
|
||||
mAnimationTrackIterator.next().onTrackStarted(false);
|
||||
for (MwmActivity.LeftAnimationTrackListener listener: mAnimationTrackListeners)
|
||||
listener.onTrackStarted(false);
|
||||
mAnimationTrackListeners.finishIterate();
|
||||
|
||||
ValueAnimator animator = ValueAnimator.ofFloat(-mWidth, 0.0f);
|
||||
animator.addUpdateListener(this::track);
|
||||
|
@ -83,9 +81,9 @@ class PanelAnimator
|
|||
@Override
|
||||
public void onAnimationEnd(Animator animation)
|
||||
{
|
||||
mAnimationTrackIterator.rewind();
|
||||
while (mAnimationTrackIterator.hasNext())
|
||||
mAnimationTrackIterator.next().onTrackStarted(true);
|
||||
for (MwmActivity.LeftAnimationTrackListener listener: mAnimationTrackListeners)
|
||||
listener.onTrackStarted(true);
|
||||
mAnimationTrackListeners.finishIterate();
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -103,9 +101,9 @@ class PanelAnimator
|
|||
return;
|
||||
}
|
||||
|
||||
mAnimationTrackIterator.rewind();
|
||||
while (mAnimationTrackIterator.hasNext())
|
||||
mAnimationTrackIterator.next().onTrackStarted(true);
|
||||
for (MwmActivity.LeftAnimationTrackListener listener: mAnimationTrackListeners)
|
||||
listener.onTrackStarted(true);
|
||||
mAnimationTrackListeners.finishIterate();
|
||||
|
||||
ValueAnimator animator = ValueAnimator.ofFloat(0.0f, -mWidth);
|
||||
animator.addUpdateListener(this::track);
|
||||
|
@ -116,9 +114,9 @@ class PanelAnimator
|
|||
{
|
||||
UiUtils.hide(mPanel);
|
||||
|
||||
mAnimationTrackIterator.rewind();
|
||||
while (mAnimationTrackIterator.hasNext())
|
||||
mAnimationTrackIterator.next().onTrackStarted(false);
|
||||
for (MwmActivity.LeftAnimationTrackListener listener: mAnimationTrackListeners)
|
||||
listener.onTrackStarted(false);
|
||||
mAnimationTrackListeners.finishIterate();
|
||||
|
||||
if (completionListener != null)
|
||||
completionListener.run();
|
||||
|
|
|
@ -19,7 +19,6 @@ import androidx.annotation.StringRes;
|
|||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import app.organicmaps.display.DisplayManager;
|
||||
import app.organicmaps.downloader.DownloaderActivity;
|
||||
import app.organicmaps.intent.Factory;
|
||||
import app.organicmaps.location.LocationHelper;
|
||||
import app.organicmaps.util.Config;
|
||||
|
@ -91,7 +90,7 @@ public class SplashActivity extends AppCompatActivity
|
|||
super.onResume();
|
||||
if (mCanceled)
|
||||
return;
|
||||
if (!Config.isLocationRequested() && !LocationUtils.checkLocationPermission(this))
|
||||
if (!Config.isLocationRequested() && !LocationUtils.checkCoarseLocationPermission(this))
|
||||
{
|
||||
Logger.d(TAG, "Requesting location permissions");
|
||||
mPermissionRequest.launch(new String[]{
|
||||
|
@ -179,13 +178,7 @@ public class SplashActivity extends AppCompatActivity
|
|||
// Re-use original intent with the known safe subset of flags to retain security permissions.
|
||||
// https://github.com/organicmaps/organicmaps/issues/6944
|
||||
final Intent intent = Objects.requireNonNull(getIntent());
|
||||
|
||||
if (isManageSpaceActivity(intent)) {
|
||||
intent.setComponent(new ComponentName(this, DownloaderActivity.class));
|
||||
} else {
|
||||
intent.setComponent(new ComponentName(this, DownloadResourcesLegacyActivity.class));
|
||||
}
|
||||
|
||||
intent.setComponent(new ComponentName(this, DownloadResourcesLegacyActivity.class));
|
||||
// FLAG_ACTIVITY_NEW_TASK and FLAG_ACTIVITY_RESET_TASK_IF_NEEDED break the cold start.
|
||||
// https://github.com/organicmaps/organicmaps/pull/7287
|
||||
// FORWARD_RESULT_FLAG conflicts with the ActivityResultLauncher.
|
||||
|
@ -203,15 +196,4 @@ public class SplashActivity extends AppCompatActivity
|
|||
startActivity(intent);
|
||||
finish();
|
||||
}
|
||||
|
||||
private boolean isManageSpaceActivity(Intent intent) {
|
||||
var component = intent.getComponent();
|
||||
|
||||
if (!Intent.ACTION_VIEW.equals(intent.getAction())) return false;
|
||||
if (component == null) return false;
|
||||
|
||||
var manageSpaceActivityName = BuildConfig.APPLICATION_ID + ".ManageSpaceActivity";
|
||||
|
||||
return manageSpaceActivityName.equals(component.getClassName());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -142,7 +142,7 @@ public class BookmarkCategoriesAdapter extends BaseBookmarkCategoryAdapter<Recyc
|
|||
case TYPE_ACTION_ADD ->
|
||||
{
|
||||
Holders.GeneralViewHolder generalViewHolder = (Holders.GeneralViewHolder) holder;
|
||||
generalViewHolder.getImage().setImageResource(R.drawable.ic_add_list);
|
||||
generalViewHolder.getImage().setImageResource(R.drawable.ic_import);
|
||||
generalViewHolder.getText().setText(R.string.bookmarks_create_new_group);
|
||||
}
|
||||
case TYPE_ACTION_IMPORT ->
|
||||
|
|
|
@ -15,7 +15,6 @@ import android.view.View;
|
|||
import android.widget.Toast;
|
||||
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.activity.result.contract.ActivityResultContracts;
|
||||
import androidx.annotation.CallSuper;
|
||||
import androidx.annotation.LayoutRes;
|
||||
import androidx.annotation.NonNull;
|
||||
|
@ -58,6 +57,9 @@ public class BookmarkCategoriesFragment extends BaseMwmRecyclerFragment<Bookmark
|
|||
{
|
||||
private static final String TAG = BookmarkCategoriesFragment.class.getSimpleName();
|
||||
|
||||
static final int REQ_CODE_DELETE_CATEGORY = 102;
|
||||
static final int REQ_CODE_IMPORT_DIRECTORY = 103;
|
||||
|
||||
private static final int MAX_CATEGORY_NAME_LENGTH = 60;
|
||||
|
||||
public static final String BOOKMARKS_CATEGORIES_MENU_ID = "BOOKMARKS_CATEGORIES_BOTTOM_SHEET";
|
||||
|
@ -73,22 +75,6 @@ public class BookmarkCategoriesFragment extends BaseMwmRecyclerFragment<Bookmark
|
|||
@NonNull
|
||||
private DataChangedListener mCategoriesAdapterObserver;
|
||||
|
||||
private final ActivityResultLauncher<Intent> startBookmarkListForResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), activityResult -> {
|
||||
if( activityResult.getResultCode() == Activity.RESULT_OK)
|
||||
onDeleteActionSelected(getSelectedCategory());
|
||||
});
|
||||
|
||||
private final ActivityResultLauncher<Intent> startImportDirectoryForResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), activityResult ->
|
||||
{
|
||||
if( activityResult.getResultCode() == Activity.RESULT_OK)
|
||||
onImportDirectoryResult(activityResult.getData());
|
||||
});
|
||||
|
||||
private final ActivityResultLauncher<Intent> startBookmarkSettingsForResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), activityResult -> {
|
||||
// not handled at the moment
|
||||
});
|
||||
|
||||
|
||||
@Override
|
||||
@LayoutRes
|
||||
protected int getLayoutRes()
|
||||
|
@ -273,7 +259,7 @@ public class BookmarkCategoriesFragment extends BaseMwmRecyclerFragment<Bookmark
|
|||
|
||||
PackageManager packageManager = requireActivity().getPackageManager();
|
||||
if (intent.resolveActivity(packageManager) != null)
|
||||
startImportDirectoryForResult.launch(intent);
|
||||
startActivityForResult(intent, REQ_CODE_IMPORT_DIRECTORY);
|
||||
else
|
||||
showNoFileManagerError();
|
||||
}
|
||||
|
@ -289,7 +275,7 @@ public class BookmarkCategoriesFragment extends BaseMwmRecyclerFragment<Bookmark
|
|||
public void onItemClick(@NonNull View v, @NonNull BookmarkCategory category)
|
||||
{
|
||||
mSelectedCategory = category;
|
||||
BookmarkListActivity.startForResult(this, startBookmarkListForResult, category);
|
||||
BookmarkListActivity.startForResult(this, category);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -317,42 +303,54 @@ public class BookmarkCategoriesFragment extends BaseMwmRecyclerFragment<Bookmark
|
|||
|
||||
private void onSettingsActionSelected(@NonNull BookmarkCategory category)
|
||||
{
|
||||
BookmarkCategorySettingsActivity.startForResult(this, startBookmarkSettingsForResult, category);
|
||||
BookmarkCategorySettingsActivity.startForResult(this, category);
|
||||
}
|
||||
|
||||
private void onImportDirectoryResult(Intent data)
|
||||
@Override
|
||||
public final void onActivityResult(int requestCode, int resultCode, Intent data)
|
||||
{
|
||||
if (data == null)
|
||||
throw new AssertionError("Data is null");
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
if (resultCode != Activity.RESULT_OK)
|
||||
return;
|
||||
switch (requestCode)
|
||||
{
|
||||
case REQ_CODE_DELETE_CATEGORY -> onDeleteActionSelected(getSelectedCategory());
|
||||
case REQ_CODE_IMPORT_DIRECTORY ->
|
||||
{
|
||||
if (data == null)
|
||||
throw new AssertionError("Data is null");
|
||||
|
||||
final Context context = requireActivity();
|
||||
final Uri rootUri = data.getData();
|
||||
final ProgressDialog dialog = new ProgressDialog(context, R.style.MwmTheme_ProgressDialog);
|
||||
dialog.setMessage(getString(R.string.wait_several_minutes));
|
||||
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
|
||||
dialog.setIndeterminate(true);
|
||||
dialog.setCancelable(false);
|
||||
dialog.show();
|
||||
Logger.d(TAG, "Importing bookmarks from " + rootUri);
|
||||
MwmApplication app = MwmApplication.from(context);
|
||||
final File tempDir = new File(StorageUtils.getTempPath(app));
|
||||
final ContentResolver resolver = context.getContentResolver();
|
||||
ThreadPool.getStorage().execute(() -> {
|
||||
AtomicInteger found = new AtomicInteger(0);
|
||||
StorageUtils.listContentProviderFilesRecursively(
|
||||
final Context context = requireActivity();
|
||||
final Uri rootUri = data.getData();
|
||||
final ProgressDialog dialog = new ProgressDialog(context, R.style.MwmTheme_ProgressDialog);
|
||||
dialog.setMessage(getString(R.string.wait_several_minutes));
|
||||
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
|
||||
dialog.setIndeterminate(true);
|
||||
dialog.setCancelable(false);
|
||||
dialog.show();
|
||||
Logger.d(TAG, "Importing bookmarks from " + rootUri);
|
||||
MwmApplication app = MwmApplication.from(context);
|
||||
final File tempDir = new File(StorageUtils.getTempPath(app));
|
||||
final ContentResolver resolver = context.getContentResolver();
|
||||
ThreadPool.getStorage().execute(() -> {
|
||||
AtomicInteger found = new AtomicInteger(0);
|
||||
StorageUtils.listContentProviderFilesRecursively(
|
||||
resolver, rootUri, uri -> {
|
||||
if (BookmarkManager.INSTANCE.importBookmarksFile(resolver, uri, tempDir))
|
||||
found.incrementAndGet();
|
||||
});
|
||||
UiThread.run(() -> {
|
||||
if (dialog.isShowing())
|
||||
dialog.dismiss();
|
||||
int found_val = found.get();
|
||||
String message = context.getResources().getQuantityString(
|
||||
UiThread.run(() -> {
|
||||
if (dialog.isShowing())
|
||||
dialog.dismiss();
|
||||
int found_val = found.get();
|
||||
String message = context.getResources().getQuantityString(
|
||||
R.plurals.bookmarks_detect_message, found_val, found_val);
|
||||
Toast.makeText(requireContext(), message, Toast.LENGTH_LONG).show();
|
||||
});
|
||||
});
|
||||
Toast.makeText(requireContext(), message, Toast.LENGTH_LONG).show();
|
||||
});
|
||||
});
|
||||
}
|
||||
default -> throw new AssertionError("Invalid requestCode: " + requestCode);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue