Merge branch 'master' into follow_track

This commit is contained in:
Vitaliy 2020-08-20 12:27:52 +03:00
commit fde90d40d4
37 changed files with 462 additions and 267 deletions

View file

@ -39,6 +39,7 @@ public class Amenity extends MapObject {
public static final String CONTENT = "content";
public static final String CUISINE = "cuisine";
public static final String WIKIDATA = "wikidata";
public static final String WIKIMEDIA_COMMONS = "wikimedia_commons";
public static final String DISH = "dish";
public static final String REF = "ref";
public static final String OSM_DELETE_VALUE = "delete";

View file

@ -32,6 +32,8 @@ public interface ITileSource {
public String getReferer();
public String getUserAgent();
public void deleteTiles(String path);
public int getAvgSize();

View file

@ -90,6 +90,7 @@ public class MapTileDownloader {
public final int yTile;
public String url;
public String referer = null;
public String userAgent = null;
public boolean error;
public DownloadRequest(String url, File fileToSave, int xTile, int yTile, int zoom) {
@ -266,7 +267,7 @@ public class MapTileDownloader {
request.setError(false);
try {
URLConnection connection = NetworkUtils.getHttpURLConnection(request.url);
connection.setRequestProperty("User-Agent", USER_AGENT); //$NON-NLS-1$
connection.setRequestProperty("User-Agent", Algorithms.isEmpty(request.userAgent) ? USER_AGENT : request.userAgent); //$NON-NLS-1$
if (request.referer != null)
connection.setRequestProperty("Referer", request.referer); //$NON-NLS-1$
connection.setConnectTimeout(CONNECTION_TIMEOUT);

View file

@ -68,6 +68,7 @@ public class TileSourceManager {
private String[] randomsArray;
private String rule;
private String referer;
private String userAgent;
private boolean hidden; // if hidden in configure map settings, for example mapillary sources
private boolean isRuleAcceptable = true;
@ -261,6 +262,14 @@ public class TileSourceManager {
this.referer = referer;
}
public String getUserAgent() {
return userAgent;
}
public void setUserAgent(String userAgent) {
this.userAgent = userAgent;
}
@Override
public int getTileSize() {
return tileSize;
@ -484,6 +493,9 @@ public class TileSourceManager {
if (!Algorithms.isEmpty(tm.getReferer())) {
properties.put("referer", tm.getReferer());
}
if (!Algorithms.isEmpty(tm.getUserAgent())) {
properties.put("user_agent", tm.getUserAgent());
}
properties.put("ext", tm.getTileFormat());
properties.put("min_zoom", tm.getMinimumZoomSupported() + "");
@ -708,6 +720,12 @@ public class TileSourceManager {
}
String randoms = attributes.get("randoms");
TileSourceTemplate templ = new TileSourceTemplate(name, urlTemplate, ext, maxZoom, minZoom, tileSize, bitDensity, avgTileSize);
if (attributes.get("referer") != null) {
templ.setReferer(attributes.get("referer"));
}
if (attributes.get("user_agent") != null) {
templ.setUserAgent(attributes.get("user_agent"));
}
if(expirationTime >= 0) {
templ.setExpirationTimeMinutes(expirationTime);
}

View file

@ -221,8 +221,8 @@
<string name="yard">ヤード</string>
<string name="foot">フィート</string>
<string name="mile">マイル</string>
<string name="km">キロメートル</string>
<string name="m">メートル</string>
<string name="km">km</string>
<string name="m">m</string>
<string name="nm">海里</string>
<string name="min_mile">min/m</string>
<string name="min_km">min/km</string>

View file

@ -2,7 +2,7 @@
<resources>
<string name="searching_for_gps">Posicionando…</string>
<string name="si_nm_h">Milhas náuticas por hora (nó)</string>
<string name="install_osmand_dialog_message">Você precisa instalar a versão gratuita ou paga do OsmAnd primeiro</string>
<string name="install_osmand_dialog_message">Precisa instalar a versão gratuita ou paga do OsmAnd primeiro</string>
<string name="shared_string_telegram">Telegram</string>
<string name="shared_string_login">Entrar</string>
<string name="start_end_date">Data de início - fim</string>
@ -10,7 +10,7 @@
<string name="gps_not_available">Por favor, ligue \"Localização\" nas configurações do sistema</string>
<string name="timeline_no_data">Sem dados</string>
<string name="sending_location_messages">enviando localização</string>
<string name="location_sharing_description">Selecione os contatos e grupos com os quais você deseja compartilhar sua localização.</string>
<string name="location_sharing_description">Selecione os contactos e grupos com os quais deseja compartilhar sua localização.</string>
<string name="waiting_for_response_from_telegram">Aguardando resposta do Telegram</string>
<string name="connected_account">Conta conectada</string>
<string name="osmand_privacy_policy">Política de privacidade do OsmAnd</string>
@ -33,7 +33,7 @@
<string name="last_updated_location">Última localização atualizada:</string>
<string name="stale_location">Parado</string>
<string name="show_gps_points_descr">Mostrar quantidade de pontos de GPS coletados e enviados.</string>
<string name="already_registered_in_telegram">Você precisa de uma conta e número de telefone registrados no Telegram</string>
<string name="already_registered_in_telegram">Precisa de uma conta e número de telefone registados no Telegram</string>
<string name="min_logging_speed_descr">Filtro: sem registro abaixo da velocidade selecionada</string>
<string name="shared_string_sort_by">Ordenar por</string>
<string name="shared_string_sent">Enviado</string>
@ -42,7 +42,7 @@
<string name="successfully_sent_and_updated">Enviado e atualizado com sucesso</string>
<string name="send_location_as_descr">Escolha como as mensagens com sua localização serão exibidas.</string>
<string name="shared_string_connection">Conexão</string>
<string name="share_location_as_description">Se você deseja conectar vários aparelhos a uma conta de telegrama, é necessário usar um aparelho diferente para compartilhar sua localização.</string>
<string name="share_location_as_description">Se deseja conectar vários aparelhos a uma conta de telegrama, é necessário usar um aparelho diferente para compartilhar a sua localização.</string>
<string name="proxy_password">Palavra-passe</string>
<string name="shared_string_authorization">Autorização</string>
<string name="shared_string_select">Selecionar</string>
@ -51,7 +51,7 @@
<string name="shared_string_bot">Robô</string>
<string name="average_altitude">Altitude média</string>
<string name="start_date">Data de início</string>
<string name="live_now_description">Contatos e grupos compartilhando o local para você.</string>
<string name="live_now_description">Contatos e grupos compartilhando o local consigo.</string>
<string name="shared_string_all">Todos</string>
<string name="received_gps_points">Pontos GPX recebidos: %1$s</string>
<string name="shared_string_appearance">Aparência</string>
@ -59,7 +59,7 @@
<string name="by_distance">Pela distância</string>
<string name="turn_off_location_sharing">Desativar o compartilhamento de local</string>
<string name="shared_string_collected">Coletado</string>
<string name="enter_another_device_name">Escolha um nome que você ainda não usou</string>
<string name="enter_another_device_name">Escolha um nome que ainda não usou</string>
<string name="shared_string_add">Adicionar</string>
<string name="show_users_on_map">Mostrar utilitadoes no mapa</string>
<string name="enter_authentication_code">Digite o código de autenticação</string>
@ -81,8 +81,8 @@
<string name="proxy_connected">Conectado</string>
<string name="m">m</string>
<string name="stop_sharing_all">O compartilhamento está ativado (desativado)</string>
<string name="do_not_have_telegram">Eu não tenho conta Telegram</string>
<string name="get_telegram_account_first">Você precisa de uma conta do Telegram para usar o compartilhamento de local.</string>
<string name="do_not_have_telegram">Não tenho uma conta do Telegram</string>
<string name="get_telegram_account_first">Precisa de uma conta do Telegram para usar o compartilhamento de local.</string>
<string name="disable_all_sharing">Desativar todo o compartilhamento</string>
<string name="sharing_status">Status de compartilhamento</string>
<string name="shared_string_end">Fim</string>
@ -92,11 +92,11 @@
<string name="shared_string_later">Mais tarde</string>
<string name="my_location">Minha localização</string>
<string name="install_osmand">Instalar OsmAnd</string>
<string name="privacy_policy_use_telegram">Telegrama (a app de mensagens) é usado para conectar e se comunicar com as pessoas.</string>
<string name="privacy_policy_use_telegram">Telegram (a app de mensagens) é usado para conectar e comunicar com as pessoas.</string>
<string name="not_possible_to_send_to_telegram_chats">Não é possível enviar para bate-papo do Telegram:</string>
<string name="not_sent_yet">Ainda não enviado</string>
<string name="points_size">%1$d pontos</string>
<string name="welcome_descr"><b>OsmAnd Tracker</b> permite que partilhe a sua localização e veja a dos outros no OsmAnd.<br/> <br/>O app usa a API Telegram e você precisa de uma conta do Telegram.</string>
<string name="welcome_descr"><b>OsmAnd Tracker</b> permite que partilhe a sua localização e veja a dos outros no OsmAnd.<br/> <br/>O app usa a API Telegram e precisa de uma conta do Telegram.</string>
<string name="min_logging_distance_descr">Filtro: distância mínima para registrar um novo ponto</string>
<string name="device_name_cannot_be_empty">O nome do aparelho não pode estar vazio</string>
<string name="yard">yd</string>
@ -152,7 +152,7 @@
<string name="hours_and_minutes_format">%1$d h %2$d m</string>
<string name="device_name_is_too_long">Nome do aparelho muito longo</string>
<string name="gps_points">Pontos de GPS</string>
<string name="timeline_description">Ative o monitoramento para salvar todos os locais no histórico.</string>
<string name="timeline_description">Ative o monitoramento para gravar todos os locais no histórico.</string>
<string name="show_on_map">Mostrar no mapa</string>
<string name="send_my_location">Enviar minha localização</string>
<string name="share_location_as">Compartilhar localização como</string>
@ -160,7 +160,7 @@
<string name="mile_per_hour">mph</string>
<string name="si_min_m">Minutos por milha</string>
<string name="last_update_from_telegram">Última atualização do Telegram</string>
<string name="logout_from_osmand_telegram_descr">Tem certeza de que deseja sair do OsmAnd Tracker para que você não possa compartilhar o local ou ver a localização de outras pessoas\?</string>
<string name="logout_from_osmand_telegram_descr">Tem certeza de que deseja sair do OsmAnd Tracker para que não possa compartilhar o local ou ver a localização de outras pessoas\?</string>
<string name="proxy_server">Servidor</string>
<string name="si_m_s">Metros por segundo</string>
<string name="location_sharing_status">Compartilhamento: %1$s</string>
@ -199,7 +199,7 @@
<string name="shared_string_authorization_descr">Por favor, insira o número de telefone do seu Telegram em formato internacional</string>
<string name="set_visible_time_for_all">Definir tempo visível para todos</string>
<string name="phone_number_title">Número de telefone</string>
<string name="privacy_policy_agree">Ao clicar em \"Continuar\" você concorda com as condições da política de privacidade do Telegram e OsmAnd.</string>
<string name="privacy_policy_agree">Ao clicar em \"Continuar\" concorda com as condições da política de privacidade do Telegram e OsmAnd.</string>
<string name="si_mi_feet">Milhas/pés</string>
<string name="monitoring_is_enabled">Monitoramento está ativado</string>
<string name="osmand_connect_desc">Escolha a versão OsmAnd que OsmAnd Tracker usa para exibir posições.</string>

View file

@ -57,10 +57,10 @@
<string name="timeline_available_for_free_now">Linha do tempo é um recurso disponível agora gratuitamente.</string>
<string name="disable_monitoring">Desativar monitoramento</string>
<string name="location_recording_enabled">Gravação de localização ativada</string>
<string name="timeline_description">Ative o monitoramento para salvar todos os locais no histórico.</string>
<string name="privacy_policy_use_telegram">Telegrama (a app de mensagens) é usado para conectar e se comunicar com as pessoas.</string>
<string name="timeline_description">Ative o monitoramento para gravar todos os locais no histórico.</string>
<string name="privacy_policy_use_telegram">Telegram (a app de mensagens) é usado para conectar e comunicar com as pessoas.</string>
<string name="privacy_policy_telegram_client">OsmAnd tracker é um dos clientes que usam a Plataforma aberta do Telegram . Seus contatos podem usar qualquer outro cliente Telegram.</string>
<string name="privacy_policy_agree">Ao clicar em \"Continuar\" você concorda com as condições da política de privacidade do Telegram e OsmAnd.</string>
<string name="privacy_policy_agree">Ao clicar em \"Continuar\" concorda com as condições da política de privacidade do Telegram e OsmAnd.</string>
<string name="shared_string_accept">Aceitar</string>
<string name="telegram_privacy_policy">Política de privacidade do Telegram</string>
<string name="osmand_privacy_policy">Política de privacidade do OsmAnd</string>
@ -82,7 +82,7 @@
<string name="send_location_as_descr">Escolha como as mensagens com sua localização serão exibidas.</string>
<string name="map_and_text">Mapa e texto</string>
<string name="last_update_from_telegram">Última atualização do Telegram</string>
<string name="enter_another_device_name">Escolha um nome que você ainda não usou</string>
<string name="enter_another_device_name">Escolha um nome que ainda não usou</string>
<string name="device_added_successfully">%1$s adicionado.</string>
<string name="error_adding_new_device">Não foi possível adicionar novo aparelho</string>
<string name="enter_device_name_description">Nomeie seu novo aparelho no máximo 200 símbolos.</string>
@ -90,7 +90,7 @@
<string name="device_name_cannot_be_empty">O nome do aparelho não pode estar vazio</string>
<string name="device_name">Nome do aparelho</string>
<string name="share_location_as_description_second_line">Pode criar e visualizar o ID do aparelho no cliente de telegrama usando o bot de bate-papo %1$s. %2$s</string>
<string name="share_location_as_description">Se você deseja conectar vários aparelhos a uma conta de telegrama, é necessário usar um aparelho diferente para compartilhar sua localização.</string>
<string name="share_location_as_description">Se deseja conectar vários aparelhos a uma conta de telegrama, é necessário usar um aparelho diferente para compartilhar a sua localização.</string>
<string name="last_updated_location">Última localização atualizada:</string>
<string name="successfully_sent_and_updated">Enviado e atualizado com sucesso</string>
<string name="not_possible_to_send_to_telegram_chats">Não é possível enviar para bate-papo do Telegram:</string>
@ -117,8 +117,8 @@
<string name="shared_string_save">Gravar</string>
<string name="add_device">Adicionar aparelho</string>
<string name="share_location_as">Compartilhar localização como</string>
<string name="live_now_description">Contatos e grupos compartilhando o local para você.</string>
<string name="logout_from_osmand_telegram_descr">Tem certeza de que deseja sair do OsmAnd Tracker para que você não possa compartilhar o local ou ver a localização de outras pessoas\?</string>
<string name="live_now_description">Contatos e grupos compartilhando o local consigo.</string>
<string name="logout_from_osmand_telegram_descr">Tem certeza de que deseja sair do OsmAnd Tracker para que não possa compartilhar o local ou ver a localização de outras pessoas\?</string>
<string name="logout_from_osmand_telegram">Sair do OsmAnd Tracker\?</string>
<string name="shared_string_name">Nome</string>
<string name="by_distance">Pela distância</string>
@ -159,13 +159,13 @@
<string name="shared_string_live">Vivo</string>
<string name="shared_string_bot">Robô</string>
<string name="get_telegram_title">Registro no Telegram</string>
<string name="get_telegram_account_first">Você precisa de uma conta do Telegram para usar o compartilhamento de local.</string>
<string name="get_telegram_account_first">Precisa de uma conta do Telegram para usar o compartilhamento de local.</string>
<string name="get_telegram_description_continue">Por favor, instale o Telegram e configure uma conta.</string>
<string name="get_telegram_after_creating_account">Então pode usar esta app.</string>
<string name="shared_string_all">Todos</string>
<string name="shared_string_off">Desligado</string>
<string name="already_registered_in_telegram">Você precisa de uma conta e número de telefone registrados no Telegram</string>
<string name="do_not_have_telegram">Eu não tenho conta Telegram</string>
<string name="shared_string_off">Desativado</string>
<string name="already_registered_in_telegram">Precisa de uma conta e número de telefone registados no Telegram</string>
<string name="do_not_have_telegram">Não tenho uma conta do Telegram</string>
<string name="enter_phone_number">Digite o número de telefone</string>
<string name="enter_authentication_code">Digite o código de autenticação</string>
<string name="set_visible_time_for_all">Definir tempo visível para todos</string>
@ -173,12 +173,12 @@
<string name="minutes_format">%1$d m</string>
<string name="hours_format">%1$d h</string>
<string name="shared_string_install">Instalar</string>
<string name="shared_string_share">Partilhar</string>
<string name="shared_string_share">Compartilhar</string>
<string name="shared_string_back">Voltar</string>
<string name="visible_time_for_all">Hora visível para todos</string>
<string name="set_time_description">Defina a hora em que seus contatos e grupos selecionados verão sua localização em tempo real.</string>
<string name="set_time">Definir tempo</string>
<string name="location_sharing_description">Selecione os contatos e grupos com os quais você deseja compartilhar sua localização.</string>
<string name="location_sharing_description">Selecione os contactos e grupos com os quais deseja compartilhar sua localização.</string>
<string name="my_location_search_hint">Pesquisa: Grupo ou contato</string>
<string name="start_location_sharing">Compartilhar localização</string>
<string name="show_on_map">Mostrar no mapa</string>
@ -190,7 +190,7 @@
<string name="authentication_code">Código de Autenticação</string>
<string name="authentication_code_descr">Uma faixa GPX é salva automaticamente durante a navegação.</string>
<string name="enter_password">Digite a palavra-passe</string>
<string name="password_descr">Palavra-passe do Telegram</string>
<string name="password_descr">Palavra-passe do telegrama</string>
<string name="shared_string_login">Entrar</string>
<string name="shared_string_logout">Sair</string>
<string name="initialization">Iniciando</string>
@ -204,14 +204,14 @@
<string name="no_location_permission">A app não tem permissão para acessar os dados de localização.</string>
<string name="gps_not_available">Por favor, ligue \"Localização\" nas configurações do sistema</string>
<string name="location_service_no_gps_available">Selecione um dos provedores de localização para compartilhar sua localização.</string>
<string name="osmand_service">Modo de fundo</string>
<string name="osmand_service">Modo em segundo plano</string>
<string name="osmand_service_descr">OsmAnd Tracker é executado em segundo plano com o ecrã desligado.</string>
<string name="shared_string_distance">Distância</string>
<string name="share_location">Compartilhar localização</string>
<string name="sharing_location">Compartilhando localização</string>
<string name="process_service">Serviço OsmAnd Tracker</string>
<string name="osmand_logo">Logotipo do OsmAnd</string>
<string name="install_osmand_dialog_message">Você precisa instalar a versão gratuita ou paga do OsmAnd primeiro</string>
<string name="install_osmand_dialog_message">Precisa instalar a versão gratuita ou paga do OsmAnd primeiro</string>
<string name="install_osmand">Instalar OsmAnd</string>
<string name="show_users_on_map">Mostrar utilitadoes no mapa</string>
<string name="active_chats">Bate-papos ativos</string>
@ -230,30 +230,29 @@
<string name="m_s">m/s</string>
<string name="km_h">km/h</string>
<string name="mile_per_hour">mph</string>
<string name="si_kmh">Quilómetros por hora</string>
<string name="si_kmh">Quilômetros por hora</string>
<string name="si_mph">Milhas por hora</string>
<string name="si_m_s">Metros por segundo</string>
<string name="si_min_km">Minutos por quilómetro</string>
<string name="si_min_km">Minutos por quilômetro</string>
<string name="si_min_m">Minutos por milha</string>
<string name="si_nm_h">Milhas náuticas por hora (nó)</string>
<string name="si_mi_feet">Milhas/pés</string>
<string name="si_mi_yard">Milhas/jardas</string>
<string name="si_km_m">Quilómetros/metros</string>
<string name="si_km_m">Quilômetros/metros</string>
<string name="si_nm">Milhas náuticas</string>
<string name="si_mi_meters">Milhas/metros</string>
<string name="shared_string_hour_short">h</string>
<string name="shared_string_minute_short">min</string>
<string name="shared_string_second_short">seg</string>
<string name="welcome_descr">O <b>OsmAnd Tracker</b> permite que partilhe sua localização e veja a dos outros no OsmAnd.<br/>
<br/>O app usa a API Telegram e você precisa de uma conta da Telegram.</string>
<string name="welcome_descr"><b>OsmAnd Tracker</b> permite que partilhe a sua localização e veja a dos outros no OsmAnd.<br/> <br/>O app usa a API Telegram e precisa de uma conta do Telegram.</string>
<string name="my_location">Minha localização</string>
<string name="live_now">Ao vivo agora</string>
<string name="timeline">Cronologia</string>
<string name="saved_messages">Mensagens gravadas</string>
<string name="time_zone_descr">Selecione o fuso horário para mostrar nas suas mensagens de localização.</string>
<string name="time_zone_descr">Selecione o fuso horário a mostrar nas suas mensagens de localização.</string>
<string name="time_zone">Fuso horário</string>
<string name="units_and_formats">Unidades e formatos</string>
<string name="unit_of_length_descr">Alterar unidade de medida de distância.</string>
<string name="unit_of_length_descr">Alterar unidade de distância.</string>
<string name="unit_of_length">Unidades de comprimento</string>
<string name="unit_of_speed_system_descr">Definir unidade de velocidade.</string>
<string name="unit_of_speed_system">Unidade de velocidade</string>

View file

@ -122,7 +122,7 @@
<string name="osmand_connect_desc">Выберите версию OsmAnd которую OsmAnd Tracker использует для отображения положений на карте.</string>
<string name="osmand_connect">OsmAnd подключение</string>
<string name="connected_account">Связанная учетная запись</string>
<string name="shared_string_account">Учетная запись</string>
<string name="shared_string_account">Учётная запись</string>
<string name="start_location_sharing">Начать отправку локации</string>
<string name="install_osmand_dialog_message">Вам необходимо сначала установить бесплатную или платную версию OsmAnd</string>
<string name="disconnect_from_telegram">Как отключить OsmAnd Tracker от Telegram</string>

View file

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:osmand="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:minHeight="@dimen/bottom_sheet_selected_item_title_height"
android:paddingLeft="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:paddingTop="@dimen/measurement_tool_menu_title_padding_top"
android:orientation="vertical"
android:paddingEnd="@dimen/content_padding"
android:paddingStart="@dimen/content_padding">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="1"
android:paddingBottom="@dimen/measurement_tool_menu_title_padding_bottom"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size"
osmand:typeface="@string/font_roboto_medium"
tools:text="Some title" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="@dimen/bottom_sheet_text_spacing_multiplier"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_regular"
tools:text="Some description" />
</LinearLayout>

View file

@ -14,8 +14,8 @@
android:paddingLeft="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:paddingTop="@dimen/multi_selection_menu_padding_top"
android:paddingBottom="@dimen/bottom_sheet_title_padding_bottom"
android:paddingTop="@dimen/measurement_tool_menu_title_padding_top"
android:paddingBottom="@dimen/measurement_tool_menu_title_padding_bottom"
android:text="@string/plan_route_open_existing_track"
android:textAppearance="@style/TextAppearance.ListItemTitle"
osmand:typeface="@string/font_roboto_medium" />

View file

@ -304,7 +304,7 @@
android:paddingLeft="@dimen/measurement_tool_button_padding"
android:paddingRight="@dimen/measurement_tool_button_padding"
android:text="@string/shared_string_apply"
android:textColor="?attr/color_dialog_buttons"
android:textColor="@color/color_white"
android:textAllCaps="false"
android:paddingEnd="@dimen/measurement_tool_button_padding"
android:paddingStart="@dimen/measurement_tool_button_padding" />

View file

@ -20,8 +20,10 @@
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/choose_navigation_title"
android:layout_width="match_parent"
android:layout_height="@dimen/bottom_sheet_title_height"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingTop="@dimen/measurement_tool_menu_title_padding_top"
android:paddingBottom="@dimen/measurement_tool_menu_title_padding_bottom"
android:paddingEnd="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
@ -42,7 +44,6 @@
android:textColor="?android:textColorPrimary"
android:lineSpacingMultiplier="@dimen/bottom_sheet_text_spacing_multiplier"
osmand:typeface="@string/font_roboto_regular"
android:letterSpacing="@dimen/description_letter_spacing"
android:textSize="@dimen/default_desc_text_size" />
<include layout="@layout/custom_radio_buttons" />
@ -61,7 +62,6 @@
android:textColor="?android:textColorPrimary"
android:lineSpacingMultiplier="@dimen/bottom_sheet_text_spacing_multiplier"
osmand:typeface="@string/font_roboto_regular"
android:letterSpacing="@dimen/description_letter_spacing"
android:textSize="@dimen/default_desc_text_size" />
</LinearLayout>

View file

@ -3480,4 +3480,22 @@ Zobrazená oblast: %1$s x %2$s</string>
<string name="tiles_storage_descr">Zvolte způsob uložení stažených dlaždic.</string>
<string name="export_import_quick_actions_with_profiles_promo">Rychlé akce můžete importovat nebo exportovat prostřednictvím profilů.</string>
<string name="shared_string_delete_all_q">Odstranit vše\?</string>
<string name="app_mode_go_cart">Motokára</string>
<string name="osm_edit_closed_note">Uzavřená OSM poznámka</string>
<string name="set_working_days_to_continue">Pro pokračování je potřeba nastavit pracovní dny</string>
<string name="route_between_points">Trasa mezi body</string>
<string name="plan_a_route">Naplánovat trasu</string>
<string name="add_to_a_track">Přidat k trase</string>
<string name="track_show_start_finish_icons">Zobrazit ikony startu a cíle</string>
<string name="select_track_width">Zvolte šířku</string>
<string name="gpx_split_interval_descr">Vyberte interval pro zobrazování značek na trase se vzdáleností nebo časem.</string>
<string name="gpx_split_interval_none_descr">Vyberte požadované dělení: podle času nebo podle vzdálenosti.</string>
<string name="shared_string_custom">Vlastní</string>
<string name="gpx_direction_arrows">Směrové šipky</string>
<string name="plan_route_last_edited">Naposledy upraveno</string>
<string name="plan_route_import_track">Importovat trasu</string>
<string name="plan_route_open_existing_track">Otevřít existující trasu</string>
<string name="plan_route_create_new_route">Vytvořit novou trasu</string>
<string name="plan_route_select_track_file_for_open">Vyberte trasu k otevření.</string>
<string name="shared_string_done">Hotovo</string>
</resources>

View file

@ -1117,7 +1117,7 @@
<string name="routing_attr_weight_description">Indiquez le poids du véhicule à respecter sur les routes.</string>
<string name="select_gpx">Sélectionner GPX…</string>
<string name="route_descr_select_destination">Définissez l\'arrivée</string>
<string name="shared_string_select_on_map">Sélectionner sur la carte</string>
<string name="shared_string_select_on_map">Sélectionnez sur la carte</string>
<string name="shared_string_favorite">Favori</string>
<string name="route_preferences">Préférences d\'itinéraire</string>
<string name="route_info">Informations sur l\'itinéraire</string>

View file

@ -88,9 +88,9 @@
<string name="indexing_poi">POIを索引中…</string>
<string name="indexing_transport">交通機関を索引化…</string>
<string name="shared_string_io_error">I/Oエラーです</string>
<string name="km">キロメートル</string>
<string name="km">km</string>
<string name="km_h">km/h</string>
<string name="m">メートル</string>
<string name="m">m</string>
<string name="old_map_index_is_not_supported">重複したマップ
データ形式 \'\'{0}\'\' はサポートされていません</string>
<string name="poi_filter_car_aid">自動車用施設</string>
@ -3737,4 +3737,41 @@ POIの更新は利用できません</string>
<string name="turn_screen_on_power_button">電源ボタン</string>
<string name="use_volume_buttons_as_zoom_descr">端末の音量ボタンでマップのズームレベルを変更できるようにします。</string>
<string name="use_volume_buttons_as_zoom">音量ボタンでズーム</string>
<string name="track_show_start_finish_icons">出発・目的地アイコンを表示</string>
<string name="select_track_width">幅の選択</string>
<string name="gpx_split_interval_descr">距離または時間のマーカーが経路に表示される間隔を選択します。</string>
<string name="gpx_split_interval_none_descr">時間または距離で、必要な分割オプションを選択します。</string>
<string name="shared_string_custom">カスタム</string>
<string name="gpx_direction_arrows">方向矢印</string>
<string name="plan_route_last_edited">最終編集日時</string>
<string name="plan_route_import_track">経路のインポート</string>
<string name="plan_route_open_existing_track">既存の経路を開く</string>
<string name="plan_route_create_new_route">新しいルートの作成</string>
<string name="plan_route_select_track_file_for_open">開きたい経路ファイルを選択します。</string>
<string name="shared_string_done">完了</string>
<string name="overwrite_track">経路を上書き</string>
<string name="save_as_new_track">新しい経路として保存</string>
<string name="reverse_route">ルート反転</string>
<string name="rourte_between_points_next_segment_button_desc">選択したプロファイルを使用して、次のセグメントのみ再計算します。</string>
<string name="rourte_between_points_whole_track_button_desc">選択したプロファイルを使用して、経路全体が再計算されます。</string>
<string name="rourte_between_points_desc">直線で地点間をつなげる方法をとるか、選択したプロファイルで地点間のルートを計算します。</string>
<string name="whole_track">全経路</string>
<string name="next_segment">次のセグメント</string>
<string name="rourte_between_points_warning_desc">このオプションを使用するには、OsmAndで経路をマップ上の道路にスナップする必要があります。
\n
\n次にナビゲーションプロファイルを選択して、利用予定の道路(一般道、高速道路)と、道路を追跡するおおよその距離を検出する必要があります。</string>
<string name="threshold_distance">限界距離</string>
<string name="navigation_profile">ナビゲーションプロファイル</string>
<string name="rourte_between_points_add_track_desc">新しいセグメントを追加するための経路ファイルを選択します。</string>
<string name="street_level_imagery">ストリート画像</string>
<string name="plan_route_exit_dialog_descr">保存せずにルート計画を終了した場合すべての変更が失われます。よろしいですか?</string>
<string name="app_mode_enduro_motorcycle">エンデューロバイク</string>
<string name="app_mode_motor_scooter">電動スクーター</string>
<string name="app_mode_wheelchair">車椅子</string>
<string name="app_mode_go_cart">ゴーカート</string>
<string name="osm_edit_closed_note">OSMのメモを閉じました</string>
<string name="set_working_days_to_continue">続けるには営業日を設定する必要があります</string>
<string name="route_between_points">地点間のルート</string>
<string name="plan_a_route">ルートを計画</string>
<string name="add_to_a_track">経路に追加</string>
</resources>

View file

@ -304,7 +304,7 @@
<string name="poi_city_gate">Brama miasta</string>
<string name="poi_fort">Fort</string>
<string name="poi_fountain">Fontanna</string>
<string name="poi_historic_ruins">Zabytkowe ruiny</string>
<string name="poi_historic_ruins">Ruiny o znaczeniu historycznym</string>
<string name="poi_rune_stone">Kamień runiczny</string>
<string name="poi_wreck">Wrak statku</string>
<string name="poi_historic_ship">Zabytkowy statek</string>

View file

@ -62,9 +62,8 @@
<string name="waypoint_visit_before">Passar antes</string>
<string name="simulate_your_location">Simular rota</string>
<string name="drawer">Lista simples</string>
<string name="short_location_on_map">Lat %1$s
\n
\nLon %2$s</string>
<string name="short_location_on_map">Latitude %1$s
\nLongitude %2$s</string>
<string name="tips_and_tricks_descr">Respostas às perguntas frequentes, mudanças recentes e outras.</string>
<string name="routing_settings_2">Configurações de navegação</string>
<string name="general_settings_2">Configurações gerais</string>
@ -780,7 +779,7 @@
<string name="osmand_parking_minutes">Minutos</string>
<string name="osmand_parking_position_description_add_time">O carro foi estacionado em</string>
<string name="index_settings">Gerenciar mapas</string>
<string name="context_menu_item_search">Pesquise nas proximidades</string>
<string name="context_menu_item_search">Pesquise por perto</string>
<string name="local_index_descr_title">Gerenciar mapas.</string>
<string name="show_point_options">Usar posição…</string>
<string name="only_show">Exibir rota</string>
@ -1364,7 +1363,7 @@
<string name="route_tsll">Vire levemente à esquerda e siga</string>
<string name="search_poi_location">Aguardando sinal…</string>
<string name="search_near_map">Pesquisar próximo ao centro do mapa</string>
<string name="search_nearby">Pesquise nas proximidades</string>
<string name="search_nearby">Pesquise por perto</string>
<string name="map_orientation_default">Mesma do aparelho</string>
<string name="map_orientation_portrait">Vertical</string>
<string name="map_orientation_landscape">Horizontal</string>
@ -1812,7 +1811,7 @@
<string name="update">Atualizar</string>
<string name="only_download_over_wifi">Somente baixar via Wi-Fi</string>
<string name="live_update">Atualização ao vivo</string>
<string name="update_now">Atualizar agora</string>
<string name="update_now">Atualizar</string>
<string name="route_distance">Distância:</string>
<string name="route_duration">Tempo:</string>
<string name="missing_write_external_storage_permission">OsmAnd não tem permissão para usar o cartão de memória</string>
@ -1835,7 +1834,7 @@
<string name="rec_split_clip_length_desc">Limite de tempo máximo para clipes gravados.</string>
<string name="rec_split_storage_size">Limite de armazenamento</string>
<string name="rec_split_storage_size_desc">Quantidade de espaço que pode ser ocupado por todos os clipes gravados.</string>
<string name="last_map_change">Última alteração no mapa: %s</string>
<string name="last_map_change">Última alteração: %s</string>
<string name="hourly">A cada hora</string>
<string name="daily">Diariamente</string>
<string name="weekly">Semanalmente</string>
@ -2087,7 +2086,7 @@
<string name="routing_attr_avoid_ice_roads_fords_name">Sem estradas de gelo ou vaus</string>
<string name="routing_attr_avoid_ice_roads_fords_description">Evitar estradas de gelo e vaus.</string>
<string name="map_orientation_change_in_accordance_with_speed">Limite para orientação do mapa</string>
<string name="quick_action_show_navigation_finish_dialog">Exibir notificação \'Navegação finalizada\'</string>
<string name="quick_action_show_navigation_finish_dialog">Exibir notif. \'Navegação finalizada\'</string>
<string name="mapillary_menu_title_tile_cache">Cache de quadrícula</string>
<string name="map_widget_ruler_control">Régua de raio</string>
<string name="show_from_zoom_level">Exibir a partir do nível de zoom</string>
@ -2463,34 +2462,22 @@
\n • Opção de gravação GPX permite-lhe gravar a sua viagem e compartilhá-la
\n • Através de plugin adicionais, você pode ativar curvas de nível e sombreamento de relevo</string>
<string name="osmand_extended_description_part6">Passeio, caminhada, turismo pela cidade
\n
\n• O mapa mostra caminhos para passeios e caminhadas
\n
\n• A Wikipédia no seu idioma preferido pode dizer muito durante um turismo pela cidade
\n
\n• Paradas de transportes públicos (ônibus, troleibus, trem) incluindo nomes de linha, ajuda a navegar em uma nova cidade
\n
\n• Navegação GPS em modo pedestre constrói a sua rota usando caminhos para pedestres
\n
\n• Fazer upload e seguir uma rota GPX ou gravar e compartilhar a sua própria rota
\n • O mapa mostra caminhos para passeios e caminhadas
\n • A Wikipédia no seu idioma preferido pode dizer muito durante um turismo pela cidade
\n • Paradas de transportes públicos (ônibus, troleibus, trem) incluindo nomes de linha, ajuda a navegar em uma nova cidade
\n • Navegação GPS em modo pedestre constrói a sua rota usando caminhos para pedestres
\n • Fazer upload e seguir uma rota GPX ou gravar e compartilhar a sua própria rota
\n</string>
<string name="osmand_extended_description_part7">Contribua para o OSM
\n
\n• Comunique falha de dados
\n
\n• Carregue trilhas GPX diretamente do app
\n
\n• Adicione POIs e carregue-os diretamente ao OSM (ou mais tarde se off-line)
\n • Comunique falha de dados
\n • Carregue trilhas GPX diretamente do app
\n • Adicione POIs e carregue-os diretamente ao OSM (ou mais tarde se off-line)
\n</string>
<string name="osmand_plus_extended_description_part5">Recursos de segurança
\n
\n• Alternância de exibição dia/noite automatizada opcional
\n
\n• Exibição de limite de velocidade opcional, com lembrete se você ultrapassá-lo
\n
\n• Zoom dependente da velocidade opcional
\n
\n• Compartilhe sua localização para que seus amigos possam encontrar você
\n • Alternância de exibição dia/noite automatizada opcional
\n • Exibição de limite de velocidade opcional, com lembrete se você ultrapassá-lo
\n • Zoom dependente da velocidade opcional
\n • Compartilhe sua localização para que seus amigos possam encontrar você
\n</string>
<string name="live_monitoring_max_interval_to_send_desrc">Especificar um buffer de tempo para manter locais para enviar sem conexão</string>
<string name="quick_action_take_audio_note_descr">Um botão para adicionar uma nota de áudio no meio da tela.</string>
@ -2559,18 +2546,12 @@
<string name="move_point">Mover Ponto</string>
<string name="osm_recipients_label">Destinatários OSM</string>
<string name="osmand_plus_extended_description_part6">Recursos de Ciclismo e Pedestre
\n
\n• Visualização de caminhos a pé, pistas de caminhadas e ciclovias, ideal para atividades ao ar livre
\n
\n• Roteamento e modos de exibição especiais para bicicleta e pedestres
\n
\n• Paradas de transporte público opcionais (ônibus, troleibus, trem) incluindo nomes de linhas
\n
\n• Gravação opcional de viagem para arquivo GPX local ou serviço on-line
\n
\n• Exibição opcional de velocidade e altitudes
\n
\n• Exibição de curvas de nível e sombreamento de relevo (via plugin adicional)</string>
\n • Visualização de caminhos a pé, pistas de caminhadas e ciclovias, ideal para atividades ao ar livre
\n • Roteamento e modos de exibição especiais para bicicleta e pedestres
\n • Paradas de transporte público opcionais (ônibus, troleibus, trem) incluindo nomes de linhas
\n • Gravação opcional de viagem para arquivo GPX local ou serviço on-line
\n • Exibição opcional de velocidade e altitudes
\n • Exibição de curvas de nível e sombreamento de relevo (via plugin adicional)</string>
<string name="shared_string_without_name">Sem nome</string>
<string name="osmand_plus_extended_description_part8">Cobertura de mapa e qualidade aproximada:
\n• Europa Ocidental: ****
@ -2646,18 +2627,12 @@
<string name="waypoints_removed_from_map_markers">Pontos de passagem removidos dos marcadores de mapa</string>
<string name="shared_string_result">Resultado</string>
<string name="osmand_plus_extended_description_part2">Navegação
\n
\n• Funciona on-line (rápido) ou offline (sem custo de roaming quando estiver no exterior)
\n
\n• Orientação por voz passo-a-passo (vozes gravadas e sintetizadas)
\n
\n• Orientação de faixas opcional, exibição do nome da rua e tempo estimado de chegada
\n
\n• Suporta pontos intermediários do seu itinerário
\n
\n• Correção de rota automático sempre que você sair da rota
\n
\n• Busque lugares por endereço, pelo tipo (ex.: restaurante, hotel, posto de gasolina, museu), ou por coordenadas geográficas
\n • Funciona on-line (rápido) ou offline (sem custo de roaming quando estiver no exterior)
\n • Orientação por voz passo-a-passo (vozes gravadas e sintetizadas)
\n • Orientação de faixas opcional, exibição do nome da rua e tempo estimado de chegada
\n • Suporta pontos intermediários do seu itinerário
\n • Correção de rota automático sempre que você sair da rota
\n • Busque lugares por endereço, pelo tipo (ex.: restaurante, hotel, posto de gasolina, museu), ou por coordenadas geográficas
\n</string>
<string name="osmand_plus_extended_description_part3">Visualização de mapa
\n• Exiba sua posição e orientação
@ -2668,19 +2643,13 @@
\n• Opcionalmente exiba nomes de lugares em inglês, língua local ou fonético
\n</string>
<string name="osmand_plus_extended_description_part4">Use dados OSM e da Wikipédia
\n • Informações de alta qualidade dos melhores projetos colaborativos do mundo
\n • Dados OSM disponíveis por país ou região
\n • POIs da Wikipédia, ótimo para visitas turísticas
\n • Downloads grátis ilimitados, diretamente do aplicativo
\n • Mapas vetoriais offline compactos e atualizados mensalmente
\n
\n• Informações de alta qualidade dos melhores projetos colaborativos do mundo
\n
\n• Dados OSM disponíveis por país ou região
\n
\n• POIs da Wikipédia, ótimo para visitas turísticas
\n
\n• Downloads grátis ilimitados, diretamente do aplicativo
\n
\n• Mapas vetoriais offline compactos e atualizados mensalmente
\n
\n
\n• Escolha entre região completa ou apenas rede rodoviária (Exemplo: Japão inteiro tem 700 MB ou apenas 200 MB para rede rodoviária)</string>
\n • Escolha entre região completa ou apenas rede rodoviária (Exemplo: Japão inteiro tem 700 MB ou apenas 200 MB para rede rodoviária)</string>
<string name="online_webpage_warning">Página disponível só online. Abrir num navegador web?</string>
<string name="images_cache">Cache de imagens</string>
<string name="delete_search_history">Apagar histórico de pesquisa</string>
@ -2817,16 +2786,11 @@
\n
\nAlgumas das principais características:</string>
<string name="osmand_plus_extended_description_part7">Contribua diretamente para o OSM
\n
\n• Avisar erros de dados
\n
\n• Fazer upload de trilhas GPX para o OSM diretamente do app
\n
\n• Adicionar POIs e fazer o upload diretamente para OSM (ou mais tarde se offline)
\n
\n• Gravação de viagem opcional também em modo background (enquanto o dispositivo está no modo sleep)
\n
\nOsmAnd é um software de código aberto desenvolvido ativamente. Todos podem contribuir para o app, reportando bugs, melhorando as traduções ou programando novas funcionalidades. Além disso, o projeto conta com as contribuições financeiras para financiar o desenvolvimento e testes de novas funcionalidades.
\n • Avisar erros de dados
\n • Fazer upload de trilhas GPX para o OSM diretamente do app
\n • Adicionar POIs e fazer o upload diretamente para OSM (ou mais tarde se offline)
\n • Gravação de viagem opcional também em modo background (enquanto o dispositivo está no modo sleep)
\n OsmAnd é um software de código aberto desenvolvido ativamente. Todos podem contribuir para o app, reportando bugs, melhorando as traduções ou programando novas funcionalidades. Além disso, o projeto conta com as contribuições financeiras para financiar o desenvolvimento e testes de novas funcionalidades.
\n</string>
<string name="point_deleted">Ponto %1$s foi excluído</string>
<string name="shared_string_world">Mundo</string>

View file

@ -326,7 +326,7 @@
<string name="poi_pharmacy">Аптека</string>
<string name="poi_hospital">Больница</string>
<string name="poi_doctors">Врач;Доктор</string>
<string name="poi_clinic">Поликлиника, клиника</string>
<string name="poi_clinic">Поликлиника;Клиника</string>
<string name="poi_first_aid">Первая помощь</string>
<string name="poi_dentist">Стоматология;Лечение зубов;Зубной врач</string>
<string name="poi_nursing_home">Дом престарелых</string>
@ -1937,7 +1937,7 @@
<string name="poi_clothes_leather">Кожаная</string>
<string name="poi_clothes_costumes">Карнавальные костюмы</string>
<string name="poi_clothes_traditional">Традиционная</string>
<string name="poi_clothes_suits">Костюмы, смокинги</string>
<string name="poi_clothes_suits">Костюмы;Смокинги</string>
<string name="poi_clothes_maternity">Для беременных</string>
<string name="poi_clothes_vintage">Старинная</string>
<string name="poi_clothes_oversize">Для больших людей</string>
@ -3308,8 +3308,8 @@
<string name="poi_climbing_rock_quartzite">Тип камня: кварцит</string>
<string name="poi_climbing_rock_gneiss">Тип камня: гнейс</string>
<string name="poi_climbing_rock_porphyry">Тип камня: порфир</string>
<string name="poi_climbing_quality_solid">Надежность камней: прочно</string>
<string name="poi_climbing_quality_fragile">Надежность камней: ненадёжно</string>
<string name="poi_climbing_quality_solid">Надёжность камней: надёжно</string>
<string name="poi_climbing_quality_fragile">Надёжность камней: ненадёжно</string>
<string name="poi_climbing_bolted_yes">Фиксированные зацепы: есть</string>
<string name="poi_climbing_bolted_no">Фиксированные зацепы: нет</string>
<string name="poi_climbing_orientation_n">Ориентация стены: С</string>

View file

@ -297,7 +297,7 @@
<string name="lang_fy">Западнофризский</string>
<string name="lang_als">Албанский (тоскский)</string>
<string name="rendering_attr_hideProposed_name">Планируемые объекты</string>
<string name="srtm_plugin_description">Этот плагин обеспечивает как наложение контурных линий, так и отображения затеняющего слоя рельефа поверх стандартных карт OsmAnd. Эта функция высоко оценится спортсменами, туристами, путешественниками и всеми, кто заинтересован в рельефной структуре ландшафта.
<string name="srtm_plugin_description">Обеспечивает как наложение контурных линий, так и отображения затеняющего слоя рельефа поверх стандартных карт OsmAnd. Эта функция высоко оценится спортсменами, туристами, путешественниками и всеми, кто заинтересован в рельефной структуре ландшафта.
\n
\nГлобальные данные (между 70° на севере и 70° на юге) основываются на измерениях SRTM (Shuttle Radar Topography Mission) и ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer) — инструментом визуализации Terra, флагманского спутника Системы Наблюдения Земли NASA. ASTER является результатом совместных усилий NASA, министерства экономики Японии, торговли и промышленности (METI), а также Космических Систем Японии (J-spacesystems).</string>
<string name="srtm_paid_version_msg">Рассмотрите возможность покупки плагина «Линии высот» в Google Play, чтобы поддержать последующую разработку.</string>
@ -327,7 +327,7 @@
<string name="recording_description">Запись %1$s %3$s %2$s</string>
<string name="recording_default_name">Запись</string>
<string name="map_widget_av_notes">Аудиозаметки</string>
<string name="osmand_srtm_short_description_80_chars">OsmAnd плагин для линий высот</string>
<string name="osmand_srtm_short_description_80_chars">OsmAnd-плагин для линий высот</string>
<string name="map_widget_distancemeasurement">Измерение расстояний</string>
<string name="audionotes_location_not_defined">Нажмите «Использовать местоположение…» чтобы добавить заметку к данному местоположению.</string>
<string name="map_widget_audionotes">Аудиозаметки</string>
@ -346,11 +346,11 @@
<string name="download_roads_only_item">Только дороги</string>
<string name="download_regular_maps">Стандартная карта</string>
<string name="download_roads_only_maps">Карта дорог</string>
<string name="safe_mode_description">Запустить приложение в безопасном режиме (замедляет работу приложения, используя только Android функции).</string>
<string name="safe_mode_description">Запустить приложение в безопасном режиме (замедляет работу приложения, используя только функции Android).</string>
<string name="safe_mode">Безопасный режим</string>
<string name="native_library_not_running">Приложение работает в безопасном режиме (отключите его в разделе «Настройки»).</string>
<string name="background_service_is_enabled_question">Фоновая служба OsmAnd всё ещё работает. Остановите её тоже\?</string>
<string name="close_changeset">Закрыть changeset</string>
<string name="close_changeset">Закрыть пакет правок</string>
<string name="zxing_barcode_scanner_not_found">Приложение ZXing Barcode Scanner не найдено. Искать в Google Play?</string>
<string name="non_optimal_route_calculation">Быстрое построение маршрута (возможно неоптимально)</string>
<string name="oclock">ч.</string>
@ -413,7 +413,7 @@
<string name="live_monitoring_interval">Интервал онлайн-слежения</string>
<string name="live_monitoring_url_descr">Укажите веб-адрес со следующими параметрами: lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6}.</string>
<string name="live_monitoring_url">Web адрес онлайн-слежения</string>
<string name="gpx_monitoring_disabled_warn">Записать трек можно с помощью виджета GPX или выбрав «Запись поездки» в Настройках.</string>
<string name="gpx_monitoring_disabled_warn">Записать трек можно с помощью виджета GPX или выбрав «Запись поездки» в настройках.</string>
<string name="show_current_gpx_title">Показывать текущий путь</string>
<string name="free_version_message">Вы можете скачать или обновить карты %1$s.</string>
<string name="free_version_title">Бесплатная версия</string>
@ -748,7 +748,7 @@
<string name="map_orientation_landscape">Ландшафт</string>
<string name="map_screen_orientation">Ориентация экрана</string>
<string name="map_screen_orientation_descr">Выберите ориентацию экрана.</string>
<string name="opening_hours_not_supported">Не могу изменить формат часов работы.</string>
<string name="opening_hours_not_supported">Невозможно изменить формат часов работы.</string>
<string name="add_new_rule">Новое правило</string>
<string name="transport_Routes">Маршруты</string>
<string name="transport_Stop">Остановка</string>
@ -1104,7 +1104,7 @@
<string name="avoid_unpaved">Без грунтовых дорог</string>
<string name="avoid_ferries">Без паромов</string>
<string name="avoid_in_routing_title">Избегать…</string>
<string name="show_warnings_descr">Установка оповещений дорожного движения (ограничения скорости, вынужденные остановки, искусственные неровности, тоннели), камер скорости, информации о полосах.</string>
<string name="show_warnings_descr">Установка оповещений дорожного движения (ограничения скорости, вынужденные остановки, искусственные неровности, туннели), камер скорости, информации о полосах.</string>
<string name="map_widget_fluorescent">Флуоресцентные маршруты</string>
<string name="show_warnings_title">Показывать сигналы…</string>
<string name="map_widget_show_ruler">Линейка</string>
@ -1184,7 +1184,7 @@
<string name="context_menu_item_last_intermediate_point">Добавить последним промежуточным пунктом</string>
<string name="context_menu_item_first_intermediate_point">Добавить первым промежуточным пунктом</string>
<string name="add_as_last_destination_point">Добавить последним промежуточным пунктом</string>
<string name="add_as_first_destination_point">Добавить как первый промежуточный пункт</string>
<string name="add_as_first_destination_point">Добавить первым промежуточным пунктом</string>
<string name="replace_destination_point">Заменить пункт назначения</string>
<string name="new_destination_point_dialog">Пункт назначения уже установлен:</string>
<string name="target_point">Пункт %1$s</string>
@ -1379,7 +1379,7 @@
<string name="app_modes_choose_descr">Выберите отображаемые профили.</string>
<string name="app_modes_choose">Профили приложения</string>
<string name="edit_tilesource_choose_existing">Выберите существующий…</string>
<string name="maps_define_edit">Задать/отредактировать </string>
<string name="maps_define_edit">Задать/редактировать…</string>
<string name="android_19_location_disabled">В Android 4.4 (KitKat) и выше прежнее хранилище (%s) объявлено устаревшим. Скопировать все файлы OsmAnd в новое хранилище\?
\n Примечание 1: ваши старые файлы останутся нетронутыми (но могут быть удалены вручную).
\n Примечание 2: в новом хранилище совместное использование файлов OsmAnd и OsmAnd+ невозможно.</string>
@ -1422,7 +1422,7 @@
<string name="lang_lv">Латышский</string>
<string name="lang_lt">Литовский</string>
<string name="lang_mr">Маратхи</string>
<string name="lang_no">Норвежский Букмол</string>
<string name="lang_no">Норвежский букмол</string>
<string name="lang_pl">Польский</string>
<string name="lang_pt">Португальский</string>
<string name="lang_ro">Румынский</string>
@ -1577,7 +1577,7 @@
<string name="save_track_to_gpx_globally">Запись трека в файл GPX</string>
<string name="save_track_interval_globally">Интервал записи</string>
<string name="save_track_to_gpx_globally_descr">Ведение записи местоположений в файл GPX можно включить или выключить с помощью виджета записи GPX на карте.</string>
<string name="record_plugin_description">Плагин активирует функции для записи и сохранения ваших треков вручную нажатием на виджет записи GPX на карте, или также автоматически записывает все ваши маршруты навигации в файл GPX.
<string name="record_plugin_description">Активирует функции для записи и сохранения ваших треков вручную нажатием на виджет записи GPX на карте, или также автоматически записывает все ваши маршруты навигации в файл GPX.
\n
\nЗаписанными треками можно поделиться с вашими друзьями или использовать их для вклада в OSM. Спортсмены могут использовать записанные треки для контроля за тренировками. Некоторый базовый анализ треков может быть выполнен непосредственно в OsmAnd, например, время прохождения круга, средняя скорость и т.д., треки, конечно, позднее также могут быть проанализированы в специальных инструментах анализа сторонних производителей.</string>
<string name="create_poi_link_to_osm_doc"><u>Онлайн OSM</u> классификация карт с изображениями.</string>
@ -1767,7 +1767,7 @@
<string name="action_delete">Удалить действие</string>
<string name="action_modify">Изменить действие</string>
<string name="action_create">Создать действие</string>
<string name="osm_edits">OSM правки</string>
<string name="osm_edits">Правки OSM</string>
<string name="osmand_parking_hour">ч.</string>
<string name="osmand_parking_minute">м.</string>
<string name="osmand_parking_time_left">осталось</string>
@ -1780,14 +1780,14 @@
<string name="delay_to_start_navigation_descr">Укажите время задержки на экране планирования маршрута.</string>
<string name="delay_to_start_navigation">Начать пошаговое ведение через…</string>
<string name="shared_string_go">Поехали</string>
<string name="plugin_nautical_descr">Плагин расширяет возможности OsmAnd, делая доступными морские карты для катания на лодках, парусного спорта и других видов спорта.
<string name="plugin_nautical_descr">Расширяет возможности OsmAnd, делая доступными морские карты для катания на лодках, парусного спорта и других видов спорта.
\n
\nСпециальная дополнительная карта для OsmAnd добавляет морские навигационные и условные знаки как для внутренней, так и для прибрежной навигации. Описание навигационных отметок содержит информацию, необходимую для их идентификации, а также их характеристики (категория, форма, цвет, последовательность мерцания огней и т.д.).
\n
\nЧтобы вернуться к одному из традиционных стилей карт в OsmAnd, просто деактивируйте этот плагин или измените на желаемый «Стиль карты» в разделе «Настройки карты».</string>
<string name="local_osm_changes_upload_all_confirm">Вы уверены, что хотите отправить %1$d изменений в OSM\?</string>
<string name="confirmation_to_clear_history">Очистить историю?</string>
<string name="plugin_ski_descr">Плагин обеспечивает вам доступ к данным о горнолыжных трассах, маршрутах для беговых лыж, альпийских спусках, фуникулёрах и горнолыжных подъёмниках. Маршруты и спуски отмечены разными цветами в зависимости от их сложности и изображены с использованием специального «зимнего» стиля карты, который заключается в том, что используются «снежные» цвета зимнего пейзажа.
<string name="plugin_ski_descr">Обеспечивает вам доступ к данным о горнолыжных трассах, маршрутах для беговых лыж, альпийских спусках, фуникулёрах и горнолыжных подъёмниках. Маршруты и спуски отмечены разными цветами в зависимости от их сложности и изображены с использованием специального «зимнего» стиля карты, который заключается в том, что используются «снежные» цвета зимнего пейзажа.
\n
\nВ случае активации этого вида, стиль карты меняется на «Зимний/лыжный», показывая все детали пейзажа так, как они выглядят зимой. Такой (зимний) вид может быть отменён либо путём деактивации здесь, либо если вы поменяете «Стиль карты» в меню «Настройки карты» на желаемый вид.</string>
<string name="current_route">Текущий маршрут</string>
@ -1999,7 +1999,7 @@
<string name="application_dir_description">Выберите, где вы хотите хранить файлы карт и другие данные.</string>
<string name="show_on_start_description">При выключении сразу открывается карта.</string>
<string name="map_downloaded">Карта загружена</string>
<string name="shared_string_qr_code">QR код</string>
<string name="shared_string_qr_code">QR-код</string>
<string name="go_to_map">Показать карту</string>
<string name="world_map_download_descr">Мировая обзорная карта (охватывающая весь мир при низком уровне масштабирования) отсутствует или устарела. Пожалуйста, загрузите её для глобального обзора.</string>
<string name="map_downloaded_descr">Карта %1$s готова к использованию.</string>
@ -2066,7 +2066,7 @@
<string name="impassable_road_desc">Выберите дороги, которых следует избегать при навигации.</string>
<string name="shared_string_undo_all">Отменить все</string>
<string name="shared_string_type">Тип</string>
<string name="share_osm_edits_subject">OSM правки отправлены через OsmAnd</string>
<string name="share_osm_edits_subject">Правки OSM отправлены через OsmAnd</string>
<string name="update_time">Время обновления</string>
<string name="number_of_contributors">Количество участников</string>
<string name="number_of_edits">Количество правок</string>
@ -2135,7 +2135,7 @@
\nНеобходимо {3} МБ временного хранилища и {1} МБ постоянного.
\n(Доступно только {2} МБ)</string>
<string name="upload_osm_note_description">Отправьте свою заметку OSM анонимно или используя свой профиль OpenStreetMap.org.</string>
<string name="upload_osm_note">Отправить OSM заметку</string>
<string name="upload_osm_note">Отправить заметку OSM</string>
<string name="use_drawer_btn">Использовать меню</string>
<string name="use_dashboard_btn">Использовать панель управления</string>
<string name="dashboard_or_drawer_title">Панель управления или меню</string>
@ -2247,7 +2247,7 @@
<string name="get_for">Получить за %1$s</string>
<string name="get_it">Получить</string>
<string name="osm_live_banner_desc">Получайте неограниченное количество загрузок карт, вдобавок к еженедельным, ежедневным и даже почасовым обновлениям.</string>
<string name="osmand_plus_banner_desc">Неограниченный доступ к картам, обновлениям и плагину Wikipedia.</string>
<string name="osmand_plus_banner_desc">Неограниченный доступ к картам, обновлениям и плагину «Википедия».</string>
<string name="select_voice_provider">Выберите голосовое сопровождение</string>
<string name="osm_live_payment_desc">Абонентская плата взимается за выбранный период. Отменить подписку можно в Google Play в любой момент.</string>
<string name="donation_to_osm">Пожертвование для сообщества OSM</string>
@ -2308,7 +2308,7 @@
<string name="mapillary_widget">Виджет Mapillary</string>
<string name="mapillary_widget_descr">Позволяет быстро внести свой вклад в Mapillary.</string>
<string name="mapillary_descr">Фото с улиц онлайн для каждого. Открывайте для себя места, сотрудничайте, снимайте мир.</string>
<string name="mapillary">Mapillary</string>
<string name="mapillary">Изображения на уровне улиц</string>
<string name="plugin_mapillary_descr">Уличные фотографии для всех. Открывайте для себя места, сотрудничайте, снимайте мир.</string>
<string name="save_poi_too_many_uppercase">Название содержит слишком много заглавных букв. Вы хотите продолжить?</string>
<string name="quick_action_resume_pause_navigation_descr">Переключатель, чтобы приостановить или возобновить навигацию.</string>
@ -2545,7 +2545,7 @@
\n• Отображает специальные онлайн-тайлы, спутниковые снимки (с Bing), различные метки, как туристические/навигационные треки GPX и дополнительные слои с настраиваемой прозрачностью
\n</string>
<string name="osmand_extended_description_part4">Катание на лыжах
\n• OsmAnd плагин лыжные карты позволяет видеть лыжные трассы с уровнем сложности и некоторой дополнительной информацией, как расположение подъёмников и других объектов.</string>
\n• OsmAnd-плагин лыжные карты позволяет видеть лыжные трассы с уровнем сложности и некоторой дополнительной информацией, как расположение подъёмников и других объектов.</string>
<string name="osmand_extended_description_part5">Езда на велосипеде
\n• Поиск велосипедных дорожек на карте
\n• GPS навигация в велосипедном режиме строит маршрут используя велосипедные дорожки
@ -2633,7 +2633,7 @@
\n • Возможность записи путешествие в фоновом режиме (в то время, как устройство находится в спящем режиме)
\n OsmAnd это активно развивающееся программное обеспечение с открытым исходным кодом. Каждый может внести свой вклад в приложение, сообщая об ошибках, улучшая переводы или кодируя новые функции. Кроме того, проект опирается на финансовые взносы для финансирования разработки и тестирования новых функциональных возможностей.
\n</string>
<string name="empty_state_osm_edits">Создать или изменить OSM объекты</string>
<string name="empty_state_osm_edits">Создать или изменить объекты OSM</string>
<string name="empty_state_osm_edits_descr">Создавайте или изменяйте OSM POI, открывайте или комментируйте заметки OSM, а также отправляйте записанные файлы GPX.</string>
<string name="shared_string_deleted">Удалено</string>
<string name="shared_string_edited">Отредактировано</string>
@ -2699,7 +2699,7 @@
<string name="osm_edits_export_desc">Экспортировать как: заметки OSM, POI или оба.</string>
<string name="all_data">Все данные</string>
<string name="osm_notes">Заметки OSM</string>
<string name="tunnel_warning">Впереди тоннель</string>
<string name="tunnel_warning">Впереди туннель</string>
<string name="show_tunnels">Туннели</string>
<string name="make_as_start_point">Сделать отправной точкой</string>
<string name="enter_the_file_name">Введите имя файла.</string>
@ -3236,7 +3236,7 @@
<string name="manage_profiles">Управление профилями приложения…</string>
<string name="utm_format_descr">OsmAnd использует формат UTM Standard, который похож, но не идентичен формату UTM NATO.</string>
<string name="navigate_point_format_utm">UTM Стандарт</string>
<string name="navigate_point_format_olc">Open Location Code</string>
<string name="navigate_point_format_olc">Открытый код местоположения (OLC)</string>
<string name="coordinates_format_info">Выбранный формат будет применён во всём приложении.</string>
<string name="pref_selected_by_default_for_profiles">Параметр выбран по умолчанию для профилей: %s</string>
<string name="route_parameters_info">Настройки для маршрутизации в выбранном профиле «%1$s».</string>
@ -3847,10 +3847,11 @@
<string name="rourte_between_points_next_segment_button_desc">Только следующий сегмент будет перестроен с использованием выбранного профиля.</string>
<string name="next_segment">Следующий сегмент</string>
<string name="whole_track">Весь трек</string>
<string name="rourte_between_points_warning_desc">Для использования данной опции OsmAnd проложет ваш трек по дорогам.
<string name="rourte_between_points_warning_desc">Для использования данной возможности OsmAnd проложит ваш трек по дорогам.
\n
\nДалее вам следует выбрать профиль для построения маршрута с учётом ограничений этого профиля.</string>
<string name="rourte_between_points_desc">Выберите как соединять точки: по прямой линии или построением маршрута.</string>
<string name="in_case_of_reverse_direction">В случае обратного направления</string>
<string name="plan_route_exit_dialog_descr">Закрыть план маршрута без сохранения\? Все изменения будут потеряны.</string>
<string name="street_level_imagery">Изображения на уровне улиц</string>
</resources>

View file

@ -3556,4 +3556,15 @@
<string name="poi_sms">SMS</string>
<string name="poi_climbing_crag_filter">Lezecká stena</string>
<string name="poi_cellar_entrance">Vstup do pivnice</string>
<string name="poi_surface_artificial_turf">Umelý trávnik</string>
<string name="poi_atm_yes">Bankomat: áno</string>
<string name="poi_health_specialty_naturopathy_yes">Prírodná medicína</string>
<string name="poi_health_specialty_manual_therapy_yes">Manuálna terapia</string>
<string name="poi_health_specialty_optometry_yes">Optometria</string>
<string name="poi_health_specialty_obstetrics_caesarean_section_yes">Pôrodníctvo (cisársky rez)</string>
<string name="poi_cooperative">Družstevná kancelária</string>
<string name="poi_wetland_bog">Močiar</string>
<string name="poi_traffic_signals_arrow">Šípka</string>
<string name="poi_traffic_signals_vibration">Vibrácie</string>
<string name="poi_fire_hydrant_pressure_filter">Tlak</string>
</resources>

View file

@ -248,6 +248,8 @@
<dimen name="content_padding_small">12dp</dimen>
<dimen name="content_padding_half">8dp</dimen>
<dimen name="bottom_sheet_content_padding_small">8dp</dimen>
<dimen name="measurement_tool_menu_title_padding_top">13dp</dimen>
<dimen name="measurement_tool_menu_title_padding_bottom">5dp</dimen>
<dimen name="measurement_tool_divider_margin">8dp</dimen>
<dimen name="measurement_tool_content_padding_medium">12dp</dimen>
<dimen name="text_margin_small">4dp</dimen>

View file

@ -39,6 +39,7 @@ public class SQLiteTileSource implements ITileSource {
private static final String ELLIPSOID = "ellipsoid";
private static final String INVERTED_Y = "inverted_y";
private static final String REFERER = "referer";
private static final String USER_AGENT = "useragent";
private static final String TIME_COLUMN = "timecolumn";
private static final String EXPIRE_MINUTES = "expireminutes";
private static final String RULE = "rule";
@ -62,6 +63,7 @@ public class SQLiteTileSource implements ITileSource {
private String[] randomsArray;
private String rule = null;
private String referer = null;
private String userAgent = null;
int tileSize = 256;
boolean tileSizeSpecified = false;
@ -93,7 +95,7 @@ public class SQLiteTileSource implements ITileSource {
}
public SQLiteTileSource(OsmandApplication ctx, String name, int minZoom, int maxZoom, String urlTemplate,
String randoms, boolean isEllipsoid, boolean invertedY, String referer,
String randoms, boolean isEllipsoid, boolean invertedY, String referer, String userAgent,
boolean timeSupported, long expirationTimeMillis, boolean inversiveZoom, String rule) {
this.ctx = ctx;
this.name = name;
@ -104,6 +106,7 @@ public class SQLiteTileSource implements ITileSource {
this.expirationTimeMillis = expirationTimeMillis;
this.randoms = randoms;
this.referer = referer;
this.userAgent = userAgent;
this.rule = rule;
this.invertedY = invertedY;
this.timeSupported = timeSupported;
@ -120,6 +123,7 @@ public class SQLiteTileSource implements ITileSource {
this.expirationTimeMillis = tileSource.getExpirationTimeMillis();
this.randoms = tileSource.getRandoms();
this.referer = tileSource.getReferer();
this.userAgent = tileSource.getUserAgent();
this.invertedY = tileSource.isInvertedYTile();
this.timeSupported = tileSource.isTimeSupported();
this.inversiveZoom = tileSource.getInversiveZoom();
@ -139,6 +143,7 @@ public class SQLiteTileSource implements ITileSource {
addInfoColumn(db, ELLIPSOID, isEllipsoid ? "1" : "0");
addInfoColumn(db, INVERTED_Y, invertedY ? "1" : "0");
addInfoColumn(db, REFERER, referer);
addInfoColumn(db, USER_AGENT, userAgent);
addInfoColumn(db, TIME_COLUMN, timeSupported ? "yes" : "no");
addInfoColumn(db, EXPIRE_MINUTES, String.valueOf(getExpirationTimeMinutes()));
@ -264,6 +269,10 @@ public class SQLiteTileSource implements ITileSource {
if(refererId != -1) {
referer = cursor.getString(refererId);
}
int userAgentId = list.indexOf(USER_AGENT);
if(userAgentId != -1) {
userAgent = cursor.getString(userAgentId);
}
int tnumbering = list.indexOf(TILENUMBERING);
if(tnumbering != -1) {
inversiveZoom = BIG_PLANET_TILE_NUMBERING.equalsIgnoreCase(cursor.getString(tnumbering));
@ -673,4 +682,8 @@ public class SQLiteTileSource implements ITileSource {
return referer;
}
public String getUserAgent() {
return userAgent;
}
}

View file

@ -343,7 +343,7 @@ public class MapActivityActions implements DialogProvider {
final double longitude,
final ContextMenuAdapter adapter,
Object selectedObj,
boolean all) {
boolean configureMenu) {
ItemBuilder itemBuilder = new ItemBuilder();
adapter.addItem(itemBuilder
@ -400,7 +400,7 @@ public class MapActivityActions implements DialogProvider {
ContextMenuItem editGpxItem = new ItemBuilder()
.setTitleId(R.string.context_menu_item_edit_waypoint, mapActivity)
.setId(MAP_CONTEXT_MENU_EDIT_GPX_WP)
.setId(MAP_CONTEXT_MENU_ADD_GPX_WAYPOINT)
.setIcon(R.drawable.ic_action_edit_dark)
.setOrder(EDIT_GPX_WAYPOINT_ITEM_ORDER)
.setListener(listener).createItem();
@ -411,8 +411,7 @@ public class MapActivityActions implements DialogProvider {
.setOrder(ADD_GPX_WAYPOINT_ITEM_ORDER)
.setListener(listener).createItem();
if (all) {
adapter.addItem(editGpxItem);
if (configureMenu) {
adapter.addItem(addGpxItem);
} else if (selectedObj instanceof WptPt
&& getMyApplication().getSelectedGpxHelper().getSelectedGPXFile((WptPt) selectedObj) != null) {

View file

@ -1062,7 +1062,7 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL
}
}
public ContextMenuAdapter getActionsContextMenuAdapter(boolean all) {
public ContextMenuAdapter getActionsContextMenuAdapter(boolean configure) {
MapActivity mapActivity = getMapActivity();
final ContextMenuAdapter menuAdapter = new ContextMenuAdapter(getMyApplication());
if (mapActivity != null) {
@ -1070,7 +1070,7 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL
for (OsmandMapLayer layer : mapActivity.getMapView().getLayers()) {
layer.populateObjectContextMenu(latLon, getObject(), menuAdapter, mapActivity);
}
mapActivity.getMapActions().addActionsToAdapter(all ? 0 : latLon.getLatitude(), all ? 0 : latLon.getLongitude(), menuAdapter, getObject(), all);
mapActivity.getMapActions().addActionsToAdapter(configure ? 0 : latLon.getLatitude(), configure ? 0 : latLon.getLongitude(), menuAdapter, getObject(), configure);
}
return menuAdapter;
}

View file

@ -471,7 +471,9 @@ public class AmenityMenuBuilder extends MenuBuilder {
}
textPrefix = app.getString(R.string.poi_cuisine);
vl = sb.toString();
} else if (key.contains(Amenity.ROUTE) || key.equals(Amenity.WIKIDATA)) {
} else if (key.contains(Amenity.ROUTE)
|| key.equals(Amenity.WIKIDATA)
|| key.equals(Amenity.WIKIMEDIA_COMMONS)) {
continue;
} else {
if (key.contains(Amenity.DESCRIPTION)) {
@ -784,7 +786,8 @@ public class AmenityMenuBuilder extends MenuBuilder {
Map<String, String> additionalInfo = amenity.getAdditionalInfo();
String imageValue = additionalInfo.get("image");
String mapillaryValue = additionalInfo.get("mapillary");
String wikidataValue = additionalInfo.get("wikidata");
String wikidataValue = additionalInfo.get(Amenity.WIKIDATA);
String wikimediaValue = additionalInfo.get(Amenity.WIKIMEDIA_COMMONS);
if (!Algorithms.isEmpty(imageValue)) {
params.put("osm_image", imageValue);
}
@ -792,7 +795,10 @@ public class AmenityMenuBuilder extends MenuBuilder {
params.put("osm_mapillary_key", mapillaryValue);
}
if (!Algorithms.isEmpty(wikidataValue)) {
params.put("wikidata_id", wikidataValue);
params.put(Amenity.WIKIDATA, wikidataValue);
}
if (!Algorithms.isEmpty(wikimediaValue)) {
params.put(Amenity.WIKIMEDIA_COMMONS, wikimediaValue);
}
return params;
}

View file

@ -17,6 +17,7 @@ import androidx.appcompat.widget.AppCompatButton;
import net.osmand.AndroidNetworkUtils;
import net.osmand.AndroidUtils;
import net.osmand.Location;
import net.osmand.data.Amenity;
import net.osmand.data.LatLon;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
@ -438,10 +439,15 @@ public abstract class ImageCard extends AbstractCard {
pms.put("lang", preferredLang);
}
if (this.params != null) {
String wikidataId = this.params.get("wikidata_id");
String wikidataId = this.params.get(Amenity.WIKIDATA);
if (wikidataId != null) {
this.params.remove("wikidata_id");
WikiImageHelper.fillWikiMediaCards(mapActivity, wikidataId, result);
this.params.remove(Amenity.WIKIDATA);
WikiImageHelper.addWikidataImageCards(mapActivity, wikidataId, result);
}
String wikimediaContent = this.params.get(Amenity.WIKIMEDIA_COMMONS);
if (wikimediaContent != null) {
this.params.remove(Amenity.WIKIMEDIA_COMMONS);
WikiImageHelper.addWikimediaImageCards(mapActivity, wikimediaContent, result);
}
pms.putAll(this.params);
}

View file

@ -392,7 +392,7 @@ public class EditMapSourceDialogFragment extends BaseOsmAndDialogFragment
SQLiteTileSource sqLiteTileSource =
new SQLiteTileSource(app, newName, minZoom,
maxZoom, urlToLoad, "",
elliptic, false, "", expireTimeMinutes > 0,
elliptic, false, "", "", expireTimeMinutes > 0,
expireTimeMinutes * 60 * 1000L, false, ""
);
sqLiteTileSource.createDataBase();

View file

@ -14,7 +14,6 @@ import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemButton;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.ShortDescriptionItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem;
public class ExitBottomSheetDialogFragment extends MenuBottomSheetDialogFragment {
@ -27,12 +26,10 @@ public class ExitBottomSheetDialogFragment extends MenuBottomSheetDialogFragment
@Override
public void createMenuItems(Bundle savedInstanceState) {
items.add(new TitleItem(getString(R.string.exit_without_saving)));
items.add(new ShortDescriptionItem.Builder()
.setDescription(getString(R.string.plan_route_exit_dialog_descr))
.setDescriptionColorId(nightMode ? R.color.text_color_primary_dark : R.color.text_color_primary_light)
.setLayoutId(R.layout.bottom_sheet_item_description_long)
.setTitle(getString(R.string.exit_without_saving))
.setLayoutId(R.layout.bottom_sheet_item_list_title_with_descr)
.create());
items.add(new DividerSpaceItem(getContext(),
@ -75,7 +72,7 @@ public class ExitBottomSheetDialogFragment extends MenuBottomSheetDialogFragment
@Override
protected int getDismissButtonTextId() {
return R.string.shared_string_close;
return R.string.shared_string_cancel;
}
public static void showInstance(@NonNull FragmentManager fragmentManager, @Nullable Fragment targetFragment) {

View file

@ -37,6 +37,7 @@ import java.util.List;
import static net.osmand.plus.UiUtilities.CustomRadioButtonType.*;
import static net.osmand.plus.measurementtool.MeasurementEditingContext.CalculationMode.NEXT_SEGMENT;
import static net.osmand.plus.measurementtool.MeasurementEditingContext.CalculationMode.WHOLE_TRACK;
import static net.osmand.plus.measurementtool.MeasurementEditingContext.DEFAULT_APP_MODE;
public class RouteBetweenPointsBottomSheetDialogFragment extends BottomSheetDialogFragment {
@ -70,8 +71,9 @@ public class RouteBetweenPointsBottomSheetDialogFragment extends BottomSheetDial
nightMode = app.getDaynightHelper().isNightModeForMapControls();
FragmentActivity activity = requireActivity();
portrait = AndroidUiHelper.isOrientationPortrait(activity);
final View mainView = inflater.inflate(R.layout.fragment_route_between_points_bottom_sheet_dialog,
container, false);
final View mainView = UiUtilities.getInflater(getContext(), nightMode)
.inflate(R.layout.fragment_route_between_points_bottom_sheet_dialog,
container, false);
AndroidUtils.setBackground(activity, mainView, nightMode,
portrait ? R.drawable.bg_bottom_menu_light : R.drawable.bg_bottom_sheet_topsides_landscape_light,
portrait ? R.drawable.bg_bottom_menu_dark : R.drawable.bg_bottom_sheet_topsides_landscape_dark);
@ -101,7 +103,7 @@ public class RouteBetweenPointsBottomSheetDialogFragment extends BottomSheetDial
@Override
public void onClick(View view) {
snapToRoadEnabled = false;
ApplicationMode mode = null;
ApplicationMode mode = DEFAULT_APP_MODE;
if ((int) view.getTag() != STRAIGHT_LINE_TAG) {
mode = modes.get((int) view.getTag());
snapToRoadEnabled = true;
@ -116,7 +118,7 @@ public class RouteBetweenPointsBottomSheetDialogFragment extends BottomSheetDial
Drawable icon = app.getUIUtilities().getIcon(R.drawable.ic_action_split_interval, nightMode);
addProfileView(navigationType, onClickListener, STRAIGHT_LINE_TAG, icon,
app.getText(R.string.routing_profile_straightline), snapToRoadAppMode == null);
app.getText(R.string.routing_profile_straightline), snapToRoadAppMode == DEFAULT_APP_MODE);
addDelimiterView(navigationType);
for (int i = 0; i < modes.size(); i++) {

View file

@ -8,14 +8,12 @@ import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import net.osmand.PlatformUtil;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem;
import net.osmand.plus.helpers.GpxTrackAdapter;
import org.apache.commons.logging.Log;
@ -38,15 +36,13 @@ public class SnapTrackWarningBottomSheet extends MenuBottomSheetDialogFragment {
if (activity instanceof MapActivity) {
activity.findViewById(R.id.snap_to_road_image_button).setVisibility(View.GONE);
}
OsmandApplication app = requiredMyApplication();
items.add(new TitleItem(getString(R.string.route_between_points)));
BaseBottomSheetItem description = new BottomSheetItemWithDescription.Builder()
.setDescription(app.getString(R.string.rourte_between_points_warning_desc))
.setDescriptionColorId(R.color.text_color_primary_light)
.setLayoutId(R.layout.bottom_sheet_item_description_long)
.setDescription(getString(R.string.rourte_between_points_warning_desc))
.setTitle(getString(R.string.route_between_points))
.setLayoutId(R.layout.bottom_sheet_item_list_title_with_descr)
.create();
items.add(description);
items.add(new DividerSpaceItem(app, app.getResources().getDimensionPixelSize(R.dimen.content_padding_half)));
items.add(new DividerSpaceItem(getContext(), getResources().getDimensionPixelSize(R.dimen.content_padding_half)));
}
@Override

View file

@ -265,14 +265,14 @@ public class OsmEditingPlugin extends OsmandPlugin {
}
if (isEditable) {
adapter.addItem(new ContextMenuItem.ItemBuilder().setTitleId(R.string.poi_context_menu_modify, mapActivity)
.setId(MAP_CONTEXT_MENU_MODIFY_POI)
.setId(MAP_CONTEXT_MENU_CREATE_POI)
.setIcon(R.drawable.ic_action_edit_dark)
.setOrder(MODIFY_POI_ITEM_ORDER)
.setListener(listener)
.createItem());
} else if (selectedObj instanceof OpenstreetmapPoint && ((OpenstreetmapPoint) selectedObj).getAction() != Action.DELETE) {
adapter.addItem(new ContextMenuItem.ItemBuilder().setTitleId(R.string.poi_context_menu_modify_osm_change, mapActivity)
.setId(MAP_CONTEXT_MENU_MODIFY_OSM_CHANGE)
.setId(MAP_CONTEXT_MENU_CREATE_POI)
.setIcon(R.drawable.ic_action_edit_dark)
.setOrder(MODIFY_OSM_CHANGE_ITEM_ORDER)
.setListener(listener)
@ -287,7 +287,7 @@ public class OsmEditingPlugin extends OsmandPlugin {
}
if (selectedObj instanceof OsmNotesPoint) {
adapter.addItem(new ContextMenuItem.ItemBuilder().setTitleId(R.string.context_menu_item_modify_note, mapActivity)
.setId(MAP_CONTEXT_MENU_MODIFY_OSM_NOTE)
.setId(MAP_CONTEXT_MENU_OPEN_OSM_NOTE)
.setIcon(R.drawable.ic_action_edit_dark)
.setOrder(MODIFY_OSM_NOTE_ITEM_ORDER)
.setListener(listener)

View file

@ -105,12 +105,13 @@ public class AsyncLoadingThread extends Thread {
}
public TileLoadDownloadRequest(File dirWithTiles, String url, File fileToSave, String tileId, ITileSource source, int tileX,
int tileY, int zoom, String referer) {
int tileY, int zoom, String referer, String userAgent) {
super(url, fileToSave, tileX, tileY, zoom);
this.dirWithTiles = dirWithTiles;
this.tileSource = source;
this.tileId = tileId;
this.referer = referer;
this.userAgent = userAgent;
}
public void saveTile(InputStream inputStream) throws IOException {

View file

@ -144,7 +144,7 @@ public abstract class TilesCache<T> {
}
}
TileLoadDownloadRequest req = new TileLoadDownloadRequest(dirWithTiles, url, toSave,
tileId, map, x, y, zoom, map.getReferer());
tileId, map, x, y, zoom, map.getReferer(), map.getUserAgent());
if (sync) {
return getRequestedTile(req);
} else {

View file

@ -2035,6 +2035,7 @@ public class SettingsHelper {
boolean ellipsoid = object.optBoolean("ellipsoid", false);
boolean invertedY = object.optBoolean("inverted_y", false);
String referer = object.optString("referer");
String userAgent = object.optString("userAgent");
boolean timeSupported = object.optBoolean("timesupported", false);
long expire = object.optLong("expire", -1);
boolean inversiveZoom = object.optBoolean("inversiveZoom", false);
@ -2054,13 +2055,14 @@ public class SettingsHelper {
tileSourceTemplate.setRule(rule);
tileSourceTemplate.setRandoms(randoms);
tileSourceTemplate.setReferer(referer);
tileSourceTemplate.setUserAgent(userAgent);
tileSourceTemplate.setEllipticYTile(ellipsoid);
tileSourceTemplate.setInvertedYTile(invertedY);
tileSourceTemplate.setExpirationTimeMillis(timeSupported ? expire : -1);
template = tileSourceTemplate;
} else {
template = new SQLiteTileSource(app, name, minZoom, maxZoom, url, randoms, ellipsoid, invertedY, referer, timeSupported, expire, inversiveZoom, rule);
template = new SQLiteTileSource(app, name, minZoom, maxZoom, url, randoms, ellipsoid, invertedY, referer, userAgent, timeSupported, expire, inversiveZoom, rule);
}
items.add(template);
}
@ -2087,6 +2089,7 @@ public class SettingsHelper {
jsonObject.put("ellipsoid", template.isEllipticYTile());
jsonObject.put("inverted_y", template.isInvertedYTile());
jsonObject.put("referer", template.getReferer());
jsonObject.put("userAgent", template.getUserAgent());
jsonObject.put("timesupported", template.isTimeSupported());
jsonObject.put("expire", template.getExpirationTimeMinutes());
jsonObject.put("inversiveZoom", template.getInversiveZoom());

View file

@ -574,11 +574,21 @@ public class ContextMenuLayer extends OsmandMapLayer {
applyingMarkerLatLon = null;
}
public boolean showContextMenuForMyLocation() {
PointLocationLayer provider = view.getLayerByClass(PointLocationLayer.class);
if (provider != null) {
LatLon ll = provider.getObjectLocation(null);
if (ll != null) {
PointDescription pointDescription = provider.getObjectName(null);
return showContextMenu(ll, pointDescription, ll, provider);
}
}
return false;
}
public boolean showContextMenu(double latitude, double longitude, boolean showUnknownLocation) {
RotatedTileBox cp = activity.getMapView().getCurrentRotatedTileBox();
float x = cp.getPixXFromLatLon(latitude, longitude);
float y = cp.getPixYFromLatLon(latitude, longitude);
return showContextMenu(new PointF(x, y), activity.getMapView().getCurrentRotatedTileBox(), showUnknownLocation);
return showContextMenu(getPointFromLatLon(latitude, longitude),
activity.getMapView().getCurrentRotatedTileBox(), showUnknownLocation);
}
public boolean showContextMenu(@NonNull LatLon latLon,
@ -803,6 +813,13 @@ public class ContextMenuLayer extends OsmandMapLayer {
return false;
}
private PointF getPointFromLatLon(double latitude, double longitude) {
RotatedTileBox cp = activity.getMapView().getCurrentRotatedTileBox();
float x = cp.getPixXFromLatLon(latitude, longitude);
float y = cp.getPixYFromLatLon(latitude, longitude);
return new PointF(x, y);
}
private List<String> getValues(@Nullable QStringStringHash set) {
List<String> res = new ArrayList<>();
if (set != null) {

View file

@ -439,15 +439,9 @@ public class MapControlsLayer extends OsmandMapLayer {
}
private void showContextMenuForMyLocation() {
OsmAndLocationProvider lp = app.getLocationProvider();
Location lastKnownLocation = lp.getLastKnownLocation();
Location lastStaleKnownLocation = lp.getLastStaleKnownLocation();
Location location = lastKnownLocation != null ? lastKnownLocation : lastStaleKnownLocation;
if (location != null) {
ContextMenuLayer cml = mapActivity.getMapView().getLayerByClass(ContextMenuLayer.class);
if (cml != null) {
cml.showContextMenu(location.getLatitude(), location.getLongitude(), true);
}
ContextMenuLayer cml = mapActivity.getMapView().getLayerByClass(ContextMenuLayer.class);
if (cml != null) {
cml.showContextMenuForMyLocation();
}
}

View file

@ -23,63 +23,111 @@ import java.util.List;
public class WikiImageHelper {
private static final String WIKIDATA_API_ENDPOINT = "https://www.wikidata.org/w/api.php";
private static final String ACTION = "?action=wbgetclaims&property=P18&entity=";
private static final String WIKIMEDIA_API_ENDPOINT = "https://commons.wikimedia.org/w/api.php";
private static final String WIKIDATA_ACTION = "?action=wbgetclaims&property=P18&entity=";
private static final String WIKIMEDIA_ACTION = "?action=query&list=categorymembers&cmtitle=";
private static final String CM_LIMIT = "&cmlimit=500";
private static final String FORMAT_JSON = "&format=json";
private static final String IMAGE_BASE_URL = "https://upload.wikimedia.org/wikipedia/commons/";
private static final String WIKIDATA_PREFIX = "Q";
private static final String WIKIMEDIA_FILE = "File:";
private static final String WIKIMEDIA_CATEGORY = "Category:";
private static final int THUMB_SIZE = 500;
private static final Log LOG = PlatformUtil.getLog(WikiImageHelper.class);
public static void fillWikiMediaCards(@NonNull MapActivity mapActivity, @NonNull String wikidata,
List<ImageCard> images) {
if (wikidata.startsWith(WIKIDATA_PREFIX)) {
StringBuilder rawResponse = new StringBuilder();
String url = WIKIDATA_API_ENDPOINT + ACTION + wikidata + FORMAT_JSON;
String error = NetworkUtils.sendGetRequest(url, null, rawResponse);
if (error == null) {
try {
Gson gson = new Gson();
WikipediaResponse response = gson.fromJson(rawResponse.toString(), WikipediaResponse.class);
for (WikiImage img : getImageData(response)) {
images.add(new WikiImageCard(mapActivity, img));
public static void addWikidataImageCards(@NonNull MapActivity mapActivity, @NonNull String wikidataId,
@NonNull List<ImageCard> imageCards) {
if (wikidataId.startsWith(WIKIDATA_PREFIX)) {
String url = WIKIDATA_API_ENDPOINT + WIKIDATA_ACTION + wikidataId + FORMAT_JSON;
WikidataResponse response = sendWikipediaApiRequest(url, WikidataResponse.class);
if (response != null) {
for (P18 p18 : response.claims.p18) {
String imageFileName = p18.mainsnak.datavalue.value;
if (imageFileName != null) {
addImageCard(mapActivity, imageCards, imageFileName);
}
return;
} catch (JsonSyntaxException e) {
error = e.getLocalizedMessage();
}
}
LOG.error(error);
} else {
LOG.error("Wrong WikiMedia ID");
LOG.error("Wrong Wikidata ID");
}
}
private static List<WikiImage> getImageData(WikipediaResponse response) {
List<WikiImage> images = new ArrayList<>();
for (P18 p18 : response.claims.p18) {
String imageFileName = p18.mainsnak.datavalue.value;
if (imageFileName != null) {
try {
String imageName = URLDecoder.decode(imageFileName, "UTF-8");
imageFileName = imageName.replace(" ", "_");
imageName = imageName.substring(0, imageName.lastIndexOf("."));
String[] urlHashParts = getHash(imageFileName);
String imageHiResUrl = IMAGE_BASE_URL +
urlHashParts[0] + "/" + urlHashParts[1] + "/" +
imageFileName;
String imageStubUrl = IMAGE_BASE_URL + "thumb/" +
urlHashParts[0] + "/" + urlHashParts[1] + "/" +
imageFileName + "/" + THUMB_SIZE + "px-" +
imageFileName;
images.add(new WikiImage(imageName, imageStubUrl, imageHiResUrl));
} catch (UnsupportedEncodingException e) {
LOG.error(e.getLocalizedMessage());
public static void addWikimediaImageCards(@NonNull MapActivity mapActivity, @NonNull String wikiMediaTagContent,
@NonNull List<ImageCard> imageCards) {
if (wikiMediaTagContent.startsWith(WIKIMEDIA_FILE)) {
String fileName = wikiMediaTagContent.substring(WIKIMEDIA_FILE.length());
addImageCard(mapActivity, imageCards, fileName);
} else if (wikiMediaTagContent.startsWith(WIKIMEDIA_CATEGORY)) {
String url = WIKIMEDIA_API_ENDPOINT + WIKIMEDIA_ACTION + wikiMediaTagContent + CM_LIMIT + FORMAT_JSON;
WikimediaResponse response = sendWikipediaApiRequest(url, WikimediaResponse.class);
if (response != null) {
List<String> subCategories = new ArrayList<>();
for (Categorymember cm : response.query.categorymembers) {
String memberTitle = cm.title;
if (memberTitle != null) {
if (memberTitle.startsWith(WIKIMEDIA_CATEGORY)) {
subCategories.add(memberTitle);
} else {
addWikimediaImageCards(mapActivity, memberTitle, imageCards);
}
}
}
for (String subCategory : subCategories) {
addWikimediaImageCards(mapActivity, subCategory, imageCards);
}
}
} else {
LOG.error("Wrong Wikimedia category member");
}
return images;
}
private static <T> T sendWikipediaApiRequest(@NonNull String url, @NonNull Class<T> responseClass) {
StringBuilder rawResponse = new StringBuilder();
String errorMessage = NetworkUtils.sendGetRequest(url, null, rawResponse);
if (errorMessage == null) {
try {
return new Gson().fromJson(rawResponse.toString(), responseClass);
} catch (JsonSyntaxException e) {
errorMessage = e.getLocalizedMessage();
}
}
LOG.error(errorMessage);
return null;
}
private static void addImageCard(@NonNull MapActivity mapActivity, @NonNull List<ImageCard> images,
@NonNull String fileName) {
WikiImage img = getImageData(fileName);
if (img != null) {
images.add(new WikiImageCard(mapActivity, img));
}
}
private static WikiImage getImageData(@NonNull String imageFileName) {
try {
String imageName = URLDecoder.decode(imageFileName, "UTF-8");
imageFileName = imageName.replace(" ", "_");
imageName = imageName.substring(0, imageName.lastIndexOf("."));
String[] urlHashParts = getHash(imageFileName);
String imageHiResUrl = IMAGE_BASE_URL +
urlHashParts[0] + "/" + urlHashParts[1] + "/" +
imageFileName;
String imageStubUrl = IMAGE_BASE_URL + "thumb/" +
urlHashParts[0] + "/" + urlHashParts[1] + "/" +
imageFileName + "/" + THUMB_SIZE + "px-" +
imageFileName;
return new WikiImage(imageName, imageStubUrl, imageHiResUrl);
} catch (UnsupportedEncodingException e) {
LOG.error(e.getLocalizedMessage());
}
return null;
}
@NonNull
@ -88,19 +136,23 @@ public class WikiImageHelper {
return new String[]{md5.substring(0, 1), md5.substring(0, 2)};
}
// Wikidata response classes
private static class WikidataResponse {
@SerializedName("claims")
@Expose
private Claims claims;
}
private static class Claims {
@SerializedName("P18")
@Expose
private List<P18> p18 = null;
}
private static class Datavalue {
@SerializedName("value")
private static class P18 {
@SerializedName("mainsnak")
@Expose
private String value;
@SerializedName("type")
@Expose
private String type;
private Mainsnak mainsnak;
}
private static class Mainsnak {
@ -112,15 +164,31 @@ public class WikiImageHelper {
private String datatype;
}
private static class P18 {
@SerializedName("mainsnak")
private static class Datavalue {
@SerializedName("value")
@Expose
private Mainsnak mainsnak;
private String value;
@SerializedName("type")
@Expose
private String type;
}
private static class WikipediaResponse {
@SerializedName("claims")
// Wikimedia response classes
private static class WikimediaResponse {
@SerializedName("query")
@Expose
private Claims claims;
private Query query;
}
private static class Query {
@SerializedName("categorymembers")
@Expose
private List<Categorymember> categorymembers;
}
private static class Categorymember {
@SerializedName("title")
@Expose
private String title;
}
}