Compare commits

..

1 Commits

Author SHA1 Message Date
Konstantin Pastbin
5848143203 [fdroid] Release version 2025.12.11-2
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-12-11 13:19:40 +07:00
834 changed files with 13408 additions and 28411 deletions

View File

@@ -1,55 +1,69 @@
# All non-assigned.
* @organicmaps/mergers
# Visual design.
/android/app/src/main/res/drawable*/ @comaps/design
/android/app/src/main/res/font/ @comaps/design
/android/app/src/main/res/mipmap*/ @comaps/design
/data/*.ttf @comaps/design
/data/resources-svg/ @comaps/design
/data/search-icons/ @comaps/design
/iphone/Maps/Images.xcassets/ @comaps/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/ @comaps/android
/android/app/src/main/java/app/comaps/car/ @comaps/android-auto
/docs/ANDROID_LOCATION_TEST.md @comaps/android
/docs/JAVA_STYLE.md @comaps/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/ @comaps/ios
/xcode/ @comaps/ios
/docs/OBJC_STYLE.md @comaps/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/ @comaps/styles
/data/types.txt @comaps/styles
/data/visibility.txt @comaps/styles
/data/mapcss-mapping.csv @comaps/styles
/data/replaced_tags.txt @comaps/styles
/data/classificator.txt @comaps/styles
/data/drules_* @comaps/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/ @comaps/styles
/tools/kothic/ @organicmaps/styles
# DevOps.
/.forgejo/workflows @comaps/devops
/android/*gradle* @comaps/devops
/docs/RELEASE_MANAGEMENT.md @comaps/devops
/xcode/fastlane/ @comaps/devops
/tools/python/maps_generator/ @comaps/devops
/generator/ @comaps/devops
/topography_generator/ @comaps/devops
/data/borders/ @comaps/devops
/data/conf/isolines/ @comaps/devops
/docs/SUBWAY_GENERATION.md @comaps/devops
/docs/MAPS.md @comaps/devops
/docs/EXPERIMENTAL_PUBLIC_TRANSPORT_SUPPORT.md @comaps/devops
/.forgejo/workflows @organicmaps/devops
/android/*gradle* @organicmaps/devops
/docs/RELEASE_MANAGEMENT.md @organicmaps/devops
/xcode/fastlane/ @organicmaps/devops
# Growth.
README.md @organicmaps/growth
/.forgejo/FUNDING.yml @organicmaps/growth
/android/app/src/fdroid/play/ @organicmaps/growth
/android/app/src/google/play/ @organicmaps/growth
/iphone/metadata/ @organicmaps/growth
# Legal.
LEGAL @comaps/admins
LICENSE @comaps/admins
NOTICE @comaps/admins
CONTRIBUTORS @comaps/admins
/docs/CODE_OF_CONDUCT.md @comaps/admins
/docs/DCO.md @comaps/admins
/docs/GOVERNANCE.md @comaps/admins
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

View File

@@ -1,3 +1 @@
open_collective: comaps
liberapay: comaps
custom: ["https://comaps.app/donate/"]

View File

@@ -14,22 +14,22 @@ on:
- LICENSE
- NOTICE
- README.md
- android/app/src/fdroid/**
- android/app/src/google/**
- iphone/**
- data/*-strings/**
- data/strings/**
- docs/**
- generator/**
- packaging/**
- libs/platform/*apple*
- libs/platform/*_ios*
- libs/platform/*_linux*
- libs/platform/*_mac*
- libs/platform/*qt*
- libs/platform/*_win*
- libs/pyhelpers/**
- platform/*apple*
- platform/*_ios*
- platform/*_linux*
- platform/*_mac*
- platform/*qt*
- platform/*_win*
- pyhelpers/**
- qt*/**
- skin_generator/**
- tools/**
- track_generator/**
- xcode/**
jobs:

View File

@@ -17,78 +17,36 @@ on:
- android/app/src/fdroid/**
- android/app/src/google/**
- iphone/**
- data/*-strings/**
- data/strings/**
- docs/**
- generator/**
- packaging/**
- libs/platform/*apple*
- libs/platform/*_ios*
- libs/platform/*_linux*
- libs/platform/*_mac*
- libs/platform/*qt*
- libs/platform/*_win*
- libs/pyhelpers/**
- platform/*apple*
- platform/*_ios*
- platform/*_linux*
- platform/*_mac*
- platform/*qt*
- platform/*_win*
- pyhelpers/**
- qt*/**
- skin_generator/**
- tools/**
- track_generator/**
- xcode/**
env:
SUBMODULE_CACHE_PATHS: |
.git/modules
3party/CMake-MetalShaderSupport
3party/Vulkan-Headers
3party/boost
3party/expat
3party/fast_double_parser
3party/fast_obj
3party/freetype/freetype
3party/gflags
3party/glaze
3party/glfw
3party/glm
3party/googletest
3party/harfbuzz/harfbuzz
3party/icu/icu
3party/imgui/imgui
3party/jansson/jansson
3party/just_gtfs
3party/protobuf/protobuf
3party/pugixml/pugixml
3party/utfcpp
tools/kothic
tools/osmctools
jobs:
lint:
name: Android Lint
runs-on: ubuntu-latest
container:
image: codeberg.org/comaps/docker-android-sdk:ubuntu-standalone-zy-docker
options: --user root
steps:
- name: Checkout sources
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Cache world map
uses: actions/cache@v4
with:
path: data/world_mwm
key: world-mwm
- uses: actions/cache@v4
with:
path: ${{ env.SUBMODULE_CACHE_PATHS }}
key: submodules-${{ hashFiles('.gitmodules') }}
restore-keys: |
submodules-
- name: Sync and update submodules
- name: Parallel submodules checkout
shell: bash
run: |
git submodule sync --recursive
git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
- name: Lint
shell: bash
@@ -98,9 +56,6 @@ jobs:
android-check:
name: Build Android Debug
runs-on: ubuntu-latest
container:
image: codeberg.org/comaps/docker-android-sdk:ubuntu-standalone-zy-docker
options: --user root
strategy:
fail-fast: false
matrix:
@@ -116,32 +71,23 @@ jobs:
cancel-in-progress: true
steps:
- name: Install build tools and dependencies
shell: bash
run: |
sudo apt-get update -y
sudo apt-get install -y ninja-build
- name: Checkout sources
uses: actions/checkout@v4
with:
fetch-depth: 200 # enough to get all commits for the current day
- name: Cache world map
uses: actions/cache@v4
with:
path: data/world_mwm
key: world-mwm
- uses: actions/cache@v4
with:
path: ${{ env.SUBMODULE_CACHE_PATHS }}
key: submodules-${{ hashFiles('.gitmodules') }}
restore-keys: |
submodules-
- name: Sync and update submodules
- name: Parallel submodules checkout
shell: bash
run: |
git submodule sync --recursive
git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
- name: Configure ccache
uses: https://github.com/hendrikmuhs/ccache-action@v1.2
uses: hendrikmuhs/ccache-action@v1.2
with:
key: ${{ github.workflow }}-${{ matrix.flavor }}
@@ -151,11 +97,14 @@ jobs:
env:
CMAKE_C_COMPILER_LAUNCHER: ccache
CMAKE_CXX_COMPILER_LAUNCHER: ccache
run: ./gradlew -P${{ matrix.arch }} assemble${{ matrix.flavor }}
run: |
cmake --version
ninja --version
./gradlew -P${{ matrix.arch }} assemble${{ matrix.flavor }}
- name: Upload ${{ matrix.flavor }} apk
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: android-${{ matrix.flavor }}
path: android/app/build/outputs/apk/**/*.apk
path: android/app/build/outputs/apk/**/OrganicMaps-*.apk
if-no-files-found: error

View File

@@ -15,12 +15,12 @@ on:
- README.md
- docs/**
- packaging/**
- libs/platform/*apple*
- libs/platform/*_android*
- libs/platform/*_ios*
- libs/platform/*_mac*
- libs/platform/*_win*
- libs/pyhelpers/**
- platform/*apple*
- platform/*_android*
- platform/*_ios*
- platform/*_mac*
- platform/*_win*
- pyhelpers/**
- tools/**
- '!tools/python/test_server/**'
- xcode/**

View File

@@ -15,15 +15,15 @@ on:
- README.md
- android/**
- iphone/**
- data/*-strings/**
- data/strings/**
- docs/**
- packaging/**
- libs/platform/*apple*
- libs/platform/*_android*
- libs/platform/*_ios*
- libs/platform/*_mac*
- libs/platform/*_win*
- libs/pyhelpers/**
- platform/*apple*
- platform/*_android*
- platform/*_ios*
- platform/*_mac*
- platform/*_win*
- pyhelpers/**
- tools/**
- '!tools/python/test_server/**'
- xcode/**

View File

@@ -1,219 +0,0 @@
name: compare_subways
on:
workflow_dispatch: # Manual trigger
inputs:
subways-branch:
description: 'Check out a different subways repo branch?'
required: true
type: string
default: master
schedule:
# Run daily at 00:00 UTC
- cron: '0 0 * * *'
env:
#PLANET: /home/planet/planet/planet-latest.pbf
#TMPDIR: /tmp
HTML_DIR: "/mnt/4tbexternal/osm-planet/subway/validator"
#DUMP: "$HTML_DIR"
#SKIP_PLANET_UPDATE: "1"
SPREADSHEET_ID: "1SEW1-NiNOnA2qDwievcxYV1FOaQl1mb1fdeyqAxHu3k"
DEBIAN_FRONTEND: nonnteractive
TZ: Etc/UTC
# /var/www/html/subways is mapped as a volume on cdn-fi-1
# as is /tmp/planet
jobs:
clone-repos:
name: Clone Git Repos
runs-on: mapfilemaker
container:
image: codeberg.org/comaps/maps_generator:f6d53d54f794
volumes:
- /mnt/4tbexternal:/mnt/4tbexternal
concurrency:
group: ${{ github.workflow }}-compare-subways-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
steps:
- uses: actions/cache@v4
with:
path: "~"
key: cache-${{ github.run_id }}-${{ github.run_attempt }}}
- name: Checkout main repo
shell: bash
run: |
echo "Cloning $FORGEJO_SERVER_URL/$FORGEJO_REPOSITORY branch $FORGEJO_REF_NAME"
cd ~
git clone --depth 1 -b $FORGEJO_REF_NAME --single-branch $FORGEJO_SERVER_URL/$FORGEJO_REPOSITORY.git comaps
# --recurse-submodules --shallow-submodules
- name: Checkout subways repo
shell: bash
run: |
cd ~
git clone --depth 1 -b ${{ inputs.subways-branch }} --single-branch https://codeberg.org/comaps/subways.git
update-planet-pbf:
name: Update PBF Planet
runs-on: mapfilemaker
container:
image: codeberg.org/comaps/maps_generator:f6d53d54f794
volumes:
- /mnt/4tbexternal/:/mnt/4tbexternal/
- /mnt/4tbexternal/osm-planet:/home/planet
concurrency:
group: ${{ github.workflow }}-compare-subways-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
steps:
- name: Download Planet File if Absent
shell: bash
# TODO: replace wget2 with curl -Z
run: |
if [ ! -d /home/planet/planet/ ]; then
mkdir -p /home/planet/planet/
fi
if [ ! -f /home/planet/planet/planet-latest.osm.pbf ]; then
cd /home/planet/planet/
wget2 --verbose --progress=bar --continue https://ftpmirror.your.org/pub/openstreetmap/pbf/planet-latest.osm.pbf
else
echo "planet-latest.osm.pbf was found, raw download not required."
fi
- name: Update PBF Planet
shell: bash
run: |
cd /home/planet/planet/
rm -f planet-latest-new.osm.pbf
pyosmium-up-to-date planet-latest.osm.pbf -o planet-latest-new.osm.pbf -v --size 16384
mv planet-latest-new.osm.pbf planet-latest.osm.pbf
- name: Notify Zulip
run: |
curl -X POST https://comaps.zulipchat.com/api/v1/messages \
-u $ZULIP_BOT_EMAIL:$ZULIP_API_KEY \
--data-urlencode type=stream \
--data-urlencode 'to="DevOps"' \
--data-urlencode topic=codeberg-bot \
--data-urlencode 'content=PBF planet update is done!'
update-planet-o5m:
if: false
name: Update O5M Planet
runs-on: mapfilemaker
container:
image: codeberg.org/comaps/maps_generator:f6d53d54f794
volumes:
- /mnt/4tbexternal/:/mnt/4tbexternal/
- /mnt/4tbexternal/osm-planet:/home/planet
concurrency:
group: ${{ github.workflow }}-compare-subways-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
steps:
- name: Check for O5M Planet File
shell: bash
run: |
if [ ! -f /home/planet/planet/planet.o5m ]; then
echo "WARN: No file at /home/planet/planet/planet.o5m"
if [ ! -f /home/planet/planet/planet-latest.osm.pbf ]; then
echo "ERROR: No file at /home/planet/planet/planet-latest.osm.pbf"
ls -al /home/planet/
ls -al /home/planet/planet/
exit 1
fi
echo "Converting planet-latest.osm.pbf to planet.o5m"
cd /home/planet/planet/
osmconvert -v --drop-author --drop-version --hash-memory=4000 planet-latest.osm.pbf -o=planet.o5m
echo "Conversion is done."
fi
- name: Update O5M planet
run: |
echo "Starting..."
cd /home/planet/planet/
rm -f planet-new.o5m
osmupdate -v --drop-author --drop-version --hash-memory=4000 --max-merge=32 --out-o5m planet.o5m planet-new.o5m
mv planet-new.o5m planet.o5m
echo "Done."
- name: Notify Zulip
run: |
curl -X POST https://comaps.zulipchat.com/api/v1/messages \
-u $ZULIP_BOT_EMAIL:$ZULIP_API_KEY \
--data-urlencode type=stream \
--data-urlencode 'to="DevOps"' \
--data-urlencode topic=codeberg-bot \
--data-urlencode 'content=O5M planet update is done!'
compare-subways:
name: Compare Subways
runs-on: mapfilemaker
needs:
- clone-repos
container:
image: codeberg.org/comaps/maps_generator:f6d53d54f794
volumes:
- /mnt/4tbexternal/:/mnt/4tbexternal/
- /mnt/4tbexternal/osm-planet:/home/planet
concurrency:
group: ${{ github.workflow }}-compare-subways-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
steps:
- uses: actions/cache@v4
with:
path: "~"
key: cache-${{ github.run_id }}-${{ github.run_attempt }}
- name: Compare Subways
shell: bash
run: |
cd ~/comaps/
cp tools/unix/maps/settings.sh.prod tools/unix/maps/settings.sh
./tools/unix/maps/generate_subways.sh
- name: Notify Zulip
run: |
curl -X POST https://comaps.zulipchat.com/api/v1/messages \
-u $ZULIP_BOT_EMAIL:$ZULIP_API_KEY \
--data-urlencode type=stream \
--data-urlencode 'to="DevOps"' \
--data-urlencode topic=codeberg-bot \
--data-urlencode 'content=Subways are done!'
- name: Compare with VK validation
shell: bash
run: |
set -e
cd ~/subways
if [ -f "$HTML_DIR/cities.txt" ]; then
echo "Comparing local validation with VK's validation..."
python3 ./scripts/compare_html_validation.py "$HTML_DIR/cities.txt" \
--remote-url "https://maps.vk.com/osm/tools/subways/latest/cities.txt"
else
echo "Local cities.txt not found at $HTML_DIR/cities.txt"
exit 1
fi
- name: Compare Google Sheets Data
shell: bash
run: |
set -e
# Download the Google Sheets data
GOOGLE_SHEETS_URL="https://docs.google.com/spreadsheets/d/${SPREADSHEET_ID}/export?format=csv"
echo "Downloading Google Sheets data from: $GOOGLE_SHEETS_URL"
curl -sL "$GOOGLE_SHEETS_URL" -o /tmp/google_sheets.csv
# Normalize line endings to avoid spurious diffs
sed 's/\r$//' source_data/Rapid.csv > /tmp/local_normalized.csv
sed 's/\r$//' /tmp/google_sheets.csv > /tmp/google_normalized.csv
# Generate unified diff
echo ""
echo "Differences between local Rapid.csv and Google Sheets:"
echo ""
if diff -u /tmp/local_normalized.csv /tmp/google_normalized.csv > /tmp/full_diff.txt; then
echo "No differences found! Local Rapid.csv is in sync with Google Sheets."
exit 0
else
cat /tmp/full_diff.txt
echo ""
echo "The above diff can be saved as a patch and applied with:"
echo " patch source_data/Rapid.csv < patch-file"
echo "or by manually reviewing and applying the changes."
exit 1
fi

3
.github/FUNDING.yml vendored
View File

@@ -1,3 +0,0 @@
open_collective: comaps
liberapay: comaps
custom: ["https://comaps.app/donate/"]

View File

@@ -1,6 +1,9 @@
name: Android Check
on:
workflow_dispatch: # Manual trigger
push:
branches:
- main
env:
JAVA_HOME: /usr/lib/jvm/temurin-21-jdk-amd64 # Java 21 is required for Android Gradle 8 plugin
@@ -12,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v6
uses: actions/checkout@v4
with:
fetch-depth: 1
@@ -75,7 +78,7 @@ jobs:
pip install "protobuf<3.21" --break-system-packages
- name: Checkout sources
uses: actions/checkout@v6
uses: actions/checkout@v4
with:
fetch-depth: 200 # enough to get all commits for the current day
@@ -100,7 +103,7 @@ jobs:
./gradlew -P${{ matrix.arch }} assemble${{ matrix.flavor }}
- name: Upload ${{ matrix.flavor }} apk
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v4
with:
name: android-${{ matrix.flavor }}
path: android/app/build/outputs/apk/**/CoMaps-*.apk

