Compare commits

..

88 commits

Author SHA1 Message Date
mamadnazar
039b71798e [ios] Load img ui fix 2025-03-18 15:30:11 +05:00
mamadnazar
77f098acb6 [ios] ui and sorting fixes 2025-03-13 21:33:34 +05:00
mamadnazar
a7d7d80a8a [ios] predownload and set tajikistan map 2025-03-13 13:28:39 +05:00
mamadnazar
7aa4f4dc03 [ios] navigation to main from sign up bug fix 2025-03-13 13:27:38 +05:00
mamadnazar
c92a138130 [ios] added internet connection check on welcome screen since ios asks for enabling wifi and/or cellular after first request, and if it is login we get error so added an internet connection check before login or registration requests 2025-03-12 01:52:21 +05:00
mamadnazar
f9a6bc5c00 [ios] pre-download Tajikistan map 2025-03-12 01:50:51 +05:00
mamadnazar
e0d98091ed [ios] fix: When user is in the map and gets out (without killing app) then returns back it shows main page instead of map 2025-03-06 19:55:08 +05:00
mamadnazar
3d9ebab8c2 ios: core data thread safety crashes fix 2025-03-02 17:38:28 +05:00
Emin
f25019b8f8 android: fix bugs 2025-02-14 21:26:40 +05:00
Emin
f592cb23dd android: Find a way to have map pre-included in the app 2025-02-13 14:43:08 +05:00
Emin
b34607bd04 android: impl smarter places updates thus fixing weird places ui updates bug 2025-02-11 17:42:59 +05:00
Emin
a3d2a22f5b android: make images offline 2025-02-11 15:28:35 +05:00
Emin
451d628bfd android: sync language 2025-02-11 09:41:57 +05:00
Emin
661807cde8 android: make translations offline 2025-02-10 01:17:15 +05:00
Emin
fa4e191fab android: fix network crashes on older devices 2025-02-07 16:31:56 +05:00
Emin
ca2167658b android: fix change language for real (android 15, 14, 12, 10 tested) 2025-02-07 16:28:49 +05:00
Emin
2183b7a53c android: fix change language 2025-02-05 20:21:25 +05:00
Emin
36f60c9d64 ios: send app for review 2025-01-09 13:38:40 +05:00
Emin
dae8c92ea2 Merge remote-tracking branch 'refs/remotes/origin/master' 2025-01-06 17:08:24 +05:00
Emin
76e66c31ec ios: add basic html parser in placesItem 2025-01-06 17:06:00 +05:00
Emin A
2cc11db7b2
Make README.md more readable
Signed-off-by: Emin A <89159161+Ohpleaseman@users.noreply.github.com>
2025-01-05 15:12:23 +05:00
Emin
549ca85c43 ios: fix some bugs 2025-01-01 20:43:00 +05:00
Emin
eb14807513 ios: fix download 2024-12-30 20:21:46 +05:00
Emin
64ed84bfa9 update readme 2024-12-30 17:54:18 +05:00
Emin
fef69f5eec android: fix crashes/bugs, adjust ui a little 2024-12-26 16:37:49 +05:00
Emin
fb493aceee android: send updates to play store, tweak map downloading 2024-10-30 16:04:02 +05:00
Emin
ded2bfe91d android: remove test crash 2024-10-30 11:53:20 +05:00
Emin
04418bc015 android: add Firebase Crashlytics 2024-10-30 10:51:52 +05:00
Emin
babef10504 ios: attempt to fix weird core data crashes, but related to hashes 2024-10-29 16:49:27 +05:00
Emin
e32a9d2665 ios: attempt to fix weird core data crashes 2024-10-23 14:30:37 +05:00
Emin
7950027ddf global: fix forgot-password 2024-10-14 11:36:27 +05:00
Emin
97e162707b global: fix forgot-password 2024-10-14 11:32:31 +05:00
Emin
93c0970275 android: replace blurriness with dark container on auth, ios: add developedByLabel on sign up screen 2024-10-11 14:24:57 +05:00
Emin
de69678a96 global: add developedByRebus label, ios: fix bugs 2024-10-10 16:06:33 +05:00
Emin
fff086dcf4 ios: make fullscreen images viewer with zoom 2024-10-02 11:45:33 +05:00
Emin
1077efd56c android: make fullscreen images viewer with zoom 2024-10-02 09:10:08 +05:00
Emin
2d9820c745 fix navigation bugs, refactor a little 2024-10-01 09:51:01 +05:00
Emin
beb457603a ios: change brand name, logo, and splash 2024-09-26 11:57:27 +05:00
Emin
c59c102f62 ios: map tasks finished (create route, download map, remove unnecessary UI), ios finished, global: change base_url, other little changes 2024-09-25 23:11:53 +05:00
Emin
90a6f01752 ios: remove unnecessary UI on map 2024-09-21 21:12:05 +05:00
Emin
5ae27cbccb android: disable car support, sent to Play Store for review; ios: backup 2024-09-20 09:38:56 +05:00
Emin
52bf2acb91 backup 2024-09-16 11:21:24 +05:00
Emin
bcf18422b5 backup 2024-09-13 09:21:18 +05:00
Emin
d728b8c7d6 backup 2024-09-13 09:20:44 +05:00
Emin
d1bf71528e backup, UI/UX finished everywhere 2024-09-10 14:56:12 +05:00
Emin
c5e3417af0 backup 2024-09-06 09:23:46 +05:00
Emin
7166577cd1 backup 2024-09-05 15:20:33 +05:00
Emin
7720b166c6 backup, home, categories, search UI/UX 2024-09-04 12:05:18 +05:00
Emin
6ea723b0f5 backup 2024-09-03 10:56:38 +05:00
LLC Rebus
91c544bfeb backup 2024-09-02 09:50:59 +05:00
LLC Rebus
6be8ce1933 backup 2024-09-02 09:34:15 +05:00
Emin
7d4e760778 push skipped SignInRequest struct 2024-08-14 10:17:16 +05:00
Emin
a85dcd0efc finish auth, ongoing: profile 2024-08-14 10:16:18 +05:00
Emin
0b5a4bf665 ios: adding skipped files 2024-08-07 16:02:02 +05:00
Emin
e62d6ef2d0 ios: lil refactor CountryPickerView 2024-08-06 17:20:34 +05:00
Emin
2d9a1ee57f ios: do auth UI/UI, do l10n 2024-08-06 17:09:21 +05:00
Emin
0d0b43ae7e ios: add translations 2024-08-05 09:45:00 +05:00
Emin
d30678a9b4 ios forgot fonts 2024-08-04 23:16:27 +05:00
Emin
207bc0cd02 ios do theme, text styles 2024-08-04 23:14:53 +05:00
Emin
09d92aec73 tried some programmatic UI 2024-08-01 17:11:45 +05:00
Emin
d0a5911fd1 ios - remove swiftui stuff, decrease ios min to 12 2024-07-31 11:06:02 +05:00
Emin
63e3de24a9 ios Tried some swiftui integraton (failed) 2024-07-31 09:47:26 +05:00
Emin
0b99a3572b make some empty screens, navigate to tourism main, set ios min to 13 2024-07-29 17:19:52 +05:00
Emin
7cb1b6e51f android: adjust UI 2024-07-26 14:21:47 +05:00
Emin
dc9c67480c android: set domain, adjustments, fix bugs, optimize imports 2024-07-22 17:58:16 +05:00
Emin
dcb0d40816 android: lil adjustments, ios: prepared to launch 2024-07-19 14:19:19 +05:00
Emin
e78bbe397e adjustments and bug fixes 2024-07-17 14:50:15 +05:00
Emin
dc0523cbb3 get currencies from tourism api instead 2024-07-16 11:31:47 +05:00
Emin
104f02b987 api/cache/sync finished 2024-07-15 11:15:14 +05:00
Emin
2400c21819 backup 2024-07-12 10:39:40 +05:00
Emin
bba8edbf48 backup, ongoing: api/cache/sync 2024-07-08 15:51:31 +05:00
Emin
b7eeeb2ed7 adjust auth, profile, do currency, ongoing: places API/DB 2024-07-03 11:23:57 +05:00
Emin
1d6e96e1fe do place details (including reviews), favorites UI/UX 2024-06-26 16:37:33 +05:00
Emin
ab8677439f do home, categories, search UI/UX 2024-06-24 14:04:48 +05:00
Emin
ab44d68eac do profile imageUpload feature 2024-06-21 15:30:06 +05:00
Emin
6f0c27d73a do profile UI/UX 2024-06-21 11:47:54 +05:00
Emin
45a8da004b do profile UI/UX 2024-06-21 10:53:58 +05:00
Emin
15b3613363 set up more libs, utils, and res; finish auth; ongoing: profile 2024-06-20 16:04:58 +05:00
Emin
c3c3736f07 set up themes, localization, auth UI 2024-06-15 00:29:23 +05:00
Emin
58b81266e8 download map after launch but in Map screen 2024-06-11 17:19:32 +05:00
Emin
8917001a27 Revert "failed attempt to download map after launch"
This reverts commit 184cd72db2.
2024-06-11 15:15:01 +05:00
Emin
184cd72db2 failed attempt to download map after launch 2024-06-11 15:14:39 +05:00
Emin
dce2313723 show route on map from another screen 2024-06-07 20:15:38 +05:00
Emin
ba0f2bb041 remove unnecessary ui elements from the map, other small stuff 2024-06-06 16:16:47 +05:00
Emin
7326924a23 remove unnecessary buttons from the map, changed appId 2024-06-06 11:34:49 +05:00
Emin
cc9e6c9dc5 try using kotlin (successful) 2024-06-06 10:14:44 +05:00
Emin
3a6166bae9 change logo and splash 2024-06-05 17:08:17 +05:00
Emin
13719ee316 remove unnecessary docs, adjust legal docs 2024-06-04 14:27:06 +05:00
4158 changed files with 348787 additions and 282232 deletions

