Compare commits

..

1 Commits

Author SHA1 Message Date
x7z4w
89bcc9894d [android] Do not crash on unknown types
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-10-19 12:27:20 +02:00
923 changed files with 7941 additions and 17931 deletions

View File

@@ -1,382 +0,0 @@
name: map-generator
on:
workflow_dispatch: # Manual trigger
inputs:
jobs:
description: 'Which job(s) to run right now?'
required: true
default: 'all'
type: choice
options:
- all
- copy-coasts
- planet
- wiki
- isolines
- subways
- tiger
- maps
env:
WIKIMEDIA_USERNAME: ${{ secrets.WIKIMEDIA_USERNAME }}
WIKIMEDIA_PASSWORD: ${{ secrets.WIKIMEDIA_PASSWORD }}
S3_KEY_ID: ${{ secrets.S3_KEY_ID }}
S3_SECRET_KEY: ${{ secrets.S3_SECRET_KEY }}
S3_ENDPOINT: ${{ secrets.S3_ENDPOINT }}
S3_BUCKET: ${{ secrets.S3_BUCKET }}
SFTP_USER: ${{ secrets.SFTP_USER }}
SFTP_PASSWORD: ${{ secrets.SFTP_PASSWORD }}
SFTP_HOST: ${{ secrets.SFTP_HOST }}
SFTP_PATH: ${{ secrets.SFTP_PATH }}
DEBIAN_FRONTEND: noninteractive
TZ: Etc/UTC
jobs:
copy-coasts:
if: inputs.jobs == 'copy-coasts' || inputs.jobs == 'all'
name: Copy Previously Generated Coasts
runs-on: mapfilemaker
container:
image: ubuntu:latest
volumes:
- /media/4tbexternal:/media/4tbexternal
concurrency:
group: ${{ github.workflow }}-map-generator-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
steps:
- name: Copy Coasts
shell: bash
run: |
if [ -f /media/4tbexternal/osm-maps/*/intermediate_data/WorldCoasts.geom ]; then
cp /media/4tbexternal/osm-maps/*/intermediate_data/WorldCoasts.geom /media/4tbexternal/osm-planet/latest_coasts.geom
cp /media/4tbexternal/osm-maps/*/intermediate_data/WorldCoasts.rawgeom /media/4tbexternal/osm-planet/latest_coasts.rawgeom
fi
update-planet:
if: inputs.jobs == 'planet' || inputs.jobs == 'all'
name: Update Planet
runs-on: mapfilemaker
container:
image: ubuntu:latest
volumes:
- /media/4tbexternal:/media/4tbexternal
concurrency:
group: ${{ github.workflow }}-map-generator-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
steps:
- name: Install dependencies
shell: bash
run: |
apt-get update -y
apt-get install -y pyosmium osmium-tool python3-venv python3-pip wget2
rm -f /usr/lib/python*/EXTERNALLY-MANAGED
pip3 install "protobuf<4"
- name: Download Planet File if Absent
shell: bash
run: |
if [ ! -d /media/4tbexternal/osm-planet/planet/ ]; then
mkdir -p /media/4tbexternal/osm-planet/planet/
fi
if [ ! -f /media/4tbexternal/osm-planet/planet/planet-latest.osm.pbf ]; then
cd /media/4tbexternal/osm-planet/planet/
wget2 --verbose --progress=bar --continue --debug https://ftpmirror.your.org/pub/openstreetmap/pbf/planet-latest.osm.pbf
fi
- name: Update Planet
shell: bash
run: |
cd /media/4tbexternal/osm-planet/planet/
pyosmium-up-to-date planet-latest.osm.pbf -o planet-latest-new.osm.pbf -vv --size 16384
mv planet-latest-new.osm.pbf planet-latest.osm.pbf
- name: Converting planet-latest.osm.pbf to planet.o5m
run: /root/OM/osmctools/osmconvert planet-latest.osm.pbf -o=planet.o5m
wiki-update:
if: inputs.jobs == 'wiki' || inputs.jobs == 'all'
name: Update Wikipedia
runs-on: mapfilemaker
container:
image: ubuntu:latest
volumes:
- /media/4tbexternal:/media/4tbexternal
concurrency:
group: ${{ github.workflow }}-map-generator-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
steps:
- name: Install dependencies
shell: bash
run: |
apt-get update -y
apt-get install -y jq curl wget2 rustc cargo git ca-certificates
- name: Clone wikiparser if necessary
shell: bash
run: |
if [ ! -d /media/4tbexternal/wikiparser ]; then
cd /media/4tbexternal
git clone https://codeberg.org/comaps/wikiparser.git
fi
- name: Check for planet file
shell: bash
run: |
if [ ! -f /media/4tbexternal/osm-planet/planet/planet-latest.osm.pbf ]; then
echo "ERROR: No file at /media/4tbexternal/osm-planet/planet/planet-latest.osm.pbf"
ls -al /media/4tbexternal/
ls -al /media/4tbexternal/osm-planet/
ls -al /media/4tbexternal/osm-planet/planet/
exit 1
fi
- name: Update Wikipedia from Enterprise API
shell: bash
run: |
mkdir -p /media/4tbexternal/osm-planet/wikipedia/dumps
mkdir -p /media/4tbexternal/osm-planet/wikipedia/build
cd /media/4tbexternal/wikiparser
ls -al
echo "Downloading ..."
./download.sh /media/4tbexternal/osm-planet/wikipedia/dumps
echo "Running ..."
./run.sh /media/4tbexternal/osm-planet/wikipedia/build \
/media/4tbexternal/osm-planet/planet/planet-latest.osm.pbf \
/media/4tbexternal/osm-planet/wikipedia/dumps/latest/*.tar.gz
echo "DONE"
update-isolines:
if: inputs.jobs == 'isolines' || inputs.jobs == 'all'
name: Update Isolines
runs-on: mapfilemaker
container:
image: ubuntu:latest
volumes:
- /media/4tbexternal:/media/4tbexternal
concurrency:
group: ${{ github.workflow }}-map-generator-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
steps:
- name: Install dependencies
shell: bash
run: |
apt-get update -qq \
&& apt-get install -y --no-install-recommends \
curl \
osmctools \
rclone \
git \
ca-certificates \
openssh-client \
sshpass \
vim \
wget \
build-essential \
clang \
cmake \
python3 \
python3-pip \
python3.12-venv \
qt6-base-dev \
qt6-positioning-dev \
libc++-dev \
libfreetype-dev \
libglvnd-dev \
libgl1-mesa-dev \
libharfbuzz-dev \
libicu-dev \
libqt6svg6-dev \
libqt6positioning6-plugins \
libqt6positioning6 \
libsqlite3-dev \
libxrandr-dev \
libxinerama-dev \
libxcursor-dev \
libxi-dev \
zlib1g-dev
rm -f /usr/lib/python*/EXTERNALLY-MANAGED
pip3 install "protobuf<4"
- name: Clone main repo if necessary
shell: bash
run: |
if [ ! -d /media/4tbexternal/comaps-init ]; then
apt-get update -qq && apt-get install -y --no-install-recommends git
cd /media/4tbexternal
git clone --recurse-submodules --shallow-submodules -b rebase-generator-pastk-wb251014 --single-branch https://codeberg.org/comaps/comaps.git comaps-init
fi
- name: Update Isolines
shell: bash
run: |
cd /media/4tbexternal/comaps-init/
./tools/unix/build_omim.sh -R topography_generator_tool
rm -rf ../osm-planet/isolines/
mkdir ../osm-planet/isolines/
../omim-build-relwithdebinfo/topography_generator_tool \
--profiles_path=./data/conf/isolines/isolines-profiles.json \
--countries_to_generate_path=./data/conf/isolines/countries-to-generate.json \
--tiles_isolines_out_dir=../osm-planet/isolines/tmp-tiles/ \
--countries_isolines_out_dir=../osm-planet/isolines/ \
--data_dir=./data/ \
--srtm_path=../osm-planet/SRTM-patched-europe/ \
--threads=22
update-subways:
if: inputs.jobs == 'subways' || inputs.jobs == 'all'
name: Update Subways
runs-on: mapfilemaker
container:
image: ubuntu:latest
volumes:
- /media/4tbexternal:/media/4tbexternal
concurrency:
group: ${{ github.workflow }}-map-generator-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
steps:
- name: Install dependencies
shell: bash
run: |
apt-get update -qq && apt-get install -y --no-install-recommends curl osmctools osmium-tool python3-venv ca-certificates git python3-pip
rm -f /usr/lib/python*/EXTERNALLY-MANAGED
pip3 install "protobuf<4"
- name: Clone subways if necessary
shell: bash
run: |
if [ ! -d /media/4tbexternal/subways ]; then
cd /media/4tbexternal
git clone https://codeberg.org/comaps/subways.git
fi
- name: Clone main repo if necessary
shell: bash
run: |
if [ ! -d /media/4tbexternal/comaps-init ]; then
cd /media/4tbexternal
git clone --recurse-submodules --shallow-submodules -b rebase-generator-pastk-wb251014 --single-branch https://codeberg.org/comaps/comaps.git comaps-init
fi
- name: Update Subways
shell: bash
run: |
cd /media/4tbexternal/comaps-init/
cp tools/unix/maps/settings.sh.prod tools/unix/maps/settings.sh
./tools/unix/maps/generate_subways.sh
update-tiger:
if: inputs.jobs == 'tiger' || inputs.jobs == 'all'
name: Update TIGER
runs-on: mapfilemaker
container:
image: ubuntu:latest
volumes:
- /media/4tbexternal:/media/4tbexternal
concurrency:
group: ${{ github.workflow }}-map-generator-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
steps:
- name: Install dependencies
shell: bash
run: |
apt-get update -qq && apt-get install -y --no-install-recommends \
build-essential \
clang \
cmake \
ninja-build \
ca-certificates \
git \
wget2
- name: Clone main repo if necessary
shell: bash
run: |
if [ ! -d /media/4tbexternal/comaps-init ]; then
cd /media/4tbexternal
git clone --recurse-submodules --shallow-submodules -b rebase-generator-pastk-wb251014 --single-branch https://codeberg.org/comaps/comaps.git comaps-init
fi
- name: Build address_parser
shell: bash
run: |
cd /media/4tbexternal/comaps-init
rm -rf ../omim-build-relwithdebinfo/CMakeCache.txt
rm -rf ../omim-build-relwithdebinfo/CMakeFiles
./tools/unix/build_omim.sh -R address_parser_tool
- name: Update TIGER from Nominatim
shell: bash
run: |
cd /media/4tbexternal/osm-planet/
wget2 https://nominatim.org/data/tiger-nominatim-preprocessed-latest.csv.tar.gz
tar -xOzf tiger-nominatim-preprocessed-latest.csv.tar.gz | /media/4tbexternal/omim-build-relwithdebinfo/address_parser_tool --output_path=./tiger
generate-maps:
if: inputs.jobs == 'maps' || inputs.jobs == 'all'
name: Generate Maps
runs-on: mapfilemaker
container:
image: ubuntu:latest
volumes:
- /media/4tbexternal:/media/4tbexternal
options: --ulimit nofile=262144:262144
concurrency:
group: ${{ github.workflow }}-map-generator-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
steps:
- name: Install dependencies
shell: bash
run: |
apt-get update -qq \
&& apt-get install -y --no-install-recommends \
curl \
osmctools \
rclone \
git \
ca-certificates \
openssh-client \
sshpass \
vim \
wget \
build-essential \
clang \
cmake \
ninja-build \
python3 \
python3-pip \
python3.12-venv \
qt6-base-dev \
qt6-positioning-dev \
libc++-dev \
libfreetype-dev \
libglvnd-dev \
libgl1-mesa-dev \
libharfbuzz-dev \
libicu-dev \
libqt6svg6-dev \
libqt6positioning6-plugins \
libqt6positioning6 \
libsqlite3-dev \
libxrandr-dev \
libxinerama-dev \
libxcursor-dev \
libxi-dev \
zlib1g-dev
- name: Clone repo if necessary
shell: bash
run: |
if [ ! -d /media/4tbexternal/comaps-init ]; then
cd /media/4tbexternal
git clone --recurse-submodules --shallow-submodules -b rebase-generator-pastk-wb251014 --single-branch https://codeberg.org/comaps/comaps.git comaps-init
fi
- name: Make output folders if necessary
shell: bash
run: |
if [ ! -d /media/4tbexternal/osm-maps ]; then
mkdir -p /media/4tbexternal/osm-maps
fi
- name: Get SRTM if necessary
shell: bash
run: |
if [ ! -d /media/4tbexternal/osm-planet/SRTM-patched-europe/ ]; then
echo "ERROR: NO SRTM"
exit 1
fi
- name: Symlink paths for repo scripts
shell: bash
run: |
mkdir -p /root/OM
ln -s /media/4tbexternal/comaps-init /root/OM/organicmaps
ln -s /media/4tbexternal/osm-planet /home/planet
ln -s /media/4tbexternal/osm-maps /root/OM/maps_build
- name: Run docker_maps_generator.sh
shell: bash
run: |
cd /root/OM/organicmaps
./tools/unix/docker_maps_generator.sh

View File

@@ -175,10 +175,10 @@ if (NOT PLATFORM_IPHONE AND NOT PLATFORM_ANDROID)
find_package(Qt6 COMPONENTS REQUIRED ${qt_components} PATHS $ENV{QT_PATH} /opt/homebrew/opt/qt@6 /usr/local/opt/qt@6 /usr/lib/x86_64-linux-gnu/qt6) find_package(Qt6 COMPONENTS REQUIRED ${qt_components} PATHS $ENV{QT_PATH} /opt/homebrew/opt/qt@6 /usr/local/opt/qt@6 /usr/lib/x86_64-linux-gnu/qt6)
set(MINIMUM_REQUIRED_QT_VERSION 6.4.0) set(MINIMUM_REQUIRED_QT_VERSION 6.4.0)
if (Qt6_VERSION VERSION_LESS ${MINIMUM_REQUIRED_QT_VERSION}) if (Qt6Widgets_VERSION VERSION_LESS ${MINIMUM_REQUIRED_QT_VERSION})
message(FATAL_ERROR "Unsupported Qt version: ${Qt6_VERSION}, the minimum required is ${MINIMUM_REQUIRED_QT_VERSION}") message(FATAL_ERROR "Unsupported Qt version: ${Qt6Widgets_VERSION}, the minimum required is ${MINIMUM_REQUIRED_QT_VERSION}")
else() else()
message(STATUS "Found Qt version: ${Qt6_VERSION}") message(STATUS "Found Qt version: ${Qt6Widgets_VERSION}")
endif() endif()
endif() endif()

View File

@@ -23,10 +23,10 @@
<img src="https://img.shields.io/github/license/comaps/comaps?style=for-the-badge&logo=opensourceinitiative&logoColor=white&color=588157" alt="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>
<a href="https://github.com/comaps/comaps/actions/workflows/android-check.yaml"> <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"/> <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&color=588157" alt="Android Build Status"/>
</a> </a>
<a href="https://github.com/comaps/comaps/actions/workflows/ios-check.yaml"> <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"/> <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&color=588157" alt="iOS Build Status"/>
</a> </a>
<a href="https://opencollective.com/comaps"> <a href="https://opencollective.com/comaps">
<img src="https://img.shields.io/opencollective/all/comaps?label=Open%20Collective%20Donors&logo=opencollective&logoColor=white&style=for-the-badge&color=588157" alt="Open Collective Donors"/> <img src="https://img.shields.io/opencollective/all/comaps?label=Open%20Collective%20Donors&logo=opencollective&logoColor=white&style=for-the-badge&color=588157" alt="Open Collective Donors"/>

View File

@@ -1 +0,0 @@
CoMaps - Mapas ensin conexón con privacidá

View File

@@ -0,0 +1,9 @@
• Vylepšena viditelnost a uživatelské rozhraní pokynů v navigaci
• Přidána možnost vynechat kroky
• Vylepšeno vyhledávání ve více jazycích
• Přidána specifická ikona pro autobusové zastávky
• Opraveny problémy s Android Auto (prostřednictvím projektu OM)
• Vylepšen editor a opraveny drobné problémy
• Vylepšeny styly map (prostřednictvím projektu OM)
• Vylepšeny překlady aplikace
Další změny najdete v našich poznámkách k vydání Codeberg!

View File

@@ -1,8 +1,9 @@
OpenStreetMap-Daten vom 4. November Verbesserte Sichtbarkeit & Benutzeroberfläche für Navigationsanweisungen
Aktualisierte Karten-Icons, inkl. Farben für Unterhaltungs-, Sport- & andere Unternehmen Option um Treppen zu vermeiden
Informationen zu Steckdosen an EV-Ladestationen Verbesserte Suche in mehreren Sprachen
• Symbole für Sportzentren, Veranstaltungsorte, Massagesalons, Gästehäuser und einige stillgelegte Unternehmen Spezifisches Symbol für Busbahnöfe hinzugefügt
Verbesserungen bei der Suche Probleme mit Android Auto behoben (via OM)
Behebung eines Absturzes bei der Suche Verbesserter Editor mit kleinere Bugfixes
Verbesserte Sprachführung während der Navigation Kartenstile verbessert (via OM)
Weitere Änderungen finden in unseren Codeberg-Versionshinweisen! • Verbesserte Übersetzungen
Für weitere Änderungen siehe Codeberg-Versionshinweise

View File

@@ -1,8 +1,9 @@
OpenStreetMap data as of November 4 Improved visibility and UI of instructions in navigation
Recategorized map icons including some new colors for entertainment, sports and other businesses Added option to avoid steps
Display info about available sockets on charging stations Improved search in multiple languages
• Added bandstands, backless benches and loungers • Added specific icon for bus stations
New icons for different sport centres, event venues, massage salons, guest houses and some disused businesses Fixed Android Auto issues (via OM project)
Multiple search improvements and crash fix Improved editor and fix minor issues
• Improved voice guidance during navigation • Improved map styles (via OM project)
• Improved app translations
Check our Codeberg release notes for more changes! Check our Codeberg release notes for more changes!

View File

@@ -1,7 +1,8 @@
Datos OSM del 04/11 Mejora de la visibilidad y la interfaz de usuario de las instrucciones de navegación
Iconos del mapa recategorizados, incluyendo nuevos colores Se ha añadido la opción de evitar escaleras
Visualización de información sobre enchufes disponibles en estaciones de recarga Mejora de la búsqueda en varios idiomas como ES
Adición de iconos para diferentes centros deportivos, lugares de eventos, salones de masajes, posadas y algunos establecimientos comerciales desactivados Se ha añadido un icono específico para las estaciones de autobús
Varias mejoras y correcciones de errores en la búsqueda Se han solucionado los problemas de Android Auto (a través del proyecto OM)
Mejora en la orientación por voz durante la navegación Se ha mejorado el editor y se han solucionado pequeños problemas
• Se han mejorado los estilos de los mapas (a través del proyecto OM)
Más detalles en Codeberg Más detalles en Codeberg

View File

@@ -1,8 +1,9 @@
Données OpenStreetMap au 4 novembre Interface utilisateur et visibilité des instructions en navigation améliorée
Recatégorisation des icônes sur la carte avec ajout de nouvelles couleurs pour certains types de lieux Option pour éviter les escaliers ajoutée
Affichage des prises sur les bornes électriques Recherche améliorée dans différents languages
Ajout d'icônes pour les centres sportifs, salles d'événements, salon de massage et autres lieux Icône pour les gares routières ajoutée
Multiple améliorations dans la recherche Corrections de bugs liées à Android Auto (via OM)
Correction d'un plantage dans la recherche Editeur amélioré et corrections de bugs
Amélioration de la synthèse vocale durant la navigation Style de la carte amélioré (via OM)
• Traductions améliorées
Plus d'informations sur notre Codeberg Plus d'informations sur notre Codeberg

View File

@@ -1,7 +1,9 @@
Dados OSM de 04/11 Visibilidade e interface do usuário aprimoradas para instruções na navegação
Ícones do mapa recategorizados, incluindo novas cores Opção adicionada para evitar degraus
Exibição de informações sobre tomadas disponíveis em eletropostos Busca aprimorada em vários idiomas
• Adição de ícones para diferentes centros esportivos, locais de eventos, salões de massagem, pousadas e alguns estabelecimentos comerciais desativados • Adição de ícone específico para rodoviárias
Diversas melhorias e correção de erro na busca Problemas corrigidos no Android Auto (via projeto OM)
Melhoria na orientação por voz durante a navegação Editor aprimorado e correção de problemas menores
Confira nossas notas de lançamento no Codeberg para mais detalhes! • Estilos de mapa aprimorados (via projeto OM)
• Traduções aprimoradas
Confira nossas notas de lançamento do Codeberg para mais mudanças!

View File

@@ -1,32 +0,0 @@
Uma aplicação pela comunidade, grátis e open-source, de mapas baseada em dados do OpenStreetMap e reforçada com compromisso para transparência, privacidade e sem fins lucrativos. CoMaps é um fork/spin-off de Organic Maps, que, por sua vez, é um fork de Maps.ME
Leia sobre as razões deste projeto e a sua direção em <b><i>codeberg.org/comaps</i></b>.
Junte-se à comunidade e ajude a fazer a melhor aplicação de mapas
• Use a aplicação e partilhe-a com outros
• Dê feedback e reporte problemas
• Atualize os dados de mapa na aplicação ou no site do OpenStreetMap
‣ <b>Simples e Polida</b>: funcionalidades essenciais fáceis que “somente funcionam”.
‣ <b>Foco Offline</b>: Planeie e navegue as suas viagens no estrangeiro sem dados móveis, procure locais numa caminhada distante, etc. Todas as funções da aplicação foram criadas com intenção de serem usadas sem internet.
‣ <b>Respeita a privacidade</b>: A aplicação foi criada com privacidade em mente — não identifica o utilizador, não rastreia, e não usa a sua informação pessoal. Sem anúncios.
‣ <b>Saves Your Battery and Space</b>: Não esgota a sua bateria ao contrário de outras aplicações. Mapas compactos salvam espaço no seu telemóvel.
‣ <b>Gratuita e Feita pela Comunidade</b>: Pessoas como si ajudam a criar a aplicação ao adicionar locais ao OpenStreetMap, testando e dando opiniões em funcionalidades e contribuindo com dotes de desenvolvimento e dinheiro.
‣ <b>Decisões e Finanças Abertas e Transparentes, Sem fins lucrativos e Open-Source.</b>
<b>Funcionalidades principais</b>:
• Mapas detalhados descarregáveis com locais que não estão disponíveis com o Google Maps
• Modo ao Ar Livre com trilhos de caminhada destacados, acampamentos, fontes de água, cumes, curvas de nível, etc
• Caminhos pedestres e ciclovias
• Pontos de interesse como restaurantes, estações de serviço, hotéis, lojas, atrações e muitos mais
• Pesquise por nome, endereço, ou por categoria de ponto de interesse
• Navegação com anúncios de voz ao caminhar, pedalar ou conduzir
• Marque os seus locais favoritos com um único clique
• Artigos da Wikipédia Offline
• Camada de metro e direções
• Gravação de Percursos
• Exportar e importar marcadores e percursos em formatos KML, KMZ, GPX
• Um modo escuro para usar durante a noite
• Melhore a informação do mapa para todos com um editor básico embebido
<b>A liberdade chegou</b>
Descubra a sua jornada, navegue o mundo com privacidade e a comunidade à frente!

View File

@@ -1,8 +1,9 @@
Карты OpenStreetMap от 4 ноября Лучшая видимость и интерфейс при навигации
Обновлены цвета иконок на карте, добавлены новые цвета для развлечений, спорта, некоторых бизнесов Добавлена возможность пропускать шаги
На зарядных станциях показываются имеющиеся типы разъёмов Улучшен поиск на нескольких языках
Добавлены эстрады, скамейки без спинок и лежаки Новый значок автостанций
Новые иконки для разных спорт центров, массажных салонов, гостевых домов, некоторых закрытых бизнесов Исправлены проблемы с Android Auto (через OM)
Несколько улучшений и исправлений в поиске Улучшен редактор и исправлены мелкие недочёты
• Улучшены голосовые подсказки при навигации • Улучшены стили карт (через OM)
Подробнее смотрите на codeberg.org/comaps/comaps/releases • Улучшены переводы приложения
Ознакомьтесь с примечаниями к выпуску Codeberg, чтобы узнать изменениях!

View File

@@ -1,31 +0,0 @@
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.
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 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, nedobičkonosno in popolnoma odprtokodno.</b>
<b>Glavne zmogljivosti</b>:
• 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 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š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 Odkrij več o svojem potovanju Podprto v skupnosti Enostavna navigacija Odkrij več o svojem potovanju Podprto v skupnosti

View File

@@ -1 +0,0 @@
Comaps- Vandra, Cykla, Kör Offline, Privat

View File

@@ -1,36 +0,0 @@
Uma aplicação pela comunidade, grátis e open-source, de mapas baseada em dados do OpenStreetMap e reforçada com compromisso para transparência, privacidade e sem fins lucrativos.
Junte-se à comunidade e ajude a fazer a melhor aplicação de mapas
• Use a aplicação e partilhe-a com outros
• Dê feedback e reporte problemas
• Atualize os dados de mapa na aplicação ou no site do OpenStreetMap
<i>O seu feedback e reviews de 5 estrelas são a melhor maneira de nos ajudar!</i>
‣ <b>Simples e Polida</b>: funcionalidades essenciais fáceis que “somente funcionam”.
‣ <b>Foco Offline</b>: Planeie e navegue as suas viagens no estrangeiro sem dados móveis, procure locais numa caminhada distante, etc. Todas as funções da aplicação foram criadas com intenção de serem usadas sem internet.
‣ <b>Respeita a privacidade</b>: A aplicação foi criada com privacidade em mente — não identifica o utilizador, não rastreia, e não usa a sua informação pessoal. Sem anúncios.
‣ <b>Saves Your Battery and Space</b>: Não esgota a sua bateria ao contrário de outras aplicações. Mapas compactos salvam espaço no seu telemóvel.
‣ <b>Gratuita e Feita pela Comunidade</b>: Pessoas como si ajudam a criar a aplicação ao adicionar locais ao OpenStreetMap, testando e dando opiniões em funcionalidades e contribuindo com dotes de desenvolvimento e dinheiro.
‣ <b>Decisões e Finanças Abertas e Transparentes, Sem fins lucrativos e Open-Source.</b>
<b>Funcionalidades principais</b>:
• Mapas detalhados descarregáveis com locais que não estão disponíveis com o Google Maps
• Modo ao Ar Livre com trilhos de caminhada destacados, acampamentos, fontes de água, cumes, curvas de nível, etc
• Caminhos pedestres e ciclovias
• Pontos de interesse como restaurantes, estações de serviço, hotéis, lojas, atrações e muitos mais
• Pesquise por nome, endereço, ou por categoria de ponto de interesse
• Navegação com anúncios de voz ao caminhar, pedalar ou conduzir
• Marque os seus locais favoritos com um único clique
• Artigos da Wikipédia Offline
• Camada de metro e direções
• Gravação de Percursos
• Exportar e importar marcadores e percursos em formatos KML, KMZ, GPX
• Um modo escuro para usar durante a noite
• Melhore a informação do mapa para todos com um editor básico embebido
• Suporte para Android Auto
Por favor, reporte problemas da aplicação, sugira ideias e junte-se à nossa comunidade no website <b><i>comaps.app</i></b>.
<b>A liberdade chegou</b>
Descubra a sua jornada, navegue o mundo com privacidade e a comunidade à frente!

View File

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

View File

@@ -1 +1 @@
CoMaps - Usmerjajte zasebno CoMaps - Navigacija z zasebnostjo

View File

@@ -1 +0,0 @@
Comaps- Navigera Privat

View File

@@ -1,13 +1,11 @@
package app.organicmaps.background; package app.organicmaps.background;
import android.content.Context; import android.content.Context;
import android.os.Build;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.work.Constraints; import androidx.work.Constraints;
import androidx.work.ExistingWorkPolicy; import androidx.work.ExistingWorkPolicy;
import androidx.work.NetworkType; import androidx.work.NetworkType;
import androidx.work.OneTimeWorkRequest; import androidx.work.OneTimeWorkRequest;
import androidx.work.OutOfQuotaPolicy;
import androidx.work.WorkManager; import androidx.work.WorkManager;
import androidx.work.Worker; import androidx.work.Worker;
import androidx.work.WorkerParameters; import androidx.work.WorkerParameters;
@@ -37,11 +35,7 @@ public class OsmUploadWork extends Worker
if (Editor.nativeHasSomethingToUpload() && OsmOAuth.isAuthorized()) if (Editor.nativeHasSomethingToUpload() && OsmOAuth.isAuthorized())
{ {
final Constraints c = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build(); final Constraints c = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
OneTimeWorkRequest.Builder builder = new OneTimeWorkRequest.Builder(OsmUploadWork.class).setConstraints(c); final OneTimeWorkRequest wr = new OneTimeWorkRequest.Builder(OsmUploadWork.class).setConstraints(c).build();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
builder.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST);
}
final OneTimeWorkRequest wr = builder.build();
WorkManager.getInstance(context).beginUniqueWork("UploadOsmChanges", ExistingWorkPolicy.KEEP, wr).enqueue(); WorkManager.getInstance(context).beginUniqueWork("UploadOsmChanges", ExistingWorkPolicy.KEEP, wr).enqueue();
} }
} }