View File

@@ -35,7 +35,7 @@ jobs:
xcodebuild -downloadPlatform iOS
- name: Checkout sources
uses: actions/checkout@v6
uses: actions/checkout@v4
- name: Parallel submodules checkout
shell: bash

9
.gitignore vendored
View File

@@ -31,9 +31,10 @@ data/types.txt*
data/visibility.txt*
data/colors.txt*
data/patterns.txt*
data/symbols/*/design/
data/colors_design.txt
data/patterns_design.txt
# TODO: designer is not used at the moment
# data/symbols/*/design/
# data/colors_design.txt
# data/patterns_design.txt
# Auto-generated from data/categories-strings/* by tools/unix/generate_categories.sh
data/categories.txt
@@ -154,8 +155,6 @@ android/huawei-appgallery.json
android/res/xml/network_security_config.xml
./server/
iphone/Maps/app.omaps/
# Generated file
libs/indexer/localized_types_map.cpp
*.li

View File

@@ -104,8 +104,7 @@ if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")
elseif (${CMAKE_BUILD_TYPE} MATCHES "Rel")
add_definitions(-DRELEASE)
if (NOT MSVC)
add_compile_options(-O3)
set (CMAKE_INTERPROCEDURAL_OPTIMIZATION True)
add_compile_options(-O3 $<$<CXX_COMPILER_ID:GNU>:-flto=auto>)
endif()
else()
message(FATAL_ERROR "Unknown build type: " ${CMAKE_BUILD_TYPE})
@@ -117,6 +116,20 @@ endif()
message(STATUS "Build type: " ${CMAKE_BUILD_TYPE})
if (PLATFORM_LINUX OR PLATFORM_ANDROID)
find_program(LLD_FOUND ld.lld)
if (LLD_FOUND)
message(STATUS "Using ld.lld linker")
set(CMAKE_EXE_LINKER_FLAGS "-fuse-ld=lld")
else()
find_program(GOLD_FOUND ld.gold)
if (GOLD_FOUND)
message(STATUS "Using ld.gold")
set(CMAKE_EXE_LINKER_FLAGS "-fuse-ld=gold")
endif()
endif()
endif()
if (NOT SKIP_TESTS)
enable_testing()
# Enables ctest -T memcheck with valgrind

View File

@@ -9,9 +9,7 @@ CoMaps contributors:
Bastian Greshake Tzovaras
clover sage
daxgar
Harry Bond <me@hbond.xyz>
NoelClick
thesupertechie
vikiawv
Yannik Bloscheck

2
NOTICE
View File

@@ -1,6 +1,6 @@
Copyright 2020 My.com B.V. (Mail.Ru Group)
Copyright 2025 Organic Maps Contributors
Copyright 2026 CoMaps Contributors
Copyright 2025 CoMaps Contributors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.

View File

@@ -22,8 +22,8 @@
<a href="https://codeberg.org/comaps/comaps/src/branch/main/LICENSE">
<img src="https://img.shields.io/github/license/comaps/comaps?style=for-the-badge&logo=opensourceinitiative&logoColor=white&color=588157" alt="License"/>
</a>
<a href="https://codeberg.org/comaps/comaps/actions?workflow=android-check.yaml">
<img src="https://codeberg.org/comaps/comaps/badges/workflows/android-check.yaml/badge.svg?label=Android%20Build&logo=android&logoColor=white&style=for-the-badge" alt="Android Build Status"/>
<a href="https://github.com/comaps/comaps/actions/workflows/android-check.yaml">
<img src="https://img.shields.io/github/actions/workflow/status/comaps/comaps/.github/workflows/android-check.yaml?label=Android%20Build&logo=android&logoColor=white&style=for-the-badge" alt="Android Build Status"/>
</a>
<a href="https://github.com/comaps/comaps/actions/workflows/ios-check.yaml">
<img src="https://img.shields.io/github/actions/workflow/status/comaps/comaps/.github/workflows/ios-check.yaml?label=iOS%20Build&logo=apple&logoColor=white&style=for-the-badge" alt="iOS Build Status"/>

View File