View file

@ -21,7 +21,7 @@ IndentCaseLabels: false
NamespaceIndentation: None
PointerAlignment: Middle
SortIncludes: true
Standard: c++20
Standard: c++17
IncludeBlocks: Regroup
IncludeCategories:
# Tests --------------------------------------------------------------------------------------------

View file

@ -1,4 +1,3 @@
6aa73face8b5eb8e026cfafa40d1983d4a0502c0
480fa6c2fcf53be296504ac6ba8e6b3d70f92b42
a6ede2b1466f0c9d8a443600ef337ba6b5832e58
1377b81bf1cac72bb6da192da7fed6696d5d5281

78
.github/CODEOWNERS vendored
View file

@ -1,69 +1,9 @@
# 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.
/android/ @organicmaps/android
/android/app/src/main/java/app/organicmaps/car/ @organicmaps/android-auto
/docs/ANDROID_LOCATION_TEST.md @organicmaps/android
/docs/JAVA_STYLE.md @organicmaps/android
# no owner for translation changes
/android/app/src/main/res/values*/strings.xml
# iOS.
/iphone/ @organicmaps/ios
/xcode/ @organicmaps/ios
/docs/OBJC_STYLE.md @organicmaps/ios
# no owner for translation changes
/iphone/plist.txt
/iphone/Maps/LocalizedStrings/
# Qt
/qt/ @organicmaps/qt
# 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
# 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
# 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
# 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
# Require legal approval for all new graphics
android/app/src/main/res/drawable*/ @organicmaps/legal
android/app/src/main/res/fonts/ @organicmaps/legal
android/app/src/main/res/mipmap*/ @organicmaps/legal
data/*.ttf @organicmaps/legal
data/resources*/ @organicmaps/legal
data/search-icons/ @organicmaps/legal
data/styles/clear/style-*/ @organicmaps/legal
iphone/Maps/Images.xcassets/ @organicmaps/legal

View file

@ -2,7 +2,7 @@
name: Feature Request
about: Suggest an idea for Organic Maps
title: ''
labels: []
labels: [Enhancement]
assignees: ''
---

View file

@ -56,24 +56,19 @@ jobs:
shell: bash
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
- name: Restore beta keys
- name: Checkout private keys
uses: actions/checkout@v4
with:
repository: ${{ secrets.PRIVATE_REPO }}
ssh-key: ${{ secrets.PRIVATE_SSH_KEY }}
ref: master
path: private.git
- name: Configure repo with private keys
shell: bash
run: |
echo "$PRIVATE_H" | base64 -d > private.h
echo "$FIREBASE_APP_DISTRIBUTION_JSON" | base64 -d > android/app/firebase-app-distribution.json
echo "$GOOGLE_SERVICES_JSON" | base64 -d > android/app/google-services.json
echo "$SECURE_PROPERTIES" | base64 -d > android/app/secure.properties
echo "$RELEASE_KEYSTORE" | base64 -d > android/app/release.keystore
env:
PRIVATE_H: ${{ secrets.PRIVATE_H }}
FIREBASE_APP_DISTRIBUTION_JSON: ${{ secrets.FIREBASE_APP_DISTRIBUTION_JSON }}
GOOGLE_SERVICES_JSON: ${{ secrets.GOOGLE_SERVICES_JSON }}
SECURE_PROPERTIES: ${{ secrets.SECURE_PROPERTIES }}
RELEASE_KEYSTORE: ${{ secrets.RELEASE_KEYSTORE }}
- name: Configure repository
shell: bash
run: ./configure.sh
./configure.sh ./private.git
rm -rf ./private.git
- name: Compile
shell: bash

View file

@ -23,10 +23,10 @@ on:
- packaging/**
- platform/*apple*
- platform/*_ios*
- platform/*_linux*
- platform/*_mac*
- platform/*qt*
- platform/*_win*
- platform/*_linux*
- platform/*_mac*
- platform/*qt*
- platform/*_win*
- pyhelpers/**
- qt*/**
- skin_generator/**
@ -51,7 +51,7 @@ jobs:
shell: bash
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
- name: Configure repository
- name: Configure in Open Source mode
shell: bash
run: ./configure.sh
@ -66,12 +66,7 @@ jobs:
strategy:
fail-fast: false
matrix:
flavor: [WebDebug, FdroidDebug]
include:
- flavor: WebDebug
arch: arm64
- flavor: FdroidDebug
arch: arm32
flavor: [WebDebug, FdroidBeta]
# Cancels previous jobs if the same branch or PR was updated again.
concurrency:
group: ${{ github.workflow }}-${{ matrix.flavor }}-${{ github.event.pull_request.number || github.ref }}
@ -93,7 +88,7 @@ jobs:
shell: bash
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
- name: Configure repository
- name: Configure in Open Source mode
shell: bash
run: ./configure.sh
@ -111,11 +106,11 @@ jobs:
run: |
cmake --version
ninja --version
./gradlew -P${{ matrix.arch }} assemble${{ matrix.flavor }}
./gradlew -Parm64 assemble${{ matrix.flavor }}
- name: Upload ${{ matrix.flavor }} apk
- name: Upload arm64-v8a ${{ matrix.flavor }} apk
uses: actions/upload-artifact@v4
with:
name: android-${{ matrix.flavor }}
name: android-arm64-v8a-${{ matrix.flavor }}
path: android/app/build/outputs/apk/**/OrganicMaps-*.apk
if-no-files-found: error

View file

@ -56,26 +56,19 @@ jobs:
shell: bash
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
- name: Restore beta keys
- name: Checkout private keys
uses: actions/checkout@v4
with:
repository: ${{ secrets.PRIVATE_REPO }}
ssh-key: ${{ secrets.PRIVATE_SSH_KEY }}
ref: master
path: private.git
- name: Configure repo with private keys
shell: bash
run: |
echo "$PRIVATE_H" | base64 -d > private.h
echo "$FIREBASE_TEST_LAB_JSON" | base64 -d > android/app/firebase-test-lab.json
echo "$FIREBASE_APP_DISTRIBUTION_JSON" | base64 -d > android/app/firebase-app-distribution.json
echo "$GOOGLE_SERVICES_JSON" | base64 -d > android/app/google-services.json
echo "$SECURE_PROPERTIES" | base64 -d > android/app/secure.properties
echo "$RELEASE_KEYSTORE" | base64 -d > android/app/release.keystore
env:
PRIVATE_H: ${{ secrets.PRIVATE_H }}
FIREBASE_TEST_LAB_JSON: ${{ secrets.FIREBASE_TEST_LAB_JSON }}
FIREBASE_APP_DISTRIBUTION_JSON: ${{ secrets.FIREBASE_APP_DISTRIBUTION_JSON }}
GOOGLE_SERVICES_JSON: ${{ secrets.GOOGLE_SERVICES_JSON }}
SECURE_PROPERTIES: ${{ secrets.SECURE_PROPERTIES }}
RELEASE_KEYSTORE: ${{ secrets.RELEASE_KEYSTORE }}
- name: Configure repository
shell: bash
run: ./configure.sh
./configure.sh ./private.git
rm -rf ./private.git
- name: Compile
shell: bash

View file

@ -26,14 +26,19 @@ jobs:
ref: master
path: screenshots
- name: Restore release keys
- name: Checkout private keys
uses: actions/checkout@v4
with:
repository: ${{ secrets.PRIVATE_REPO }}
ssh-key: ${{ secrets.PRIVATE_SSH_KEY }}
ref: master
path: private.git
- name: Configure repo with private keys
shell: bash
run: |
echo "$PRIVATE_H" | base64 -d > private.h
echo "$GOOGLE_PLAY_JSON" | base64 -d > android/app/google-play.json
env:
PRIVATE_H: ${{ secrets.PRIVATE_H }}
GOOGLE_PLAY_JSON: ${{ secrets.GOOGLE_PLAY_JSON }}
./configure.sh ./private.git
rm -rf ./private.git
- name: Upload
shell: bash

View file