View File

@@ -7,9 +7,15 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.StyleRes; import androidx.annotation.StyleRes;
import androidx.fragment.app.DialogFragment; import androidx.fragment.app.DialogFragment;
import app.organicmaps.R;
public class BaseMwmDialogFragment extends DialogFragment public class BaseMwmDialogFragment extends DialogFragment
{ {
@StyleRes
protected final int getFullscreenTheme()
{
return R.style.MwmTheme_DialogFragment_Fullscreen;
}
protected int getStyle() protected int getStyle()
{ {

View File

@@ -188,7 +188,7 @@ public class BookmarkCategoriesFragment extends BaseMwmRecyclerFragment<Bookmark
ArrayList<MenuBottomSheetItem> items = new ArrayList<>(); ArrayList<MenuBottomSheetItem> items = new ArrayList<>();
if (mSelectedCategory != null) if (mSelectedCategory != null)
{ {
items.add(new MenuBottomSheetItem(R.string.edit, R.drawable.ic_edit, items.add(new MenuBottomSheetItem(R.string.edit, R.drawable.ic_settings,
() -> onSettingsActionSelected(mSelectedCategory))); () -> onSettingsActionSelected(mSelectedCategory)));
items.add(new MenuBottomSheetItem(mSelectedCategory.isVisible() ? R.string.hide : R.string.show, items.add(new MenuBottomSheetItem(mSelectedCategory.isVisible() ? R.string.hide : R.string.show,
mSelectedCategory.isVisible() ? R.drawable.ic_hide : R.drawable.ic_show, mSelectedCategory.isVisible() ? R.drawable.ic_hide : R.drawable.ic_show,

View File

@@ -466,10 +466,12 @@ public class BookmarkListAdapter extends RecyclerView.Adapter<Holders.BaseBookma
View desc = inflater.inflate(R.layout.item_category_description, parent, false); View desc = inflater.inflate(R.layout.item_category_description, parent, false);
MaterialTextView moreBtn = desc.findViewById(R.id.more_btn); MaterialTextView moreBtn = desc.findViewById(R.id.more_btn);
MaterialTextView text = desc.findViewById(R.id.text); MaterialTextView text = desc.findViewById(R.id.text);
MaterialTextView title = desc.findViewById(R.id.title);
setMoreButtonVisibility(text, moreBtn); setMoreButtonVisibility(text, moreBtn);
holder = new Holders.DescriptionViewHolder(desc, mSectionsDataSource.getCategory()); holder = new Holders.DescriptionViewHolder(desc, mSectionsDataSource.getCategory());
text.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn)); text.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn));
moreBtn.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn)); moreBtn.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn));
title.setOnClickListener(v -> onMoreButtonClicked(text, moreBtn));
break; break;
} }