@@ -1,17 +0,0 @@
## Reporting Vulnerabilities
You can report a security vulnerability by creating an issue or send mail to security@comaps.app
## Verifying Fingerprints
To [verify](https://developer.android.com/studio/command-line/apksigner#usage-verify) the APK, use the following signing certificate fingerprints:
```
SHA-256: 4894e8e6963627ef660031d8593fe77297f835acb4e23810003e926135023b4c
SHA-1: 8b7b5739f917e9f7c681671ced0c9c8562123ade
MD5: 9cce0ffea281dc2f0e0a154d6d2e281e
```
To verify CoMaps via [AppVerifier](https://github.com/soupslurpr/AppVerifier), use the following signing certificate fingerprint:
```
app.comaps
48:94:E8:E6:96:36:27:EF:66:00:31:D8:59:3F:E7:72:97:F8:35:AC:B4:E2:38:10:00:3E:92:61:35:02:3B:4C
```

View File

@@ -254,20 +254,18 @@ android {
androidResources {
ignoreAssetsPattern = '!.svn:!.git:!.DS_Store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~'
noCompress = ['txt', 'bin', 'html', 'png', 'json', 'mwm', 'ttf', 'sdf', 'ui', 'config', 'csv', 'spv', 'obj']
// Some languages not supported by Android require to be specified here to be applied
localeFilters += [
"en",
"af",
"ar",
"az",
"be",
"bg",
"bn",
"ca",
"cs",
"da",
"de",
"el",
"en",
"en-rGB",
"es",
"es-rMX",
@@ -277,38 +275,28 @@ android {
"fi",
"fr",
"fr-rCA",
"gl",
"gsw",
"he",
"iw",
"hi",
"hu",
"id",
"in",
"is",
"it",
"iw",
"ja",
"kw",
"ko",
"lt",
"lv",
"mr",
"mt",
"nb",
"nb-rNO",
"nl",
"pl",
"pt",
"pt-rBR",
"ro",
"ru",
"sl",
"sk",
"sr",
"b+sr+Latn",
"sv",
"sw",
"ta",
"th",
"tr",
"uk",
@@ -363,8 +351,6 @@ dependencies {
implementation libs.androidx.recyclerview
implementation libs.androidx.work.runtime
implementation libs.androidx.lifecycle.process
implementation libs.androidx.documentfile
// 1.13 Material library version doesn't render properly alpha properties on map buttons
implementation libs.android.material
// Fix for app/organicmaps/util/FileUploadWorker.java:14: error: cannot access ListenableFuture
// https://github.com/organicmaps/organicmaps/issues/6106

View File

@@ -1,32 +0,0 @@
تطبيق خرائط مجاني ومفتوح المصدر تقوده المجتمع، مبني على بيانات OpenStreetMap ويعززه الالتزام بالشفافية والخصوصية وعدم الربح. CoMaps هو فرع/انبثاق من Organic Maps، والذي بدوره هو فرع من Maps.ME.
اقرأ المزيد عن أسباب المشروع واتجاهه على <b><i>codeberg.org/comaps</i></b>.
انضم إلى المجتمع هناك وساعد في صنع أفضل تطبيق خرائط
• استخدم التطبيق وانشر الكلمة عنه
• قدم الملاحظات وأبلغ عن المشكلات
• حدِّث بيانات الخرائط في التطبيق أو على موقع OpenStreetMap
‣ <b>مرتكز على وضع عدم الاتصال</b>: خطط وابحث عن طريقك في رحلتك بالخارج دون الحاجة إلى خدمة الهاتف الخلوي، ابحث عن نقاط الطريق أثناء التنزه البعيد، إلخ. جميع وظائف التطبيق مصممة للعمل دون اتصال.
‣ <b>يحترم الخصوصية</b>: التطبيق مصمم مع مراعاة الخصوصية - لا يحدد هوية الأشخاص، لا يتتبع، ولا يجمع المعلومات الشخصية. خالٍ من الإعلانات.
‣ <b>بسيط ومصقول</b>: ميزات أساسية سهلة الاستخدام تعمل ببساطة.
‣ <b>يوفر بطاريتك ومساحتك</b>: لا يستنزف بطاريتك مثل تطبيقات الملاحة الأخرى. الخرائط المدمجة توفر مساحة ثمينة على هاتفك.
‣ <b>مجاني ومبني من قبل المجتمع</b>: ساعد أشخاص مثلك في بناء التطبيق بإضافة أماكن إلى OpenStreetMap، واختبار الميزات وإبداء الملاحظات، والمساهمة بمهاراتهم التطويرية وأموالهم.
‣ <b>قرارات ومالية مفتوحة وشفافة، غير ربحية ومفتوحة المصدر بالكامل.</b>
<b>الميزات الرئيسية</b>:
• خرائط تفصيلية قابلة للتحميل تحتوي على أماكن غير متوفرة في خرائط Google
• وضع خارجي مع مسارات المشي لمسافات طويلة المميزة، مواقع التخييم، مصادر المياه، القمم، خطوط الكنتور، إلخ
• ممرات المشي ومسارات الدراجات
• نقاط الاهتمام مثل المطاعم، محطات الوقود، الفنادق، المتاجر، المعالم السياحية والكثير غيرها
• البحث بالاسم أو العنوان أو فئة نقطة الاهتمام
• ملاحة مع إعلانات صوتية للمشي أو ركوب الدراجات أو القيادة
• وضع إشارة على أماكنك المفضلة بنقرة واحدة
• مقالات ويكيبيديا دون اتصال
• طبقة مترو الأنفاق والتوجيهات
• تسجيل المسار
• تصدير واستيراد العلامات والمسارات بصيغ KML وKMZ وGPX
• وضع الظلام للاستخدام أثناء الليل
• تحسين بيانات الخرائط للجميع باستخدام محرر مدمج أساسي
<b>الحرية هنا</b>
اكتشف رحلتك، ابحر في العالم مع وضع الخصوصية والمجتمع في المقدمة!

View File

@@ -1 +0,0 @@
تنقل سهل في الخريطة - اكتشف المزيد من رحلتك - مدعوم من المجتمع

View File

@@ -1 +0,0 @@
تنزه، تنقل، قُد بدون إتصال الإنترنت مع الخصوصية

View File

@@ -1,6 +1,6 @@
Eine von der Community betriebene, kostenlose Open-Source Karten-App, die auf OpenStreetMap Daten basiert. Transparent und nicht gewinnorientiert. CoMaps ist ein Fork/Abspaltung von Organic Maps, die wiederum ein Fork/Abspaltung von Maps.Me ist.
Lese mehr über die Gründe und Ziele des Projektes unter <b><i>codeberg.org/comaps</i></b> (auf Englisch).
Lese mehr über die Gründe und Ziele des Projektes unter <b><i>codeberg.org/comaps</i></b>.
Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
• Nutze die App und erzähle anderen davon
• Gib Feedback und melde Probleme
@@ -9,9 +9,9 @@ Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
‣ <b>Einfach und ausgereift</b>: Essenzielle, leicht zu bedienende Funktionen, die einfach funktionieren.
‣ <b>Offline-orientiert</b>: Plane und navigiere im Ausland ohne Mobilfunkverbindung, finde Wegpunkte auf abgelegenen Wanderungen usw. Alle Funktionen sind für den Offline-Einsatz konzipiert.
‣ <b>Datenschutzfreundlich</b>: Die App wurde mit Fokus auf Privatsphäre entwickelt keine Personenidentifikation, kein Tracking, keine Erfassung persönlicher Daten, keine Werbung.
‣ <b>Spart Akku und Speicherplatz</b>: Verbraucht nicht unnötig viel Akku wie andere Navi-Apps. Kompakte Karten sparen Speicherplatz auf deinem Gerät.
‣ <b>Spart Akku und Speicherplatz</b>: Verbraucht nicht unnötig Akku wie andere Navi-Apps. Kompakte Karten sparen Speicherplatz auf deinem Gerät.
‣ <b>Kostenlos und von der Community entwickelt</b>: Menschen wie du haben geholfen, diese App zu entwickeln durch das Hinzufügen von Orten zu OpenStreetMap, Testen von neuen Funktionen, Softwareentwicklung oder Spenden.
‣ <b>Offen und transparent bei Entscheidungen und Finanzen, gemeinnützig und vollständig Open-Source.</b>
‣ <b>Offen und transparent bei Entscheidungen und Finanzen, gemeinnützig und vollständig Open-Source</b>
<b>Hauptfunktionen</b>:
• Detaillierte, herunterladbare Karten mit Orten, die bei Google Maps oft fehlen
@@ -28,5 +28,5 @@ Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
• Dunkler Modus für die Nutzung bei Nacht
• Kartenbearbeitung direkt in der App mit einem einfachen Editor
<b>Freiheit beginnt hier</b>
Entdecke deine Reise, wobei Datenschutz und Gemeinschaft im Vordergrund stehen!
<b>Entdecke die Unabhängigkeit</b>
Entdecke deine Reise navigiere in der Welt mit Datenschutz!

View File

@@ -1,9 +1,10 @@
• OSM-Daten vom 6. Januar
Editor: POI mit mehr als einem Tag, (z.B. Arten von Kunstwerken wie Skulpturen...), mehr POI können als leer/stillgelegt werden
Miniatureisenbahnen & Kläranlagen hinzugefügt
Material 3-Dialoge & dunklerer Hintergrund im Darkmode
Fiktive Geschwindigkeitsbegrenzungen für Verbindungsstraßen entfernt
Versatz der Kameraausschnitt in der Navigation behoben
Weniger empfindliches langes Antippen
Weitere Details unter codeberg.org/comaps/comaps/releases
• OpenStreetMap-Daten vom 9. Dezember
Material 3 Design
Im OSM-Editor können nun Ladestationen hinzugefügt werden
Schuko und Typ E Ladestationen hinzugefügt
Verbesserte Suchvorschläge
Litauische und lettische Sprachankündigungen
Die Fahranweisungen wurden vergrößert
• Der Zoomlevel passt sich an die Distanz zur nächsten Abbiegung an
• Neue Anordnung der Einstellungen
Weitere Einzelheiten auf codeberg.org/comaps/comaps/releases

View File

@@ -1 +1 @@
Leichte Navigation Erlebe mehr von deiner Reise Community-unterstützt
Einfache Navigation - Entdecken Sie mehr von Ihrer Reise - Community-Entwickelt

View File

@@ -1,32 +0,0 @@
A community led free & open source maps app based on OpenStreetMap data and reinforced with commitment to transparency, privacy and being not-for-profit. CoMaps is a fork/spin-off of Organic Maps, which in turn is a fork of Maps.ME.
Read on about reasons for the project and its direction at <b><i>codeberg.org/comaps</i></b>.
Join the community there and help make the best maps app
• Use the app and spread the word about it
• Give feedback and report issues
• Update map data in the app or on the OpenStreetMap website
‣ <b>Offline focused</b>: Plan and navigate your trip abroad without the need for cellular service, search waypoints while on a distant hike, etc. All app functions are designed to work offline.
‣ <b>Respecting Privacy</b>: The app is designed with privacy in mind - it does not identify people, does not track, and does not collect personal information. Ad free.
‣ <b>Simple and Polished</b>: essential easy to use features that just work.
‣ <b>Saves Your Battery and Space</b>: Doesnt drain your battery like other navigation apps. Compact maps save precious space on your phone.
‣ <b>Free and Built by the Community</b>: People like you helped build the app by adding places to OpenStreetMap, testing and giving feedback on features and contributing their development skills and money.
‣ <b>Open and Transparent Decision-making and Financials, Not-for-profit and Fully Open Source.</b>
<b>Main Features</b>:
• Downloadable detailed maps with places which are not available with Google Maps
• Outdoor mode with highlighted hiking trails, campsites, water sources, peaks, contour lines, etc
• Walking paths and cycleways
• Points of interest like restaurants, gas stations, hotels, shops, sightseeing and many more
• Search by name or an address or by point of interest category
• Navigation with voice announcements for walking, cycling, or driving
• Bookmark your favorite places with a single tap
• Offline Wikipedia articles
• Subway transit layer and directions
• Track recording
• Export and import bookmarks and tracks in KML, KMZ, GPX formats
• A dark mode to use during the night
• Improve map data for everyone using a basic built-in editor
<b>Freedom Is Here</b>
Discover your journey, navigate the world with privacy and community at the forefront!

View File

@@ -1,32 +0,0 @@
A community-led free & open source maps app based on OpenStreetMap data and reinforced with commitment to transparency, privacy and being not-for-profit. CoMaps is a fork/spin-off of Organic Maps, which in turn is a fork of Maps.ME.
Read on about reasons for the project and its direction at <b><i>codeberg.org/comaps</i></b>.
Join the community there and help make the best maps app
• Use the app and spread the word about it
• Give feedback and report issues
• Update map data in the app or on the OpenStreetMap website
‣ <b>Offline-focused</b>: Plan and navigate your trip abroad without the need for cellular service, search waypoints while on a distant hike, etc. All app functions are designed to work offline.
‣ <b>Respecting Privacy</b>: The app is designed with privacy in mind - does not identify people, does not track, and does not collect personal information. Ads-free.
‣ <b>Simple and Polished</b>: essential easy to use features that just work.
‣ <b>Saves Your Battery and Space</b>: Doesnt drain your battery like other navigation apps. Compact maps save precious space on your phone.
‣ <b>Free and Built by the Community</b>: People like you helped build the app by adding places to OpenStreetMap, testing and giving feedback on features and contributing their development skills and money.
‣ <b>Open and Transparent Decision-making and Financials, Not-for-profit and Fully Open Source.</b>
<b>Main Features</b>:
• Downloadable detailed maps with places which are not available with Google Maps
• Outdoor mode with highlighted hiking trails, campsites, water sources, peaks, contour lines, etc
• Walking paths and cycleways
• Points of interest like restaurants, gas stations, hotels, shops, sightseeing and many more
• Search by name or an address or by point of interest category
• Navigation with voice announcements for walking, cycling, or driving
• Bookmark your favorite places with a single tap
• Offline Wikipedia articles
• Subway transit layer and directions
• Track recording
• Export and import bookmarks and tracks in KML, KMZ, GPX formats
• A dark mode to use during the night
• Improve map data for everyone using a basic built-in editor
<b>Freedom Is Here</b>
Discover your journey, navigate the world with privacy and community at the forefront!

View File

@@ -1 +0,0 @@
Easy map navigation - Discover more of your journey - Powered by the community

View File

@@ -1 +0,0 @@
CoMaps - Hike, Bike, Drive Offline with Privacy

View File

@@ -1,9 +1,10 @@
• OpenStreetMap data as of January 6
Editor: add POI types with more than one OSM tag, e.g. artwork subtypes sculptures, paintings..; more POI types could be marked as vacant/disused
Added miniature railways and wastewater treatment plants
Use Material 3 dialogs and darker background in dark mode
Removed fictional speed limits for link roads
Fixed camera cutout offset in navigation
Less sensitive long tap (full-screen mode)
• OpenStreetMap data as of December 9
Use Material 3 themes
Support charging sockets in OSM Editor
Added schuko/type-E charge sockets
Improved search results ranking
Enabled Lithuanian and Latvian in voice announcements
Improved size of driving indications
• Base zoom level on distance to next turn
• Reordered settings
More details on codeberg.org/comaps/comaps/releases

View File

@@ -1,9 +1,11 @@
• Datos OSM a 06/01
Editor: se añaden tipos de POI con más de una etiqueta, ej. esculturas, pinturas...; se podrán marcar más tipos como en desuso
Se añaden ferrocarriles mini y plantas de tratamiento de aguas
• Se utilizan diálogos Material 3 y fondo más oscuro en el modo oscuro
• Se eliminan límites de velocidad ficticios para enlaces
• Se corrige desplazamiento en la navegación
Toque largo menos sensible (en pantalla completa)
• Datos de OpenStreetMap a fecha 9/12.
Uso de temas Material 3.
Compatibilidad con enchufes de recarga en Editor.
• Se añaden enchufes de recarga schuko/tipo E.
• Se mejora la búsqueda.
• Se habilitan el lituano y el letón en las indicaciones de voz.
Se aumenta el tamaño de las indicaciones de conducción.
• Nivel de zoom base según la distancia al siguiente giro.
• Se han reordenado los ajustes.
Más detalles en codeberg.org/comaps/comaps/releases

View File

@@ -1,9 +1,10 @@
• Données OpenStreetMap du 6 janvier
Éditeur : support des types de POI avec plus dun tag OSM, par exemple types dœuvres dart sculptures, peintures..
Rendu des rails pour trains miniatures et des stations dpuration
Utilisation des pop-ups Material 3 et d'un fond plus sombre en thème sombre
Suppression des limites de vitesse fictives sur les bretelles de routes
Correction des instructions de navigation sur les appareils avec des encoches
• Appui long moins sensible (en mode plein écran)
• Données OpenStreetMap du 9 Décembre
Utilisation de Material 3
Support de l'édition des bornes de recharge dans lditeur OSM
Ajout du type de prise schuko/type-E
Amélioration de l'ordre des résultats de recherche
Ajout du lituanien et du letton dans le guidage vocal
• Amélioration de la taille des instructions dans la navigation
• Niveau de zoom basé sur la distance jusquau prochain virage
• Réorganisation des paramètres
Plus de détails sur codeberg.org/comaps/comaps/releases

View File

@@ -1,7 +1,10 @@
• OpenStreetMap podaci od 6. siječnja
Uređivač: dodane točake interesa s više od jedne OSM oznake, npr. podtipovi umjetnina kao skulpture, slike...; više točaka interesa se sada može označiti kao upražnjene/napuštene
Dodane minijaturne željeznice i postrojenja za pročišćavanje otpadnih voda
Korištenje Material 3 dijaloga i tamnije pozadine u tamnom načinu rada
Uklonjena su izmišljena ograničenja brzine za spojne ceste
Više detalja na codeberg.org/comaps/comaps/releases
Podaci OpenStreetMap karte od 9. prosinca
Korištenje Material 3 tema
Podrška za utičnice za punjenje u OSM Editoru
Dodane šuko/tip-E utičnice
Poboljšano rangiranje rezultata pretraživanja
• Omogućeni litvanski i latvijski jezici u glasovnim najavama
• Povećana veličina indikatora vožnje
• Razina zumiranja se mijenja ovisno o udaljenosti do sljedećeg skretanja
• Promijenjen redoslijed postavki
Više detalja na codeberg.org/comaps/comaps/releases

View File

@@ -1 +0,0 @@
CoMaps- Navigasi Offline dengan Privasi

View File

@@ -1,32 +0,0 @@
Unn app mappys rydh hag ygor selys war an kemeneth, selys war data OpenStreetMap ha krefhys gans omrians dhe klerder, privetter, ha heb budh. CoMaps yw unn forgh a Organic Maps, unn forgh a Maps.ME.
Redya ma a-dro resons rag an ragdres hag y tu yn <b><i>codeberg.org/comaps</i></b>.
Omjunya an kemeneth ena ha gweres gul an app mappys gwella
• Devnydhya an app ha kevrenna y'n
• Dasliva ha derivas kudynnow
• Nowedhi data mappa yn an app po war an gwasiva OpenStreetMap
‣ <b>Fogellys war dhywarlinen</b>: Devisya ha viajya dha viaj tramor neb res rag gonis kellgowser, hwilas leow ha war unn gwandrans pell, h.e. Oll nasyow app yw desinys dhe oberi dhywarlinen.
‣ <b>Ow Gul Revrons dhe Privetter</b>: An app yw desinys gans privetter yn brys - na aswon tus, na helerghi, ha na kuntel kedhlow personel. Heb argemynnow.
‣ <b>Sempel ha Polsys</b>: nasyow es may oberi poran.
‣ <b>Sawya dha Batri hag Efander</b>: Na gwakhe dha batri haval dhe appys navigacyon aral. Mappys kesstrothys sawya efander precyous war dha kellgowser.
‣ <b>Rydh ha Byldys gans an Kemeneth</b>: Tus haval dhe ty gwerys byldya an app gans owth addya leos dhe OpenStreetMap, ow previ ha dasliva a-dro nasyow hag ow kevri aga sleynethow hag arghans i.
‣ <b>Erviransow hag Arghansereth Ygor ha Treusweladow, Heb Budh, ha Kod Ygor yn Leun</b>
<b>Nasyow Chif</b>
• Mappys manylys iskargadow gans leos ankavadow war Google Maps
• Fordh Yn-Mes gans olow gwandrans, kampvaow, pennfentynnyow dowr, menydhyow, linennow kettres, h.e.
• Hensyow kerdhyans ha diwrosyans
• Leow kepar ha bostiow, petrolvaow, ostelyow, gwethjiow, troyll gwelyow, ha moy
• Hwilas gans hanow po unn trigva po gans klass leow
• Navigacyon gans gwarnyansow kewsys rag ow walkya, ow diwrosa, po ow lewa
• Lyververkya dha leow drudh gans unn tava unnik
• Artiklow dhywarlinen Wikipedya
• Gwiskas metro ha tuyow
• Helerghyans lerghow
• Esperthi hag ynperthi lyververkys ha lerghow yn furvasow KML, KMZ, GPX
• Unn fordh du rag an nos
• Gwellhe data mappa rag peub ow devnydhya unn chanjyell selyek
<b>Rydhses Yw Omma</b>
Trovya dha viaj, viajya an nor gans privetter ha kemeneth a-talenebek!

View File

@@ -1 +0,0 @@
Navigacyon mappa es - Trovya moy a dha kerdh - Selys war an kemeneth

View File

@@ -1 +0,0 @@
CoMaps - Viajya gans Privetter

View File

@@ -1,32 +0,0 @@
Bendruomenės vystoma nemokama atvirojo kodo žemėlapių programa, pagrįsta „OpenStreetMap“ duomenimis ir sustiprinta įsipareigojimu užtikrinti skaidrumą, privatumą ir pelno nesiekimą. „CoMaps“ programa yra kilusi iš „Organic Maps“, o pastaroji iš programos „Maps.ME“.
Apie šio projekto kilmę, jos priežastis ir palaikomą kryptį galite paskaityti adresu <b><i>codeberg.org/comaps</i></b>.
Prisijunkite prie bendruomenės ir padėkite sukurti geriausią žemėlapių programą
• Naudokitės programa ir paskleiskite žinią apie ją
• Teikite atsiliepimus ir praneškite apie problemas
• Atnaujinkite žemėlapių duomenis programoje arba „OpenStreetMap“ svetainėje
‣ <b>Skirta naudoti neprisijungus prie interneto</b>: planuokite maršrutus ir keliaukite užsienyje be mobiliojo ryšio, ieškokite kelionės taškų tolimuose žygiuose ir pan. Visos programos funkcijos yra pritaikytos veikti be interneto ryšio.
‣ <b>Gerbia privatumą</b>: programėlė sukurta, teikiant prioritetą privatumui: neidentifikuoja žmonių, neseka ir nerenka asmeninės informacijos. Be reklamų.
‣ <b>Paprasta ir išbaigta</b>: esminės, lengvai naudojamos funkcijos, kurios tiesiog veikia.
‣ <b>Taupo bateriją ir vietą</b>: neišsekina baterijos kaip kitos navigacijos programos. Kompaktiški žemėlapiai tausoja vietą jūsų telefone.
‣ <b>Nemokama ir kuriama bendruomenės</b>: paprasti žmonės kaip jūs padėjo sukurti šią programą, pildydami „OpenStreetMap“ žemėlapį, išbandydami ir pateikdami atsiliepimus apie funkcijas bei prisidėdami savo programavimo įgūdžiais ir pinigais.
‣ <b>Atviras ir skaidrus sprendimų priėmimas ir finansai, ne pelno siekianti ir visiškai atviro kodo programa.</b>
<b>Pagrindinės funkcijos</b>:
• Atsisiunčiami išsamūs žemėlapiai su vietomis, kurių nėra „Google Maps“;
• Žygių pėsčiomis veiksena su pažymėtais pėsčiųjų takais, stovyklavietėmis, vandens šaltiniais, kalnų viršūnėmis, reljefo linijomis ir kt.;
• Pėsčiųjų ir dviračių takai;
• Potencialūs kelionės taškai, kaip antai restoranai, degalinės, viešbučiai, parduotuvės, lankytinos vietos ir daugelis kitų;
• Paieška pagal pavadinimą, adresą arba lankytinos vietos kategoriją;
• Navigacija su balso instrukcijomis pėstiesiems, dviratininkams ir motorinio transporto vairuotojams;
• Mėgstamų vietų įsiminimas vienu bakstelėjimu;
• „Vikipedijos“ straipsniai, prieinami neprisijungus prie interneto;
• Kelionių metro sluoksnis ir maršrutai;
• Trasų įrašymas;
• Žymių ir trasų eksportavimas ir importavimas KML, KMZ, GPX formatais;
• Tamsaus žemėlapio veiksena, skirta naudoti naktį;
• Galimybė papildyti žemėlapio duomenis visiems, naudojantis įtaisytuoju baziniu redaktoriumi.
<b>Laisvė yra čia</b>
Atraskite savo kelionę ir keliaukite po pasaulį, kuriame privatumas ir bendruomenė yra svarbiausia!

View File

@@ -1 +1 @@
Paprasta ir patogi navigacija Turiningesnės kelionės Vystoma bendruomenės
Paprasta ir patogi navigacija Turiningos kelionės Vystoma bendruomenės

View File

@@ -0,0 +1,10 @@
• Dane OpenStreetMap z 9 grudnia
• Użycie motywów Material 3
• Obsługa gniazd ładowania w Edytorze OSM
• Dodane gniazda ładowania schuko/type-E
• Poprawiony ranking wyników wyszukiwania
• Dodane litewskie i łotewskie komunikaty głosowe
• Poprawiony rozmiar znaków drogowych
• Poziom powiększenia oparty na odległości do następnego manewru
• Zmieniona kolejność ustawień
Więcej szczegółów na codeberg.org/comaps/comaps/releases

View File

@@ -1,9 +1,10 @@
• Dados OSM de 6/1
Editor: adição de POIs com mais de uma etiqueta OSM, por exemplo esculturas e pinturas; mais tipos de POI podem ser marcados como vagos/desativados
Adição de ferrovias em miniatura e ETEs
Uso de diálogos Material 3 e fundo mais escuro no modo escuro
Remoção de limites de velocidade fictícios para vias de ligação
Correção de recorte da câmera na navegação
Toque longo menos sensível (modo tela cheia)
• Dados OpenStreetMap atualizados em 9 de dezembro
Uso do estilo Material 3
Suporte para tomadas de carregamento no Editor OSM
Adição de tomadas de carregamento Schuko/Tipo E
Melhoria na classificação dos resultados de busca
Adição dos idiomas letão e lituano nas orientações por voz
Melhoria no tamanho das indicações de direção
• Nível de zoom baseado em distância até a próxima curva
• Configurações reordenadas
Mais detalhes em codeberg.org/comaps/comaps/releases

View File

@@ -1,8 +0,0 @@
• Карты OpenStreetMap от 6 января
• Редактор: возможность добавления POI, определяемых несколькими тегами, например церквей, мечетей, буддистских храмов..
• Добавлены миниатюрные железные дороги и очистные сооружения
• Использование диалогов Material 3 и более тёмного фона в тёмном режиме
• Удалены фиктивные ограничения скорости для заездов / съездов с шоссе
• Менее чувствительное длительное нажатие на экран (переход в полноэкранный режим)
Подробнее на codeberg.org/comaps/comaps/releases

View File

@@ -1,31 +1,31 @@
Brezplačno in odprtokodno zemljevidno orodje, ki ga vodi skupnost, temelji na podatkih OpenStreetMap in je okrepljena s predanostjo transparentnosti, zasebnosti in nepridobitnosti. CoMaps je izpeljanka OrganicMaps, ta pa je izpeljanka Maps.ME.
Brezplačno in odprtokodno zemljevidno orodje, ki ga vodi skupnost, temelji na podatkih OpenStreetMap in je okrepljena s predanostjo transparentnosti, zasebnosti in nedobičkonosnosti. CoMaps je izpeljanka OrganicMaps, ta pa je izpeljanka Maps.ME.
Preberite si o razlogih za ta projekt in njegovi usmerjenosti na <b><i>codeberg.org/comaps</i></b>.
Preverite si o razlogih za ta projekt in njegovi usmerjenosti na <b><i>codeberg.org/comaps</i></b>.
Pridružite se skupnosti in pomagajte narediti najboljše zemljevidno orodje
• Uporabljajte orodje in širite glas o njem
• Dajajte povratne informacije in poročajte o napakah
• Posodabljajte podatke zemljevida v tem orodju ali na spletni strani OpenStreetMap
‣ <b>Osredotočeno na uporabo brez povezave</b>: Načrtujte in se usmerjajte na vašem potovanju v tujini vrez potrebe po mobilnih podatkih, iščite vmesne točke potovanja ko ste na daljšem pohodu ipd. Vse zmogljivosti orodja so zasnovane za delo brez povezave.
‣ <b>Osredotočeno na uporabo brez povezave</b>: Načrtujte in se usmerjajte na vašem potovanju v tujini vrez potrebe po mobilnih podatkih, iščite vmesne točke potocanja ko ste na daljšem pohodu ipd. Vse zmogljivosti orodja so zasnovane za delo brez povezave.
‣ <b>Spoštovanje zasebnosti</b>: orodje je zasnovano z mislijo na zasebnost ne prepoznava oseb, ne sledi in ne zbira osebnih podatkov. Brez oglasov.
‣ <b>Preprosto in dodelano</b>: nujne zmogljivosti, enostavne za uporabo, ki preprosto delujejo.
‣ <b>Prihrani vašo baterijo in prostor.</b>: ne izčrpava vaše baterije kakor druga usmerjevalna orodja. Strnjeni zemljevidi prihranijo dragocen prostor na vašem telefonu.
‣ <b>Brezplačno in ustvarjeno v skupnosti</b>: ljudje kot ste vi pomagajo ustvarjati to orodje, tako da dodajajo kraje na OpenStreetMap, preizkušajo in dajejo povratne informacije o zmogljivostih in prispevajo svoje razvijalske sposobnosti in sredstva.
‣ <b>Odprto in transparentno odločanje in finance, nepridobitno in popolnoma odprtokodno.</b>
‣ <b>Odprto in transparentno odločanje in finance, nedobičkonosno in popolnoma odprtokodno.</b>
<b>Glavne zmogljivosti</b>:
• Prenosljivi podrobni zemljevidi s kraji, ki na Googlovih zemljevidih niso na voljo.
• Prenosljivi podrobni zemljevidi s kraji, ki na Googlovoh zemljevidih niso na voljo.
• Prikaz za dejavnosti na prostem s poudarjenimi pohodniškimi potmi, tabornimi prostori, vodnimi viri, vrhovi, plastnicami itd.
• Pešpoti in kolesarke poti
• Kraji zanimanja, npr. restavracije, bencinske črpalke, hoteli, trgovine, znamenitosti in mnogo več
• Iščite po imenu, hišnemu naslovu ali po vrsti
• Usmerjanje z glasovnimi navodili za hojo, kolesarjenje ali vožnjo avtomobila.
• Usmerjanje z glasovnimi obvestili za hojo, kolesarjenje ali vožnjo avtomobila.
• Zaznamujte svoje najljubše kraje s preprostim dotikom
• Wikipedijini članki brez povezave
• Prometna plast podzemne železnice z usmerjanjem
• Izvozite ali uvozite zaznamke in sledi v oblikah KML, KMZ, GPX
• Temni prikaz za uporabo ponoči
• Izboljšajte podatke zemljevida za vse z uporabo vgrajenega urejevalnika
• Izboljšajtw podatke zemljevida za vse z uporabo vgrajenega urejevalnika
<b>Svoboda je tu</b>
Odkijte več o vašem potovanju, usmerjajte se po svetu s poudarkom na zasebnosti in skupnostnem delovanju!

View File

@@ -1 +1 @@
Enostavno usmerjanje Odkrijte več o svojem potovanju Podprto v skupnosti
Enostavno usmerjanje Odkrij več o svojem potovanju Podprto v skupnosti

View File

@@ -1 +1 @@
CoMaps hodi in vozi brez povezave, zasebno
CoMapsHodi, kolesari, vozi brez povezave, zasebno

View File

@@ -1,32 +0,0 @@
Besplatna aplikacija otvorenog koda koju održava zajednica i koja se zasniva na OpenStreetMap podacima. Neprofitna, transparentna i ceni vašu privatnost. CoMaps je nastala od aplikacije Organic Maps, koja je nastala od aplikacije Maps.ME.
Pročitajte o razlozima projekta i njegovog pravca na <b><i>codeberg.org/comaps</i></b>
Pridružite se otvorenoj zajednici i pomozite da napravimo najbolju aplikaciju za mape
• Koristite aplikaciju i proširite glas o tome
• Dajte povratne informacije i prijavite probleme
• Ažurirajte podatke na mapi u aplikaciji ili na sajtu OpenStreetMap
‣ <b>Fokusirano na oflajn rad</b>: Planirajte i upravljajte putovanjem u inostranstvu bez potrebe za mobilnim internetom, tražite usputne tačke dok ste na zabačenom planinskom putu, itd. Sve funkcionalnosti su dizajnirane za rad bez interneta.
‣ <b>Poštovanje privatnosti</b>: Aplikacija je osmišljena sa privatnošću korisnika na umu - ne identifikuje ljude, ne prati ili prikuplja lične podatke. Nema reklama.
‣ <b>Jednostavno i elegantno</b>: Aplikacija je laka za upotrebu i jednostavno funkcioniše.
‣ <b>Čuva vašu bateriju i prostor</b>: Ne troši bateriju kao ostale aplikacije za navigaciju. Kompaktne mape čuvaju dragoceni prostor na vašem telefonu.
‣ <b>Otvoreno i napravljeno od strane zajednice</b>: Ljudi poput vas su doprineli razvoju aplikacije dodavanjem lokacija na OpenStreetMap, testiranjem, davanjem povratnih informacija o aplikaciji i pomogli su svojim programerskim veštinama i donacijama.
‣ <b>Otvoreno i transparentno donošenje odluka i upotreba donacija, neprofitna i potpuno otvorenog koda.</b>
<b> Glavne karakteristike </b>:
• Preuzmimanje detaljne mape sa lokacijama koje nisu dostupne sa Google mapama
• Režim za izlete sa istaknutim planinarskim stazama, kampovima, izvorima vode, planinskim vrhovima, izohipsama itd.
• Staze za planinarenje i bicikle
• Tačke interesa kao što su restorani, benzinske pumpe, hoteli, prodavnice, znamenitosti i još mnogo toga
• Pretraga po nazivu, adresi ili kategorijama
• Navigacija sa glasovnim instrukcijama za hodanje, vožnju bicikla ili automobila
• Označivanje omiljenih mesta jednim dodirom
• Oflajn članci Vikipedije
• Tranzitni sloj podzemne železnice sa navigacijom
• Snimanje GPS putanja
• Uvoz i uvoz markera i putanja u KML, KMZ, GPX formate
• Tamni režim za upotrebu tokom noći
• Poboljšajte kartu za sve korisnike, koristeći osnovni editor za mape
<b> Sloboda je ovde </b>
Otkrijte svoje putovanje, krećete se sa svetom sa privatnošću i zajednicom na prvom mestu!

View File

@@ -1 +0,0 @@
Jednostavna navigacija - Saznajte više o svom putovanju - Održava zajednica

View File

@@ -1 +0,0 @@
CoMaps - pešačenje, bicikl, vožnja sa privatnošću

View File

@@ -1 +1 @@
version: 2025.03.02-7-FDroid+25030207
version: 2025.12.11-2-FDroid+25121102

View File

@@ -1,36 +0,0 @@
تطبيق خرائط مجاني ومفتوح المصدر تقوده المجتمع، مبني على بيانات OpenStreetMap ويعززه الالتزام بالشفافية والخصوصية وعدم الربحية.
انضم إلى المجتمع وساعد في صنع أفضل تطبيق خرائط
• استخدم التطبيق وانشر الكلمة عنه
• قدم ملاحظاتك وأبلغ عن المشاكل
• حدِّث بيانات الخريطة في التطبيق أو على موقع OpenStreetMap
<i>ملاحظاتك وتقييماتك الخمس نجوم هي أفضل دعم لنا!</i>
‣ <b>بسيط ومصقول</b>: ميزات أساسية سهلة الاستخدام تعمل ببساطة.
‣ <b>مركز على العمل دون اتصال</b>: خطط وابحث عن طريقك في رحلاتك بالخارج دون الحاجة لخدمة الهاتف، ابحث عن نقاط الطريق خلال رحلات المشي البعيدة، إلخ. جميع وظائف التطبيق مصممة للعمل دون اتصال.
‣ <b>يحترم الخصوصية</b>: التطبيق مصمم مع مراعاة الخصوصية - لا يعرّف الأشخاص، لا يتتبع، ولا يجمع المعلومات الشخصية. خالٍ من الإعلانات.
‣ <b>يوفر بطاريتك ومساحتك</b>: لا يستنزف بطاريتك مثل تطبيقات الملاحة الأخرى. الخرائط المدمجة توفر مساحة ثمينة على هاتفك.
‣ <b>مجاني ومبني بواسطة المجتمع</b>: أشخاص مثلك ساعدوا في بناء التطبيق بإضافة أماكن إلى OpenStreetMap، واختبار الميزات وإعطاء ملاحظات، والمساهبة بمهاراتهم التطويرية وأموالهم.
‣ <b>قرارات ومالية مفتوحة وشفافة، غير ربحية ومفتوحة المصدر بالكامل.</b>
<b>الميزات الرئيسية</b>:
• خرائط مفصلة قابلة للتحميل تحتوي على أماكن غير متوفرة في خرائط جوجل
• وضع خارجي مع مسارات المشي المميزة، مواقع التخييم، مصادر المياه، القمم، خطوط الكنتور، إلخ
• مسارات المشي ومسارات الدراجات
• نقاط الاهتمام مثل المطاعم، محطات الوقود، الفنادق، المتاجر، المعالم السياحية والكثير غيرها
• البحث بالاسم أو العنوان أو فئة نقطة الاهتمام
• ملاحة مع إعلانات صوتية للمشي، ركوب الدراجات، أو القيادة
• وضع إشارة على أماكنك المفضلة بنقرة واحدة
• مقالات ويكيبيديا دون اتصال
• طبقة مترو الأنفاق وإرشادات الاتجاهات
• تسجيل المسار
• تصدير واستيراد العلامات والمسارات بصيغ KML، KMZ، GPX
• وضع مظلم للاستخدام خلال الليل
• تحسين بيانات الخريطة للجميع باستخدام محرر مدمج أساسي
• دعم Android Auto
يرجى الإبلاغ عن مشاكل التطبيق، اقتراح أفكار والانضمام إلى مجتمعنا على موقع <b><i>comaps.app</i></b>.
<b>الحرية هنا</b>
اكتشف رحلتك، ابحر في العالم مع وضع الخصوصية والمجتمع في المقدمة!

View File

@@ -1 +0,0 @@
تنقل سهل في الخريطة - اكتشف المزيد من رحلتك - مدعوم من المجتمع

View File

@@ -1 +0,0 @@
CoMaps - التنقل مع الخصوصية

View File

@@ -3,7 +3,7 @@ Eine von der Community betriebene, kostenlose Open-Source Karten App, die auf Op
Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
• Nutze die App und erzähle anderen davon
• Gib Feedback und melde Probleme
• Aktualisiere Kartendaten in der App oder auf der OpenStreetMap-Webseite
• Aktualisiere Kartendaten in der App oder auf der OpenStreetMap Website
<i>Dein Feedback und deine 5-Sterne-Bewertung sind die beste Unterstützung für uns!</i>
@@ -12,7 +12,7 @@ Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
‣ <b>Datenschutz ist uns wichtig!</b>: Die App wurde mit Fokus auf Privatsphäre entwickelt kein Tracking, keine Erfassung persönlicher Daten, keine Werbung.
‣ <b>Spart Akku und Speicherplatz</b>: Verbraucht nicht unnötig Akku wie andere Navi-Apps. Kompakte Karten sparen Speicherplatz auf Deinem Gerät.
‣ <b>Kostenlos und von der Community entwickelt</b>: Menschen wie du haben geholfen, die App zu entwickeln durch das Hinzufügen von Orten zu OpenStreetMap, Testen von neuen Funktionen, Softwareentwicklung oder Spenden.
‣ <b>Offen und transparent bei Entscheidungen und Finanzen, gemeinnützig und vollständig Open Source.</b>
‣ <b>Offen und transparent bei Entscheidungen und Finanzen, gemeinnützig und vollständig Open Source</b>
<b>Hauptfunktionen</b>:
• Detaillierte, herunterladbare Karten mit Orten, die bei Google Maps oft fehlen
@@ -24,13 +24,13 @@ Werde Teil der Community und hilf mit, die beste Karten-App zu entwickeln
• Lesezeichen mit einem einzigen Tippen speichern
• Offline verfügbare Wikipedia-Artikel
• U- und S-Bahn-Netze
• Aufzeichnen von GPS-Tracks
• Aufzeichnen von GPS Tracks
• Import und Export von Favoriten und Routen im KML-, KMZ- oder GPX-Format
• Dunkler Modus für die Nutzung bei Nacht
• Kartenbearbeitung direkt in der App mit einem einfachen Editor
• Unterstützung für Android Auto
Bitte melde Probleme, schlage neue Funktionen vor und werde Teil der Community auf unserer Website: <b><i>comaps.app/de/</i></b>
Bitte melde Probleme, schlage neue Funktionen vor und werde Teil der Community auf unserer Website: <b><i>comaps.app</i></b>
<b>Freiheit beginnt hier</b>
Entdecke deine Reise, wobei Datenschutz und Gemeinschaft im Vordergrund stehen!
<b>Entdecke die Unabhängigkeit</b>
Entdecke deine Reise navigiere in der Welt mit Datenschutz!

View File

@@ -1 +1 @@
Leichte Navigation Erlebe mehr von deiner Reise Community-unterstützt
Einfache Navigation - Entdecken Sie mehr von Ihrer Reise - Community-Entwickelt

View File

@@ -1,36 +0,0 @@
A community led free & open source maps app based on OpenStreetMap data and reinforced with commitment to transparency, privacy and being not-for-profit.
Join the community and help make the best maps app
• Use the app and spread the word about it
• Give feedback and report issues
• Update map data in the app or on the OpenStreetMap website
<i>Your feedback and 5-star reviews are the best support for us!</i>
‣ <b>Simple and Polished</b>: essential easy to use features that just work.
‣ <b>Offline focused</b>: Plan and navigate your trip abroad without the need for cellular service, search waypoints while on a distant hike, etc. All app functions are designed to work offline.
‣ <b>Respecting Privacy</b>: The app is designed with privacy in mind - it does not identify people, does not track, and does not collect personal information. Ad free.
‣ <b>Saves Your Battery and Space</b>: Doesnt drain your battery like other navigation apps. Compact maps save precious space on your phone.
‣ <b>Free and Built by the Community</b>: People like you helped build the app by adding places to OpenStreetMap, testing and giving feedback on features and contributing their development skills and money.
‣ <b>Open and Transparent Decision-making and Financials, Not-for-profit and Fully Open Source.</b>
<b>Main Features</b>:
• Downloadable detailed maps with places which are not available with Google Maps
• Outdoor mode with highlighted hiking trails, campsites, water sources, peaks, contour lines, etc
• Walking paths and cycleways
• Points of interest like restaurants, gas stations, hotels, shops, sightseeings and many more
• Search by name or an address or by point of interest category
• Navigation with voice announcements for walking, biking, or driving
• Bookmark your favorite places with a single tap
• Offline Wikipedia articles
• Subway transit layer and directions
• Track recording
• Export and import bookmarks and tracks in KML, KMZ, GPX formats
• A dark mode to use during the night
• Improve map data for everyone using a basic built-in editor
• Android Auto support
Please report app issues, suggest ideas and join our community at <b><i>comaps.app</i></b> website.
<b>Freedom Is Here</b>
Discover your journey, navigate the world with privacy and community at the forefront!

View File

@@ -1,36 +1,36 @@
Besplatna aplikacija za karte otvorenog koda koju vodi zajednica, a temelji se na podacima OpenStreetMapa, a pojačana je predanošću transparentnosti, privatnosti i neprofitnosti.
Besplatna aplikacija otvorenog koda koju vodi zajednica i temelji se na podacima OpenStreetMap-a, usmjerana transparentnosti, privatnosti i neprofitnosti.
Pridružite se zajednici i pomozite u izradi najbolje aplikacije za karte
• Koristite aplikaciju i širite vijest o njoj
Pridružite se otvorenoj zajednici i pomozite izraditi najbolju aplikaciju za karte
• Koristite aplikaciju i proširite glas o njoj
• Dajte povratne informacije i prijavite probleme
• Ažurirajte podatke karte u aplikaciji ili na web stranici OpenStreetMap
• Ažurirajte podatke na karti u aplikaciji ili na web stranici OpenStreetMap-a
<i>Vaše povratne informacije i recenzije s 5 zvjezdica najbolja su nam podrška!</i>
‣ <b>Jednostavno i dotjerano</b>: bitne značajke koje su jednostavne za korištenje i jednostavno rade.
‣ <b>Usmjereno na rad izvan mreže</b>: Planirajte i upravljajte svojim putovanjem u inozemstvo bez potrebe za mobilnom mrežom, pretražujte točke puta tijekom udaljenog planinarenja itd. Sve funkcije aplikacije dizajnirane su za rad izvan mreže.
‣ <b>Poštivanje privatnosti</b>: Aplikacija je dizajnirana imajući na umu privatnost - ne identificira ljude, ne prati i ne prikuplja osobne podatke. Bez oglasa.
‣ <b>Štedi bateriju i prostor</b>: Ne prazni bateriju kao druge navigacijske aplikacije. Kompaktne karte štede dragocjeni prostor na vašem telefonu.
‣ <b>Besplatno i izrađeno od strane zajednice</b>: Ljudi poput vas pomogli su u izgradnji aplikacije dodavanjem mjesta u OpenStreetMap, testiranjem i davanjem povratnih informacija o značajkama te doprinosom svojim razvojnim vještinama i novcem.
‣ <b>Otvoreno i transparentno donošenje odluka i financije, neprofitno i potpuno otvorenog koda.</b>
‣ <b>Jednostavna i dotjerana</b>: aplikacija je trivijalna za korištenje i jednostavno radi.
‣ <b>Fokusirana na Offline rad</b>: Planirajte i upravljajte svojim putovanjem u inozemstvo bez potrebe za mobilnom uslugom, tražite putne točke dok ste na udaljenom pješačenju itd. Sve funkcije aplikacije dizajnirane su za offline rad.
‣ <b>Poštivanje privatnosti</b>: Aplikacija je dizajnirana imajući na umu privatnost - ne identificira ljude, ne prati i ne prikuplja osobne podatke. Bez reklama.
‣ <b>Štedi vašu bateriju i prostor</b>: Ne troši bateriju kao druge navigacijske aplikacije. Kompaktne karte štede dragocjeni prostor na vašem telefonu.
‣ <b>Otvorena i izrađena od strane zajednice</b>: Ljudi poput vas pomogli su izraditi aplikaciju dodavanjem lokacija na OpenStreetMap-u, testiranjem i davanjem povratnih informacija o aplikaciji te doprinoseći svojim razvojnim vještinama i novcem.
‣ <b>Otvoreno i transparentno donošenje odluka i korištenja financija, Neprofitna i potpuno Otvorenog koda.</b>
<b>Glavne značajke</b>:
Detaljne karte za preuzimanje s mjestima koja nisu dostupna na Google kartama
Vanjski način rada s označenim planinarskim stazama, kampovima, izvorima vode, vrhovima, konturnim linijama itd.
Preuzimanje detaljnih karti s lokacijama koje nisu dostupne s Google kartama
Karte za izlete s istaknutim pješačkim stazama, kampovima, izvorima vode, planinskim vrhovima, konturnim linijama itd.
• Pješačke i biciklističke staze
Znamenitosti poput restorana, benzinskih postaja, hotela, trgovina, znamenitosti i mnogih drugih
• Pretraživanje po imenu ili adresi ili po kategoriji znamenitosti
• Navigacija s glasovnim najavama za hodanje, vožnju biciklom ili vožnju
• Označavanje omiljenih mjesta jednim dodirom
Članci na Wikipediji izvan mreže
Sloj i upute za podzemnu željeznicu
• Snimanje tragova
• Izvoz i uvoz oznaka i tragova u KML, KMZ, GPX formatima
Točke interesa kao što su restorani, benzinske crpke, hoteli, trgovine, vidikovci i još mnogo toga
• Pretražujte po nazivu ili adresi ili po kategoriji interesa
• Navigacija s glasovnim najavama za hodanje, vožnju biciklom ili automobilom
• Obilježite svoja omiljena mjesta jednim dodirom
Offline članci Wikipedije
Tranzitni sloj podzemne željeznice sa navigacijom
• Snimanje GPS tragova
• Izvoz i uvoz oznaka i staza u KML, KMZ, i GPX formatima
• Tamni način rada za korištenje tijekom noći
• Poboljšajte podatke karte za sve pomoću osnovnog ugrađenog uređivača
Podrška za Android Auto
• Poboljšajte kartu za sve korisnike, koristeći osnovni ugrađeni uređivač karte
• Android Auto podrška
Prijavite probleme s aplikacijom, predložite ideje i pridružite se našoj zajednici na web stranici <b><i>comaps.app</i></b>.
<b>Sloboda je ovdje</b>
Otkrijte svoje putovanje, snađite se u svijetu s privatnošću i zajednicom u prvom planu!
Otkrijte svoje putovanje, navigirajte svijetom s privatnošću i zajednicom na prvom mjestu!

View File

@@ -1,36 +0,0 @@
Bendruomenės vystoma nemokama atvirojo kodo žemėlapių programa, pagrįsta „OpenStreetMap“ duomenimis ir sustiprinta įsipareigojimu užtikrinti skaidrumą, privatumą ir pelno nesiekimą.
Prisijunkite prie bendruomenės ir padėkite sukurti geriausią žemėlapių programą
• Naudokitės programa ir paskleiskite žinią apie ją
• Teikite atsiliepimus ir praneškite apie problemas
• Atnaujinkite žemėlapių duomenis programoje arba „OpenStreetMap“ svetainėje
<i>Jūsų atsiliepimai ir 5 žvaigždučių vertinimai yra geriausias palaikymas mums!</i>
‣ <b>Paprasta ir išbaigta</b>: esminės, lengvai naudojamos funkcijos, kurios tiesiog veikia.
‣ <b>Skirta naudoti neprisijungus prie interneto</b>: planuokite maršrutus ir keliaukite užsienyje be mobiliojo ryšio, ieškokite kelionės taškų tolimuose žygiuose ir pan. Visos programos funkcijos yra pritaikytos veikti be interneto ryšio.
‣ <b>Gerbia privatumą</b>: programėlė sukurta, teikiant prioritetą privatumui: neidentifikuoja žmonių, neseka ir nerenka asmeninės informacijos. Be reklamų.
‣ <b>Taupo bateriją ir vietą</b>: neišsekina baterijos kaip kitos navigacijos programos. Kompaktiški žemėlapiai tausoja vietą jūsų telefone.
‣ <b>Nemokama ir kuriama bendruomenės</b>: paprasti žmonės kaip jūs padėjo sukurti šią programą, pildydami „OpenStreetMap“ žemėlapį, išbandydami ir pateikdami atsiliepimus apie funkcijas bei prisidėdami savo programavimo įgūdžiais ir pinigais.
‣ <b>Atviras ir skaidrus sprendimų priėmimas ir finansai, ne pelno siekianti ir visiškai atviro kodo programa.</b>
<b>Pagrindinės funkcijos</b>:
• Atsisiunčiami išsamūs žemėlapiai su vietomis, kurių nėra „Google Maps“;
• Žygių pėsčiomis veiksena su pažymėtais pėsčiųjų takais, stovyklavietėmis, vandens šaltiniais, kalnų viršūnėmis, reljefo linijomis ir kt.;
• Pėsčiųjų ir dviračių takai;
• Potencialūs kelionės taškai, kaip antai restoranai, degalinės, viešbučiai, parduotuvės, lankytinos vietos ir daugelis kitų;
• Paieška pagal pavadinimą, adresą arba lankytinos vietos kategoriją;
• Navigacija su balso instrukcijomis pėstiesiems, dviratininkams ir motorinio transporto vairuotojams;
• Mėgstamų vietų įsiminimas vienu bakstelėjimu;
• „Vikipedijos“ straipsniai, prieinami neprisijungus prie interneto;
• Kelionių metro sluoksnis ir maršrutai;
• Trasų įrašymas;
• Žymių ir trasų eksportavimas ir importavimas KML, KMZ, GPX formatais;
• Tamsaus žemėlapio veiksena, skirta naudoti naktį;
• Galimybė papildyti žemėlapio duomenis visiems, naudojantis įtaisytuoju baziniu redaktoriumi;
• „Android Auto“ palaikymas.
Praneškite apie programos problemas, siūlykite idėjas ir prisijunkite prie mūsų bendruomenės svetainėje <b><i>comaps.app</i></b>.
<b>Laisvė yra čia</b>
Atraskite savo kelionę ir keliaukite po pasaulį, kuriame privatumas ir bendruomenė yra svarbiausia!

View File

@@ -1 +1 @@
Paprasta ir patogi navigacija Turiningesnės kelionės Vystoma bendruomenės
Paprasta ir patogi navigacija Turiningos kelionės Vystoma bendruomenės

View File

@@ -1 +1 @@
Enostavno usmerjanje Odkrijte več o svojem potovanju Podprto v skupnosti
Enostavno usmerjanje Odkrij več o svojem potovanju Podprto v skupnosti

View File

@@ -1 +1 @@
CoMaps - Usmerjajte se zasebno
CoMaps - Usmerjajte zasebno

View File

@@ -1 +0,0 @@
Проста навігація по мапі - Дізнайтеся більше про свою подорож - Розроблено спільнотою

View File

@@ -1 +0,0 @@
Приватна навігація

View File

@@ -400,14 +400,8 @@
android:name="app.organicmaps.settings.SettingsActivity"
android:configChanges="orientation|screenLayout|screenSize"
android:screenOrientation="fullUser"
android:exported="true"
android:label="@string/settings"
android:parentActivityName="app.organicmaps.MwmActivity" >
<intent-filter>
<action android:name="android.intent.action.APPLICATION_PREFERENCES"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
android:parentActivityName="app.organicmaps.MwmActivity" />
<activity
android:name="app.organicmaps.help.HelpActivity"

View File

@@ -18,7 +18,6 @@ import android.location.Location;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.CallSuper;
@@ -26,15 +25,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.core.view.ViewCompat;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.checkbox.MaterialCheckBox;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.progressindicator.LinearProgressIndicator;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.base.BaseMwmFragmentActivity;
import app.organicmaps.dialog.CustomMapServerDialog;
import app.organicmaps.downloader.MapManagerHelper;
import app.organicmaps.intent.Factory;
import app.organicmaps.sdk.Framework;
@@ -47,7 +38,11 @@ import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.checkbox.MaterialCheckBox;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.progressindicator.LinearProgressIndicator;
import com.google.android.material.textview.MaterialTextView;
import java.util.List;
import java.util.Objects;
@@ -59,7 +54,6 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
private MaterialTextView mTvMessage;
private LinearProgressIndicator mProgress;
private MaterialButton mBtnDownload;
private MaterialButton mBtnAdvanced;
private MaterialCheckBox mChbDownloadCountry;
private String mCurrentCountry;
@@ -273,14 +267,6 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
mProgress = findViewById(R.id.progressbar);
mBtnDownload = findViewById(R.id.btn_download_resources);
mChbDownloadCountry = findViewById(R.id.chb_download_country);
mBtnAdvanced = findViewById(R.id.btn_advanced);
mBtnAdvanced.setOnClickListener(v -> {
CustomMapServerDialog.show(this, url -> {
prepareFilesDownload(false);
});
});
mBtnAdvanced.setEnabled(true);
mBtnListeners = new View.OnClickListener[BTN_COUNT];
mBtnNames = new String[BTN_COUNT];
@@ -305,11 +291,6 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
{
mBtnDownload.setOnClickListener(mBtnListeners[action]);
mBtnDownload.setText(mBtnNames[action]);
// Allow changing server only when idle or after an error.
boolean advancedEnabled = (action == DOWNLOAD || action == TRY_AGAIN || action == RESUME);
mBtnAdvanced.setEnabled(advancedEnabled);
mBtnAdvanced.setAlpha(advancedEnabled ? 1f : 0.5f);
}
private void doDownload()
@@ -378,9 +359,6 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
private void finishFilesDownload(int result)
{
mBtnAdvanced.setEnabled(true);
mBtnAdvanced.setAlpha(1f);
if (result == ERR_NO_MORE_FILES)
{
// World and WorldCoasts has been downloaded, we should register maps again to correctly add them to the model.
@@ -446,20 +424,16 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
default -> throw new AssertionError("Unexpected result code = " + result);
};
mAlertDialog = new MaterialAlertDialogBuilder(this)
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(titleId)
.setMessage(messageId)
.setCancelable(true)
.setOnCancelListener((dialog) -> setAction(RESUME))
.setOnCancelListener((dialog) -> setAction(PAUSE))
.setPositiveButton(R.string.try_again,
(dialog, which) -> {
setAction(TRY_AGAIN);
onTryAgainClicked();
})
.setNegativeButton(R.string.cancel,
(dialog, which) -> {
setAction(RESUME);
})
.setOnDismissListener(dialog -> mAlertDialog = null)
.show();
}

View File

@@ -132,6 +132,7 @@ import app.organicmaps.widget.placepage.PlacePageViewModel;
import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.textview.MaterialTextView;
import java.util.ArrayList;
import java.util.Objects;
@@ -431,7 +432,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
}
dismissLocationErrorDialog();
mLocationErrorDialog = new MaterialAlertDialogBuilder(MwmActivity.this)
mLocationErrorDialog = new MaterialAlertDialogBuilder(MwmActivity.this, R.style.MwmTheme_AlertDialog)
.setMessage(R.string.unknown_current_position)
.setCancelable(true)
.setPositiveButton(R.string.ok, null)
@@ -654,7 +655,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
else
{
dismissAlertDialog();
mAlertDialog = new MaterialAlertDialogBuilder(this)
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.message_invalid_feature_position)
.setPositiveButton(R.string.ok, null)
.setOnDismissListener(dialog -> mAlertDialog = null)
@@ -711,6 +712,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
if (!TextUtils.isEmpty(appName))
{
setTitle(appName);
((MaterialTextView) mPointChooser.findViewById(R.id.title)).setText(appName);
}
}
@@ -1153,7 +1155,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
if (type == IsolinesState.EXPIREDDATA)
{
mAlertDialog = new MaterialAlertDialogBuilder(this)
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.downloader_update_maps)
.setMessage(R.string.isolines_activation_error_dialog)
.setPositiveButton(
@@ -1772,7 +1774,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
{
dismissAlertDialog();
mAlertDialog =
new MaterialAlertDialogBuilder(this)
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,
@@ -1795,7 +1797,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
builder.append(getString(resId)).append("\n\n");
dismissAlertDialog();
mAlertDialog = new MaterialAlertDialogBuilder(this)
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.dialog_routing_disclaimer_title)
.setMessage(builder.toString())
.setCancelable(false)
@@ -1844,7 +1846,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
return true;
final MapObject endPoint = Objects.requireNonNull(controller.getEndPoint());
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this)
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.p2p_only_from_current)
.setMessage(R.string.p2p_reroute_from_current)
.setCancelable(false)
@@ -2038,7 +2040,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
{
mPreciseLocationDialogShown = true;
final MaterialAlertDialogBuilder builder =
new MaterialAlertDialogBuilder(this)
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())
@@ -2072,7 +2074,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
return;
}
mLocationErrorDialog = new MaterialAlertDialogBuilder(this)
mLocationErrorDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.enable_location_services)
.setMessage(R.string.location_is_disabled_long_text)
.setOnDismissListener(dialog -> mLocationErrorDialog = null)
@@ -2165,7 +2167,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
return;
}
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this)
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.enable_location_services)
.setMessage(R.string.location_is_disabled_long_text)
.setOnDismissListener(dialog -> mLocationErrorDialog = null)
@@ -2251,7 +2253,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
dismissAlertDialog();
final MaterialAlertDialogBuilder builder =
new MaterialAlertDialogBuilder(this)
new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.current_location_unknown_error_title)
.setCancelable(true)
.setMessage(R.string.power_save_dialog_summary)
@@ -2276,7 +2278,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
{
dismissAlertDialog();
mAlertDialog =
new MaterialAlertDialogBuilder(this)
new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.load_kmz_title)
.setMessage(getString(R.string.unknown_file_type, uri))
.setPositiveButton(R.string.ok, null)
@@ -2293,7 +2295,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
{
dismissAlertDialog();
mAlertDialog =
new MaterialAlertDialogBuilder(this)
new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.load_kmz_title)
.setMessage(getString(R.string.failed_to_open_file, uri, error))
.setPositiveButton(R.string.ok, null)
@@ -2315,7 +2317,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
public void onBookmarksFileImportFailed()
{
dismissAlertDialog();
mAlertDialog = new MaterialAlertDialogBuilder(this)
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.load_kmz_title)
.setMessage(R.string.load_kmz_failed)
.setPositiveButton(R.string.ok, null)
@@ -2576,7 +2578,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
private void reportUnsupported()
{
new MaterialAlertDialogBuilder(this)
new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setMessage(R.string.unsupported_phone)
.setCancelable(false)
.setPositiveButton(R.string.close, (dlg, which) -> this.moveTaskToBack(true))

View File

@@ -120,7 +120,7 @@ public class SplashActivity extends AppCompatActivity
private void showFatalErrorDialog(@StringRes int titleId, @StringRes int messageId, Exception error)
{
mCanceled = true;
new MaterialAlertDialogBuilder(this, R.style.MwmTheme_M3_AlertDialog)
new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(titleId)
.setMessage(messageId)
.setPositiveButton(

View File

@@ -60,14 +60,14 @@ public enum BookmarksSharingHelper
case BookmarkSharingResult.SUCCESS ->
SharingUtils.shareBookmarkFile(context, launcher, result.getSharingPath(), result.getMimeType());
case BookmarkSharingResult.EMPTY_CATEGORY ->
new MaterialAlertDialogBuilder(context)
new MaterialAlertDialogBuilder(context, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.bookmarks_error_title_share_empty)
.setMessage(R.string.bookmarks_error_message_share_empty)
.setPositiveButton(R.string.ok, null)
.show();
case BookmarkSharingResult.ARCHIVE_ERROR, BookmarkSharingResult.FILE_ERROR ->
{
new MaterialAlertDialogBuilder(context)
new MaterialAlertDialogBuilder(context, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.dialog_routing_system_error)
.setMessage(R.string.bookmarks_error_message_share_general)
.setPositiveButton(R.string.ok, null)

View File

@@ -42,7 +42,6 @@ public class ChooseBookmarkCategoryFragment
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View root = inflater.inflate(R.layout.choose_bookmark_category_fragment, container, false);
getDialog().getWindow().setBackgroundDrawableResource(R.drawable.bg_transparent_dlg);
mRecycler = root.findViewById(R.id.recycler);
mRecycler.setLayoutManager(new LinearLayoutManager(requireActivity()));
return root;

View File

@@ -77,7 +77,6 @@ public class ChooseBookmarksSortingTypeFragment
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
getDialog().getWindow().setBackgroundDrawableResource(R.drawable.bg_transparent_dlg);
final Bundle args = getArguments();
if (args == null)

View File

@@ -1,86 +0,0 @@
package app.organicmaps.dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.preference.PreferenceManager;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;
import app.organicmaps.R;
import app.organicmaps.sdk.Framework;
public final class CustomMapServerDialog
{
public interface OnUrlAppliedListener
{
void onUrlApplied(@NonNull String url);
}
private CustomMapServerDialog() {}
public static void show(@NonNull Context context,
@Nullable OnUrlAppliedListener listener)
{
View dialogView = LayoutInflater.from(context)
.inflate(R.layout.dialog_custom_map_server, null);
TextInputLayout til = dialogView.findViewById(R.id.til_custom_map_server);
TextInputEditText edit = dialogView.findViewById(R.id.edit_custom_map_server);
SharedPreferences prefs =
PreferenceManager.getDefaultSharedPreferences(context);
String current = prefs.getString(context.getString(R.string.pref_custom_map_download_url), "");
edit.setText(current);
MaterialAlertDialogBuilder builder =
new MaterialAlertDialogBuilder(context)
.setTitle(R.string.download_resources_custom_url_title)
.setMessage(R.string.download_resources_custom_url_message)
.setView(dialogView)
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(R.string.save, null);
AlertDialog dialog = builder.create();
dialog.setOnShowListener(dlg -> {
Button ok = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
ok.setOnClickListener(v -> {
String url = edit.getText() != null ? edit.getText().toString().trim() : "";
if (!url.isEmpty()
&& !url.startsWith("http://")
&& !url.startsWith("https://"))
{
til.setError(context.getString(R.string.download_resources_custom_url_error_scheme));
return;
}
til.setError(null);
String normalizedUrl = Framework.normalizeServerUrl(url);
prefs.edit()
.putString(context.getString(R.string.pref_custom_map_download_url), normalizedUrl)
.apply();
// Apply to native
Framework.applyCustomMapDownloadUrl(context, normalizedUrl);
if (listener != null)
listener.onUrlApplied(normalizedUrl);
dialog.dismiss();
});
});
dialog.show();
}
}

View File

@@ -113,7 +113,7 @@ public class EditTextDialogFragment extends BaseMwmDialogFragment
negativeButtonText = args.getString(ARG_NEGATIVE_BUTTON);
}
AlertDialog editTextDialog = new MaterialAlertDialogBuilder(requireActivity())
AlertDialog editTextDialog = new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog)
.setView(buildView())
.setNegativeButton(negativeButtonText, null)
.setPositiveButton(positiveButtonText, null)
@@ -152,7 +152,7 @@ public class EditTextDialogFragment extends BaseMwmDialogFragment
if (mInputValidator != null)
{
final String maybeError = mInputValidator.validate(activity, input);
mEtInputLayout.setError(maybeError);
mEtInputLayout.getEditText().setError(maybeError);
mEtInputLayout.requestFocus();
return maybeError == null;
}

View File

@@ -119,7 +119,7 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
{
if (RoutingController.get().isNavigating())
{
new MaterialAlertDialogBuilder(adapter.mActivity)
new MaterialAlertDialogBuilder(adapter.mActivity, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.downloader_delete_map)
.setMessage(R.string.downloader_delete_map_while_routing_dialog)
.setPositiveButton(R.string.ok, null)
@@ -133,7 +133,7 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
return;
}
new MaterialAlertDialogBuilder(adapter.mActivity)
new MaterialAlertDialogBuilder(adapter.mActivity, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.downloader_delete_map)
.setMessage(R.string.downloader_delete_map_dialog)
.setNegativeButton(R.string.cancel, null)

View File

@@ -49,7 +49,7 @@ public class MapManagerHelper
return;
}
final AlertDialog dlg = new MaterialAlertDialogBuilder(activity)
final AlertDialog dlg = new MaterialAlertDialogBuilder(activity, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.country_status_download_failed)
.setMessage(getErrorCodeStrRes(errorData.errorCode))
.setNegativeButton(R.string.cancel,
@@ -72,7 +72,7 @@ public class MapManagerHelper
private static void notifyNoSpaceInternal(Activity activity)
{
new MaterialAlertDialogBuilder(activity)
new MaterialAlertDialogBuilder(activity, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.downloader_no_space_title)
.setMessage(R.string.downloader_no_space_message)
.setPositiveButton(android.R.string.ok, null)
@@ -123,7 +123,7 @@ public class MapManagerHelper
return false;
}
new MaterialAlertDialogBuilder(activity)
new MaterialAlertDialogBuilder(activity, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.download_over_mobile_header)
.setMessage(R.string.download_over_mobile_message)
.setNegativeButton(R.string.cancel, null)

View File

@@ -53,6 +53,7 @@ public class AdvancedTimetableFragment extends BaseMwmFragment implements View.O
public void onResume()
{
super.onResume();
refreshTimetables();
}
private void initViews(View view)

View File

@@ -196,8 +196,10 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
{
final Context context = mInputBuildingLevels.getContext();
final boolean isValid = Editor.nativeIsLevelValid(s.toString());
mInputBuildingLevels.setError(isValid ? null : context.getString(R.string.error_enter_correct_storey_number,
Editor.nativeGetMaxEditableBuildingLevels()));
UiUtils.setInputError(mInputBuildingLevels,
isValid ? null
: context.getString(R.string.error_enter_correct_storey_number,
Editor.nativeGetMaxEditableBuildingLevels()));
}
});
@@ -493,7 +495,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
}
});
return new MaterialAlertDialogBuilder(requireActivity())
return new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog)
.setTitle(R.string.editor_socket)
.setView(dialogView)
.setPositiveButton(R.string.save,
@@ -946,7 +948,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
mDisused.setVisibility(Editor.nativeCanMarkPlaceAsDisused() ? View.VISIBLE : View.GONE);
if (Editor.nativeAreSomeFeatureChangesUploaded())
if (Editor.nativeIsMapObjectUploaded())
{
mReset.setText(R.string.editor_place_doesnt_exist);
return;
@@ -964,7 +966,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
private void reset()
{
if (Editor.nativeAreSomeFeatureChangesUploaded())
if (Editor.nativeIsMapObjectUploaded())
{
placeDoesntExist();
return;
@@ -997,7 +999,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
message = R.string.editor_reset_edits_message;
}
new MaterialAlertDialogBuilder(requireActivity())
new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog)
.setTitle(message)
.setPositiveButton(title,
(dialog, which) -> {
@@ -1020,7 +1022,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
private void placeDisused()
{
new MaterialAlertDialogBuilder(requireActivity())
new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog)
.setTitle(R.string.editor_mark_business_vacant_title)
.setMessage(R.string.editor_mark_business_vacant_description)
.setPositiveButton(R.string.editor_submit, (dlg, which) -> {

View File

@@ -237,7 +237,6 @@ public class EditorHostFragment
for (LocalizedName name : sNames)
languages.add(name.lang);
args.putStringArrayList(LanguagesFragment.EXISTING_LOCALIZED_NAMES, languages);
args.putBoolean(LanguagesFragment.IS_MAP_LANGUAGE_SELECTION, false);
editWithFragment(Mode.LANGUAGE, R.string.choose_language, args, LanguagesFragment.class, false);
}
@@ -353,7 +352,7 @@ public class EditorHostFragment
private void processNoFeatures()
{
new MaterialAlertDialogBuilder(requireActivity())
new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog)
.setTitle(R.string.downloader_no_space_title)
.setPositiveButton(R.string.ok, null)
.show();
@@ -387,7 +386,7 @@ public class EditorHostFragment
private void showNoobDialog()
{
new MaterialAlertDialogBuilder(requireActivity())
new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog)
.setTitle(R.string.editor_share_to_all_dialog_title)
.setMessage(getString(R.string.editor_share_to_all_dialog_message_1) + " "
+ getString(R.string.editor_share_to_all_dialog_message_2))

View File

@@ -155,7 +155,7 @@ public class FeatureCategoryFragment
// Duplicate of showNoobDialog()
private void showNoteConfirmationDialog(double lat, double lon, String noteText)
{
new MaterialAlertDialogBuilder(requireActivity())
new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog)
.setTitle(R.string.editor_share_to_all_dialog_title)
.setMessage(getString(R.string.editor_share_to_all_dialog_message_1) + " "
+ getString(R.string.editor_share_to_all_dialog_message_2))

View File

@@ -1,15 +1,11 @@
package app.organicmaps.editor;
import static app.organicmaps.sdk.editor.data.Language.DEFAULT_LANG_CODE;
import android.content.res.Configuration;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.core.os.ConfigurationCompat;
import androidx.core.os.LocaleListCompat;
import androidx.fragment.app.Fragment;
import app.organicmaps.R;
import app.organicmaps.base.BaseMwmRecyclerFragment;
import app.organicmaps.sdk.editor.Editor;
import app.organicmaps.sdk.editor.data.Language;
@@ -25,7 +21,6 @@ import java.util.Set;
public class LanguagesFragment extends BaseMwmRecyclerFragment<LanguagesAdapter>
{
final static String EXISTING_LOCALIZED_NAMES = "ExistingLocalizedNames";
final static String IS_MAP_LANGUAGE_SELECTION = "IsMapLanguageSelection";
public interface Listener
{
@@ -39,8 +34,6 @@ public class LanguagesFragment extends BaseMwmRecyclerFragment<LanguagesAdapter>
protected LanguagesAdapter createAdapter()
{
Bundle args = getArguments();
boolean isMapLanguageSelection =
args != null ? args.getBoolean(IS_MAP_LANGUAGE_SELECTION) : true;
Set<String> existingLanguages =
args != null ? new HashSet<>(args.getStringArrayList(EXISTING_LOCALIZED_NAMES)) : new HashSet<>();
@@ -52,14 +45,8 @@ public class LanguagesFragment extends BaseMwmRecyclerFragment<LanguagesAdapter>
for (int i = 0; i < systemLocales.size(); i++)
systemLanguages.add(null);
// service languages are old_name, alt_name, ...
boolean includeServiceLangs = !isMapLanguageSelection;
for (Language lang : Editor.nativeGetSupportedLanguages(includeServiceLangs))
for (Language lang : Editor.nativeGetSupportedLanguages(false))
{
if (existingLanguages.contains(lang.code))
continue;
// Separately extract system languages
for (int i = 0; i < systemLocales.size(); i++)
{
@@ -71,7 +58,7 @@ public class LanguagesFragment extends BaseMwmRecyclerFragment<LanguagesAdapter>
}
}
if (systemLanguages.contains(lang))
if (existingLanguages.contains(lang.code) || systemLanguages.contains(lang))
continue;
languages.add(lang);
@@ -81,12 +68,6 @@ public class LanguagesFragment extends BaseMwmRecyclerFragment<LanguagesAdapter>
languages.addAll(0, systemLanguages.stream().filter(Objects::nonNull).toList());
if (isMapLanguageSelection) {
String localLanguageLabel = getString(R.string.pref_maplanguage_local);
Language localLanguage = new Language(DEFAULT_LANG_CODE, localLanguageLabel);
languages.add(0, localLanguage);
}
return new LanguagesAdapter(this, languages.toArray(new Language[languages.size()]));
}

View File

@@ -79,7 +79,7 @@ public class OsmLoginFragment extends BaseMwmToolbarFragment
private void onAuthFail()
{
new MaterialAlertDialogBuilder(requireActivity())
new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog)
.setTitle(R.string.editor_login_error_dialog)
.setPositiveButton(R.string.ok, null)
.show();

View File

@@ -66,7 +66,7 @@ public class FaqFragment extends BaseMwmFragment
FloatingActionButton feedbackFab = root.findViewById(R.id.feedback_fab);
feedbackFab.setOnClickListener(
v
-> new MaterialAlertDialogBuilder(requireActivity())
-> new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog)
.setTitle(R.string.feedback)
.setNegativeButton(R.string.cancel, null)
.setItems(new CharSequence[] {getString(R.string.feedback_general), getString(R.string.report_a_bug)},

View File

@@ -296,7 +296,7 @@ public class MapButtonsController extends Fragment
mBadgeDrawable.setMaxCharacterCount(0);
mBadgeDrawable.setHorizontalOffset(verticalOffset);
mBadgeDrawable.setVerticalOffset(dpToPx(9, context));
mBadgeDrawable.setBackgroundColor(ContextCompat.getColor(context, R.color.active_track_recording));
mBadgeDrawable.setBackgroundColor(ContextCompat.getColor(context, R.color.base_accent));
mBadgeDrawable.setVisible(enable);
BadgeUtils.attachBadgeDrawable(mBadgeDrawable, menuButton);
}

View File

@@ -107,7 +107,7 @@ public class TrafficButtonController implements TrafficManager.TrafficCallback
if (mDialog != null && mDialog.isShowing())
return;
mDialog = new MaterialAlertDialogBuilder(mActivity)
mDialog = new MaterialAlertDialogBuilder(mActivity, R.style.MwmTheme_AlertDialog)
.setMessage(R.string.common_check_internet_connection_dialog)
.setPositiveButton(R.string.ok, (dialog, which) -> TrafficManager.INSTANCE.setEnabled(false))
.setCancelable(true)

View File

@@ -56,7 +56,7 @@ abstract class BaseRoutingErrorDialogFragment extends BaseMwmDialogFragment
public Dialog onCreateDialog(Bundle savedInstanceState)
{
parseArguments();
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireActivity())
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog)
.setCancelable(true)
.setNegativeButton(android.R.string.cancel, null);
beforeDialogCreated(builder);

View File

@@ -98,11 +98,6 @@ public class NavigationController implements TrafficManager.TrafficCallback, Nav
mSpeedLimit = topFrame.findViewById(R.id.nav_speed_limit);
mCurrentSpeed = topFrame.findViewById(R.id.nav_current_speed);
View mTopbar = topFrame.findViewById(R.id.statutbar);
ViewCompat.setOnApplyWindowInsetsListener(mTopbar,(v, windowInsets) -> {
UiUtils.setViewNavigationTopInsetsMargin(v, windowInsets);
return windowInsets;
});
// Show a blank view below the navbar to hide the menu content
final View navigationBarBackground = mFrame.findViewById(R.id.nav_bottom_sheet_nav_bar);
final View nextTurnContainer = mFrame.findViewById(R.id.nav_next_turn_container);

View File

@@ -6,10 +6,12 @@ import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.XmlRes;
import androidx.core.content.ContextCompat;
import androidx.core.view.ViewCompat;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.recyclerview.widget.RecyclerView;
import app.organicmaps.R;
import app.organicmaps.util.Utils;
import app.organicmaps.util.WindowInsetUtils.ScrollableContentInsetsListener;
@@ -42,6 +44,7 @@ abstract class BaseXmlSettingsFragment extends PreferenceFragmentCompat
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
view.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.bg_cards));
RecyclerView recyclerView = getListView();
ViewCompat.setOnApplyWindowInsetsListener(recyclerView, new ScrollableContentInsetsListener(recyclerView));
}

View File

@@ -1,27 +1,19 @@
package app.organicmaps.settings;
import static app.organicmaps.leftbutton.LeftButtonsHolder.DISABLE_BUTTON_CODE;
import static app.organicmaps.sdk.editor.data.Language.DEFAULT_LANG_CODE;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceManager;
import androidx.preference.TwoStatePreference;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import app.organicmaps.MwmApplication;
import app.organicmaps.R;
import app.organicmaps.dialog.CustomMapServerDialog;
import app.organicmaps.downloader.OnmapDownloader;
import app.organicmaps.editor.LanguagesFragment;
import app.organicmaps.editor.ProfileActivity;
@@ -43,7 +35,7 @@ import app.organicmaps.sdk.util.SharedPropertiesUtils;
import app.organicmaps.sdk.util.log.LogsManager;
import app.organicmaps.util.ThemeSwitcher;
import app.organicmaps.util.Utils;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@@ -81,7 +73,6 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
initScreenSleepEnabledPrefsCallbacks();
initShowOnLockScreenPrefsCallbacks();
initLeftButtonPrefs();
initCustomMapDownloadUrlPrefsCallbacks();
}
private void initLeftButtonPrefs()
@@ -141,13 +132,8 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
private void updateMapLanguageCodeSummary()
{
final Preference pref = getPreference(getString(R.string.pref_map_locale));
String mapLanguageCode = MapLanguageCode.getMapLanguageCode();
if (mapLanguageCode.equals(DEFAULT_LANG_CODE)) {
pref.setSummary(R.string.pref_maplanguage_local);
} else {
Locale locale = new Locale(mapLanguageCode);
pref.setSummary(locale.getDisplayLanguage());
}
Locale locale = new Locale(MapLanguageCode.getMapLanguageCode());
pref.setSummary(locale.getDisplayLanguage());
}
private void updateRoutingSettingsPrefsSummary()
@@ -500,7 +486,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
pref.setOnPreferenceClickListener(preference -> {
if (MapManager.nativeIsDownloading())
{
new MaterialAlertDialogBuilder(requireActivity())
new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog)
.setTitle(R.string.downloading_is_active)
.setMessage(R.string.cant_change_this_setting)
.setPositiveButton(R.string.ok, null)
@@ -549,34 +535,6 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
});
}
private void initCustomMapDownloadUrlPrefsCallbacks()
{
Preference customUrlPref = getPreference(getString(R.string.pref_custom_map_download_url));
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());
String current = prefs.getString(getString(R.string.pref_custom_map_download_url), "");
String normalizedUrl = Framework.normalizeServerUrl(current);
// Initial summary
customUrlPref.setSummary(normalizedUrl.isEmpty()
? getString(R.string.download_resources_custom_url_summary_none)
: normalizedUrl);
// Sync native
Framework.applyCustomMapDownloadUrl(requireContext(), normalizedUrl);
// Show dialog
customUrlPref.setOnPreferenceClickListener(preference -> {
CustomMapServerDialog.show(requireContext(), url -> {
preference.setSummary(url.isEmpty()
? getString(R.string.download_resources_custom_url_summary_none)
: url);
});
return true;
});
}
private void removePreference(@NonNull String categoryKey, @NonNull Preference preference)
{
final PreferenceCategory category = getPreference(categoryKey);

View File

@@ -97,7 +97,7 @@ public class StoragePathFragment extends BaseSettingsFragment
final String oldPath = storages.get(currentIndex).mPath;
final String newPath = storages.get(newIndex).mPath;
new MaterialAlertDialogBuilder(requireActivity())
new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog)
.setCancelable(false)
.setTitle(R.string.move_maps)
.setPositiveButton(R.string.ok, (dlg, which) -> moveStorage(newPath, oldPath))
@@ -133,7 +133,7 @@ public class StoragePathFragment extends BaseSettingsFragment
if (!result)
{
new MaterialAlertDialogBuilder(requireActivity())
new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog)
.setTitle(R.string.move_maps_error)
.setPositiveButton(
R.string.report_a_bug,

View File

@@ -90,7 +90,8 @@ public enum ThemeSwitcher
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
uiModeManager.setApplicationNightMode(UiModeManager.MODE_NIGHT_YES);
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
else
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
if (RoutingController.get().isVehicleNavigation())
style = MapStyle.VehicleDark;
@@ -103,7 +104,8 @@ public enum ThemeSwitcher
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
uiModeManager.setApplicationNightMode(UiModeManager.MODE_NIGHT_NO);
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
else
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
if (RoutingController.get().isVehicleNavigation())
style = MapStyle.VehicleClear;

View File

@@ -24,6 +24,7 @@ import androidx.annotation.ColorInt;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.core.content.ContextCompat;
import androidx.core.content.res.ResourcesCompat;
import androidx.core.graphics.Insets;
import androidx.core.view.WindowCompat;
@@ -195,7 +196,7 @@ public final class UiUtils
public static void showHomeUpButton(MaterialToolbar toolbar)
{
toolbar.setNavigationIcon(
UiUtils.getStyledResourceId(toolbar.getContext(), androidx.appcompat.R.attr.homeAsUpIndicator));
ThemeUtils.getResource(toolbar.getContext(), androidx.appcompat.R.attr.homeAsUpIndicator));
}
// this method returns the total height of the display (in pixels) including notch and other touchable areas
@@ -208,7 +209,15 @@ public final class UiUtils
}
public static void setInputError(@NonNull TextInputLayout layout, @StringRes int error)
{
layout.setError(error == 0 ? null : layout.getContext().getString(error));
setInputError(layout, error == 0 ? null : layout.getContext().getString(error));
}
public static void setInputError(@NonNull TextInputLayout layout, String error)
{
layout.getEditText().setError(error);
layout.getEditText().setTextColor(error == null
? ThemeUtils.getColor(layout.getContext(), android.R.attr.textColorPrimary)
: ContextCompat.getColor(layout.getContext(), R.color.base_red));
}
public static void setFullscreen(@NonNull Activity activity, boolean fullscreen)
@@ -272,14 +281,6 @@ public final class UiUtils
view.setPadding(systemInsets.left, systemInsets.top, systemInsets.right, view.getPaddingBottom());
}
public static void setViewNavigationTopInsetsMargin(View view, WindowInsetsCompat windowInsets)
{
final Insets systemInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
lp.topMargin = systemInsets.top;
view.setLayoutParams(lp);
}
public static void setupNavigationIcon(@NonNull MaterialToolbar toolbar, @NonNull View.OnClickListener listener)
{
View customNavigationButton = toolbar.findViewById(R.id.back);

View File

@@ -184,6 +184,20 @@ public class Utils
}
}
public static void showFacebookPage(Activity activity)
{
try
{
// Exception is thrown if we don't have installed Facebook application.
getPackageInfo(activity.getPackageManager(), Constants.Package.FB_PACKAGE, 0);
activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(Constants.Url.FB_OM_COMMUNITY_NATIVE)));
}
catch (final Exception e)
{
activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(Constants.Url.FB_OM_COMMUNITY_HTTP)));
}
}
public static void openUrl(@NonNull Context context, @Nullable String url)
{
if (TextUtils.isEmpty(url))

View File

@@ -65,6 +65,8 @@ public class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.ViewHolder>
iv.setImageResource(R.drawable.ic_track_recording_on);
iv.setImageTintMode(null);
viewHolder.getTitleTextView().setText(R.string.stop_track_recording);
badge.setBackgroundResource(R.drawable.track_recorder_badge);
badge.setVisibility(View.VISIBLE);
}
}