@ -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"
@ -100,26 +100,19 @@ jobs:
ref: master
path: screenshots
- name: Restore release keys
- name: Checkout private keys
uses: actions/checkout@v4
with:
repository: ${{ secrets.PRIVATE_REPO }}
ssh-key: ${{ secrets.PRIVATE_SSH_KEY }}
ref: master
path: private.git
- name: Configure repo with private keys
shell: bash
run: |
echo "$PRIVATE_H" | base64 -d > private.h
echo "$GOOGLE_PLAY_JSON" | base64 -d > android/app/google-play.json
echo "$HUAWEI_APPGALLERY_JSON" | base64 -d > android/app/huawei-appgallery.json
echo "$AGCONNECT_SERVICES_JSON" | base64 -d > android/app/agconnect-services.json
echo "$SECURE_PROPERTIES" | base64 -d > android/app/secure.properties
echo "$RELEASE_KEYSTORE" | base64 -d > android/app/release.keystore
env:
PRIVATE_H: ${{ secrets.PRIVATE_H }}
GOOGLE_PLAY_JSON: ${{ secrets.GOOGLE_PLAY_JSON }}
HUAWEI_APPGALLERY_JSON: ${{ secrets.HUAWEI_APPGALLERY_JSON }}
AGCONNECT_SERVICES_JSON: ${{ secrets.AGCONNECT_SERVICES_JSON }}
SECURE_PROPERTIES: ${{ secrets.SECURE_PROPERTIES }}
RELEASE_KEYSTORE: ${{ secrets.RELEASE_KEYSTORE }}
- name: Configure repository
shell: bash
run: ./configure.sh
./configure.sh ./private.git
rm -rf ./private.git
- name: Set up SDK
shell: bash
@ -155,8 +148,7 @@ jobs:
{
cat ${{ env.RELEASE_NOTES }}
echo ""
echo "See [a detailed announce](https://organicmaps.app/news/) on our website when app updates are published in all stores."
echo "You can get automatic app updates from GitHub [using Obtainium](https://github.com/organicmaps/organicmaps/wiki/Installing-Organic-Maps-from-GitHub-using-Obtainium)."
echo "See [more details](https://organicmaps.app/news/) on our website when apps are published."
echo ""
echo "sha256sum:"
echo -e '\n```'

View file

@ -34,7 +34,3 @@ jobs:
- name: Lint appstream data with flatpak Builder
shell: bash
run: flatpak run --command=flatpak-builder-lint org.flatpak.Builder appstream packaging/app.organicmaps.desktop.metainfo.xml
- name: Run appstreamcli in pedantic mode
shell: bash
run: flatpak run --command=appstreamcli org.flatpak.Builder validate --pedantic packaging/app.organicmaps.desktop.metainfo.xml

View file

@ -94,7 +94,7 @@ jobs:
llvm \
gcovr
- name: Configure repository
- name: Configure
shell: bash
run: ./configure.sh
@ -124,14 +124,14 @@ jobs:
shell: bash
working-directory: build
env:
QT_QPA_PLATFORM: "offscreen"
# drape_tests - requires X Window
# generator_integration_tests - https://github.com/organicmaps/organicmaps/issues/225
# opening_hours_integration_tests - https://github.com/organicmaps/organicmaps/issues/219
# opening_hours_supported_features_tests - https://github.com/organicmaps/organicmaps/issues/219
# routing_integration_tests - https://github.com/organicmaps/organicmaps/issues/221
# shaders_tests - https://github.com/organicmaps/organicmaps/issues/223
# world_feed_integration_tests - https://github.com/organicmaps/organicmaps/issues/215
CTEST_EXCLUDE_REGEX: "generator_integration_tests|opening_hours_integration_tests|opening_hours_supported_features_tests|routing_benchmarks|routing_integration_tests|routing_quality_tests|search_quality_tests|storage_integration_tests|shaders_tests|world_feed_integration_tests"
CTEST_EXCLUDE_REGEX: "drape_tests|generator_integration_tests|opening_hours_integration_tests|opening_hours_supported_features_tests|routing_benchmarks|routing_integration_tests|routing_quality_tests|search_quality_tests|storage_integration_tests|shaders_tests|world_feed_integration_tests"
run: |
sudo locale-gen en_US
sudo locale-gen en_US.UTF-8

View file

@ -3,7 +3,7 @@ on:
workflow_dispatch: # Manual trigger
pull_request:
paths:
- qt/res/app.organicmaps.desktop.desktop
- qt/res/OrganicMaps.desktop
- .github/workflows/desktop-file-check.yaml # Run check on self change
jobs:
@ -16,7 +16,7 @@ jobs:
with:
fetch-depth: 1
sparse-checkout: |
qt/res/app.organicmaps.desktop.desktop
qt/res/OrganicMaps.desktop
- name: Install desktop-file-validate tool
shell: bash
@ -27,4 +27,4 @@ jobs:
- name: Validate desktop file
shell: bash
run: desktop-file-validate qt/res/app.organicmaps.desktop.desktop && echo "Successfully validated .desktop file"
run: desktop-file-validate qt/res/OrganicMaps.desktop && echo "Successfully validated .desktop file"

View file

@ -33,9 +33,9 @@ on:
jobs:
ios-beta:
name: Apple TestFlight
runs-on: macos-15
runs-on: macos-14
env:
DEVELOPER_DIR: /Applications/Xcode_16.app/Contents/Developer
DEVELOPER_DIR: /Applications/Xcode_15.3.app/Contents/Developer
LANG: en_US.UTF-8 # Fastlane complains that the terminal is using ASCII.
LANGUAGE: en_US.UTF-8
LC_ALL: en_US.UTF-8
@ -52,23 +52,18 @@ jobs:
- name: Parallel submodules checkout
run: git submodule update --depth 1 --init --recursive --jobs=$(($(sysctl -n hw.logicalcpu) * 20))
- name: Restore beta keys
shell: bash
run: |
mkdir -p xcode/keys
echo "$PRIVATE_H" | base64 -d > private.h
echo "$APPSTORE_JSON" | base64 -d > xcode/keys/appstore.json
echo "$CERTIFICATES_DEV_P12" | base64 -d > xcode/keys/CertificatesDev.p12
echo "$CERTIFICATES_DISTR_P12" | base64 -d > xcode/keys/CertificatesDistr.p12
env:
PRIVATE_H: ${{ secrets.PRIVATE_H }}
APPSTORE_JSON: ${{ secrets.APPSTORE_JSON }}
CERTIFICATES_DEV_P12: ${{ secrets.CERTIFICATES_DEV_P12 }}
CERTIFICATES_DISTR_P12: ${{ secrets.CERTIFICATES_DISTR_P12 }}
- name: Checkout private keys
uses: actions/checkout@v4
with:
repository: ${{ secrets.PRIVATE_REPO }}
ssh-key: ${{ secrets.PRIVATE_SSH_KEY }}
ref: master
path: private.git
- name: Configure repository
shell: bash
run: ./configure.sh
- name: Configure repo with private keys
run: |
./configure.sh ./private.git
rm -rf ./private.git
- name: Compile and upload to TestFlight
run: |

View file

@ -35,9 +35,9 @@ on:
jobs:
ios-check:
name: Build iOS
runs-on: macos-15
runs-on: macos-14
env:
DEVELOPER_DIR: /Applications/Xcode_16.app/Contents/Developer
DEVELOPER_DIR: /Applications/Xcode_15.3.app/Contents/Developer
LANG: en_US.UTF-8 # Fastlane complains that the terminal is using ASCII.
LANGUAGE: en_US.UTF-8
LC_ALL: en_US.UTF-8
@ -59,7 +59,7 @@ jobs:
shell: bash
run: git submodule update --depth 1 --init --recursive --jobs=$(($(sysctl -n hw.logicalcpu) * 20))
- name: Configure repository
- name: Configure
shell: bash
run: ./configure.sh
@ -78,7 +78,7 @@ jobs:
-scheme OMaps \
-configuration Debug \
-sdk iphonesimulator \
-destination 'platform=iOS Simulator,name=iPhone 16 Pro Max,OS=latest' \
-destination 'platform=iOS Simulator,name=iPhone 15,OS=latest' \
-quiet \
-resultBundlePath ${{ env.TEST_RESULTS_BUNDLE_NAME }}.xcresult \
CODE_SIGNING_REQUIRED=NO \

View file

@ -5,9 +5,9 @@ on:
jobs:
ios-release:
name: iOS Release
runs-on: macos-15
runs-on: macos-14
env:
DEVELOPER_DIR: /Applications/Xcode_16.app/Contents/Developer
DEVELOPER_DIR: /Applications/Xcode_15.3.app/Contents/Developer
LANG: en_US.UTF-8 # Fastlane complains that the terminal is using ASCII.
LANGUAGE: en_US.UTF-8
LC_ALL: en_US.UTF-8
@ -16,13 +16,20 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
- name: Restore release keys
- name: Checkout private keys
uses: actions/checkout@v4
with:
repository: ${{ secrets.PRIVATE_REPO }}
ssh-key: ${{ secrets.PRIVATE_SSH_KEY }}
ref: master
path: ./private.git
- name: Configure repo with private keys
shell: bash
run: |
mkdir -p xcode/keys
echo "$APPSTORE_JSON" | base64 -d > xcode/keys/appstore.json
env:
APPSTORE_JSON: ${{ secrets.APPSTORE_JSON }}
mkdir -p xcode/keys/
cp -p ./private.git/xcode/keys/appstore.json xcode/keys/
rm -rf ./private.git
- name: Checkout screenshots
uses: actions/checkout@v4

View file

@ -61,17 +61,13 @@ jobs:
libgl1-mesa-dev \
libglvnd-dev \
libharfbuzz-dev \
libxrandr-dev \
libxinerama-dev \
libxcursor-dev \
libxi-dev \
qt6-base-dev \
libqt6svg6-dev \
qt6-positioning-dev \
libqt6positioning6-plugins \
libqt6positioning6
- name: Configure repository
- name: Configure
shell: bash
run: ./configure.sh
@ -132,17 +128,13 @@ jobs:
libgl1-mesa-dev \
libglvnd-dev \
libharfbuzz-dev \
libxrandr-dev \
libxinerama-dev \
libxcursor-dev \
libxi-dev \
qt6-base-dev \
libqt6svg6-dev \
qt6-positioning-dev \
libqt6positioning6-plugins \
libqt6positioning6
- name: Configure repository
- name: Configure
shell: bash
run: ./configure.sh
@ -173,6 +165,7 @@ jobs:
shell: bash
working-directory: build
env:
# drape_tests - requires X Window
QT_QPA_PLATFORM: "offscreen"
# generator_integration_tests - https://github.com/organicmaps/organicmaps/issues/225
# opening_hours_integration_tests - https://github.com/organicmaps/organicmaps/issues/219
@ -180,7 +173,7 @@ jobs:
# routing_integration_tests - https://github.com/organicmaps/organicmaps/issues/221
# shaders_tests - https://github.com/organicmaps/organicmaps/issues/223
# world_feed_integration_tests - https://github.com/organicmaps/organicmaps/issues/215
CTEST_EXCLUDE_REGEX: "generator_integration_tests|opening_hours_integration_tests|opening_hours_supported_features_tests|routing_benchmarks|routing_integration_tests|routing_quality_tests|search_quality_tests|storage_integration_tests|shaders_tests|world_feed_integration_tests"
CTEST_EXCLUDE_REGEX: "drape_tests|generator_integration_tests|opening_hours_integration_tests|opening_hours_supported_features_tests|routing_benchmarks|routing_integration_tests|routing_quality_tests|search_quality_tests|storage_integration_tests|shaders_tests|world_feed_integration_tests"
run: |
sudo locale-gen en_US
sudo locale-gen en_US.UTF-8

View file

@ -30,9 +30,9 @@ on:
jobs:
macos-matrix:
name: macOS builds and tests
runs-on: macos-15
runs-on: macos-14
env:
DEVELOPER_DIR: /Applications/Xcode_16.app/Contents/Developer
DEVELOPER_DIR: /Applications/Xcode_15.3.app/Contents/Developer
HOMEBREW_NO_ANALYTICS: 1
HOMEBREW_NO_INSTALL_CLEANUP: 1
strategy:
@ -57,7 +57,7 @@ jobs:
run: |
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 brew install ninja qt@6
- name: Configure repository
- name: Configure
shell: bash
run: ./configure.sh

View file

@ -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 youd 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
View 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

4
.gitignore vendored
View file

@ -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
@ -85,7 +84,7 @@ data/[0-9][0-9][0-9][0-9][0-9][0-9]
data/gps_track.dat
# temporary files for downloader
data/settings.ini
data/test_data/world_feed_integration_tests_data
data/world_feed_integration_tests_data
# benchmark results
data/benchmarks/*.trace
@ -147,7 +146,6 @@ iphone/Maps/app.omaps/
*.autosave
# CMake
cmake-build-*
build/

61
.gitmodules vendored
View file

@ -1,23 +1,29 @@
[submodule "tools/osmctools"]
path = tools/osmctools
url = https://git.omaps.dev/organicmaps/osmctools.git
url = https://github.com/organicmaps/osmctools.git
[submodule "tools/kothic"]
path = tools/kothic
url = https://git.omaps.dev/organicmaps/kothic.git
url = https://github.com/organicmaps/kothic.git
[submodule "tools/macdeployqtfix"]
path = tools/macdeployqtfix
url = https://github.com/aurelien-rainone/macdeployqtfix.git
[submodule "3party/protobuf/protobuf"]
path = 3party/protobuf/protobuf
url = https://git.omaps.dev/organicmaps/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 = https://github.com/KhronosGroup/Vulkan-Headers.git
[submodule "3party/boost"]
path = 3party/boost
url = https://github.com/boostorg/boost.git
branch = boost-1.85.0
branch = boost-1.76.0
ignore = dirty
[submodule "3party/just_gtfs"]
path = 3party/just_gtfs
url = https://git.omaps.dev/organicmaps/just_gtfs.git
url = https://github.com/organicmaps/just_gtfs.git
branch = for-usage-as-submodule
[submodule "3party/expat"]
path = 3party/expat
@ -30,38 +36,29 @@
path = 3party/icu/icu
url = https://github.com/unicode-org/icu.git
[submodule "3party/freetype/freetype"]
path = 3party/freetype/freetype
url = https://git.omaps.dev/organicmaps/freetype.git
path = 3party/freetype/freetype
url = https://github.com/organicmaps/freetype.git
[submodule "3party/googletest"]
path = 3party/googletest
url = https://github.com/google/googletest.git
path = 3party/googletest
url = https://github.com/google/googletest.git
[submodule "3party/fast_double_parser"]
path = 3party/fast_double_parser
url = https://github.com/lemire/fast_double_parser.git
path = 3party/fast_double_parser
url = https://github.com/lemire/fast_double_parser.git
[submodule "3party/pugixml/pugixml"]
path = 3party/pugixml/pugixml
url = https://github.com/zeux/pugixml.git
path = 3party/pugixml/pugixml
url = https://github.com/zeux/pugixml.git
[submodule "3party/jansson/jansson"]
path = 3party/jansson/jansson
url = https://github.com/akheron/jansson.git
path = 3party/jansson/jansson
url = https://github.com/akheron/jansson.git
[submodule "3party/gflags"]
path = 3party/gflags
url = https://github.com/gflags/gflags
path = 3party/gflags
url = https://github.com/gflags/gflags
[submodule "3party/fast_obj"]
path = 3party/fast_obj
url = https://github.com/thisistherk/fast_obj
path = 3party/fast_obj
url = https://github.com/thisistherk/fast_obj
[submodule "3party/harfbuzz/harfbuzz"]
path = 3party/harfbuzz/harfbuzz
url = https://github.com/harfbuzz/harfbuzz.git
path = 3party/harfbuzz/harfbuzz
url = https://github.com/harfbuzz/harfbuzz.git
[submodule "3party/utfcpp"]
path = 3party/utfcpp
url = https://github.com/nemtrif/utfcpp.git
[submodule "3party/glfw"]
path = 3party/glfw
url = https://github.com/glfw/glfw.git
[submodule "3party/CMake-MetalShaderSupport"]
path = 3party/CMake-MetalShaderSupport
url = https://github.com/dpogue/CMake-MetalShaderSupport.git
[submodule "3party/imgui/imgui"]
path = 3party/imgui/imgui
url = https://github.com/ocornut/imgui
path = 3party/utfcpp
url = https://github.com/nemtrif/utfcpp.git

@ -1 +0,0 @@
Subproject commit 989857d2e5e54869c35ad06fb21a67d12a2dbc67

View file

@ -22,6 +22,7 @@ if (NOT WITH_SYSTEM_PROVIDED_3PARTY)
set(EXPAT_DTD OFF)
set(EXPAT_NS ON)
add_subdirectory(expat/expat)
add_library(expat::expat ALIAS expat)
# Configure Jansson library.
set(JANSSON_BUILD_DOCS OFF)
@ -66,19 +67,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 +1 @@
Subproject commit 595c8d4794410a4e64b98dc58d27c0310d7ea2fd
Subproject commit 31aa7f634b052d87ede4664053e85f3f4d1d50d3

@ -1 +1 @@
Subproject commit ab7968a0bbcf574a7859240d1d8443f58ed6f6cf
Subproject commit 564e2ac16907019696cdaba8a93e3588ec596062

@ -1 +1 @@
Subproject commit a0dc7d5efacbe2b744211289c276e2b9168bd4ae
Subproject commit 74d91febb0995b7c6706dfd4eed2d39fb1694421

@ -1 +1 @@
Subproject commit 252029ddac664370bdda3f0761675785d92a1573
Subproject commit efec03532ef65984786e5e32dbc81f6e6a55a115

@ -1 +1 @@
Subproject commit 42629f744269e004907a6fb4f16c6c7f69acc586
Subproject commit 1a8060257a96401a9555a476bd13c3a87502c9b5

@ -1 +1 @@
Subproject commit 97069edd163b66ce11e8152bee3055b2fa627e15
Subproject commit 920c5502cc3ddda88f6c7d85ee834ac611bb11cc

@ -1 +0,0 @@
Subproject commit 21fea01161e0d6b70c0c5c1f52dc8e7a7df14a50

View file

@ -17,7 +17,6 @@ target_compile_options(${PROJECT_NAME}
-fno-rtti
-fno-exceptions
-fno-threadsafe-statics
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:-Wno-format-pedantic>
)
target_compile_definitions(${PROJECT_NAME}

@ -1 +1 @@
Subproject commit 788b469ad5e5f78611f665b6eb17afd0eb040f21
Subproject commit bc90b29b37fe3809f9e48aa7be08fbf2208e481a

View file

@ -32,13 +32,10 @@ add_library(icuuc
icu/icu4c/source/common/locbased.h
icu/icu4c/source/common/locid.cpp
icu/icu4c/source/common/loclikely.cpp
icu/icu4c/source/common/loclikelysubtags.cpp
icu/icu4c/source/common/loclikelysubtags.h
icu/icu4c/source/common/locmap.cpp
icu/icu4c/source/common/locutil.cpp
icu/icu4c/source/common/locutil.h
icu/icu4c/source/common/lsr.h
icu/icu4c/source/common/lsr.cpp
icu/icu4c/source/common/messageimpl.h
icu/icu4c/source/common/msvcres.h
icu/icu4c/source/common/mutex.h

@ -1 +1 @@
Subproject commit 7750081bda4b3bc1768ae03849ec70f67ea10625
Subproject commit 6af11aa609f3fdf735cab5fdc051cd840960186b

View file

@ -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

@ -1 +1 @@
Subproject commit caade5a28aad86b92a4b5337a9dc70c4ba73c5eb
Subproject commit a0e064336317c9347a91224112af9933598714e9

View file

@ -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}>)

View file

@ -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

View file

@ -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

View file

@ -1,8 +1,8 @@
cmake_minimum_required(VERSION 3.22.1)
cmake_minimum_required(VERSION 3.18)
project(omim C CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_C_STANDARD 17)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_STANDARD 11)
# Our code does not rely on gnu extensions.
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_C_EXTENSIONS OFF)
@ -26,7 +26,7 @@ if (APPLE AND NOT ("${CMAKE_SYSTEM_NAME}" STREQUAL Android))
set(CMAKE_OBJC_VISIBILITY_PRESET hidden)
enable_language(OBJCXX)
set(CMAKE_OBJCXX_EXTENSIONS OFF)
set(CMAKE_OBJCXX_STANDARD 20)
set(CMAKE_OBJCXX_STANDARD 17)
set(CMAKE_OBJCXX_FLAGS -fobjc-arc)
set(CMAKE_OBJCXX_VISIBILITY_PRESET hidden)
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
@ -162,12 +149,6 @@ if (BUILD_DESIGNER)
add_definitions(-DBUILD_DESIGNER)
endif()
option(BUILD_STANDALONE "Build standalone application" OFF)
if (BUILD_STANDALONE)
message(STATUS "Standalone building is enabled")
add_definitions(-DBUILD_STANDALONE)
endif()
option(USE_ASAN "Enable Address Sanitizer" OFF)
option(USE_TSAN "Enable Thread Sanitizer" OFF)
option(USE_LIBFUZZER "Enable LibFuzzer" OFF)
@ -176,7 +157,6 @@ option(SKIP_QT_GUI "Skip building of Qt GUI" OFF)
option(USE_PCH "Use precompiled headers" OFF)
option(NJOBS "Number of parallel processes" OFF)
option(ENABLE_VULKAN_DIAGNOSTICS "Enable Vulkan diagnostics" OFF)
option(ENABLE_TRACE "Enable Tracing" OFF)
if (NJOBS)
message(STATUS "Number of parallel processes: ${NJOBS}")
@ -186,9 +166,9 @@ if (NJOBS)
set(CMAKE_JOB_POOL_PRECOMPILE_HEADER custom)
endif()
# GCC 10.0 is required to support <charconv> header inclusion in base/string_utils.hpp
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.0)
message(FATAL_ERROR "Minimum supported g++ version is 10.0, yours is ${CMAKE_CXX_COMPILER_VERSION}")
# GCC 8.1 is required to support <charconv> header inclusion in base/string_utils.hpp, otherwise 7.0 is sufficient
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.1)
message(FATAL_ERROR "Minimum supported g++ version is 8.1 yours is ${CMAKE_CXX_COMPILER_VERSION}")
endif()
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
@ -233,11 +213,6 @@ if (ENABLE_VULKAN_DIAGNOSTICS)
add_definitions(-DENABLE_VULKAN_DIAGNOSTICS)
endif()
if (ENABLE_TRACE)
message(STATUS "Tracing is enabled")
add_definitions(-DENABLE_TRACE)
endif()
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# Set environment variables
@ -278,6 +253,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)
@ -288,13 +273,6 @@ if (NOT PLATFORM_IPHONE AND NOT PLATFORM_ANDROID)
endif()
# PATHS are hard-coded hints where to look for qt6 in addition to other places.
find_package(Qt6 COMPONENTS REQUIRED ${qt_components} PATHS $ENV{QT_PATH} /opt/homebrew/opt/qt@6 /usr/local/opt/qt@6 /usr/lib/x86_64-linux-gnu/qt6)
set(MINIMUM_REQUIRED_QT_VERSION 6.4.0)
if (Qt6Widgets_VERSION VERSION_LESS ${MINIMUM_REQUIRED_QT_VERSION})
message(FATAL_ERROR "Unsupported Qt version: ${Qt6Widgets_VERSION}, the minimum required is ${MINIMUM_REQUIRED_QT_VERSION}")
else()
message(STATUS "Found Qt version: ${Qt6Widgets_VERSION}")
endif()
endif()
# To allow #include "base/file_name.hpp" in all sources.
@ -397,7 +375,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)

View file

@ -1 +0,0 @@
See [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md)

View file

@ -1,150 +0,0 @@
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!
--------------------------------------------------------------------------------
Organic Maps (formerly OMaps) contributors:
(in alphabetic order)
--------------------------------------------------------------------------------
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):
--------------------------------------------------------------------------------
Code contributions:
Dmitry Yunitski
Lev Dragunov
Sergey Yershov <syershov@gmail.com>
Vladimir Byko-Ianko <bykoianko@gmail.com>
Yuri Gorshenin
Maxim Pimenov <m@maps.me>
Roman Kuznetsov
Konstantin Shalnev <k.shalnev@gmail.com>
Ilja Zverev <zverik@textual.ru>
Vlad Mihaylenko
Ilya Grechuhin
Alexander Marchuk
Sergey Magidovich
Yury Rakhuba
Kirill Zhdanovich
Dmitry Kunin
Denis Koronchik
Darafei Praliaskouski <me@komzpa.net>
Igor Khmurets
Timur Bernikowich
Roman Sorokin
Alexander Gusak
Alexei Vitenko
Artem Polkovnikov <artyom.polkovnikov@gmail.com>
Alex Gontmakher <gsasha@gmail.com>
Dima Korolev <dmitry.korolev@gmail.com>
Max Grigorev <forwidur@gmail.com>
Porting to Tizen platform:
Sergey Pisarchik
Testing and automation:
Timofey Danshin
Design and styles:
Igor Tomko <igor.n.tomko@gmail.com>
Urbica http://urbica.co
Vasiliy Cherkasov
Maksim Okala-Kulak <kaenoru@gmail.com>
Strings and translations:
Nataliya Yakavenka
Daria Terentieva
Satoshi Iida
Mathias Wittwer
R3gi <regiprogi@gmail.com>
Hidde Wieringa
Vasily Korotkevich
Mark N. Kuramochi
Lidia Vasiljeva
Project management:
Alexander Matveenko
Marketing & support:
Sergey Ermilov
Anna Mozheiko
Alexander Bobko
Marat Mukhamedov
Alena Miranovich
Polina Kovalchuk
Ekaterina Sazonova
Alesya Serada
Special thanks to:
Yauheniya Melnichek
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>

9
LEGAL
View file

@ -1,9 +0,0 @@
Certain project resources, including but not limited to domain names, trademarks, hosting accounts, payment accounts, and others, are overseen and managed by Organic Maps OÜ. The governance of these digital assets is subject to policies established by Organic Maps OÜ, in compliance with applicable statutory laws.
Organic Maps OÜ is a legal entity established on 2021-05-01 under the laws of the Republic of Estonia and the European Union, with registration number 16225385. The primary purpose of the entity is to shield the project's members from personal liability and to ensure the legal protection of the project's assets. Official up-to-date information about the entity can be found in the Estonian Business Register:
https://ariregister.rik.ee/eng/company/16225385/Organic-Maps-O%C3%9C
Organic Maps OÜ does not require contributors to transfer copyright ownership and does not retain any copyright over the code contributed to the repository. See the NOTICE file and docs/DCO.md for additional information.
For any legal inquiries, feel free to contact legal@organicmaps.app.

5
NOTICE
View file

@ -1,5 +1,4 @@
Copyright 2020 My.com B.V. (Mail.Ru Group)
Copyright 2024 Organic Maps Contributors
Copyright 2024 rebus.tj (Rebus Group) Not really Rebus will be updated
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@ -13,10 +12,10 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
The app is based on Organic maps.
Most libraries in the following directories made by other people and
organizations and licensed in different ways:
* `3party`
* `tools`
Please refer to their LICENCE, COPYING or NOTICE files for terms of use.
Some icons files may be copyrighted by (C) 2020 My.com B.V. (Mail.Ru Group)
See also `data/copyright.html` file for a full list of copyright notices.

202
README.md
View file

@ -1,30 +1,45 @@
<div align="center">
<img src="qt/res/logo.png" height="100"/>
</div>
<h1 align="center"">Organic Maps</h1>
# Tourism Map Tajikistan
[Organic Maps](https://organicmaps.app) is a free Android & iOS offline maps app for travellers, tourists, drivers, hikers, and cyclists.
It uses crowd-sourced [OpenStreetMap](https://www.openstreetmap.org) data and is developed with love by the creators of **MapsWithMe** (later renamed to **Maps.Me**) and by our community.
No ads, no tracking, no data collection, no crapware. Your [donations](https://organicmaps.app/donate/) and positive reviews motivate and inspire us, thanks ❤️!
This app is for Tajikistan tourists. It's based on open source app Organic map.
[<img src="docs/badges/apple-appstore.png" alt="App Store" width="160">](https://apps.apple.com/app/organic-maps/id1567437057)
[<img src="docs/badges/google-play.png" alt="Google Play" width="160">](https://play.google.com/store/apps/details?id=app.organicmaps)
[<img src="docs/badges/huawei-appgallery.png" alt="AppGallery" width="160">](https://appgallery.huawei.com/#/app/C104325611)
[<img src="docs/badges/obtainium.png" alt="Obtainium" width="160">](https://github.com/organicmaps/organicmaps/wiki/Installing-Organic-Maps-from-GitHub-using-Obtainium)
[<img src="docs/badges/fdroid.png" alt="F-Droid" width="160">](https://f-droid.org/en/packages/app.organicmaps/)
## Please Read all of this before continuing
<p float="left">
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/1.jpg" width="400" />
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/2.jpg" width="400" />
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/3.jpg" width="400" />
<img src="android/app/src/fdroid/play/listings/en-US/graphics/phone-screenshots/4.jpg" width="400" />
</p>
Don't forget make changes to this file, when you make significant changes to navigation.
version of Android Studio I used: android-studio-2024.1.1.13-mac_arm.dmg
version of XCode I used: 16.1
## Features
## Navigation on Android
The first activity app starts is SplashActivity.java. There it navigates to MainActivity
where all of the data about Tajikistan places are located,
it has its own navigation system on Jetpack compose.
There we navigateToAuthIfNotAuthed() and then navigateToMapToDownloadIfNotPresent().
In AuthActivity we move Tajikistan map to app's internal storage and if it is successful,
it won't navigate to map to download.
When map download is finished it will go to MainActivity.
When you sign in or up, it will navigate to MainActivity.
## Navigation on iOS
The first screen to be shown is Map screen (see MapsAppDelegate.mm). I (Emin) couldn't change it.
There's such logic in MapsAppDelegate.mm:
```
if (Tajikistan is loaded) {
if (token is nil) navigate to Auth (note: token is cleared when user signs out)
else navigate to TourismMain (Home)
}
```
In Auth when user signs in or up, it navigates to TourismMain
In TourismMain goes to auth if not authorized
## Features of their map
Organic Maps is the ultimate companion app for travellers, tourists, hikers, and cyclists:
- Detailed offline maps with places that don't exist on other maps, thanks to [OpenStreetMap](https://openstreetmap.org)
- Detailed offline maps with places that don't exist on other maps, thanks
to [OpenStreetMap](https://openstreetmap.org)
- Cycling routes, hiking trails, and walking paths
- Contour lines, elevation profiles, peaks, and slopes
- Turn-by-turn walking, cycling, and car navigation with voice guidance
@ -34,152 +49,9 @@ Organic Maps is the ultimate companion app for travellers, tourists, hikers, and
- Countries and regions don't take a lot of space
- Free and open-source
## Why Organic?
Organic Maps is pure and organic, made with love:
- Respects your privacy
- Saves your battery
- No unexpected mobile data charges
Organic Maps is free from trackers and other bad stuff:
- No ads
- No tracking
- No data collection
- No phoning home
- No annoying registration
- No mandatory tutorials
- No noisy email spam
- No push notifications
- No crapware
- ~~No pesticides~~ Purely organic!
The Android application is verified by the <a href="https://reports.exodus-privacy.eu.org/en/reports/app.organicmaps/latest/">Exodus Privacy Project:
<img src="docs/privacy/exodus.png" width="400">
</a>
The iOS application is verified by <a href="https://ios.trackercontrol.org/analysis/app.organicmaps">TrackerControl for iOS:
<img src="docs/privacy/trackercontrol-ios.png" width="400">
</a>
<br/>
Organic Maps doesn't request excessive permissions to spy on you:
<p float="left">
<img src="docs/privacy/om.jpg" width="400">
<img src="docs/privacy/mm.jpg" width="400">
</p>
At Organic Maps, we believe that privacy is a fundamental human right:
- Organic Maps is an indie community-driven open-source project
- We protect your privacy from Big Tech's prying eyes
- Stay safe no matter where you are
Reject surveillance - embrace your freedom.
[**Give Organic Maps a try!**](#install)
## Who is paying for the development?
The app is free for everyone, so we rely on donations. Please donate at [organicmaps.app/donate](https://organicmaps.app/donate) to support us!
Beloved institutional sponsors below have provided targeted grants to cover some infrastructure costs and fund development of new selected features:
<table>
<tr>
<td>
<a href="https://nlnet.nl/"><img src="docs/sponsors/nlnet.svg" alt="The NLnet Foundation" width="200px"></a>
</td>
<td>
<a href="https://github.com/organicmaps/organicmaps/milestone/7">The Search & Fonts improvement project</a> has been <a href="https://nlnet.nl/project/OrganicMaps/">funded</a> through NGI0 Entrust Fund. <a href="https://nlnet.nl/entrust/">NGI0 Entrust Fund</a> is established by the <a href="https://nlnet.nl/">NLnet Foundation</a> with financial support from the European Commission's <a href="https://www.ngi.eu/">Next Generation Internet programme</a>, under the aegis of DG Communications Networks, Content and Technology under grant agreement No 101069594.
</td>
</tr>
<tr>
<td>
<a href="https://summerofcode.withgoogle.com/"><img src="docs/sponsors/gsoc.svg" alt="Google Summer of Code" width="200px"></a>
</td>
<td>
<a href="https://summerofcode.withgoogle.com/">Google</a> backed 5 student's projects in the Google Summer of Code program during <a href="https://summerofcode.withgoogle.com/programs/2022/organizations/organic-maps">2022</a> and <a href="https://summerofcode.withgoogle.com/programs/2023/organizations/organic-maps">2023</a> programs. Noteworthy projects included Android Auto and Wikipedia Dump Extractor.
</td>
</tr>
<tr>
<td>
<a href="https://www.mythic-beasts.com/"><img src="docs/sponsors/mythic-beasts.png" alt="Mythic Beasts" width="200px"></a>
</td>
<td>
<a href="https://www.mythic-beasts.com/">Mythic Beasts</a> ISP <a href="https://www.mythic-beasts.com/blog/2021/10/06/improving-the-world-bit-by-expensive-bit/">provides us</a> two virtual servers with 400 TB/month of free bandwidth to host and serve maps downloads and updates.
</td>
</tr>
<tr>
<td>
<a href="https://44plus.vn"><img src="docs/sponsors/44plus.svg" alt="44+ Technologies" width="200px"></a>
</td>
<td>
<a href="https://44plus.vn">44+ Technologies</a> is <a href="https://44plus.vn/organicmaps">providing us </a>with a free dedicated server worth around $12,000/year to serve maps across Vietnam & Southeast Asia.
</td>
</tr>
<tr>
<td>
<a href="https://futo.org"><img src="docs/sponsors/futo.svg" alt="FUTO" width="200px"></a>
</td>
<td>
<a href="https://futo.org">FUTO</a> has <a href="https://www.youtube.com/watch?v=fJJclgBHrEw">awarded $1000 micro-grant</a> to Organic Maps in February 2023.
</td>
</tr>
</table>
The majority of all expenses have been funded by founders of the project since its inception. The project is far from achieving any sort of financial sustainability. The current level of voluntary donations falls significantly short of covering efforts needed to sustain the app. Any new developments of features are beyond the scope of possibility due to the absence of the necessary financial resources.
Please consider [donating](https://organicmaps.app/donate) if you want to see this open-source project thriving, not dying. There are [other ways how to support the project](#contributing). No coding skills required.
## Copyrights
Licensed under the Apache License, Version 2.0. See
[LICENSE](https://github.com/organicmaps/organicmaps/blob/master/LICENSE),
[NOTICE](https://github.com/organicmaps/organicmaps/blob/master/NOTICE)
and [data/copyright.html](http://htmlpreview.github.io/?https://github.com/organicmaps/organicmaps/blob/master/data/copyright.html)
[LICENSE](https://github.com/Ohpleaseman/tourism/blob/master/LICENSE),
[NOTICE](https://github.com/Ohpleaseman/tourism/blob/master/NOTICE)
for more information.
## Governance
See [docs/GOVERNANCE.md](docs/GOVERNANCE.md).
<a name="contributing">
## Contributing
If you want to build the project, check [docs/INSTALL.md](docs/INSTALL.md). If you want to help the project,
see [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md). You can [help in many ways](https://organicmaps.app/support-us/), the ability to code is not necessary.
## Beta
Please join our beta program, suggest your features, and report bugs:
- [iOS Beta (TestFlight)](https://testflight.apple.com/join/lrKCl08I)
- [Android Beta (Firebase)](https://appdistribution.firebase.dev/i/2f0fee463107b137)
## Feedback
- **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).
- 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) для обратной связи и помощи.
- Diğer kullanıcılarla tartışmak için [Telegram Grubumuza](https://t.me/OrganicMapsTR) katılın.
- Rejoignez notre groupe [Telegram](https://t.me/OrganicMapsFR) pour obtenir de l'aide.
- Contact us by [email](mailto:hello@organicmaps.app).
- Follow our updates in
[Mastodon](https://fosstodon.org/@organicmaps),
[Facebook](https://facebook.com/OrganicMaps),
[X (Twitter)](https://x.com/OrganicMapsApp),
[Instagram](https://instagram.com/organicmaps.app/).
- Güncellemelerimizi [Instagram](https://instagram.com/organicmapstr/) üzerinden takip edin.
The Organic Maps community abides by the CNCF [code of conduct](https://github.com/organicmaps/organicmaps/blob/master/docs/CODE_OF_CONDUCT.md).

2
android/.gitignore vendored
View file

@ -22,5 +22,3 @@ local.properties
lint.xml
.gradletasknamecache
# Generated by Eclipse and JDTLS
.settings/

View file

@ -31,3 +31,6 @@
# ignore autogenerated metadata (see prepareGoogleReleaseListing in build.gradle)
/src/google/play/listings
# ignore google releases
/google/release

View file

@ -12,28 +12,36 @@ buildscript {
def taskName = getGradle().getStartParameter().getTaskRequests().toString().toLowerCase()
def isFdroid = taskName.contains('fdroid')
def isBeta = taskName.contains('beta')
def isRelease = taskName.contains('release')
// Firebase Crashlytics compile-time feature flag: -Pfirebase=true|false
def googleFirebaseServicesFlag = findProperty('firebase')
// Enable Firebase for all beta flavors except fdroid only if google-services.json exists.
def googleFirebaseServicesDefault = isBeta && !isFdroid && file("$projectDir/google-services.json").exists()
ext.googleFirebaseServicesEnabled = googleFirebaseServicesFlag != null ?
googleFirebaseServicesFlag == '' || googleFirebaseServicesFlag.toBoolean() :
googleFirebaseServicesDefault
/*
We want to use Firebase Crashlytics for Tourism. We can't use it for debug,
because debug version has its own package_name, release doesn't, so I (Emin) changed
the condition for ext.googleFirebaseServicesEnabled
*/
// ext.googleFirebaseServicesEnabled = googleFirebaseServicesFlag != null ?
// googleFirebaseServicesFlag == '' || googleFirebaseServicesFlag.toBoolean() :
// googleFirebaseServicesDefault
ext.googleFirebaseServicesEnabled = isRelease
dependencies {
classpath 'com.android.tools.build:gradle:8.7.3'
classpath 'com.android.tools.build:gradle:8.4.1'
if (googleFirebaseServicesEnabled) {
println('Building with Google Firebase Services')
classpath 'com.google.gms:google-services:4.4.2'
classpath 'com.google.firebase:firebase-crashlytics-gradle:3.0.2'
classpath 'com.google.firebase:firebase-appdistribution-gradle:5.0.0'
classpath 'com.google.gms:google-services:4.4.1'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9'
classpath 'com.google.firebase:firebase-appdistribution-gradle:4.2.0'
} else {
println('Building without Google Firebase Services')
}
classpath('com.github.triplet.gradle:play-publisher:3.10.1')
classpath('com.github.triplet.gradle:play-publisher:3.9.1')
classpath('ru.cian:huawei-publish-gradle-plugin:1.4.2')
}
}
@ -45,6 +53,7 @@ repositories {
}
apply plugin: 'com.android.application'
apply from: 'secure.properties'
if (googleFirebaseServicesEnabled) {
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.crashlytics'
@ -52,6 +61,11 @@ if (googleFirebaseServicesEnabled) {
}
apply plugin: 'com.github.triplet.play'
apply plugin: 'ru.cian.huawei-publish-gradle-plugin'
apply plugin: 'org.jetbrains.kotlin.android'
apply plugin: 'kotlin-parcelize'
apply plugin: 'org.jetbrains.kotlin.plugin.serialization'
apply plugin: 'kotlin-kapt'
apply plugin: 'com.google.dagger.hilt.android'
def run(cmd) {
def stdout = new ByteArrayOutputStream()
@ -80,15 +94,14 @@ def getCommitMessage() {
def osName = System.properties['os.name'].toLowerCase()
project.ext.appId = 'app.organicmaps'
project.ext.appName = 'Organic Maps'
project.ext.appId = 'tj.tourism.rebus'
project.ext.appName = 'Tourism Map Tajikistan'
// I have Java 21 installed, but this doesn't work on MacOS.
//java {
// toolchain {
// languageVersion.set(JavaLanguageVersion.of(17))
// }
//}
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(17))
}
}
android {
namespace 'app.organicmaps'
@ -96,19 +109,20 @@ android {
buildFeatures {
dataBinding = true
buildConfig = true
compose true
}
// All properties are read from gradle.properties file
compileSdk propCompileSdkVersion.toInteger()
ndkVersion '27.2.12479018'
ndkVersion '26.3.11579264'
defaultConfig {
// Default package name is taken from the manifest and should be app.organicmaps
def ver = getVersion()
versionCode = ver.V1
versionName = ver.V2
println('Version: ' + versionName)
println('VersionCode: ' + versionCode)
versionCode = 4
versionName = "1.0.1"
// println('Version: ' + versionName)
// println('VersionCode: ' + versionCode)
minSdk propMinSdkVersion.toInteger()
targetSdk propTargetSdkVersion.toInteger()
applicationId project.ext.appId
@ -129,11 +143,6 @@ android {
enableVulkanDiagnostics = project.getProperty('enableVulkanDiagnostics')
}
def enableTrace = 'OFF'
if (project.hasProperty('enableTrace')) {
enableTrace = project.getProperty('enableTrace')
}
cmake {
cppFlags '-fexceptions', '-frtti'
// There is no sense to enable sections without gcc's --gc-sections flag.
@ -141,8 +150,7 @@ android {
'-Wno-extern-c-compat'
arguments '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=c++_static',
"-DOS=$osName", '-DSKIP_TESTS=ON', '-DSKIP_TOOLS=ON', "-DUSE_PCH=$pchFlag",
"-DNJOBS=$njobs", "-DENABLE_VULKAN_DIAGNOSTICS=$enableVulkanDiagnostics",
"-DENABLE_TRACE=$enableTrace"
"-DNJOBS=$njobs", "-DENABLE_VULKAN_DIAGNOSTICS=$enableVulkanDiagnostics"
targets 'organicmaps'
}
}
@ -172,6 +180,9 @@ android {
}
setProperty('archivesBaseName', appName.replaceAll('\\s','') + '-' + defaultConfig.versionCode)
vectorDrawables {
useSupportLibrary true
}
}
flavorDimensions += 'default'
@ -246,11 +257,6 @@ android {
}
}
def securityPropertiesFileExists = file('secure.properties').exists()
if (securityPropertiesFileExists) {
apply from: 'secure.properties'
}
signingConfigs {
debug {
storeFile file('debug.keystore')
@ -260,15 +266,10 @@ android {
}
release {
if (securityPropertiesFileExists) {
println('The release signing keys are available')
storeFile file(spropStoreFile)
storePassword spropStorePassword
keyAlias spropKeyAlias
keyPassword spropKeyPassword
} else {
println('The release signing keys are unavailable')
}
storeFile file(spropStoreFile)
storePassword spropStorePassword
keyAlias spropKeyAlias
keyPassword spropKeyPassword
}
}
@ -360,10 +361,80 @@ android {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = '17'
}
composeOptions {
kotlinCompilerExtensionVersion '1.5.14'
}
packaging {
resources {
excludes += '/META-INF/{AL2.0,LGPL2.1}'
}
}
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.8.7'
implementation 'androidx.activity:activity-compose:1.9.3'
implementation platform('androidx.compose:compose-bom:2024.12.01')
implementation 'androidx.compose.ui:ui'
implementation 'androidx.compose.ui:ui-graphics'
implementation 'androidx.compose.ui:ui-tooling-preview'
implementation 'androidx.compose.material3:material3'
androidTestImplementation platform('androidx.compose:compose-bom:2024.12.01')
androidTestImplementation 'androidx.compose.ui:ui-test-junit4'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
debugImplementation 'androidx.compose.ui:ui-tooling'
debugImplementation 'androidx.compose.ui:ui-test-manifest'
// hilt
def hilt = '2.51.1'
implementation "com.google.dagger:hilt-android:$hilt"
kapt "com.google.dagger:hilt-compiler:$hilt"
kapt "androidx.hilt:hilt-compiler:1.2.0"
implementation 'androidx.hilt:hilt-navigation-compose:1.2.0'
// navigation
implementation 'androidx.navigation:navigation-compose:2.8.5'
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3"
// countries
implementation 'com.hbb20:ccp:2.7.3'
// webview
implementation "androidx.webkit:webkit:1.11.0"
// compress
implementation 'id.zelory:compressor:3.0.1'
// restart app
implementation 'com.jakewharton:process-phoenix:3.0.0'
//Background processing
def coroutines = '1.8.1'
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines"
// Coroutine Lifecycle Scopes
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7'
// region Network
// Retrofit
def retrofit = '2.11.0'
implementation "com.squareup.retrofit2:retrofit:$retrofit"
implementation "com.squareup.retrofit2:converter-gson:$retrofit"
def okhttp = '5.0.0-alpha.14'
implementation "com.squareup.okhttp3:okhttp:$okhttp"
implementation "com.squareup.okhttp3:logging-interceptor:$okhttp"
implementation 'com.google.code.gson:gson:2.11.0'
def coil_version = '2.7.0'
implementation("io.coil-kt:coil-compose:$coil_version")
implementation("io.coil-kt:coil-svg:$coil_version")
// endregion
// Room
def room = '2.6.1'
implementation "androidx.room:room-ktx:$room"
implementation "androidx.room:room-runtime:$room"
kapt "androidx.room:room-compiler:$room"
// Google Play Location Services
//
@ -374,17 +445,14 @@ dependencies {
// ls -la src/$flavor/java/app/organicmaps/location/GoogleFusedLocationProvider.java
// ```
//
webImplementation 'com.google.android.gms:play-services-location:21.3.0'
googleImplementation 'com.google.android.gms:play-services-location:21.3.0'
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'
webImplementation 'com.google.android.gms:play-services-location:21.2.0'
googleImplementation 'com.google.android.gms:play-services-location:21.2.0'
huaweiImplementation 'com.google.android.gms:play-services-location:21.2.0'
// Google Firebase Services
if (googleFirebaseServicesEnabled) {
// Import the BoM for the Firebase platform
implementation platform('com.google.firebase:firebase-bom:33.5.1')
implementation platform('com.google.firebase:firebase-bom:32.8.0')
// Add the dependencies for the Crashlytics and Analytics libraries
// When using the BoM, you don't specify versions in Firebase library dependencies
implementation 'com.google.firebase:firebase-crashlytics'
@ -395,32 +463,36 @@ dependencies {
// > A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable
// 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 '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.constraintlayout:constraintlayout:2.2.0'
implementation 'androidx.fragment:fragment:1.8.5'
implementation 'androidx.core:core:1.13.1'
implementation(platform('org.jetbrains.kotlin:kotlin-bom:1.9.23'))
implementation 'androidx.annotation:annotation:1.8.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.car.app:app:1.7.0-alpha02'
implementation 'androidx.car.app:app-projected:1.7.0-alpha02'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.fragment:fragment:1.7.1'
implementation 'androidx.preference:preference:1.2.1'
implementation 'androidx.recyclerview:recyclerview:1.3.2'
implementation 'androidx.work:work-runtime:2.10.0'
implementation 'androidx.lifecycle:lifecycle-process:2.8.7'
implementation 'androidx.work:work-runtime:2.9.0'
implementation 'androidx.lifecycle:lifecycle-process:2.8.0'
implementation 'com.google.android.material:material:1.12.0'
// Fix for app/organicmaps/util/FileUploadWorker.java:14: error: cannot access ListenableFuture
// https://github.com/organicmaps/organicmaps/issues/6106
implementation 'com.google.guava:guava:33.3.0-android'
implementation 'com.google.guava:guava:33.1.0-android'
implementation 'com.github.devnullorthrow:MPAndroidChart:3.2.0-alpha'
implementation 'net.jcip:jcip-annotations:1.0'
// Test Dependencies
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
testImplementation 'junit:junit:4.13.2'
testImplementation 'org.mockito:mockito-core:5.15.2'
testImplementation 'org.mockito:mockito-core:5.11.0'
testImplementation 'org.mockito:mockito-inline:5.2.0'
}
kapt {
correctErrorTypes true
}
tasks.withType(JavaCompile) {
options.compilerArgs << '-Xlint:unchecked' << '-Xlint:deprecation'
}
@ -462,7 +534,7 @@ task prepareGoogleReleaseListing {
play {
enabled.set(false)
track.set('production')
track.set('alpha')
defaultToAppBundles.set(true)
releaseStatus.set(ReleaseStatus.IN_PROGRESS)
serviceAccountCredentials.set(file('google-play.json'))

View file

@ -28,3 +28,25 @@
# R8 crypts the source line numbers in all log messages.
# https://github.com/organicmaps/organicmaps/issues/6559#issuecomment-1812039926
-dontoptimize
# For some unknown reason we couldn't find out, requests are not working properly
# when the app is shrinked and/or minified, so we keep all of these things out from R8 effects.
-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation
-keep,allowobfuscation,allowshrinking interface retrofit2.Call
-keep,allowobfuscation,allowshrinking class retrofit2.Response
-if interface * { @retrofit2.http.* public *** *(...); }
-keep,allowoptimization,allowshrinking,allowobfuscation class <3>
-keep class app.tourism.data.remote.** { *; }
-keep public class app.tourism.data.dto.** {
public void set*(***);
public *** get*();
public protected private *;
}
-keep public class app.tourism.domain.models.** {
public void set*(***);
public *** get*();
public protected private *;
}

View file

@ -0,0 +1,28 @@
package app.organicmaps;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest
{
@Test
public void useAppContext()
{
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("app.organicmaps", appContext.getPackageName());
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 976 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#000000</color>
</resources>

View file

@ -1 +0,0 @@
../../../../google/java/app/organicmaps/location

View file

@ -0,0 +1,18 @@
package app.organicmaps.location;
import android.content.Context;
import androidx.annotation.NonNull;
public class LocationProviderFactory
{
public static boolean isGoogleLocationAvailable(@NonNull @SuppressWarnings("unused") Context context)
{
return false;
}
public static BaseLocationProvider getProvider(@NonNull Context context, @NonNull BaseLocationProvider.Listener listener)
{
return new AndroidNativeProvider(context, listener);
}
}

View file

@ -1,8 +1,9 @@
• 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
• Sort bookmarks and tracks by name
• Transitioned to the new OpenStreetMap authentication mechanism — all authenticated OSM users must re-login
• OpenStreetMap data as of April 29
• Difficult hiking trails are now brown-dotted, expert ones are black
• Dark blue lines for dedicated cycleways, mixed with white/brown dashes for shared foot/cycle paths
• Roads are now visible under semi-transparent bridges
• Fixed GPX import from Google Files app
…more details at omaps.org/news

View file

@ -1,8 +1,9 @@
• 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
• Sort bookmarks and tracks by name
• Transitioned to the new OpenStreetMap authentication mechanism — all authenticated OSM users must re-login
• OpenStreetMap data as of April 29
• Difficult hiking trails are now brown-dotted, expert ones are black
• Dark blue lines for dedicated cycleways, mixed with white/brown dashes for shared foot/cycle paths
• Roads are now visible under semi-transparent bridges
• Fixed GPX import from Google Files app
…more details at omaps.org/news

View file

@ -1,8 +1,9 @@
• Новыя дадзеныя OpenStreetMap ад 27 лютага
• Магчымасць уручную расстаўляць прамежкавыя кропкі маршруту
• Экспарт аднаго абранага трэка са спісу
• Палепшаная маршрутызацыя для веласіпедыстаў
• Дададзена сістэмнае апавяшчэнне пры загрузцы карт, фонавыя загрузкі больш не перарываюцца
• Дададзены мігатлівы віджэт запісу трэка
• Сартаванне закладак і сцежак па імені
• Дадзеныя OpenStreetMap па стане на 29 красавіка
• Трэба ізноў залагініцца ў OSM
• Складаныя паходныя сцежкі зараз карычневыя, а экспертныя шляхі чорныя
• Веласіпедныя дарожкі цяпер цёмна-сінія, пункцірам там, дзе яны ідуць па пешаходных сцежках
• Цяпер бачна дарогі пад напаўпразрыстымі мастамі
• Выпраўлены імпарт GPX з прыкладання Google Files
і шматлікае іншае на omaps.org/news
больш падрабязна на omaps.org/news

View file

@ -1,8 +1,9 @@
• 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
• Sort bookmarks and tracks by name
• Transitioned to the new OpenStreetMap authentication mechanism — all authenticated OSM users must re-login
• OpenStreetMap data as of April 29
• Difficult hiking trails are now brown-dotted, expert ones are black
• Dark blue lines for dedicated cycleways, mixed with white/brown dashes for shared foot/cycle paths
• Roads are now visible under semi-transparent bridges
• Fixed GPX import from Google Files app
…more details at omaps.org/news

View file

@ -1,8 +1,9 @@
• 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
• Sort bookmarks and tracks by name
• Transitioned to the new OpenStreetMap authentication mechanism — all authenticated OSM users must re-login
• OpenStreetMap data as of April 29
• Difficult hiking trails are now brown-dotted, expert ones are black
• Dark blue lines for dedicated cycleways, mixed with white/brown dashes for shared foot/cycle paths
• Roads are now visible under semi-transparent bridges
• Fixed GPX import from Google Files app
…more details at omaps.org/news

View file

@ -1,8 +1,9 @@
• 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
• Sort bookmarks and tracks by name
• Transitioned to the new OpenStreetMap authentication mechanism — all authenticated OSM users must re-login
• OpenStreetMap data as of April 29
• Difficult hiking trails are now brown-dotted, expert ones are black
• Dark blue lines for dedicated cycleways, mixed with white/brown dashes for shared foot/cycle paths
• Roads are now visible under semi-transparent bridges
• Fixed GPX import from Google Files app
…more details at omaps.org/news

View file

@ -1,8 +1,9 @@
• 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
• Sort bookmarks and tracks by name
• Transitioned to the new OpenStreetMap authentication mechanism — all authenticated OSM users must re-login
• OpenStreetMap data as of April 29
• Difficult hiking trails are now brown-dotted, expert ones are black
• Dark blue lines for dedicated cycleways, mixed with white/brown dashes for shared foot/cycle paths
• Roads are now visible under semi-transparent bridges
• Fixed GPX import from Google Files app
…more details at omaps.org/news

View file

@ -1,8 +1,9 @@
• 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
• Sort bookmarks and tracks by name
• Transitioned to the new OpenStreetMap authentication mechanism — all authenticated OSM users must re-login
• OpenStreetMap data as of April 29
• Difficult hiking trails are now brown-dotted, expert ones are black
• Dark blue lines for dedicated cycleways, mixed with white/brown dashes for shared foot/cycle paths
• Roads are now visible under semi-transparent bridges
• Fixed GPX import from Google Files app
…more details at omaps.org/news

View file

@ -1,8 +1,9 @@
• 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
• Sort bookmarks and tracks by name
• Transitioned to the new OpenStreetMap authentication mechanism — all authenticated OSM users must re-login
• OpenStreetMap data as of April 29
• Difficult hiking trails are now brown-dotted, expert ones are black
• Dark blue lines for dedicated cycleways, mixed with white/brown dashes for shared foot/cycle paths
• Roads are now visible under semi-transparent bridges
• Fixed GPX import from Google Files app
weitere Details unter omaps.org/news
more details at omaps.org/news

View file

@ -1,8 +1,9 @@
• 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
• Sort bookmarks and tracks by name
• Transitioned to the new OpenStreetMap authentication mechanism — all authenticated OSM users must re-login
• OpenStreetMap data as of April 29
• Difficult hiking trails are now brown-dotted, expert ones are black
• Dark blue lines for dedicated cycleways, mixed with white/brown dashes for shared foot/cycle paths
• Roads are now visible under semi-transparent bridges
• Fixed GPX import from Google Files app
…more details at omaps.org/news

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 970 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

View file

@ -1,8 +1,9 @@
• 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
• Sort bookmarks and tracks by name
• Transitioned to the new OpenStreetMap authentication mechanism — all authenticated OSM users must re-login
• OpenStreetMap data as of April 29
• Difficult hiking trails are now brown-dotted, expert ones are black
• Dark blue lines for dedicated cycleways, mixed with white/brown dashes for shared foot/cycle paths
• Roads are now visible under semi-transparent bridges
• Fixed GPX import from Google Files app
…more details at omaps.org/news

View file

@ -1,8 +1,9 @@
• 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
• Sort bookmarks and tracks by name
• Transitioned to the new OpenStreetMap authentication mechanism — all authenticated OSM users must re-login
• OpenStreetMap data as of April 29
• Difficult hiking trails are now brown-dotted, expert ones are black
• Dark blue lines for dedicated cycleways, mixed with white/brown dashes for shared foot/cycle paths
• Roads are now visible under semi-transparent bridges
• Fixed GPX import from Google Files app
…more details at omaps.org/news

View file

@ -1,8 +1,9 @@
• 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
• Sort bookmarks and tracks by name
• Transitioned to the new OpenStreetMap authentication mechanism — all authenticated OSM users must re-login
• OpenStreetMap data as of April 29
• Difficult hiking trails are now brown-dotted, expert ones are black
• Dark blue lines for dedicated cycleways, mixed with white/brown dashes for shared foot/cycle paths
• Roads are now visible under semi-transparent bridges
• Fixed GPX import from Google Files app
…more details at omaps.org/news

Some files were not shown because too many files have changed in this diff Show more