View File

@@ -282,11 +282,11 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
{ {
if (isEmptySearchResults()) if (isEmptySearchResults())
{ {
requirePlaceholder().setContent(R.string.search_not_found, R.string.search_not_found_query, R.drawable.ic_search_fail); requirePlaceholder().setContent(R.string.search_not_found, R.string.search_not_found_query);
} }
else if (isEmpty()) else if (isEmpty())
{ {
requirePlaceholder().setContent(R.string.bookmarks_empty_list_title, R.string.bookmarks_empty_list_message, R.drawable.ic_bookmarks); requirePlaceholder().setContent(R.string.bookmarks_empty_list_title, R.string.bookmarks_empty_list_message);
} }
boolean isEmptyRecycler = isEmpty() || isEmptySearchResults(); boolean isEmptyRecycler = isEmpty() || isEmptySearchResults();
@@ -771,7 +771,7 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
items.add(new MenuBottomSheetItem(R.string.export_file_gpx, R.drawable.ic_file_gpx, items.add(new MenuBottomSheetItem(R.string.export_file_gpx, R.drawable.ic_file_gpx,
() -> onShareOptionSelected(KmlFileType.Gpx))); () -> onShareOptionSelected(KmlFileType.Gpx)));
} }
items.add(new MenuBottomSheetItem(R.string.edit, R.drawable.ic_edit, this::onSettingsOptionSelected)); items.add(new MenuBottomSheetItem(R.string.edit, R.drawable.ic_settings, this::onSettingsOptionSelected));
if (!isLastOwnedCategory()) if (!isLastOwnedCategory())
items.add(new MenuBottomSheetItem(R.string.delete_list, R.drawable.ic_delete, this::onDeleteOptionSelected)); items.add(new MenuBottomSheetItem(R.string.delete_list, R.drawable.ic_delete, this::onDeleteOptionSelected));
return items; return items;

View File

@@ -438,17 +438,21 @@ public class Holders
static final float SPACING_MULTIPLE = 1.0f; static final float SPACING_MULTIPLE = 1.0f;
static final float SPACING_ADD = 0.0f; static final float SPACING_ADD = 0.0f;
@NonNull @NonNull
private final MaterialTextView mTitle;
@NonNull
private final MaterialTextView mDescText; private final MaterialTextView mDescText;
DescriptionViewHolder(@NonNull View itemView, @NonNull BookmarkCategory category) DescriptionViewHolder(@NonNull View itemView, @NonNull BookmarkCategory category)
{ {
super(itemView); super(itemView);
mDescText = itemView.findViewById(R.id.text); mDescText = itemView.findViewById(R.id.text);
mTitle = itemView.findViewById(R.id.title);
} }
@Override @Override
void bind(@NonNull SectionPosition position, @NonNull BookmarkListAdapter.SectionsDataSource sectionsDataSource) void bind(@NonNull SectionPosition position, @NonNull BookmarkListAdapter.SectionsDataSource sectionsDataSource)
{ {
mTitle.setText(sectionsDataSource.getCategory().getName());
bindDescription(sectionsDataSource.getCategory()); bindDescription(sectionsDataSource.getCategory());
} }
@@ -458,12 +462,9 @@ public class Holders
String formattedDesc = desc.replace("\n", "<br>"); String formattedDesc = desc.replace("\n", "<br>");
Spanned spannedDesc = Utils.fromHtml(formattedDesc); Spanned spannedDesc = Utils.fromHtml(formattedDesc);
if (!TextUtils.isEmpty(spannedDesc)) { mDescText.setText(spannedDesc);
mDescText.setText(spannedDesc);
} UiUtils.showIf(!TextUtils.isEmpty(spannedDesc), mDescText);
else {
mDescText.setText(R.string.list_description_empty);
}
} }
} }
} }

View File

@@ -32,8 +32,7 @@ public class DrivingOptionsScreen extends BaseMapScreen
new DrivingOption(RoadType.Dirty, R.string.avoid_unpaved), new DrivingOption(RoadType.Dirty, R.string.avoid_unpaved),
new DrivingOption(RoadType.Ferry, R.string.avoid_ferry), new DrivingOption(RoadType.Ferry, R.string.avoid_ferry),
new DrivingOption(RoadType.Motorway, R.string.avoid_motorways), new DrivingOption(RoadType.Motorway, R.string.avoid_motorways),
new DrivingOption(RoadType.Steps, R.string.avoid_steps), new DrivingOption(RoadType.Steps, R.string.avoid_steps)};
new DrivingOption(RoadType.Paved, R.string.avoid_paved)};
@NonNull @NonNull
private final Map<RoadType, Boolean> mInitialDrivingOptionsState = new HashMap<>(); private final Map<RoadType, Boolean> mInitialDrivingOptionsState = new HashMap<>();

View File

@@ -222,10 +222,10 @@ public class DownloaderFragment
return; return;
if (mAdapter != null && mAdapter.isSearchResultsMode()) if (mAdapter != null && mAdapter.isSearchResultsMode())
placeholder.setContent(R.string.search_not_found, R.string.search_not_found_query, R.drawable.ic_search_fail); placeholder.setContent(R.string.search_not_found, R.string.search_not_found_query);
else else
placeholder.setContent(R.string.downloader_no_downloaded_maps_title, placeholder.setContent(R.string.downloader_no_downloaded_maps_title,
R.string.downloader_no_downloaded_maps_message, R.drawable.ic_download); R.string.downloader_no_downloaded_maps_message);
} }
@Override @Override

View File

@@ -352,8 +352,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
{ {
hasChargeSockets = hasChargeSockets || (type == Metadata.MetadataType.FMD_CHARGE_SOCKETS.toInt()); hasChargeSockets = hasChargeSockets || (type == Metadata.MetadataType.FMD_CHARGE_SOCKETS.toInt());
} }
// Hide socket until https://codeberg.org/comaps/comaps/issues/2368 is fixed UiUtils.showIf(hasChargeSockets, mCardChargingStation);
//UiUtils.showIf(hasChargeSockets, mCardChargingStation);
setCardVisibility(mCardDetails, mDetailsBlocks, editableDetails); setCardVisibility(mCardDetails, mDetailsBlocks, editableDetails);
setCardVisibility(mCardSocialMedia, mSocialMediaBlocks, editableDetails); setCardVisibility(mCardSocialMedia, mSocialMediaBlocks, editableDetails);