View File

@@ -53,7 +53,7 @@ public class MenuBottomSheetFragment extends BottomSheetDialogFragment
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState)
{
return new BottomSheetDialog(requireContext(), R.style.MwmTheme_BottomSheetDialog) {
return new BottomSheetDialog(requireContext(), getTheme()) {
@Override
public void onAttachedToWindow()
{

View File

@@ -61,7 +61,6 @@ public class StackedButtonsDialog extends AppCompatDialog implements View.OnClic
setCancelable(mCancelable);
setOnCancelListener(mCancelListener);
setContentView(R.layout.dialog_stacked_buttons);
getWindow().setBackgroundDrawableResource(R.drawable.bg_transparent_dlg);
TextView title = findViewById(R.id.tv__title);
UiUtils.setTextAndHideIfEmpty(title, mTitle);

View File

@@ -47,7 +47,7 @@ public class BookmarkColorDialogFragment extends BaseMwmDialogFragment
mIconResId = getArguments().getInt(ICON_RES);
}
return new MaterialAlertDialogBuilder(requireActivity())
return new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog)
.setView(buildView())
.setTitle(R.string.choose_color)
.setNegativeButton(R.string.cancel, null)

View File

@@ -464,7 +464,7 @@ public class PlacePageController
mAlertDialog.show();
return;
}
mAlertDialog = new MaterialAlertDialogBuilder(requireContext())
mAlertDialog = new MaterialAlertDialogBuilder(requireContext(), R.style.MwmTheme_AlertDialog)
.setTitle(requireContext().getString(R.string.delete_track_dialog_title, mMapObject.getTitle()))
.setCancelable(true)
.setNegativeButton(R.string.cancel, null)

View File

@@ -154,7 +154,6 @@ public class PlacePageView extends Fragment
private MaterialTextView mTvLastChecked;
private View mEditPlace;
private View mAddPlace;
private View mMapTooOld;
private View mEditTopSpace;
private ShapeableImageView mColorIcon;
private MaterialTextView mTvCategory;
@@ -319,7 +318,6 @@ public class PlacePageView extends Fragment
mTvLastChecked = mFrame.findViewById(R.id.place_page_last_checked);
mEditPlace = mFrame.findViewById(R.id.ll__place_editor);
mAddPlace = mFrame.findViewById(R.id.ll__place_add);
mMapTooOld = mFrame.findViewById(R.id.cv__map_too_old);
mEditTopSpace = mFrame.findViewById(R.id.edit_top_space);
latlon.setOnLongClickListener(this);
address.setOnLongClickListener(this);
@@ -428,9 +426,8 @@ public class PlacePageView extends Fragment
private void updateBookmarkView()
{
boolean enabled = mMapObject.isBookmark() || mMapObject.isTrack();
updateViewFragment(PlacePageBookmarkFragment.class, BOOKMARK_FRAGMENT_TAG, R.id.place_page_bookmark_fragment,
enabled);
mMapObject.isBookmark());
}
private void updateTrackView()
@@ -687,84 +684,39 @@ public class PlacePageView extends Fragment
if (RoutingController.get().isNavigating() || RoutingController.get().isPlanning())
{
UiUtils.hide(mEditPlace, mAddPlace, mEditTopSpace, mMapTooOld);
UiUtils.hide(mEditPlace, mAddPlace, mEditTopSpace);
}
else
{
UiUtils.showIf(Editor.nativeShouldShowEditPlace(), mEditPlace);
UiUtils.showIf(Editor.nativeShouldShowAddPlace(), mAddPlace);
UiUtils.hide(mMapTooOld);
MaterialButton mTvEditPlace = mEditPlace.findViewById(R.id.mb__place_editor);
MaterialButton mTvAddPlace = mAddPlace.findViewById(R.id.mb__place_add);
boolean shouldEnableEditPlace = Editor.nativeShouldEnableEditPlace();
if (shouldEnableEditPlace)
{
mTvEditPlace.setEnabled(true);
mTvAddPlace.setEnabled(true);
mTvEditPlace.setOnClickListener(this);
mTvAddPlace.setOnClickListener(this);
}
else
{
String countryId = MapManager.nativeGetSelectedCountry();
if (countryId != null && MapManager.nativeIsMapTooOldToEdit(countryId))
{
// map editing is disabled because the map is too old
mTvEditPlace.setEnabled(true);
mTvAddPlace.setEnabled(true);
mTvEditPlace.setOnClickListener((v) -> {
Utils.showSnackbar(v.getContext(), v.getRootView(), R.string.place_page_too_old_to_edit);
});
mTvAddPlace.setOnClickListener((v) -> {
Utils.showSnackbar(v.getContext(), v.getRootView(), R.string.place_page_too_old_to_edit);
});
CountryItem map = CountryItem.fill(countryId);
if (map.status == CountryItem.STATUS_UPDATABLE || map.status == CountryItem.STATUS_DONE
|| map.status == CountryItem.STATUS_FAILED)
{
UiUtils.show(mMapTooOld);
boolean canUpdateMap = map.status != CountryItem.STATUS_DONE;
MaterialButton mTvUpdateTooOldMap = mMapTooOld.findViewById(R.id.mb__update_too_old_map);
UiUtils.showIf(canUpdateMap, mTvUpdateTooOldMap);
MaterialTextView mapTooOldDescription = mMapTooOld.findViewById(R.id.tv__map_too_old_description);
if (canUpdateMap)
{
mapTooOldDescription.setText(R.string.place_page_map_too_old_description);
mTvUpdateTooOldMap.setOnClickListener((v) -> {
MapManagerHelper.warn3gAndDownload(requireActivity(), map.id, null);
UiUtils.hide(mMapTooOld);
});
}
else
mapTooOldDescription.setText(R.string.place_page_app_too_old_description);
}
}
else
{
// map editing is disabled for other reasons
mTvEditPlace.setEnabled(false);
mTvAddPlace.setEnabled(false);
}
}
final int editButtonColor =
shouldEnableEditPlace
mTvEditPlace.setOnClickListener(this);
mTvAddPlace.setOnClickListener(this);
mTvEditPlace.setEnabled(Editor.nativeShouldEnableEditPlace());
mTvAddPlace.setEnabled(Editor.nativeShouldEnableAddPlace());
final int editTextButtonColor =
Editor.nativeShouldEnableEditPlace()
? ContextCompat.getColor(
getContext(),
UiUtils.getStyledResourceId(getContext(), com.google.android.material.R.attr.colorSecondary))
: ContextCompat.getColor(getContext(), R.color.button_accent_text_disabled);
mTvEditPlace.setTextColor(editButtonColor);
mTvAddPlace.setTextColor(editButtonColor);
mTvEditPlace.setStrokeColor(ColorStateList.valueOf(editButtonColor));
mTvAddPlace.setStrokeColor(ColorStateList.valueOf(editButtonColor));
final ColorStateList editStrokeButtonColor = new ColorStateList(
new int[][]{
new int[]{android.R.attr.state_enabled}, // enabled
new int[]{-android.R.attr.state_enabled} // disabled
},
new int[]{
ContextCompat.getColor(
getContext(),
UiUtils.getStyledResourceId(getContext(), com.google.android.material.R.attr.colorSecondary)),
ContextCompat.getColor(getContext(), R.color.button_accent_text_disabled)
});
mTvEditPlace.setTextColor(editTextButtonColor);
mTvAddPlace.setTextColor(editTextButtonColor);
mTvEditPlace.setStrokeColor(editStrokeButtonColor);
mTvAddPlace.setStrokeColor(editStrokeButtonColor);
UiUtils.showIf(
UiUtils.isVisible(mEditPlace) || UiUtils.isVisible(mAddPlace),
mEditTopSpace);

View File

@@ -23,7 +23,6 @@ import app.organicmaps.R;
import app.organicmaps.sdk.bookmarks.data.Bookmark;
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
import app.organicmaps.sdk.bookmarks.data.MapObject;
import app.organicmaps.sdk.bookmarks.data.Track;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
@@ -42,7 +41,6 @@ public class PlacePageBookmarkFragment extends Fragment implements View.OnClickL
private PlacePageViewModel mViewModel;
private Bookmark currentBookmark;
private Track currentTrack;
@Nullable
@Override
@@ -90,15 +88,7 @@ public class PlacePageBookmarkFragment extends Fragment implements View.OnClickL
private void updateBookmarkDetails()
{
String notes = null;
if (currentBookmark != null)
{
notes = currentBookmark.getBookmarkDescription();
}
if (currentTrack != null)
{
notes = currentTrack.getTrackDescription();
}
final String notes = currentBookmark.getBookmarkDescription();
if (TextUtils.isEmpty(notes))
{
UiUtils.hide(mTvBookmarkNote);
@@ -130,16 +120,8 @@ public class PlacePageBookmarkFragment extends Fragment implements View.OnClickL
public void onClick(View v)
{
final FragmentActivity activity = requireActivity();
if (currentBookmark != null)
{
EditBookmarkFragment.editBookmark(currentBookmark.getCategoryId(), currentBookmark.getBookmarkId(), activity,
getChildFragmentManager(), PlacePageBookmarkFragment.this);
}
else if (currentTrack != null)
{
EditBookmarkFragment.editBookmark(currentTrack.getCategoryId(), currentTrack.getTrackId(), activity,
getChildFragmentManager(), PlacePageBookmarkFragment.this);
}
EditBookmarkFragment.editBookmark(currentBookmark.getCategoryId(), currentBookmark.getBookmarkId(), activity,
getChildFragmentManager(), PlacePageBookmarkFragment.this);
}
@Override
@@ -170,11 +152,6 @@ public class PlacePageBookmarkFragment extends Fragment implements View.OnClickL
currentBookmark = (Bookmark) mapObject;
updateBookmarkDetails();
}
if (mapObject != null && mapObject.isTrack())
{
currentTrack = (Track) mapObject;
updateBookmarkDetails();
}
}
@Override

View File

@@ -0,0 +1,25 @@
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<size
android:width="40dp"
android:height="40dp" />
<solid android:color="#51585E" />
</shape>
</item>
<item>
<vector
android:width="24dp"
android:height="24dp"
android:viewportWidth="28"
android:viewportHeight="28">
<group
android:pivotX="12"
android:pivotY="12">
<path
android:fillColor="#000"
android:pathData="M20,8 C20.82725,8 21.5,8.67275 21.5,9.5 L21.5,18.5 C21.5,19.32725 20.82725,20 20,20 L8,20 C7.17275,20 6.5,19.32725 6.5,18.5 L6.5,9.5 C6.5,8.67275 7.17275,8 8,8 L20,8 Z M20.00075,14 L8,14 L8,18.5 L20.0015,18.5 L20.00075,14 Z M14,15.5 L14,17 L9.5,17 L9.5,15.5 L14,15.5 Z M20,9.5 L8,9.5 L8,11 L20,11 L20,9.5 Z" />
</group>
</vector>
</item>
</layer-list>

View File

@@ -0,0 +1,25 @@
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<size
android:width="40dp"
android:height="40dp" />
<solid android:color="#51585E" />
</shape>
</item>
<item>
<vector
android:width="24dp"
android:height="24dp"
android:viewportWidth="28"
android:viewportHeight="28">
<group
android:pivotX="12"
android:pivotY="12">
<path
android:fillColor="#000"
android:pathData="M7,9.53073333 L14,6.3 L21,9.53073333 L21,10.60766 L19.9230733,10.60766 L19.9230733,18.68461 L21,18.68461 L21,20.2999767 L7,20.2999767 L7,18.68461 L8.07692667,18.68461 L8.07692667,10.60766 L7,10.60766 L7,9.53073333 Z M16.6923167,15.2756333 C16.6923167,14.0852833 15.4814333,13.1208 13.9976667,13.1208 C13.50468,13.1208 13.09784,12.7993017 13.09784,12.4012583 C13.09784,12.003215 13.4998967,11.6817167 13.9976667,11.6817167 C14.4954483,11.6817167 14.8974933,12.0070417 14.8974933,12.4012583 L16.69241,12.4012583 C16.69241,11.4673883 15.94096,10.6789083 14.8974933,10.3803583 L14.8974933,9.53068667 L13.1025767,9.53068667 L13.1025767,10.3803583 C12.0591567,10.6788967 11.30766,11.46733 11.30766,12.4012583 C11.30766,13.5916083 12.5185433,14.5560917 14.00231,14.5560917 C14.5000917,14.5560917 14.9021367,14.87759 14.9021367,15.2756333 C14.9021367,15.6736767 14.50008,15.995175 14.00231,15.995175 C13.5045283,15.995175 13.1024833,15.66985 13.1024833,15.2756333 L11.3075667,15.2756333 C11.3075667,16.2095033 12.0590167,16.9979833 13.1024833,17.2965333 L13.1024833,18.146205 L14.8974,18.146205 L14.8974,17.2965333 C15.94082,16.997995 16.6923167,16.2095617 16.6923167,15.2756333 Z" />
</group>
</vector>
</item>
</layer-list>

View File

@@ -0,0 +1,25 @@
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<size
android:width="40dp"
android:height="40dp" />
<solid android:color="#802D19" />
</shape>
</item>
<item>
<vector
android:width="24dp"
android:height="24dp"
android:viewportWidth="28"
android:viewportHeight="28">
<group
android:pivotX="12"
android:pivotY="12">
<path
android:pathData="M10.7398398,14.5988166 C11.2766539,14.5988166 11.7741396,14.7668787 12.1823664,15.0532612 C11.7724801,15.4914625 11.5235582,16.0775925 11.5235582,16.7240712 L11.529303,16.8892426 L11.5491056,17.0705775 C11.6012609,17.429281 11.7280184,17.7632492 11.9167798,18.0556079 L11.9546499,18.1104694 L11.9142567,18.13405 C11.1417478,18.5947243 10.6376499,19.4380664 10.6376499,20.3887564 L10.637,21.073 L5.952,21.073 L5.95232411,17.1079171 C5.95232411,15.7221656 7.06098553,14.5988166 8.46443574,14.5988166 L10.7398398,14.5988166 Z M14.7363802,18.7647355 C15.6343829,18.7647355 16.3623501,19.4913492 16.3623501,20.3887564 L16.362,21.073 L11.637,21.073 L11.6376499,20.3887564 C11.6376499,19.4918257 12.3552335,18.7647355 13.2636198,18.7647355 L14.7363802,18.7647355 Z M19.4916069,12.4068343 C20.8792516,12.4068343 22.0041478,13.5296391 22.0041478,14.9163636 L22.004,21.073 L17.362,21.073 L17.3623501,20.3887564 L17.3567032,20.2194334 L17.3385166,20.043376 C17.2273964,19.2299207 16.7526866,18.5346787 16.0784713,18.1328785 L16.0416499,18.1124694 L16.0806774,18.0575117 C16.336328,17.665886 16.4764418,17.2070581 16.4764418,16.7240712 C16.4764418,15.6254025 15.757471,14.7010059 14.7609634,14.3838791 C15.0006762,13.2537372 15.9971232,12.4068343 17.215814,12.4068343 L19.4916069,12.4068343 Z M14,15.2664694 C14.8194057,15.2664694 15.4764418,15.9151249 15.4764418,16.7240712 C15.4764418,17.5330608 14.819449,18.1816731 14,18.1816731 C13.1805943,18.1816731 12.5235582,17.5330175 12.5235582,16.7240712 C12.5235582,15.9150816 13.1805943,15.2664694 14,15.2664694 Z M9.60213775,9.19402109 C10.8681135,9.19402109 11.8832295,10.1961892 11.8832295,11.4460053 C11.8832295,12.6958883 10.8681805,13.6979895 9.60213775,13.6979895 C8.33616197,13.6979895 7.32104605,12.6958214 7.32104605,11.4460053 C7.32104605,10.1961223 8.33616197,9.19402109 9.60213775,9.19402109 Z M18.3537105,7.00111521 C19.6199026,7.00111521 20.635192,8.00345456 20.635192,9.25348422 C20.635192,10.5035808 19.6199695,11.5058532 18.3537105,11.5058532 C17.0875184,11.5058532 16.072229,10.5035139 16.072229,9.25348422 C16.072229,8.00338763 17.0875184,7.00111521 18.3537105,7.00111521 Z"
android:fillColor="#000" />
</group>
</vector>
</item>
</layer-list>

View File

@@ -0,0 +1,25 @@
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<size
android:width="40dp"
android:height="40dp" />
<solid android:color="#8C491C" />
</shape>
</item>
<item>
<vector
android:width="24dp"
android:height="24dp"
android:viewportWidth="28"
android:viewportHeight="28">
<group
android:pivotX="12"
android:pivotY="12">
<path
android:pathData="M12.5416667,11.1416783 L12.5416667,7.70257833 C12.5416667,7.31455667 12.232395,7 11.8466717,7 L11.7783342,7 C11.3945008,7 11.0833392,7.32498667 11.0833392,7.70257833 L11.0833392,11.1416783 L9.62500583,11.1416783 L9.62500583,7.70257833 C9.62500583,7.31455667 9.31573417,7 8.93001083,7 L8.86167333,7 C8.47784,7 8.16667833,7.32498667 8.16667833,7.70257833 L8.16667833,11.1416783 C8.16667833,12.749345 9.62501167,14.0000117 11.0104283,14.0000117 L10.8211833,20.055945 C10.8048897,20.5773283 11.2048417,21 11.7169383,21 L11.9080967,21 C12.4190967,21 12.815985,20.58308 12.7940167,20.055945 L12.54169,14.0000117 C14.0000233,14.0000117 15.7500233,12.749345 15.4583567,11.1416783 L15.4583567,7.70257833 C15.4583567,7.31455667 15.149085,7 14.7633617,7 L14.6950242,7 C14.3111908,7 14.0000292,7.32498667 14.0000292,7.70257833 L14.0000292,11.1416783 L12.5416958,11.1416783 L12.5416667,11.1416783 Z M16.3333333,14.933345 L18.0833333,14.933345 L18.0833333,20.130845 C18.0833333,20.6108933 18.4717167,21.0000467 18.9583333,21.0000467 C19.4415783,21.0000467 19.8333333,20.6109983 19.8333333,20.1242883 L19.8333333,7.000455 C17.3903333,7.000455 16.275,8.69912167 16.3333333,10.0337883 L16.3333333,14.9337883 L16.3333333,14.933345 Z"
android:fillColor="#000" />
</group>
</vector>
</item>
</layer-list>

View File

@@ -0,0 +1,25 @@
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<size
android:width="40dp"
android:height="40dp" />
<solid android:color="#802D19" />
</shape>
</item>
<item>
<vector
android:width="24dp"
android:height="24dp"
android:viewportWidth="28"
android:viewportHeight="28">
<group
android:pivotX="12"
android:pivotY="12">
<path
android:pathData="M14.8166667,12.2166667 L14.8166667,17.525 C14.8166667,20.0076667 12.8076667,22.0166667 10.325,22.0166667 C7.84233333,22.0166667 5.83333333,20.0076667 5.83333333,17.525 L5.83333333,12.2166667 L14.8166667,12.2166667 Z M12.3666667,17.9333333 L8.28333333,17.9333333 C8.28333333,18.6111667 9.198,19.1583333 10.325,19.1583333 C11.452,19.1583333 12.3666667,18.6111667 12.3666667,17.9333333 Z M22.1666667,6.5 L22.1666667,11.8083333 C22.1666667,14.291 20.1576667,16.3 17.675,16.3 C16.94,16.3 16.2458333,16.1121667 15.6333333,15.8018333 L15.6333333,11.4 L13.1833333,11.4 L13.1833333,6.5 L22.1666667,6.5 Z M12.3666667,14.6666667 C11.9175,14.6666667 11.55,15.0341667 11.55,15.4833333 C11.55,15.9325 11.9175,16.3 12.3666667,16.3 C12.8158333,16.3 13.1833333,15.9325 13.1833333,15.4833333 C13.1833333,15.0341667 12.8158333,14.6666667 12.3666667,14.6666667 Z M8.28333333,14.6666667 C7.83416667,14.6666667 7.46666667,15.0341667 7.46666667,15.4833333 C7.46666667,15.9325 7.83416667,16.3 8.28333333,16.3 C8.7325,16.3 9.1,15.9325 9.1,15.4833333 C9.1,15.0341667 8.7325,14.6666667 8.28333333,14.6666667 Z M17.675,12.2166667 C16.548,12.2166667 15.6333333,12.7638333 15.6333333,13.4416667 L19.7166667,13.4416667 C19.7166667,12.7638333 18.802,12.2166667 17.675,12.2166667 Z M15.6333333,9.01533333 C15.1841667,9.01533333 14.8166667,9.38283333 14.8166667,9.832 C14.8166667,10.2811667 15.1841667,10.6486667 15.6333333,10.6486667 C16.0825,10.6486667 16.45,10.2893333 16.45,9.832 C16.45,9.38283333 16.0825,9.01533333 15.6333333,9.01533333 Z M19.7166667,9.01533333 C19.2675,9.01533333 18.9,9.38283333 18.9,9.832 C18.9,10.2811667 19.2675,10.6486667 19.7166667,10.6486667 C20.1658333,10.6486667 20.5333333,10.2893333 20.5333333,9.832 C20.5333333,9.38283333 20.1658333,9.01533333 19.7166667,9.01533333 Z"
android:fillColor="#000" />
</group>
</vector>
</item>
</layer-list>

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