View File

@@ -1,208 +0,0 @@
package app.organicmaps.editor;
import android.content.res.Configuration;
import android.content.res.Resources;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import com.google.android.material.timepicker.MaterialTimePicker;
import com.google.android.material.timepicker.TimeFormat;
import app.organicmaps.R;
import app.organicmaps.sdk.editor.data.HoursMinutes;
import app.organicmaps.sdk.util.DateUtils;
public class FromToTimePicker
{
private final FragmentActivity mActivity;
private final FragmentManager mFragmentManager;
private final OnPickListener mListener;
private final int mId;
private final boolean mIs24HourFormat;
private final Resources mResources;
private HoursMinutes mFromTime;
private HoursMinutes mToTime;
private MaterialTimePicker mToTimePicker;
private MaterialTimePicker mFromTimePicker;
private boolean mIsFromTimePicked;
private int mInputMode;
public static void pickTime(@NonNull Fragment fragment,
@NonNull FromToTimePicker.OnPickListener listener,
@NonNull HoursMinutes fromTime,
@NonNull HoursMinutes toTime,
int id,
boolean startWithToTime)
{
FromToTimePicker timePicker = new FromToTimePicker(fragment,
listener,
fromTime,
toTime,
id);
if (startWithToTime)
timePicker.showToTimePicker();
else
timePicker.showFromTimePicker();
}
private FromToTimePicker(@NonNull Fragment fragment,
@NonNull FromToTimePicker.OnPickListener listener,
@NonNull HoursMinutes fromTime,
@NonNull HoursMinutes toTime,
int id)
{
mActivity = fragment.requireActivity();
mFragmentManager = fragment.getChildFragmentManager();
mListener = listener;
mFromTime = fromTime;
mToTime = toTime;
mId = id;
mIsFromTimePicked = false;
mInputMode = MaterialTimePicker.INPUT_MODE_CLOCK;
mIs24HourFormat = DateUtils.is24HourFormat(mActivity);
mResources = mActivity.getResources();
mActivity.addOnConfigurationChangedListener(this::handleConfigurationChanged);
}
public void showFromTimePicker()
{
if (mFromTimePicker != null)
{
saveState(mFromTimePicker, true);
mFromTimePicker.dismiss();
}
mFromTimePicker = buildFromTimePicker();
mFromTimePicker.show(mFragmentManager, null);
}
public void showToTimePicker()
{
if (mToTimePicker != null)
{
saveState(mToTimePicker, false);
mToTimePicker.dismiss();
}
mToTimePicker = buildToTimePicker();
mToTimePicker.show(mFragmentManager, null);
}
private MaterialTimePicker buildFromTimePicker()
{
MaterialTimePicker timePicker = buildTimePicker(mFromTime,
mResources.getString(R.string.editor_time_from),
mResources.getString(R.string.next_button),
null);
timePicker.addOnNegativeButtonClickListener(view -> finishTimePicking(false));
timePicker.addOnPositiveButtonClickListener(view ->
{
mIsFromTimePicked = true;
saveState(timePicker, true);
mFromTimePicker = null;
showToTimePicker();
});
timePicker.addOnCancelListener(view -> finishTimePicking(false));
return timePicker;
}
private MaterialTimePicker buildToTimePicker()
{
MaterialTimePicker timePicker = buildTimePicker(mToTime,
mResources.getString(R.string.editor_time_to),
null,
mResources.getString(R.string.back));
timePicker.addOnNegativeButtonClickListener(view ->
{
saveState(timePicker, false);
mToTimePicker = null;
if (mIsFromTimePicked)
showFromTimePicker();
else
finishTimePicking(false);
});
timePicker.addOnPositiveButtonClickListener(view ->
{
saveState(timePicker, false);
finishTimePicking(true);
});
timePicker.addOnCancelListener(view -> finishTimePicking(false));
return timePicker;
}
@NonNull
private MaterialTimePicker buildTimePicker(@NonNull HoursMinutes time,
@NonNull String title,
@Nullable String positiveButtonTextOverride,
@Nullable String negativeButtonTextOverride)
{
MaterialTimePicker.Builder builder = new MaterialTimePicker.Builder()
.setTitleText(title)
.setTimeFormat(mIs24HourFormat ? TimeFormat.CLOCK_24H : TimeFormat.CLOCK_12H)
.setInputMode(mInputMode)
.setTheme(R.style.MwmMain_MaterialTimePicker)
.setHour((int) time.hours)
.setMinute((int) time.minutes);
if (positiveButtonTextOverride != null)
builder.setPositiveButtonText(positiveButtonTextOverride);
if (negativeButtonTextOverride != null)
builder.setNegativeButtonText(negativeButtonTextOverride);
return builder.build();
}
private void saveState(@NonNull MaterialTimePicker timePicker, boolean isFromTime)
{
mInputMode = timePicker.getInputMode();
if (isFromTime)
mFromTime = getHoursMinutes(timePicker);
else
mToTime = getHoursMinutes(timePicker);
}
private HoursMinutes getHoursMinutes(@NonNull MaterialTimePicker timePicker)
{
return new HoursMinutes(timePicker.getHour(), timePicker.getMinute(), mIs24HourFormat);
}
private void finishTimePicking(boolean isConfirmed)
{
mActivity.removeOnConfigurationChangedListener(this::handleConfigurationChanged);
if (isConfirmed)
mListener.onHoursMinutesPicked(mFromTime, mToTime, mId);
}
private void handleConfigurationChanged(Configuration configuration)
{
if (mFromTimePicker != null && mFromTimePicker.isVisible())
showFromTimePicker();
else if (mToTimePicker != null && mToTimePicker.isVisible())
showToTimePicker();
}
public interface OnPickListener
{
void onHoursMinutesPicked(HoursMinutes from, HoursMinutes to, int id);
}
}

View File

@@ -0,0 +1,211 @@
package app.organicmaps.editor;
import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.Context;
import android.content.res.ColorStateList;
import android.os.Bundle;
import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.TimePicker;
import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.fragment.app.FragmentManager;
import app.organicmaps.R;
import app.organicmaps.base.BaseMwmDialogFragment;
import app.organicmaps.sdk.editor.data.HoursMinutes;
import app.organicmaps.sdk.util.DateUtils;
import app.organicmaps.util.Utils;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.textview.MaterialTextView;
public class HoursMinutesPickerFragment extends BaseMwmDialogFragment
{
private static final String EXTRA_FROM = "HoursMinutesFrom";
private static final String EXTRA_TO = "HoursMinutesTo";
private static final String EXTRA_SELECT_FIRST = "SelectedTab";
private static final String EXTRA_ID = "Id";
public static final int TAB_FROM = 0;
public static final int TAB_TO = 1;
private HoursMinutes mFrom;
private HoursMinutes mTo;
private TimePicker mPicker;
private View mPickerHoursLabel;
@IntRange(from = 0, to = 1)
private int mSelectedTab;
private TabLayout mTabs;
private int mId;
private Button mOkButton;
public interface OnPickListener
{
void onHoursMinutesPicked(HoursMinutes from, HoursMinutes to, int id);
}
public static void pick(Context context, FragmentManager manager, @NonNull HoursMinutes from,
@NonNull HoursMinutes to, @IntRange(from = 0, to = 1) int selectedPosition, int id)
{
final Bundle args = new Bundle();
args.putParcelable(EXTRA_FROM, from);
args.putParcelable(EXTRA_TO, to);
args.putInt(EXTRA_SELECT_FIRST, selectedPosition);
args.putInt(EXTRA_ID, id);
final HoursMinutesPickerFragment fragment = (HoursMinutesPickerFragment) manager.getFragmentFactory().instantiate(
context.getClassLoader(), HoursMinutesPickerFragment.class.getName());
fragment.setArguments(args);
fragment.show(manager, null);
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
readArgs();
final View root = createView();
// noinspection ConstantConditions
mTabs.getTabAt(mSelectedTab).select();
final AlertDialog dialog =
new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmMain_DialogFragment_TimePicker)
.setView(root)
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(R.string.ok, null)
.setCancelable(true)
.create();
dialog.setOnShowListener(dialogInterface -> {
mOkButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
mOkButton.setOnClickListener(v -> {
if (mSelectedTab == TAB_FROM)
{
// noinspection ConstantConditions
mTabs.getTabAt(TAB_TO).select();
return;
}
saveHoursMinutes();
dismiss();
if (getParentFragment() instanceof OnPickListener)
((OnPickListener) getParentFragment()).onHoursMinutesPicked(mFrom, mTo, mId);
});
refreshPicker();
});
return dialog;
}
private void readArgs()
{
final Bundle args = getArguments();
if (args == null)
throw new IllegalArgumentException("Args must not be null");
mFrom = Utils.getParcelable(args, EXTRA_FROM, HoursMinutes.class);
mTo = Utils.getParcelable(args, EXTRA_TO, HoursMinutes.class);
mSelectedTab = args.getInt(EXTRA_SELECT_FIRST);
mId = args.getInt(EXTRA_ID);
}
private View createView()
{
final LayoutInflater inflater = LayoutInflater.from(requireActivity());
@SuppressLint("InflateParams")
final View root = inflater.inflate(R.layout.fragment_timetable_picker, null);
mPicker = root.findViewById(R.id.picker);
mPicker.setIs24HourView(DateFormat.is24HourFormat(requireActivity()));
@SuppressLint("DiscouragedApi")
int id = getResources().getIdentifier("hours", "id", "android");
if (id != 0)
{
mPickerHoursLabel = mPicker.findViewById(id);
if (!(mPickerHoursLabel instanceof TextView))
mPickerHoursLabel = null;
}
mTabs = root.findViewById(R.id.tabs);
MaterialTextView tabView = (MaterialTextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);
tabView.setText(getResources().getString(R.string.editor_time_from));
final ColorStateList textColor =
AppCompatResources.getColorStateList(requireContext(), R.color.accent_color_selector);
tabView.setTextColor(textColor);
mTabs.addTab(mTabs.newTab().setCustomView(tabView), true);
tabView = (MaterialTextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);
tabView.setText(getResources().getString(R.string.editor_time_to));
tabView.setTextColor(textColor);
mTabs.addTab(mTabs.newTab().setCustomView(tabView), true);
mTabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab)
{
if (!isInit())
return;
saveHoursMinutes();
mSelectedTab = tab.getPosition();
refreshPicker();
if (mPickerHoursLabel != null)
mPickerHoursLabel.performClick();
}
@Override
public void onTabUnselected(TabLayout.Tab tab)
{}
@Override
public void onTabReselected(TabLayout.Tab tab)
{}
});
return root;
}
private void saveHoursMinutes()
{
boolean is24HourFormat = DateUtils.is24HourFormat(requireContext());
final HoursMinutes hoursMinutes =
new HoursMinutes(mPicker.getCurrentHour(), mPicker.getCurrentMinute(), is24HourFormat);
if (mSelectedTab == TAB_FROM)
mFrom = hoursMinutes;
else
mTo = hoursMinutes;
}
private boolean isInit()
{
return mOkButton != null && mPicker != null;
}
private void refreshPicker()
{
if (!isInit())
return;
HoursMinutes hoursMinutes;
int okBtnRes;
if (mSelectedTab == TAB_FROM)
{
hoursMinutes = mFrom;
okBtnRes = R.string.next_button;
}
else
{
hoursMinutes = mTo;
okBtnRes = R.string.ok;
}
mPicker.setCurrentMinute((int) hoursMinutes.minutes);
mPicker.setCurrentHour((int) hoursMinutes.hours);
mOkButton.setText(okBtnRes);
}
}

View File

@@ -6,7 +6,6 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.CompoundButton; import android.widget.CompoundButton;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import androidx.annotation.IdRes; import androidx.annotation.IdRes;
import androidx.annotation.IntRange; import androidx.annotation.IntRange;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@@ -30,13 +29,13 @@ import java.util.Calendar;
import java.util.List; import java.util.List;
class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter.BaseTimetableViewHolder> class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter.BaseTimetableViewHolder>
implements FromToTimePicker.OnPickListener, TimetableProvider implements HoursMinutesPickerFragment.OnPickListener, TimetableProvider
{ {
private static final int TYPE_TIMETABLE = 0; private static final int TYPE_TIMETABLE = 0;
private static final int TYPE_ADD_TIMETABLE = 1; private static final int TYPE_ADD_TIMETABLE = 1;
private static final int ID_OPENING_TIME = 0; private static final int ID_OPENING = 0;
private static final int ID_CLOSED_SPAN = 1; private static final int ID_CLOSING = 1;
private static final int[] DAYS = {R.id.day1, R.id.day2, R.id.day3, R.id.day4, R.id.day5, R.id.day6, R.id.day7}; private static final int[] DAYS = {R.id.day1, R.id.day2, R.id.day3, R.id.day4, R.id.day5, R.id.day6, R.id.day7};
@@ -70,7 +69,7 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
@Override @Override
public String getTimetables() public String getTimetables()
{ {
return OpeningHours.nativeTimetablesToString(mItems.toArray(new Timetable[0])); return OpeningHours.nativeTimetablesToString(mItems.toArray(new Timetable[mItems.size()]));
} }
@Override @Override
@@ -102,7 +101,7 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
private void addTimetable() private void addTimetable()
{ {
mItems.add(OpeningHours.nativeGetComplementTimetable(mItems.toArray(new Timetable[0]))); mItems.add(OpeningHours.nativeGetComplementTimetable(mItems.toArray(new Timetable[mItems.size()])));
notifyItemInserted(mItems.size() - 1); notifyItemInserted(mItems.size() - 1);
refreshComplement(); refreshComplement();
} }
@@ -116,31 +115,25 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
private void refreshComplement() private void refreshComplement()
{ {
mComplementItem = OpeningHours.nativeGetComplementTimetable(mItems.toArray(new Timetable[0])); mComplementItem = OpeningHours.nativeGetComplementTimetable(mItems.toArray(new Timetable[mItems.size()]));
notifyItemChanged(getItemCount() - 1); notifyItemChanged(getItemCount() - 1);
} }
private void pickTime(int position, private void pickTime(int position,
@IntRange(from = ID_OPENING_TIME, to = ID_CLOSED_SPAN) int id, @IntRange(from = HoursMinutesPickerFragment.TAB_FROM, to = HoursMinutesPickerFragment.TAB_TO)
boolean startWithToTime) int tab, @IntRange(from = ID_OPENING, to = ID_CLOSING) int id)
{ {
final Timetable data = mItems.get(position); final Timetable data = mItems.get(position);
mPickingPosition = position; mPickingPosition = position;
HoursMinutesPickerFragment.pick(mFragment.requireActivity(), mFragment.getChildFragmentManager(),
FromToTimePicker.pickTime(mFragment, data.workingTimespan.start, data.workingTimespan.end, tab, id);
this,
data.workingTimespan.start,
data.workingTimespan.end,
id,
startWithToTime);
} }
@Override @Override
public void onHoursMinutesPicked(HoursMinutes from, HoursMinutes to, int id) public void onHoursMinutesPicked(HoursMinutes from, HoursMinutes to, int id)
{ {
final Timetable item = mItems.get(mPickingPosition); final Timetable item = mItems.get(mPickingPosition);
if (id == ID_OPENING_TIME) if (id == ID_OPENING)
mItems.set(mPickingPosition, OpeningHours.nativeSetOpeningTime(item, new Timespan(from, to))); mItems.set(mPickingPosition, OpeningHours.nativeSetOpeningTime(item, new Timespan(from, to)));
else else
mItems.set(mPickingPosition, OpeningHours.nativeAddClosedSpan(item, new Timespan(from, to))); mItems.set(mPickingPosition, OpeningHours.nativeAddClosedSpan(item, new Timespan(from, to)));
@@ -155,7 +148,7 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
private void addWorkingDay(int day, int position) private void addWorkingDay(int day, int position)
{ {
final Timetable[] tts = mItems.toArray(new Timetable[0]); final Timetable[] tts = mItems.toArray(new Timetable[mItems.size()]);
mItems = new ArrayList<>(Arrays.asList(OpeningHours.nativeAddWorkingDay(tts, position, day))); mItems = new ArrayList<>(Arrays.asList(OpeningHours.nativeAddWorkingDay(tts, position, day)));
refreshComplement(); refreshComplement();
notifyDataSetChanged(); notifyDataSetChanged();
@@ -163,7 +156,7 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
private void removeWorkingDay(int day, int position) private void removeWorkingDay(int day, int position)
{ {
final Timetable[] tts = mItems.toArray(new Timetable[0]); final Timetable[] tts = mItems.toArray(new Timetable[mItems.size()]);
mItems = new ArrayList<>(Arrays.asList(OpeningHours.nativeRemoveWorkingDay(tts, position, day))); mItems = new ArrayList<>(Arrays.asList(OpeningHours.nativeRemoveWorkingDay(tts, position, day)));
refreshComplement(); refreshComplement();
notifyDataSetChanged(); notifyDataSetChanged();
@@ -269,13 +262,13 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
{ {
final int id = v.getId(); final int id = v.getId();
if (id == R.id.time_open) if (id == R.id.time_open)
pickTime(getBindingAdapterPosition(), ID_OPENING_TIME, false); pickTime(getBindingAdapterPosition(), HoursMinutesPickerFragment.TAB_FROM, ID_OPENING);
else if (id == R.id.time_close) else if (id == R.id.time_close)
pickTime(getBindingAdapterPosition(), ID_OPENING_TIME, true); pickTime(getBindingAdapterPosition(), HoursMinutesPickerFragment.TAB_TO, ID_OPENING);
else if (id == R.id.tv__remove_timetable) else if (id == R.id.tv__remove_timetable)
removeTimetable(getBindingAdapterPosition()); removeTimetable(getBindingAdapterPosition());
else if (id == R.id.tv__add_closed) else if (id == R.id.tv__add_closed)
pickTime(getBindingAdapterPosition(), ID_CLOSED_SPAN, false); pickTime(getBindingAdapterPosition(), HoursMinutesPickerFragment.TAB_FROM, ID_CLOSING);
else if (id == R.id.allday) else if (id == R.id.allday)
swAllday.toggle(); swAllday.toggle();
} }

View File

@@ -8,9 +8,10 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.base.BaseMwmRecyclerFragment; import app.organicmaps.base.BaseMwmRecyclerFragment;
import app.organicmaps.sdk.editor.data.HoursMinutes;
public class SimpleTimetableFragment extends BaseMwmRecyclerFragment<SimpleTimetableAdapter> public class SimpleTimetableFragment extends BaseMwmRecyclerFragment<SimpleTimetableAdapter>
implements TimetableProvider implements TimetableProvider, HoursMinutesPickerFragment.OnPickListener
{ {
private SimpleTimetableAdapter mAdapter; private SimpleTimetableAdapter mAdapter;
@Nullable @Nullable
@@ -56,4 +57,10 @@ public class SimpleTimetableFragment extends BaseMwmRecyclerFragment<SimpleTimet
{ {
mInitTimetables = timetables; mInitTimetables = timetables;
} }
@Override
public void onHoursMinutesPicked(HoursMinutes from, HoursMinutes to, int id)
{
mAdapter.onHoursMinutesPicked(from, to, id);
}
} }

View File

@@ -273,7 +273,7 @@ public class SearchFragment extends BaseMwmFragment implements SearchListener, C
RecyclerView mResults = mResultsFrame.findViewById(R.id.recycler); RecyclerView mResults = mResultsFrame.findViewById(R.id.recycler);
setRecyclerScrollListener(mResults); setRecyclerScrollListener(mResults);
mResultsPlaceholder = mResultsFrame.findViewById(R.id.placeholder); mResultsPlaceholder = mResultsFrame.findViewById(R.id.placeholder);
mResultsPlaceholder.setContent(R.string.search_not_found, R.string.search_not_found_query, R.drawable.ic_search_fail); mResultsPlaceholder.setContent(R.string.search_not_found, R.string.search_not_found_query);
mSearchAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() mSearchAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver()
{ {

View File

@@ -47,7 +47,7 @@ public class SearchHistoryFragment extends BaseMwmRecyclerFragment<SearchHistory
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
getRecyclerView().setLayoutManager(new LinearLayoutManager(view.getContext())); getRecyclerView().setLayoutManager(new LinearLayoutManager(view.getContext()));
mPlaceHolder = view.findViewById(R.id.placeholder); mPlaceHolder = view.findViewById(R.id.placeholder);
mPlaceHolder.setContent(R.string.search_history_title, R.string.search_history_text, R.drawable.ic_search_recent); mPlaceHolder.setContent(R.string.search_history_title, R.string.search_history_text);
getAdapter().registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { getAdapter().registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override @Override

View File

@@ -90,36 +90,28 @@ public class DrivingOptionsFragment extends BaseMwmToolbarFragment
{ {
SwitchCompat tollsBtn = root.findViewById(R.id.avoid_tolls_btn); SwitchCompat tollsBtn = root.findViewById(R.id.avoid_tolls_btn);
tollsBtn.setChecked(RoutingOptions.hasOption(RoadType.Toll)); tollsBtn.setChecked(RoutingOptions.hasOption(RoadType.Toll));
CompoundButton.OnCheckedChangeListener tollBtnListener = new ToggleRoutingOptionListener(RoadType.Toll, root); CompoundButton.OnCheckedChangeListener tollBtnListener = new ToggleRoutingOptionListener(RoadType.Toll);
tollsBtn.setOnCheckedChangeListener(tollBtnListener); tollsBtn.setOnCheckedChangeListener(tollBtnListener);
SwitchCompat motorwaysBtn = root.findViewById(R.id.avoid_motorways_btn); SwitchCompat motorwaysBtn = root.findViewById(R.id.avoid_motorways_btn);
motorwaysBtn.setChecked(RoutingOptions.hasOption(RoadType.Motorway)); motorwaysBtn.setChecked(RoutingOptions.hasOption(RoadType.Motorway));
CompoundButton.OnCheckedChangeListener motorwayBtnListener = CompoundButton.OnCheckedChangeListener motorwayBtnListener = new ToggleRoutingOptionListener(RoadType.Motorway);
new ToggleRoutingOptionListener(RoadType.Motorway, root);
motorwaysBtn.setOnCheckedChangeListener(motorwayBtnListener); motorwaysBtn.setOnCheckedChangeListener(motorwayBtnListener);
SwitchCompat ferriesBtn = root.findViewById(R.id.avoid_ferries_btn); SwitchCompat ferriesBtn = root.findViewById(R.id.avoid_ferries_btn);
ferriesBtn.setChecked(RoutingOptions.hasOption(RoadType.Ferry)); ferriesBtn.setChecked(RoutingOptions.hasOption(RoadType.Ferry));
CompoundButton.OnCheckedChangeListener ferryBtnListener = new ToggleRoutingOptionListener(RoadType.Ferry, root); CompoundButton.OnCheckedChangeListener ferryBtnListener = new ToggleRoutingOptionListener(RoadType.Ferry);
ferriesBtn.setOnCheckedChangeListener(ferryBtnListener); ferriesBtn.setOnCheckedChangeListener(ferryBtnListener);
SwitchCompat dirtyRoadsBtn = root.findViewById(R.id.avoid_dirty_roads_btn); SwitchCompat dirtyRoadsBtn = root.findViewById(R.id.avoid_dirty_roads_btn);
dirtyRoadsBtn.setChecked(RoutingOptions.hasOption(RoadType.Dirty)); dirtyRoadsBtn.setChecked(RoutingOptions.hasOption(RoadType.Dirty));
dirtyRoadsBtn.setEnabled(!RoutingOptions.hasOption(RoadType.Paved) || RoutingOptions.hasOption(RoadType.Dirty)); CompoundButton.OnCheckedChangeListener dirtyBtnListener = new ToggleRoutingOptionListener(RoadType.Dirty);
CompoundButton.OnCheckedChangeListener dirtyBtnListener = new ToggleRoutingOptionListener(RoadType.Dirty, root);
dirtyRoadsBtn.setOnCheckedChangeListener(dirtyBtnListener); dirtyRoadsBtn.setOnCheckedChangeListener(dirtyBtnListener);
SwitchCompat stepsBtn = root.findViewById(R.id.avoid_steps_btn); SwitchCompat stepsBtn = root.findViewById(R.id.avoid_steps_btn);
stepsBtn.setChecked(RoutingOptions.hasOption(RoadType.Steps)); stepsBtn.setChecked(RoutingOptions.hasOption(RoadType.Steps));
CompoundButton.OnCheckedChangeListener stepsBtnListener = new ToggleRoutingOptionListener(RoadType.Steps, root); CompoundButton.OnCheckedChangeListener stepsBtnListener = new ToggleRoutingOptionListener(RoadType.Steps);
stepsBtn.setOnCheckedChangeListener(stepsBtnListener); stepsBtn.setOnCheckedChangeListener(stepsBtnListener);
SwitchCompat pavedBtn = root.findViewById(R.id.avoid_paved_roads_btn);
pavedBtn.setChecked(RoutingOptions.hasOption(RoadType.Paved));
pavedBtn.setEnabled(!RoutingOptions.hasOption(RoadType.Dirty) || RoutingOptions.hasOption(RoadType.Paved));
CompoundButton.OnCheckedChangeListener pavedBtnListener = new ToggleRoutingOptionListener(RoadType.Paved, root);
pavedBtn.setOnCheckedChangeListener(pavedBtnListener);
} }
private static class ToggleRoutingOptionListener implements CompoundButton.OnCheckedChangeListener private static class ToggleRoutingOptionListener implements CompoundButton.OnCheckedChangeListener
@@ -127,13 +119,9 @@ public class DrivingOptionsFragment extends BaseMwmToolbarFragment
@NonNull @NonNull
private final RoadType mRoadType; private final RoadType mRoadType;
@NonNull private ToggleRoutingOptionListener(@NonNull RoadType roadType)
private final View mRoot;
private ToggleRoutingOptionListener(@NonNull RoadType roadType, @NonNull View root)
{ {
mRoadType = roadType; mRoadType = roadType;
mRoot = root;
} }
@Override @Override
@@ -143,27 +131,6 @@ public class DrivingOptionsFragment extends BaseMwmToolbarFragment
RoutingOptions.addOption(mRoadType); RoutingOptions.addOption(mRoadType);
else else
RoutingOptions.removeOption(mRoadType); RoutingOptions.removeOption(mRoadType);
SwitchCompat dirtyRoadsBtn = mRoot.findViewById(R.id.avoid_dirty_roads_btn);
SwitchCompat pavedBtn = mRoot.findViewById(R.id.avoid_paved_roads_btn);
if (mRoadType == RoadType.Dirty)
{
pavedBtn.setEnabled(!isChecked);
if (isChecked)
{
pavedBtn.setChecked(false);
dirtyRoadsBtn.setEnabled(true);
}
}
else if (mRoadType == RoadType.Paved)
{
dirtyRoadsBtn.setEnabled(!isChecked);
if (isChecked)
{
dirtyRoadsBtn.setChecked(false);
pavedBtn.setEnabled(true);
}
}
} }
} }
} }

View File

@@ -3,7 +3,6 @@ package app.organicmaps.widget;
import android.content.Context; import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@@ -12,7 +11,6 @@ import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.StringRes; import androidx.annotation.StringRes;
import androidx.core.content.ContextCompat;
import com.google.android.material.imageview.ShapeableImageView; import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textview.MaterialTextView; import com.google.android.material.textview.MaterialTextView;
@@ -178,10 +176,9 @@ public class PlaceholderView extends LinearLayout
return view.getMeasuredHeight() + params.bottomMargin + params.topMargin; return view.getMeasuredHeight() + params.bottomMargin + params.topMargin;
} }
public void setContent(@StringRes int titleRes, @StringRes int subtitleRes, @DrawableRes int iconRes) public void setContent(@StringRes int titleRes, @StringRes int subtitleRes)
{ {
mTitle.setText(titleRes); mTitle.setText(titleRes);
mSubtitle.setText(subtitleRes); mSubtitle.setText(subtitleRes);
mImage.setImageDrawable(ContextCompat.getDrawable(getContext(), iconRes));
} }
} }

View File

@@ -1,6 +1,5 @@
package app.organicmaps.widget.placepage; package app.organicmaps.widget.placepage;
import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
@@ -15,7 +14,6 @@ import androidx.annotation.Nullable;
import androidx.core.view.ViewCompat; import androidx.core.view.ViewCompat;
import androidx.core.view.WindowCompat; import androidx.core.view.WindowCompat;
import androidx.core.view.WindowInsetsCompat; import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentFactory; import androidx.fragment.app.FragmentFactory;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import app.organicmaps.R; import app.organicmaps.R;
@@ -105,9 +103,9 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
public EditBookmarkFragment() {} public EditBookmarkFragment() {}
@Override @Override
public void onCreate(@Nullable Bundle savedInstanceState) { protected int getCustomTheme()
super.onCreate(savedInstanceState); {
setStyle(DialogFragment.STYLE_NORMAL, R.style.MwmTheme_FullScreenDialog); return getFullscreenTheme();
} }
@Nullable @Nullable
@@ -183,12 +181,6 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
public void onStart() public void onStart()
{ {
super.onStart(); super.onStart();
Dialog dialog = getDialog();
if (dialog != null) {
dialog.getWindow().setLayout(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
}
// Focus name and show keyboard for "Unknown Place" bookmarks // Focus name and show keyboard for "Unknown Place" bookmarks
if (mBookmark != null if (mBookmark != null

View File

@@ -152,7 +152,7 @@ public class PlacePageView extends Fragment
private View mEditTopSpace; private View mEditTopSpace;
private ShapeableImageView mColorIcon; private ShapeableImageView mColorIcon;
private MaterialTextView mTvCategory; private MaterialTextView mTvCategory;
private MaterialButton mEditBookmark; private ShapeableImageView mEditBookmark;
// Data // Data
private CoordinatesFormat mCoordsFormat = CoordinatesFormat.LatLonDecimal; private CoordinatesFormat mCoordsFormat = CoordinatesFormat.LatLonDecimal;
@@ -691,27 +691,16 @@ public class PlacePageView extends Fragment
mTvAddPlace.setOnClickListener(this); mTvAddPlace.setOnClickListener(this);
mTvEditPlace.setEnabled(Editor.nativeShouldEnableEditPlace()); mTvEditPlace.setEnabled(Editor.nativeShouldEnableEditPlace());
mTvAddPlace.setEnabled(Editor.nativeShouldEnableAddPlace()); mTvAddPlace.setEnabled(Editor.nativeShouldEnableAddPlace());
final int editTextButtonColor = final int editPlaceButtonColor =
Editor.nativeShouldEnableEditPlace() Editor.nativeShouldEnableEditPlace()
? ContextCompat.getColor( ? ContextCompat.getColor(
getContext(), getContext(),
UiUtils.getStyledResourceId(getContext(), com.google.android.material.R.attr.colorSecondary)) UiUtils.getStyledResourceId(getContext(), com.google.android.material.R.attr.colorSecondary))
: ContextCompat.getColor(getContext(), R.color.button_accent_text_disabled); : ContextCompat.getColor(getContext(), R.color.button_accent_text_disabled);
final ColorStateList editStrokeButtonColor = new ColorStateList( mTvEditPlace.setTextColor(editPlaceButtonColor);
new int[][]{ mTvAddPlace.setTextColor(editPlaceButtonColor);
new int[]{android.R.attr.state_enabled}, // enabled mTvEditPlace.setStrokeColor(ColorStateList.valueOf(editPlaceButtonColor));
new int[]{-android.R.attr.state_enabled} // disabled mTvAddPlace.setStrokeColor(ColorStateList.valueOf(editPlaceButtonColor));
},
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.showIf(
UiUtils.isVisible(mEditPlace) || UiUtils.isVisible(mAddPlace), UiUtils.isVisible(mEditPlace) || UiUtils.isVisible(mAddPlace),
mEditTopSpace); mEditTopSpace);

View File

@@ -59,6 +59,8 @@ public class PlacePageBookmarkFragment extends Fragment implements View.OnClickL
mFrame = view; mFrame = view;
mTvBookmarkNote = mFrame.findViewById(R.id.tv__bookmark_notes); mTvBookmarkNote = mFrame.findViewById(R.id.tv__bookmark_notes);
mTvBookmarkNote.setOnLongClickListener(this); mTvBookmarkNote.setOnLongClickListener(this);
final View editBookmarkBtn = mFrame.findViewById(R.id.tv__bookmark_edit);
editBookmarkBtn.setOnClickListener(this);
} }
private void initWebView() private void initWebView()

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 620 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 414 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 402 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 690 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 826 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 814 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1016 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 B

View File

@@ -2,5 +2,5 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android" <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"> android:shape="rectangle">
<solid android:color="@color/bg_cards"/> <solid android:color="@color/bg_cards"/>
<corners android:radius="8dp"/> <corners android:radius="4dp"/>
</shape> </shape>

View File

@@ -2,5 +2,5 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android" <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"> android:shape="rectangle">
<solid android:color="@color/bg_primary"/> <solid android:color="@color/bg_primary"/>
<corners android:radius="8dp"/> <corners android:radius="4dp"/>
</shape> </shape>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="80"
android:viewportHeight="80">
<path
android:fillColor="#FFF"
android:pathData="m6.778,18.994 l5.418,5.418c-2.663,4.673 -4.184,10.086 -4.184,15.858 0,9.988 4.552,18.9 11.701,24.763 -0.03,-0.193 -0.021,-0.395 0.031,-0.596 0.113,-0.434 0.412,-0.79 0.81,-0.977l0.26,-0.094c0.57,-0.219 1.076,-0.463 1.548,-0.737l0.579,-0.359 1.178,-0.808c1.482,-0.993 2.772,-1.415 4.902,-1.415 2.125,0 3.459,0.506 5.32,1.775l0.757,0.534c1.89,1.354 2.921,1.797 4.871,1.797 1.787,0 2.877,-0.387 4.506,-1.464l0.955,-0.657c1.056,-0.732 1.931,-1.241 2.826,-1.56l2.32,2.32c-1.086,0.053 -1.893,0.372 -3.075,1.144l-0.957,0.656c-2.341,1.629 -3.944,2.298 -6.576,2.298 -2.414,0 -3.892,-0.548 -5.902,-1.915l-0.798,-0.562c-1.725,-1.235 -2.624,-1.628 -4.249,-1.628 -1.392,0 -2.152,0.198 -3.039,0.734l-0.616,0.407 -0.561,0.389c-0.385,0.264 -0.713,0.475 -1.07,0.682 -0.771,0.447 -1.608,0.828 -2.576,1.152 5.265,3.839 11.755,6.103 18.786,6.103 5.782,0 11.203,-1.531 15.881,-4.209l5.409,5.408c-6.143,3.939 -13.451,6.223 -21.29,6.223 -21.729,0 -39.404,-17.627 -39.404,-39.404 0,-7.839 2.291,-15.141 6.236,-21.276zM7.342,2.707 L77.558,72.923c1.368,1.368 1.368,3.59 0,4.958 -1.368,1.368 -3.59,1.368 -4.958,0l-70.216,-70.216c-1.368,-1.368 -1.368,-3.59 0,-4.958 1.368,-1.368 3.59,-1.368 4.958,0zM39.947,0.865c21.777,0 39.453,17.627 39.453,39.404 0,7.852 -2.298,15.164 -6.257,21.305l-5.423,-5.423c2.679,-4.678 4.21,-10.1 4.21,-15.882 0,-17.676 -14.307,-31.982 -31.983,-31.982 -5.785,0 -11.204,1.533 -15.877,4.214l-5.398,-5.399c6.14,-3.948 13.445,-6.238 21.276,-6.238zM27.862,40.076 L46.428,58.64c-0.133,0.082 -0.269,0.168 -0.407,0.257l-1.038,0.71c-1.924,1.339 -3.047,1.808 -5.012,1.808 -1.773,0 -2.786,-0.366 -4.375,-1.45l-0.731,-0.516c-2.147,-1.537 -3.524,-2.14 -5.842,-2.14 -2.13,0 -3.42,0.422 -4.902,1.415l-0.515,0.355 -6.9,-16.406zM51.512,39.944 L63.237,42.673 60.57,49.002zM44.497,19.925 L50.009,19.931c0.611,0 1.146,0.407 1.309,0.996l4.901,17.731 -7.814,-1.821 -6.81,-6.81 9.468,0.004 -1.787,-6.46c-0.054,-0.196 -0.233,-0.332 -0.436,-0.332l-7.738,-0.003 -0,6.297 -2.264,-2.264 0.001,-4.033 -4.032,0.002 -3.309,-3.309zM24.309,36.523 L25.928,38.142 23.719,38.657zM41.782,14.048c0.25,0 0.453,0.203 0.453,0.453l-0.007,4.025h-4.523l0.002,-4.025c0,-0.25 0.203,-0.453 0.453,-0.453z"
android:fillType="evenOdd"/>
</vector>

View File

@@ -1,12 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="89"
android:viewportHeight="101">
<path
android:fillColor="#FFF"
android:fillType="evenOdd"
android:pathData="m64.75,87.76c4.1,0 6.97,1.02 10.93,3.37l1.77,1.06c1.04,0.62 1.96,1.14 2.85,1.57l0.11,0.03c1.54,0.46 2.42,2.07 1.97,3.62 -0.24,0.82 -0.83,1.49 -1.6,1.83l-0.48,0.17c-1.35,-0.51 -2.68,-1.16 -4.14,-1.98l-1.81,-1.06 -1.29,-0.78c-3.24,-1.92 -5.28,-2.65 -8.29,-2.65 -2.4,0 -4,0.57 -6.46,2.18l-1.81,1.24c-4.43,3.08 -7.46,4.35 -12.44,4.35 -4.57,0 -7.36,-1.04 -11.17,-3.62l-1.51,-1.06c-3.26,-2.34 -4.96,-3.08 -8.04,-3.08 -2.64,0 -4.07,0.37 -5.75,1.39l-1.17,0.77 -1.06,0.74c-0.73,0.5 -1.35,0.9 -2.02,1.29 -1.63,0.94 -3.41,1.73 -5.52,2.39 -1.51,-0.39 -2.42,-1.94 -2.03,-3.45 0.21,-0.82 0.78,-1.49 1.53,-1.85l0.49,-0.18c1.08,-0.41 2.04,-0.88 2.93,-1.39l1.1,-0.68 2.23,-1.53c2.81,-1.88 5.25,-2.68 9.28,-2.68 4.02,0 6.55,0.96 10.07,3.36l1.43,1.01c3.58,2.56 5.53,3.4 9.22,3.4 3.38,0 5.44,-0.73 8.53,-2.77l1.81,-1.24c3.83,-2.66 6.41,-3.76 10.38,-3.76zM44.03,44.64 L88.06,54.89 75.11,85.62c-3.67,-2.11 -6.46,-3.04 -10.36,-3.04 -3.58,0 -6.02,0.89 -9.27,3.01l-1.96,1.34c-3.64,2.53 -5.77,3.42 -9.49,3.42 -3.35,0 -5.27,-0.69 -8.28,-2.74l-1.38,-0.98c-4.06,-2.91 -6.67,-4.05 -11.06,-4.05 -4.03,0 -6.47,0.8 -9.28,2.68l-0.97,0.67 -13.06,-31.05zM52.59,11.83 L63.02,11.85c1.16,0 2.17,0.77 2.48,1.88l9.28,33.55 -30.75,-7.16 -30.76,7.16 9.28,-33.55c0.31,-1.11 1.32,-1.88 2.48,-1.88zM41.88,18.1 L27.25,18.11c-0.39,0 -0.72,0.26 -0.83,0.63l-3.38,12.22 18.84,-0.01zM46.17,18.1v12.85l18.85,0.01 -3.38,-12.22c-0.1,-0.37 -0.44,-0.63 -0.83,-0.63zM47.46,0.71c0.47,0 0.86,0.38 0.86,0.86l-0.01,7.62h-8.56l0,-7.62c0,-0.47 0.38,-0.86 0.86,-0.86z" />
</vector>

View File

@@ -1,12 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="89"
android:viewportHeight="101">
<path
android:fillColor="#FFF"
android:fillType="evenOdd"
android:pathData="m65.11,87.89c2.22,0 4.09,0.3 5.95,0.95l2.49,2.49c1.86,1.86 4.38,2.67 6.81,2.42l0.29,0.15 0.11,0.03c1.54,0.46 2.42,2.07 1.97,3.62 -0.24,0.82 -0.83,1.49 -1.6,1.83l-0.48,0.17c-1.35,-0.51 -2.68,-1.16 -4.14,-1.98l-1.81,-1.06 -1.29,-0.78c-3.24,-1.92 -5.28,-2.65 -8.29,-2.65 -2.4,0 -4,0.57 -6.46,2.18l-1.81,1.24c-4.43,3.08 -7.46,4.35 -12.44,4.35 -4.57,0 -7.36,-1.04 -11.17,-3.62l-1.51,-1.06c-3.26,-2.34 -4.96,-3.08 -8.04,-3.08 -2.64,0 -4.07,0.37 -5.75,1.39l-1.17,0.77 -1.06,0.74c-0.73,0.5 -1.35,0.9 -2.02,1.29 -1.63,0.94 -3.41,1.73 -5.52,2.39 -1.51,-0.39 -2.42,-1.94 -2.03,-3.45 0.21,-0.82 0.78,-1.49 1.53,-1.85l0.49,-0.18c1.08,-0.41 2.04,-0.88 2.93,-1.39l1.1,-0.68 2.23,-1.53c2.81,-1.88 5.25,-2.68 9.28,-2.68 4.02,0 6.55,0.96 10.07,3.36l1.43,1.01c3.58,2.56 5.53,3.4 9.22,3.4 3.38,0 5.44,-0.73 8.53,-2.77l1.81,-1.24c3.83,-2.66 6.41,-3.76 10.38,-3.76zM30.27,48.05 L64.93,82.71 64.7,82.71c-3.36,0.07 -5.74,0.97 -8.86,3l-1.96,1.34c-3.64,2.53 -5.77,3.42 -9.49,3.42 -3.35,0 -5.27,-0.69 -8.28,-2.74l-1.38,-0.98c-4.06,-2.91 -6.67,-4.05 -11.06,-4.05 -4.03,0 -6.47,0.8 -9.28,2.68l-0.97,0.67 -13.06,-31.05zM11.76,12.69 L81.98,82.9c1.37,1.37 1.37,3.59 0,4.96 -1.37,1.37 -3.59,1.37 -4.96,0l-70.22,-70.22c-1.37,-1.37 -1.37,-3.59 0,-4.96s3.59,-1.37 4.96,0zM52.7,46.7 L88.42,55.01 80.3,74.29zM52.95,11.96 L63.38,11.97c1.16,0 2.17,0.77 2.48,1.88l9.28,33.55 -28.32,-6.6 -9.73,-9.73 5.16,-0v-12.85l-14.64,0.01c-0.39,0 -0.72,0.26 -0.83,0.63l-0.42,1.5 -4.11,-4.11 0.66,-2.39c0.31,-1.11 1.32,-1.88 2.48,-1.88zM17.1,34.88 L26.61,44.39 13.63,47.41zM46.53,18.23v12.85l18.85,0.01 -3.38,-12.22c-0.1,-0.37 -0.44,-0.63 -0.83,-0.63zM47.82,0.84c0.47,0 0.86,0.38 0.86,0.86l-0.01,7.62h-8.56l0,-7.62c0,-0.47 0.38,-0.86 0.86,-0.86z" />
</vector>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="80"
android:viewportHeight="80">
<path
android:fillColor="#FFF"
android:pathData="m6.682,18.589 l5.418,5.418c-2.663,4.673 -4.184,10.086 -4.184,15.858 0,17.676 14.258,31.982 31.934,31.982 5.782,0 11.204,-1.531 15.882,-4.21l5.408,5.408c-6.143,3.939 -13.451,6.223 -21.29,6.223 -21.729,0 -39.404,-17.627 -39.404,-39.404 0,-7.839 2.291,-15.141 6.236,-21.276zM7.246,2.303 L77.461,72.519c1.368,1.368 1.368,3.59 0,4.958 -1.368,1.368 -3.59,1.368 -4.958,0l-70.216,-70.216c-1.368,-1.368 -1.368,-3.59 0,-4.958 1.368,-1.368 3.59,-1.368 4.958,0zM42.002,53.908 L50.794,62.7 42.266,62.701zM26.358,38.264 L37.87,49.776 37.482,62.701h-16.745zM39.85,0.461c21.777,0 39.453,17.627 39.453,39.404 0,7.852 -2.298,15.164 -6.257,21.305l-5.423,-5.424c2.679,-4.678 4.21,-10.1 4.21,-15.882 0,-17.676 -14.307,-31.982 -31.983,-31.982 -5.785,0 -11.204,1.533 -15.877,4.214l-5.398,-5.399c6.14,-3.948 13.445,-6.238 21.276,-6.238zM52.291,33.485 L54.361,42.485 45.36,33.484zM61.882,27.266v3.827h-2.871v2.871h-3.827v-2.871l-12.216,-0 -3.827,-3.827zM20.737,32.643 L22.057,33.963 20.737,33.963zM17.866,29.772 L19.186,31.092 17.867,31.093zM48.007,14.859 L50.531,25.83h-9.37l-0.329,-10.971zM38.917,14.859 L38.588,25.83 37.705,25.829 30.805,18.929 31.741,14.859z"
android:fillType="evenOdd"/>
</vector>

View File

@@ -1,12 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="84"
android:viewportHeight="91">
<path
android:fillColor="#FFF"
android:fillType="evenOdd"
android:pathData="m65.501,35.443 l12.641,54.961h-31.5l-1.649,-54.961zM39.291,35.443 L37.643,90.404h-31.5l12.641,-54.961zM83.543,23.743v7.2h-5.4v5.4h-7.2v-5.4h-57.6v5.4h-7.2v-5.4h-5.4v-7.2zM40.343,0.404 L39.723,21.043h-17.627l4.747,-20.639zM57.443,0.404 L62.189,21.043h-17.627l-0.619,-20.639z" />
</vector>

View File

@@ -1,12 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="83"
android:viewportHeight="91">
<path
android:fillColor="#FFF"
android:fillType="evenOdd"
android:pathData="m45.227,62.389 l25.507,25.507c1.862,1.862 4.382,2.667 6.814,2.416l0.021,0.092h-31.5zM18.28,35.442 L38.122,55.284 37.069,90.404h-31.5l12.641,-54.961zM8.943,9.256 L79.158,79.472c1.368,1.368 1.368,3.59 0,4.958 -1.368,1.368 -3.59,1.368 -4.958,0l-70.216,-70.216c-1.368,-1.368 -1.368,-3.59 0,-4.958s3.59,-1.368 4.958,0zM64.927,35.443 L71.757,65.137 44.492,37.872 44.42,35.443zM30.362,23.742 L82.969,23.743v7.2h-5.4v5.4h-7.2v-5.4l-32.807,-0.001zM6.58,23.742 L13.78,30.942 12.769,30.943v5.4h-7.2v-5.4h-5.4v-7.2zM56.869,0.404 L61.615,21.043h-17.627l-0.619,-20.639zM39.769,0.404 L39.149,21.043 27.662,21.042 22.669,16.049 26.269,0.404z" />
</vector>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="80"
android:viewportHeight="80">
<path
android:fillColor="#FFF"
android:pathData="m6.682,19.023 l5.418,5.418c-2.663,4.673 -4.184,10.086 -4.184,15.858 0,17.676 14.258,31.982 31.934,31.982 5.782,0 11.204,-1.531 15.882,-4.21l5.408,5.408c-6.143,3.939 -13.451,6.223 -21.29,6.223 -21.729,0 -39.404,-17.627 -39.404,-39.404 0,-7.839 2.291,-15.141 6.236,-21.276zM7.246,2.736 L77.461,72.952c1.368,1.368 1.368,3.59 0,4.958 -1.368,1.368 -3.59,1.368 -4.958,0l-70.216,-70.216c-1.368,-1.368 -1.368,-3.59 0,-4.958 1.368,-1.368 3.59,-1.368 4.958,0zM39.85,0.894c21.777,0 39.453,17.627 39.453,39.404 0,7.852 -2.298,15.164 -6.257,21.305l-5.423,-5.424c2.679,-4.678 4.21,-10.1 4.21,-15.882 0,-17.676 -14.307,-31.982 -31.983,-31.982 -5.785,0 -11.204,1.533 -15.877,4.214l-5.398,-5.399c6.14,-3.948 13.445,-6.238 21.276,-6.238zM24.24,36.58 L38.181,50.521 38.181,55.68h3.256l-0,-1.903 5.603,5.603 -22.799,0.001zM31.919,20.477 L55.378,20.477 55.377,43.935 41.437,29.995 41.437,24.178h-3.256l-0,2.561z"
android:fillType="evenOdd"/>
</vector>

View File

@@ -1,12 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="29dp"
android:viewportWidth="61"
android:viewportHeight="76">
<path
android:fillColor="#FFF"
android:fillType="evenOdd"
android:pathData="m60.739,0.837v75h-60v-75zM33.876,52.693h-6.274v16.011h6.274zM33.876,30.332h-6.274v16.011h6.274zM33.876,7.972h-6.274v16.011h6.274z" />
</vector>

View File

@@ -1,12 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="78"
android:viewportHeight="78">
<path
android:fillColor="#FFF"
android:fillType="evenOdd"
android:pathData="m6.245,1.736 l70.216,70.216c1.368,1.368 1.368,3.59 0,4.958 -1.368,1.368 -3.59,1.368 -4.958,0l-70.216,-70.216c-1.368,-1.368 -1.368,-3.59 0,-4.958s3.59,-1.368 4.958,0zM9.029,21.369 L40.568,52.908 35.892,52.908v16.011h6.274l-0,-14.413 21.546,21.546 -54.683,0.001zM12.494,1.052 L69.029,1.053v56.534l-26.863,-26.863 0,-0.176 -0.177,-0.001zM42.166,8.187h-6.274v16.011h6.274z" />
</vector>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="80"
android:viewportHeight="80">
<path
android:fillColor="#FFF"
android:pathData="m6.682,18.618 l5.418,5.418c-2.663,4.673 -4.184,10.086 -4.184,15.858 0,17.676 14.258,31.982 31.934,31.982 5.782,0 11.204,-1.531 15.882,-4.21l5.408,5.408c-6.143,3.939 -13.451,6.223 -21.29,6.223 -21.729,0 -39.404,-17.627 -39.404,-39.404 0,-7.839 2.291,-15.141 6.236,-21.276zM7.246,2.332 L77.461,72.548c1.368,1.368 1.368,3.59 0,4.958 -1.368,1.368 -3.59,1.368 -4.958,0l-70.216,-70.216c-1.368,-1.368 -1.368,-3.59 0,-4.958 1.368,-1.368 3.59,-1.368 4.958,0zM44.592,56.527 L46.705,58.64 46.706,62.287h-6.341l0.001,4.227h-8.455v-2.114h6.34l0.001,-4.227h6.34zM29.826,47.004c0.216,0.074 0.44,0.132 0.671,0.173l4.477,0.99 -1.118,6.342c-0.036,0.204 -0.099,0.397 -0.185,0.575 -0.056,0.3 -0.176,0.594 -0.363,0.861l-6.742,9.628c-0.699,0.999 -2.076,1.241 -3.075,0.542 -0.999,-0.699 -1.242,-2.076 -0.542,-3.075l6.345,-9.062c-0.036,-0.193 -0.047,-0.394 -0.029,-0.599zM39.85,0.49c21.777,0 39.453,17.627 39.453,39.404 0,7.852 -2.298,15.164 -6.257,21.305l-5.423,-5.424c2.679,-4.678 4.21,-10.1 4.21,-15.882 0,-17.676 -14.307,-31.982 -31.983,-31.982 -5.785,0 -11.204,1.533 -15.877,4.214l-5.398,-5.399c6.14,-3.948 13.445,-6.238 21.276,-6.238zM39.684,51.619 L43.129,55.064 42.439,56.964c-0.417,1.146 -1.684,1.736 -2.829,1.319s-1.736,-1.684 -1.319,-2.829zM27.592,39.527 L33.638,45.573 31.109,45.015c-2.401,-0.423 -4.005,-2.713 -3.581,-5.115zM20.359,32.294 L24.775,36.71 24.775,40.127c0,1.219 -0.988,2.208 -2.208,2.208s-2.208,-0.988 -2.208,-2.208zM45.212,33.365 L50.636,33.366c1.219,0 2.208,0.988 2.208,2.208s-0.988,2.208 -2.208,2.208l-1.009,-0.001zM36.783,24.934c0.729,0.358 1.335,0.823 1.788,1.376 0.145,0.14 0.273,0.303 0.379,0.486l0.421,0.729zM36.779,13.672c2.438,0 4.415,1.977 4.415,4.415 0,2.438 -1.977,4.415 -4.415,4.415s-4.415,-1.977 -4.415,-4.415c0,-2.438 1.977,-4.415 4.415,-4.415z"
android:fillType="evenOdd"/>
</vector>

View File

@@ -1,12 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="32dp"
android:viewportWidth="75"
android:viewportHeight="101">
<path
android:fillColor="#FFF"
android:fillType="evenOdd"
android:pathData="m74.07,72.4v4h-12l0,8h-12l0,8h-12l0,8h-16v-4h12l0,-8h12l0,-8h12l0,-8zM18.13,63.48c0.41,0.14 0.83,0.25 1.27,0.33l8.47,1.87 -2.12,12c-0.07,0.39 -0.19,0.75 -0.35,1.09 -0.11,0.57 -0.33,1.12 -0.69,1.63l-12.76,18.22c-1.32,1.89 -3.93,2.35 -5.82,1.03s-2.35,-3.93 -1.03,-5.82l12.01,-17.15c-0.07,-0.37 -0.09,-0.75 -0.05,-1.13zM29.5,21c2.19,0.71 3.97,1.85 5.17,3.32 0.27,0.26 0.52,0.57 0.72,0.92l7.18,12.43 14.94,0c2.31,0 4.18,1.87 4.18,4.18s-1.87,4.18 -4.18,4.18h-17.23c-1.48,0 -2.78,-0.77 -3.52,-1.93 -0.21,-0.22 -0.39,-0.48 -0.55,-0.75l-1.65,-2.86 -2.1,11.92 13.71,4.99c0.37,0.13 0.7,0.31 1.01,0.53 1.75,0.99 2.58,3.12 1.87,5.07l-7.04,19.34c-0.79,2.17 -3.19,3.29 -5.35,2.5 -2.17,-0.79 -3.29,-3.19 -2.5,-5.35l5.64,-15.5 -19.23,-4.25c-4.54,-0.8 -7.58,-5.13 -6.78,-9.68l3.4,-19.3 -8.61,4.97v14.75c0,2.31 -1.87,4.18 -4.18,4.18s-4.18,-1.87 -4.18,-4.18v-17.23c0,-1.91 1.28,-3.52 3.02,-4.02 0.18,-0.15 0.38,-0.29 0.59,-0.42l13.99,-8.08c1.59,-0.92 6.93,-1.27 11.69,0.27zM31.28,0.4c4.61,0 8.36,3.74 8.36,8.36 0,4.61 -3.74,8.36 -8.36,8.36s-8.36,-3.74 -8.36,-8.36c0,-4.61 3.74,-8.36 8.36,-8.36z" />
</vector>

View File

@@ -1,12 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="32dp"
android:viewportWidth="78"
android:viewportHeight="101">
<path
android:fillColor="#FFF"
android:fillType="evenOdd"
android:pathData="m57.54,80.92 l4,4 -9.74,0 0,8h-12l0,8h-16v-4h12l0,-8h12l0,-8zM19.86,64c0.41,0.14 0.83,0.25 1.27,0.33l8.47,1.87 -2.12,12c-0.07,0.39 -0.19,0.75 -0.35,1.09 -0.11,0.57 -0.33,1.12 -0.69,1.63l-12.76,18.22c-1.32,1.89 -3.93,2.35 -5.82,1.03 -1.89,-1.32 -2.35,-3.93 -1.03,-5.82l12.01,-17.15c-0.07,-0.37 -0.09,-0.75 -0.05,-1.13zM6.25,12.77 L76.46,82.99c1.37,1.37 1.37,3.59 0,4.96 -1.37,1.37 -3.59,1.37 -4.96,0l-70.22,-70.22c-1.37,-1.37 -1.37,-3.59 0,-4.96s3.59,-1.37 4.96,0zM41.41,64.78 L47.93,71.3 43.72,82.84c-0.79,2.17 -3.19,3.29 -5.35,2.5 -2.17,-0.79 -3.29,-3.19 -2.5,-5.35zM73.33,72.92 L75.8,72.92 75.8,75.39zM17.25,40.63 L41,64.37 22.28,60.23c-4.54,-0.8 -7.58,-5.13 -6.78,-9.68zM5.8,29.18 L11.92,35.29 10.3,36.23v14.75c0,2.31 -1.87,4.18 -4.18,4.18s-4.18,-1.87 -4.18,-4.18v-17.23c0,-1.91 1.28,-3.52 3.02,-4.02 0.18,-0.15 0.38,-0.29 0.59,-0.42zM31.23,21.51c2.19,0.71 3.97,1.85 5.17,3.32 0.27,0.26 0.52,0.57 0.72,0.92l7.18,12.43 14.94,0c2.31,0 4.18,1.87 4.18,4.18s-1.87,4.18 -4.18,4.18l-12.29,-0 -25.82,-25.82c2.37,-0.46 6.41,-0.41 10.1,0.79zM33.01,0.92c4.61,0 8.36,3.74 8.36,8.36 0,4.61 -3.74,8.36 -8.36,8.36s-8.36,-3.74 -8.36,-8.36c0,-4.61 3.74,-8.36 8.36,-8.36z" />
</vector>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="80"
android:viewportHeight="79">
<path
android:fillColor="#FFF"
android:pathData="m7.036,18.185 l5.418,5.418c-2.663,4.673 -4.184,10.086 -4.184,15.858 0,17.676 14.258,31.982 31.934,31.982 5.782,0 11.204,-1.531 15.882,-4.21l5.408,5.408c-6.143,3.939 -13.451,6.223 -21.29,6.223 -21.729,0 -39.404,-17.627 -39.404,-39.404 0,-7.839 2.291,-15.141 6.236,-21.276zM7.599,1.899 L77.815,72.114c1.368,1.368 1.368,3.59 0,4.958 -1.368,1.368 -3.59,1.368 -4.958,0l-70.216,-70.216c-1.368,-1.368 -1.368,-3.59 0,-4.958 1.368,-1.368 3.59,-1.368 4.958,0zM38.708,49.856 L41.991,53.139 41.991,55.196c0.561,-0.107 1.1,-0.253 1.617,-0.439l5.109,5.108c-0.413,0.203 -0.842,0.39 -1.284,0.561 -1.682,0.649 -3.496,1.074 -5.442,1.277v4.378h-3.284v-4.317c-2.675,0.041 -5.24,-0.365 -7.692,-1.216s-4.611,-2.25 -6.476,-4.196l5.534,-5.655c0.973,1.378 2.23,2.432 3.77,3.162 1.54,0.73 3.162,1.176 4.865,1.338zM40.204,0.057c21.777,0 39.453,17.627 39.453,39.404 0,7.852 -2.298,15.164 -6.257,21.305l-5.423,-5.424c2.679,-4.678 4.21,-10.1 4.21,-15.882 0,-17.676 -14.307,-31.982 -31.983,-31.982 -5.785,0 -11.204,1.533 -15.877,4.214l-5.398,-5.399c6.14,-3.948 13.445,-6.238 21.276,-6.238zM41.991,13.239v4.013h0.547c2.068,0 4.186,0.355 6.354,1.064 2.169,0.71 4.023,1.753 5.564,3.132l-5.047,5.655c-0.932,-1.013 -2.047,-1.814 -3.344,-2.402 -1.297,-0.588 -2.655,-0.882 -4.074,-0.882l-0.001,5.537 -3.283,-3.283 0,-2.133c-0.578,0.099 -1.131,0.257 -1.658,0.474l-5.032,-5.03c0.561,-0.317 1.149,-0.602 1.765,-0.855 1.581,-0.649 3.223,-1.054 4.925,-1.216v-4.074z"
android:fillType="evenOdd"/>
</vector>

View File

@@ -1,12 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="39dp"
android:viewportWidth="61"
android:viewportHeight="100">
<path
android:fillColor="#FFF"
android:fillType="evenOdd"
android:pathData="m33.77,7.59h1.04c3.91,0 7.92,0.67 12.03,2.01s7.61,3.32 10.53,5.93l-9.55,10.7c-1.76,-1.92 -3.87,-3.43 -6.33,-4.55 -2.45,-1.11 -5.02,-1.67 -7.71,-1.67v23.01l0.46,0.12c3.22,0.84 6.39,1.8 9.49,2.88 3.11,1.07 5.87,2.47 8.29,4.2 2.42,1.73 4.37,3.89 5.87,6.5 1.5,2.61 2.24,5.87 2.24,9.78 0,3.84 -0.69,7.23 -2.07,10.18 -1.38,2.95 -3.26,5.49 -5.64,7.59s-5.16,3.78 -8.34,5.01c-3.18,1.23 -6.62,2.03 -10.3,2.42v8.29h-6.21v-8.17c-5.06,0.08 -9.92,-0.69 -14.56,-2.3 -4.64,-1.61 -8.73,-4.26 -12.26,-7.94l10.47,-10.7c1.84,2.61 4.22,4.6 7.13,5.98 2.92,1.38 5.98,2.22 9.21,2.53v-24.28l-0.58,-0.12c-3.22,-0.92 -6.29,-1.94 -9.21,-3.05s-5.5,-2.57 -7.77,-4.37c-2.26,-1.8 -4.05,-3.99 -5.35,-6.56s-1.96,-5.77 -1.96,-9.61c0,-3.45 0.69,-6.56 2.07,-9.32s3.22,-5.16 5.52,-7.19c2.3,-2.03 4.95,-3.66 7.94,-4.89 2.99,-1.23 6.1,-1.99 9.32,-2.3v-7.71h6.21zM27.55,20.25c-2.69,0.46 -5.08,1.59 -7.19,3.39 -2.11,1.8 -3.16,4.16 -3.16,7.08 0,1.76 0.29,3.18 0.86,4.26s1.32,1.99 2.24,2.76c0.92,0.77 2.01,1.4 3.28,1.9 1.27,0.5 2.59,1.05 3.97,1.67zM33.77,79.4c1.61,-0.31 3.13,-0.79 4.55,-1.44 1.42,-0.65 2.67,-1.46 3.74,-2.42 1.07,-0.96 1.94,-2.11 2.59,-3.45 0.65,-1.34 0.98,-2.86 0.98,-4.55 0,-1.69 -0.36,-3.11 -1.09,-4.26 -0.73,-1.15 -1.67,-2.11 -2.82,-2.88 -1.15,-0.77 -2.42,-1.42 -3.8,-1.96 -1.38,-0.54 -2.76,-1.04 -4.14,-1.5z" />
</vector>

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