Merge pull request #10807 from osmandapp/master

update test branch
This commit is contained in:
Hardy 2021-02-09 00:12:48 +01:00 committed by GitHub
commit 7b6e1c0de4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
47 changed files with 937 additions and 498 deletions

View file

@ -1,4 +1,4 @@
contact_links:
- name: Outdated FAQ
- url: https://groups.google.com/forum/#!forum/osmand
- about: Fix wrong or outdated FAQ on the forum instead
url: https://groups.google.com/forum/#!forum/osmand
about: Fix wrong or outdated FAQ on the forum instead

View file

@ -8,6 +8,7 @@ import gnu.trove.set.hash.TIntHashSet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
@ -627,7 +628,9 @@ public class BinaryMapAddressReaderAdapter {
indexOffset = codedIS.getTotalBytesRead();
int oldLimit = codedIS.pushLimit(length);
// here offsets are sorted by distance
map.readIndexedStringTable(stringMatcher.getCollator(), req.nameQuery, "", loffsets, 0);
TIntArrayList charsList = new TIntArrayList();
charsList.add(0);
map.readIndexedStringTable(stringMatcher.getCollator(), Collections.singletonList(req.nameQuery), "", Collections.singletonList(loffsets), charsList);
codedIS.popLimit(oldLimit);
break;
case OsmAndAddressNameIndexData.ATOM_FIELD_NUMBER:

View file

@ -2161,9 +2161,9 @@ public class BinaryMapIndexReader {
private static boolean testAddressSearch = false;
private static boolean testAddressSearchName = false;
private static boolean testAddressJustifySearch = false;
private static boolean testPoiSearch = false;
private static boolean testPoiSearch = true;
private static boolean testPoiSearchOnPath = false;
private static boolean testTransportSearch = true;
private static boolean testTransportSearch = false;
private static int sleft = MapUtils.get31TileNumberX(27.55079);
private static int sright = MapUtils.get31TileNumberX(27.55317);
@ -2177,7 +2177,7 @@ public class BinaryMapIndexReader {
public static void main(String[] args) throws IOException {
File fl = new File(System.getProperty("maps") + "/Synthetic_test_rendering.obf");
fl = new File("/home/madwasp79/OsmAnd-maps/Poly_center2.obf");
fl = new File(System.getProperty("maps") +"/Wikivoyage.obf__");
RandomAccessFile raf = new RandomAccessFile(fl, "r");
@ -2325,7 +2325,7 @@ public class BinaryMapIndexReader {
private static void testPoiSearchByName(BinaryMapIndexReader reader) throws IOException {
println("Searching by name...");
SearchRequest<Amenity> req = buildSearchPoiRequest(0, 0, "Art",
SearchRequest<Amenity> req = buildSearchPoiRequest(0, 0, "central ukraine",
0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE, null);
reader.searchPoiByName(req);
@ -2385,54 +2385,72 @@ public class BinaryMapIndexReader {
}
int readIndexedStringTable(Collator instance, String query, String prefix, TIntArrayList list, int charMatches) throws IOException {
void readIndexedStringTable(Collator instance, List<String> queries, String prefix, List<TIntArrayList> listOffsets, TIntArrayList matchedCharacters) throws IOException {
String key = null;
boolean[] matched = new boolean[matchedCharacters.size()];
boolean shouldWeReadSubtable = false;
while (true) {
int t = codedIS.readTag();
int tag = WireFormat.getTagFieldNumber(t);
switch (tag) {
case 0:
return charMatches;
return;
case OsmandOdb.IndexedStringTable.KEY_FIELD_NUMBER :
key = codedIS.readString();
if(prefix.length() > 0){
if (prefix.length() > 0) {
key = prefix + key;
}
// check query is part of key (the best matching)
if(CollatorStringMatcher.cmatches(instance, key, query, StringMatcherMode.CHECK_ONLY_STARTS_WITH)){
if(query.length() >= charMatches){
if(query.length() > charMatches){
charMatches = query.length();
list.clear();
}
} else {
key = null;
shouldWeReadSubtable = false;
for (int i = 0; i < queries.size(); i++) {
int charMatches = matchedCharacters.get(i);
String query = queries.get(i);
matched[i] = false;
if (query == null) {
continue;
}
// check key is part of query
} else if (CollatorStringMatcher.cmatches(instance, query, key, StringMatcherMode.CHECK_ONLY_STARTS_WITH)) {
if (key.length() >= charMatches) {
if (key.length() > charMatches) {
charMatches = key.length();
list.clear();
// check query is part of key (the best matching)
if (CollatorStringMatcher.cmatches(instance, key, query, StringMatcherMode.CHECK_ONLY_STARTS_WITH)) {
if (query.length() >= charMatches) {
if (query.length() > charMatches) {
matchedCharacters.set(i, query.length());
listOffsets.get(i).clear();
}
matched[i] = true;
}
// check key is part of query
} else if (CollatorStringMatcher.cmatches(instance, query, key, StringMatcherMode.CHECK_ONLY_STARTS_WITH)) {
if (key.length() >= charMatches) {
if (key.length() > charMatches) {
matchedCharacters.set(i, key.length());
listOffsets.get(i).clear();
}
matched[i] = true;
}
} else {
key = null;
}
} else {
key = null;
shouldWeReadSubtable |= matched[i];
}
break;
case OsmandOdb.IndexedStringTable.VAL_FIELD_NUMBER :
int val = readInt();
if (key != null) {
list.add(val);
for (int i = 0; i < queries.size(); i++) {
if (matched[i]) {
listOffsets.get(i).add(val);
}
}
break;
case OsmandOdb.IndexedStringTable.SUBTABLES_FIELD_NUMBER :
int len = codedIS.readRawVarint32();
int oldLim = codedIS.pushLimit(len);
if (key != null) {
charMatches = readIndexedStringTable(instance, query, key, list, charMatches);
if (shouldWeReadSubtable && key != null) {
List<String> subqueries = new ArrayList<>(queries);
// reset query so we don't search what was not matched
for(int i = 0; i < queries.size(); i++) {
if(!matched[i]) {
subqueries.set(i, null);
}
}
readIndexedStringTable(instance, subqueries, key, listOffsets, matchedCharacters);
} else {
codedIS.skipRawBytes(codedIS.getBytesUntilLimit());
}

View file

@ -1,10 +1,6 @@
package net.osmand.binary;
import gnu.trove.list.array.TIntArrayList;
import gnu.trove.map.hash.TIntLongHashMap;
import gnu.trove.set.hash.TLongHashSet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
@ -12,6 +8,14 @@ import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.logging.Log;
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.WireFormat;
import gnu.trove.list.array.TIntArrayList;
import gnu.trove.map.hash.TIntLongHashMap;
import gnu.trove.set.hash.TLongHashSet;
import net.osmand.Collator;
import net.osmand.CollatorStringMatcher;
import net.osmand.CollatorStringMatcher.StringMatcherMode;
@ -26,11 +30,6 @@ import net.osmand.osm.MapPoiTypes;
import net.osmand.osm.PoiCategory;
import net.osmand.util.MapUtils;
import org.apache.commons.logging.Log;
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.WireFormat;
public class BinaryMapPoiReaderAdapter {
private static final Log LOG = PlatformUtil.getLog(BinaryMapPoiReaderAdapter.class);
@ -38,7 +37,7 @@ public class BinaryMapPoiReaderAdapter {
private static final int CATEGORY_MASK = (1 << SHIFT_BITS_CATEGORY) - 1;
private static final int ZOOM_TO_SKIP_FILTER_READ = 6;
private static final int ZOOM_TO_SKIP_FILTER = 3;
private static final int BUCKET_SEARCH_BY_NAME = 5;
private static final int BUCKET_SEARCH_BY_NAME = 15; // should be bigger 100?
public static class PoiSubType {
public boolean text;
@ -332,7 +331,7 @@ public class BinaryMapPoiReaderAdapter {
});
int p = BUCKET_SEARCH_BY_NAME * 3;
if (p < offKeys.length) {
for (int i = p + BUCKET_SEARCH_BY_NAME; ; i += BUCKET_SEARCH_BY_NAME) {
for (int i = p + BUCKET_SEARCH_BY_NAME;; i += BUCKET_SEARCH_BY_NAME) {
if (i > offKeys.length) {
Arrays.sort(offKeys, p, offKeys.length);
break;
@ -344,7 +343,6 @@ public class BinaryMapPoiReaderAdapter {
}
}
LOG.info("Searched poi structure in " + (System.currentTimeMillis() - time) +
"ms. Found " + offKeys.length + " subtrees");
for (int j = 0; j < offKeys.length; j++) {
@ -370,7 +368,8 @@ public class BinaryMapPoiReaderAdapter {
private TIntLongHashMap readPoiNameIndex(Collator instance, String query, SearchRequest<Amenity> req) throws IOException {
TIntLongHashMap offsets = new TIntLongHashMap();
TIntArrayList dataOffsets = null;
List<TIntArrayList> listOffsets = null;
List<TIntLongHashMap> listOfSepOffsets = new ArrayList<TIntLongHashMap>();
int offset = 0;
while (true) {
int t = codedIS.readTag();
@ -381,24 +380,51 @@ public class BinaryMapPoiReaderAdapter {
case OsmandOdb.OsmAndPoiNameIndex.TABLE_FIELD_NUMBER: {
int length = readInt();
int oldLimit = codedIS.pushLimit(length);
dataOffsets = new TIntArrayList();
offset = codedIS.getTotalBytesRead();
map.readIndexedStringTable(instance, query, "", dataOffsets, 0);
List<String> queries = new ArrayList<>();
for (String word : query.split(" ")) {
if (word.trim().length() > 0) {
queries.add(word.trim());
}
}
TIntArrayList charsList = new TIntArrayList(queries.size());
listOffsets = new ArrayList<TIntArrayList>(queries.size());
while(listOffsets.size() < queries.size()) {
charsList.add(0);
listOffsets.add(new TIntArrayList());
}
map.readIndexedStringTable(instance, queries, "", listOffsets, charsList);
codedIS.popLimit(oldLimit);
break;
}
case OsmandOdb.OsmAndPoiNameIndex.DATA_FIELD_NUMBER: {
if (dataOffsets != null) {
dataOffsets.sort(); // 1104125
for (int i = 0; i < dataOffsets.size(); i++) {
codedIS.seek(dataOffsets.get(i) + offset);
int len = codedIS.readRawVarint32();
int oldLim = codedIS.pushLimit(len);
readPoiNameIndexData(offsets, req);
codedIS.popLimit(oldLim);
if (req.isCancelled()) {
codedIS.skipRawBytes(codedIS.getBytesUntilLimit());
return offsets;
if (listOffsets != null) {
for (TIntArrayList dataOffsets : listOffsets) {
TIntLongHashMap offsetMap = new TIntLongHashMap();
listOfSepOffsets.add(offsetMap);
dataOffsets.sort(); // 1104125
for (int i = 0; i < dataOffsets.size(); i++) {
codedIS.seek(dataOffsets.get(i) + offset);
int len = codedIS.readRawVarint32();
int oldLim = codedIS.pushLimit(len);
readPoiNameIndexData(offsetMap, req);
codedIS.popLimit(oldLim);
if (req.isCancelled()) {
codedIS.skipRawBytes(codedIS.getBytesUntilLimit());
return offsets;
}
}
}
}
if (listOfSepOffsets.size() > 0) {
offsets.putAll(listOfSepOffsets.get(0));
for (int j = 1; j < listOfSepOffsets.size(); j++) {
TIntLongHashMap mp = listOfSepOffsets.get(j);
// offsets.retainAll(mp); -- calculate intresection of mp & offsets
for (int chKey : offsets.keys()) {
if (!mp.containsKey(chKey)) {
offsets.remove(chKey);
}
}
}
}

View file

@ -0,0 +1,20 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M3,19V16H5V19H19V16H21V19C21,20.1046 20.1046,21 19,21H5C3.8954,21 3,20.1046 3,19Z"
android:fillColor="#ffffff"
android:fillType="evenOdd"/>
<path
android:pathData="M8,12.5858V4H10V12.5858L12.2929,10.2929L13.7071,11.7071L9,16.4142L4.2929,11.7071L5.7071,10.2929L8,12.5858Z"
android:fillColor="#ffffff"
android:fillType="evenOdd"/>
<path
android:pathData="M14,12.5858V4H16V12.5858L18.2929,10.2929L19.7071,11.7071L15,16.4142L11.2929,12.7071L12.7071,11.2929L14,12.5858Z"
android:strokeAlpha="0.5"
android:fillColor="#ffffff"
android:fillType="evenOdd"
android:fillAlpha="0.5"/>
</vector>

View file

@ -329,7 +329,7 @@
<string name="local_osm_changes_backup">نسخ الاحتياطي كتعديل OSM</string>
<string name="files_limit">%1$d ملف بقى</string>
<string name="osmand_background_plugin_description">يظهر الإعدادات لتمكين التتبع والملاحة في وضعية السكون ( الشاشة مغلقة ) عبر إيقاظ دوري لجهاز GPS.</string>
<string name="precise_routing_mode_descr">تمكين لحساب المسارات بدقة دون أخطاء. لا يزال محدود المسافة وبطيء.</string>
<string name="precise_routing_mode_descr">حساب الطرق بدقة دون أخطاء. لا يزال محدود المسافة وبطيء.</string>
<string name="recording_photo_description">صورة %1$s %2$s</string>
<string name="dropbox_plugin_description">مزامنة المسارات والملاحظات الصوتية / الفيديو مع حساب Dropbox الخاص بك.</string>
<string name="av_video_format_descr">تنسيق الفيديو الناتج:</string>
@ -471,7 +471,7 @@
<string name="index_name_africa">إفريقيا</string>
<string name="index_name_asia">آسيا</string>
<string name="index_name_oceania">أستراليا و أوقيانوسيا</string>
<string name="routing_settings">التوجيه مع الطرق</string>
<string name="routing_settings">التوجيه</string>
<string name="routing_settings_descr">ضبط خاص لكل وضع من أوضاع الملاحة.</string>
<string name="index_settings">إدارة بيانات الخرائط</string>
<string name="general_settings">إعدادات عامة</string>
@ -977,7 +977,7 @@
<string name="map_source">مصدر الخريطة</string>
<string name="layer_amenity_label">عرض أسماء المفضلة</string>
<string name="map_locale">لغة الخريطة</string>
<string name="rendering_category_details">تفاصيل إضافية</string>
<string name="rendering_category_details">التفاصيل</string>
<string name="map_widget_plain_time">الوقت الحالي</string>
<string name="rotate_map_to_bearing">اتجاه الخريطة</string>
<string name="rotate_map_bearing_opt">اتجاه الحركة في الأعلى</string>
@ -992,7 +992,7 @@
<string name="record_plugin_name">تسجيل المسار</string>
<string name="save_track_interval_descr">اختر الفاصل الزمني لتسجيل المسار أثناء الملاحة</string>
<string name="voice">صوت مسج</string>
<string name="get_directions">التوجيه مع الطرق</string>
<string name="get_directions">الاتجاهات</string>
<string name="show_point_options">استخدام الموقع…</string>
<string name="favorite">مفضلة</string>
<string name="speak_favorites">نقاط مفضلة مجاورة</string>
@ -1071,7 +1071,7 @@
<string name="impassable_road">تجنب الطرق…</string>
<string name="rendering_attr_trainLightrailRoutes_name">طرق السكك الحديدية</string>
<string name="rendering_attr_tramRoutes_name">خطوط الترام</string>
<string name="rendering_category_routes">المسارات الرياضية</string>
<string name="rendering_category_routes">الطرق</string>
<string name="rendering_category_transport">وسائل المواصلات</string>
<string name="rendering_category_others">سمات أخرى للخريطة</string>
<string name="map_widget_appearance_rem">العناصر الأخرى</string>
@ -1170,7 +1170,7 @@
<string name="rendering_attr_trolleybusRoutes_name">طرق الحافلات الكهربائية</string>
<string name="rendering_attr_busRoutes_name">طرق الحافلات</string>
<string name="rendering_attr_subwayMode_name">سكك قطار الأنفاق</string>
<string name="rendering_attr_shareTaxiRoutes_name">شارك طرق التاكسي</string>
<string name="rendering_attr_shareTaxiRoutes_name">تاكسي مشاركة الطرق</string>
<string name="speed_limit_exceed_message">حدد حد السرعة المسموح به لتلقي تنبيه صوتي إذا ما تجاوزته.</string>
<string name="traffic_warning_border_control">مراقبة الحدود</string>
<string name="traffic_warning_payment">كشك الرسوم</string>
@ -1184,7 +1184,7 @@
<string name="rendering_attr_hideAccess_name">قيود الدخول</string>
<string name="rendering_attr_showAccess_name">عرض قيود الدخول</string>
<string name="rendering_attr_showSurfaces_name">عرض سطح الطريق</string>
<string name="rendering_attr_showCycleRoutes_name">إظهار مسارات الدراجات</string>
<string name="rendering_attr_showCycleRoutes_name">إظهار طرق الدراجات</string>
<string name="delay_navigation_start">بدء التوجيه المفصل تلقائياً</string>
<string name="gpx_info_subtracks">مسارات فرعية: %1$s</string>
<string name="gpx_info_waypoints">نقاط الطريق: %1$s</string>
@ -1390,7 +1390,7 @@
<string name="app_mode_train">قطار</string>
<string name="current_track">المسار الحالي</string>
<string name="map_widget_battery">مستوى البطارية</string>
<string name="change_markers_position">تغيير موقع التوجيه المباشر</string>
<string name="change_markers_position">تغيير موقع العلامة</string>
<string name="follow_us">تابعنا</string>
<string name="access_direction_audio_feedback">اتجاه صدى الصوت</string>
<string name="use_osm_live_routing">الملاحة عبر أوسماند لايف</string>
@ -1411,7 +1411,7 @@
<string name="map_mode">مظهرالخريطة</string>
<string name="rendering_value_thin_name">رقيقة</string>
<string name="rendering_value_medium_name">متوسط</string>
<string name="no_map_markers_found">لم تضف توجيه مباشر على الخريطة</string>
<string name="no_map_markers_found">أضف علامات عبر الخريطة</string>
<string name="no_waypoints_found">لم يتم العثور على نقاط الطريق</string>
<string name="report">التقرير</string>
<string name="storage_permission_restart_is_required">سمح الآن للتطبيق بالكتابة على وحدة التخزين الخارجية. الرجاء إعادة تشغيله يدويا.</string>
@ -1436,7 +1436,7 @@
<string name="upload_anonymously">رفع كمستخدم مجهول</string>
<string name="upload_osm_note">رفع ملاحظة OSM</string>
<string name="shared_string_toolbar">شريط الأدوات</string>
<string name="select_map_markers">حدد توجيه مباشرعلى الخريطة</string>
<string name="select_map_markers">حدد علامات الخريطة</string>
<string name="shared_string_reverse_order">ترتيب عكسي</string>
<string name="show_map_markers_description">تفعيل ميزة العلامات.</string>
<string name="lang_ast">الأسترية</string>
@ -1472,7 +1472,7 @@
<string name="file_name_containes_illegal_char">حرف غير قانوني في اسم الملف</string>
<string name="reports_for">تقرير عن</string>
<string name="world_maps">خرائط العالم</string>
<string name="move_marker_bottom_sheet_title">حرك الخريطة لتغيير مكان التوجيه المباشر</string>
<string name="move_marker_bottom_sheet_title">حرك الخريطة لتغيير مكان العلامة</string>
<!-- string name="lat_lon_pattern">خط العرض: %1$.5f خط الطول: %2$.5f</string -->
<string name="access_direction_audio_feedback_descr">إشارة صوتية عند اتجاه نقطة الوصول.</string>
<string name="access_direction_haptic_feedback_descr">حدد اتجاه النقطة المستهدفة بالاهتزاز.</string>
@ -1590,7 +1590,7 @@
<string name="shared_string_move_down">حرك للاسفل</string>
<string name="open_street_map_login_and_pass">اسم مستخدم و كلمة سر OSM</string>
<string name="osm_live_email_desc">نحن بحاجة اليه لكي نوفر لك معلومات حول المساهمات.</string>
<string name="select_map_marker">حدد توجيه مباشر</string>
<string name="select_map_marker">اختر علامة</string>
<string name="show_transparency_seekbar">عرض شريط الشفافية</string>
<string name="download_files_error_not_enough_space">لا توجد مساحة كافية!
\n {3} MB مطلوب مؤقتا ، {1} ميجا بايت بشكل دائم.
@ -1611,7 +1611,7 @@
\nللعودة إلى واحدة من أنماط الخريطة التقليدية، ببساطة إما عطل هذا الملحق مرة أخرى أو غير \'نمط الخريطة\' في \'ضبط الخريطة\' حسب الرغبة.</string>
<string name="search_near_map">البحث قرب مركز الخريطة الحالية</string>
<string name="active_markers">عدد خطوط التوجيه</string>
<string name="map_markers">التوجيه المباشر</string>
<string name="map_markers">علامات الخريطة</string>
<string name="routing_attr_avoid_borders_name">تخطي الحدود</string>
<string name="impassable_road_desc">حدد الطرق التي تريد تجنبها أثناء التنقل.</string>
<string name="search_categories">الفئات</string>
@ -1629,11 +1629,11 @@
<string name="available_maps">الخرائط الموجودة</string>
<string name="access_shared_string_navigate_up">انتقال للأعلى</string>
<string name="osm_user_stat">التعديلات %1$s ، الرتبة %2$s ، مجموع التعديلات %3$s</string>
<string name="map_marker_1st">التوجيه المباشرالأول للخريطة</string>
<string name="map_marker_2nd">التوجيه المباشرالثاني للخريطة</string>
<string name="shared_string_add_to_map_markers">إضافة إلى التوجيه المباشر</string>
<string name="clear_active_markers_q">حذف كافة التوجيه المباشرالنشط على الخريطة؟</string>
<string name="map_marker">توجيه مباشر على الخريطة</string>
<string name="map_marker_1st">أول علامة</string>
<string name="map_marker_2nd">ثاني علامة</string>
<string name="shared_string_add_to_map_markers">إضافة إلى علامات الخريطة</string>
<string name="clear_active_markers_q">حذف كافة العلامات النشطة على الخريطة؟</string>
<string name="map_marker">علامة خريطة</string>
<string name="show_polygons">عرض المضلعات</string>
<string name="shared_string_status">الحالة</string>
<string name="shared_string_save_changes">حفظ التعديلات</string>
@ -1655,7 +1655,7 @@
<string name="select_voice_provider">اختر التوجيه الصوتي</string>
<string name="select_voice_provider_descr">اختر أو قم بتحميل التوجيه الصوتي الخاص بلغتك.</string>
<string name="no_location_permission">منح الوصول إلى بيانات الموقع.</string>
<string name="rendering_attr_horseRoutes_name">مسارات الخيول</string>
<string name="rendering_attr_horseRoutes_name">طرق الخيول</string>
<string name="shared_string_hide">إخفاء</string>
<string name="av_video_quality_low">جودة أقل</string>
<string name="av_video_quality_high">أعلى جودة</string>
@ -1749,7 +1749,7 @@
<string name="update_poi_error_local">خطأ تحيين القائمة المحلية لPOI.</string>
<string name="context_menu_item_update_poi">تحيين الPOI</string>
<string name="upload_osm_note_description">قم بتحميل مذكرة OSM الخاصة بك دون الكشف عن هويتك أو باستخدام ملف تعريف OpenStreetMap.org .</string>
<string name="add_points_to_map_markers_q">إضافة جميع النقاط إلى التوجيه المباشر؟</string>
<string name="add_points_to_map_markers_q">إضافة جميع النقاط إلى علامات الخريطة؟</string>
<string name="clear_markers_history_q">مسح السجلات ؟</string>
<string name="rendering_attr_showMtbRoutes_name">إظهار مسارات الدراجة الجبلية</string>
<string name="clear_updates_proposition_message">يمكنك إزالة التحديثات المحملة والرجوع إلى الإصدار الأصلي للخريطة</string>
@ -1830,7 +1830,7 @@
<string name="osm_edit_commented_note">ملاحظة OSM معلق عليها</string>
<string name="rendering_attr_pisteGrooming_name">مسار زلق</string>
<string name="world_ski_missing">لإظهار خرائط التزلج، يجب تحميل خريطة خاصة محلية.</string>
<string name="rendering_attr_publicTransportMode_name">حافلة، ترامواي وغيرها</string>
<string name="rendering_attr_publicTransportMode_name">حافلة، عربة وغيرها</string>
<string name="osm_edit_created_note">إنشاء ملاحظة OSM</string>
<string name="osn_add_dialog_error">حدث استثناء: لم يتم إنشاء الملاحظة.</string>
<string name="osn_close_dialog_error">حدث استثناء: لم يتم غلق الملاحظة.</string>
@ -1868,7 +1868,7 @@
<string name="rendering_value_walkingRoutesScopeOSMC_name">تلوين وفق الانتماء للشبكة</string>
<string name="rendering_value_walkingRoutesOSMC_name">تلوين وفق رمز تنزه OSMC</string>
<string name="shared_string_logoff">خروج</string>
<string name="local_recordings_delete_all_confirm">هل أنت متأكد من أنك تريد حذف الملاحظات %1$d؟</string>
<string name="local_recordings_delete_all_confirm">حذف الملاحظات %1$d؟</string>
<string name="nautical_maps_missing">لعرض الخرائط البحرية، يجب تحميل خريطة خاصة محلياً.</string>
<string name="save_track_to_gpx_globally_descr">تسجيل الموقع العام إلى ملف GPX يمكن تشغيله أو إيقافه باستخدام نافذة تسجيل GPX على الشاشة خريطة.</string>
<string name="proxy_host_descr">ضبط اسم مضيف البروكسي (مثال 127.0.0.1).</string>
@ -2089,7 +2089,7 @@
<string name="configure_screen_quick_action">إجراءات سريعة</string>
<string name="quick_action_item_action">إجراء %d</string>
<string name="quick_action_item_screen">شاشة %d</string>
<string name="quick_action_add_marker">إضافة توجيه مباشر للخريطة</string>
<string name="quick_action_add_marker">إضافة علامة خريطة</string>
<string name="quick_action_add_poi">إضافة POI</string>
<string name="quick_action_map_style">نمط الخريطة</string>
<string name="quick_action_map_style_switch">نمط الخرائط تغير ل \"%s\".</string>
@ -2468,7 +2468,7 @@
<string name="add_point_before">إضافة نقطة قبل</string>
<string name="add_point_after">إضافة نقطة بعد</string>
<string name="shared_string_options">خيارات</string>
<string name="measurement_tool_snap_to_road_descr">سيتم توصيل النقاط بمسارات الوضع المحدد.</string>
<string name="measurement_tool_snap_to_road_descr">سيتم توصيل النقاط بطرق الوضع المحدد.</string>
<string name="measurement_tool_save_as_new_track_descr">يمكنك حفظ النقاط إما كنقاط طريق أو كخط.</string>
<string name="choose_navigation_type">اختر وضع الملاحة</string>
<string name="add_route_points">إضافة نقاط مسار</string>
@ -2481,12 +2481,12 @@
<string name="map_orientation_change_in_accordance_with_speed">عتبة توجيه الخريطة</string>
<string name="map_orientation_change_in_accordance_with_speed_descr">حدد أدناه على أي سرعة يتغير توجيه الخريطة من \'اتجاه الحركة\' إلى \'البوصلة\'.</string>
<string name="all_markers_moved_to_history">تم نقل جميع العلامات إلى السجل</string>
<string name="marker_moved_to_history">تم نقل التوجيه المباشر إلى السجل</string>
<string name="marker_moved_to_active">التوجيه المباشر انتقل كنشط</string>
<string name="marker_moved_to_history">تم نقل العلامة إلى السجل</string>
<string name="marker_moved_to_active">العلامة أصبحت نشطة</string>
<string name="shared_string_list">قائمة</string>
<string name="shared_string_groups">مجموعات</string>
<string name="passed">آخر استخدام : %1$s</string>
<string name="make_active">تنشيط التوجيه المباشر</string>
<string name="make_active">تنشيط العلامة</string>
<string name="today">اليوم</string>
<string name="yesterday">أمس</string>
<string name="last_seven_days">آخر ٧ أيام</string>
@ -2502,12 +2502,12 @@
<string name="show_arrows_on_the_map">سهم متجه للهدف</string>
<string name="show_passed">عرض المتجاوز</string>
<string name="hide_passed">إخفاء المتجاوز</string>
<string name="remove_from_map_markers">إزالة من \"التوجيه المباشر\"</string>
<string name="remove_from_map_markers">إزالة من \"علامات الخريطة\"</string>
<string name="descendingly">تنازلي</string>
<string name="ascendingly">تصاعدي</string>
<string name="date_added">تاريخ الإضافة</string>
<string name="order_by">ترتيب حسب:</string>
<string name="marker_show_distance_descr">حدد كيفية الإشارة إلى المسافة والاتجاه للتوجيه المباشر على شاشة الخريطة:</string>
<string name="marker_show_distance_descr">حدد كيفية الإشارة إلى مسافة واتجاه العلامة على شاشة الخريطة:</string>
<string name="use_location">استخدم الموقع</string>
<string name="add_location_as_first_point_descr">أضف موقعك كنقطة أولى لتخطيط طريق مثالي.</string>
<string name="my_location">موقعي</string>
@ -2518,7 +2518,7 @@
<string name="marker_save_as_track_descr">تصدير علاماتك إلى ملف يمكنك تحديده هنا:</string>
<string name="move_to_history">نقل إلى السجل</string>
<string name="group_will_be_removed_after_restart">سيتم إزالة المجموعة بعد إعادة تشغيل التطبيق.</string>
<string name="shared_string_markers">التوجيه المباشر</string>
<string name="shared_string_markers">العلامات</string>
<string name="coordinates_format">نمط الإحداثيات</string>
<string name="use_system_keyboard">لوحة مفاتيح النظام</string>
<string name="fast_coordinates_input_descr">اختر نسق إدخال الأحداثيات. يمكنك دائماً تغييره بالنقر على خيارات.</string>
@ -2535,12 +2535,12 @@
<string name="show_map">أظهر الخريطة</string>
<string name="route_is_calculated">تم حساب المسار</string>
<string name="round_trip">رحلة ذهاب وإياب</string>
<string name="plan_route_no_markers_toast">يجب عليك إضافة توجيه مباشر واحد على الأقل لاستخدام هذه الوظيفة.</string>
<string name="plan_route_no_markers_toast">يجب عليك إضافة علامة واحدة على الأقل لاستخدام هذه الوظيفة.</string>
<string name="wrong_format">تنسيق خاطئ</string>
<string name="enter_new_name">أدخل اسم جديد</string>
<string name="shared_string_back">عودة</string>
<string name="shared_string_view">عرض</string>
<string name="waypoints_added_to_map_markers">تمت إضافة نقاط الطريق إلى التوجيه المباشر للخريطة</string>
<string name="waypoints_added_to_map_markers">تمت إضافة نقاط الطريق إلى علامات الخريطة</string>
<string name="wrong_input">إدخال خاطئ</string>
<string name="import_gpx_file_description">يمكن استيرادها كنقاط مفضلة، أو كملف GPX.</string>
<string name="import_as_gpx">استيراد كملف GPX</string>
@ -2548,15 +2548,15 @@
<string name="import_file">استيراد ملف</string>
<string name="tap_on_map_to_hide_interface_descr">نقرة على الخريطة ستفعل أزرار التحكم والويدجت.</string>
<string name="tap_on_map_to_hide_interface">شاشة كاملة</string>
<string name="mark_passed">توجيه مباشر مجتاز</string>
<string name="mark_passed">علامة مُجتازة</string>
<string name="empty_state_osm_edits">إنشاء أو تعديل عناصر OSM</string>
<string name="empty_state_osm_edits_descr">قم بإنشاء أو تعديل نقاط الاهتمام OSM ، وفتح ملاحظات OSM أو التعليق عليها ، والمساهمة في ملفات GPX المسجلة.</string>
<string name="shared_string_deleted">حذف</string>
<string name="shared_string_edited">مُعدلة</string>
<string name="shared_string_added">تمت الإضافة</string>
<string name="modify_the_search_query">تعديل طلب البحث.</string>
<string name="marker_activated">تم تنشيط التوجيه المباشر %s.</string>
<string name="one_tap_active_descr">انقر على التوجيه المباشر في الخريطة لجعله الاعلى بدون فتح القائمة.</string>
<string name="marker_activated">تم تنشيط العلامة %s.</string>
<string name="one_tap_active_descr">انقر على العلامة في الخريطة لجعلها بالاعلى بدون فتح القائمة.</string>
<string name="empty_state_av_notes">تدوين ملاحظات!</string>
<string name="without_time_limit">بدون حد زمني</string>
<string name="context_menu_read_full_article">اقرأ المقال كاملا</string>
@ -2564,27 +2564,27 @@
<string name="context_menu_points_of_group">جميع نقاط هذه المجموعة</string>
<string name="open_from">افتح من</string>
<string name="open_till">مفتوح حتى</string>
<string name="will_close_at">يغلق أبوابه على</string>
<string name="will_open_at">سيفتح الأبواب على</string>
<string name="will_open_on">يفتح أبوابه على</string>
<string name="will_close_at">يغلق عند</string>
<string name="will_open_at">يفتح عند</string>
<string name="will_open_on">يفتح عند</string>
<string name="additional_actions">إجراءات إضافية</string>
<string name="shared_string_actions">إجراءات</string>
<string name="shared_string_marker">توجيه مباشر</string>
<string name="shared_string_marker">العلامات</string>
<string name="notes_by_date">الملاحظات حسب التاريخ</string>
<string name="by_date">حسب التاريخ</string>
<string name="by_type">حسب النوع</string>
<string name="shared_string_more_without_dots">المزيد</string>
<string name="appearance_on_the_map">التوجيه المباشر</string>
<string name="appearance_on_the_map">المظهر على الخريطة</string>
<string name="shared_string_gpx_waypoints">نقاط المسار</string>
<string name="add_group">إضافة مجموعة</string>
<string name="empty_state_markers_active">قم بإنشاء التوجيه المباشر على الخريطة !</string>
<string name="empty_state_markers_active">قم بإنشاء علامات على الخريطة !</string>
<string name="empty_state_markers_groups">استيراد مجموعات</string>
<string name="digits_quantity">عدد الأرقام</string>
<string name="shared_string_right">اليمين</string>
<string name="shared_string_left">اليسار</string>
<string name="shared_string_paste">لصق</string>
<string name="go_to_next_field">الانتقال إلى الحقل التالي</string>
<string name="rename_marker">إعادة تسمية التوجيه المباشر</string>
<string name="rename_marker">إعادة تسمية العلامة</string>
<string name="total_donations">مجموع التبرعات</string>
<string name="rendering_attr_hidePOILabels_name">تسميات POI</string>
<string name="shared_string_without_name">بدون اسم</string>
@ -2616,7 +2616,7 @@
<string name="south_abbreviation">ج</string>
<string name="north_abbreviation">ش</string>
<string name="optional_point_name">اسم النقطة</string>
<string name="transport_nearby_routes_within">الطرق القريبة التي في الداخل</string>
<string name="transport_nearby_routes_within">الطرق القريبة في الداخل</string>
<string name="enter_the_file_name">أدخل اسم الملف.</string>
<string name="map_import_error">خطأ أثناء استرجاع الخريطة</string>
<string name="map_imported_successfully">تمت عملية استيراد الخريطة</string>
@ -2628,7 +2628,7 @@
<string name="choose_file_type">قم باختيار نسق الملف</string>
<string name="all_data">جميع البيانات</string>
<string name="osm_notes">ملاحظات OSM</string>
<string name="will_open_tomorrow_at">سيفتح أبوابه غداً على</string>
<string name="will_open_tomorrow_at">سيفتح غداً عند</string>
<string name="what_is_here">ماذا هنا:</string>
<string name="lang_lo">اللاوسية</string>
<string name="touring_view_renderer">عرض خريطة السياحة</string>
@ -2692,7 +2692,7 @@
<string name="download_all">تنزيل الكل</string>
<string name="shared_string_restart">إعادة تشغيل التطبيق</string>
<string name="shared_string_bookmark">إشارة مرجعية</string>
<string name="waypoints_removed_from_map_markers">نقاط بالطريق تم إزالتها من التوجيه المباشر للخريطة</string>
<string name="waypoints_removed_from_map_markers">نقاط بالطريق تم إزالتها من علامات الخريطة</string>
<string name="powered_by_osmand">بواسطة أوسماند</string>
<string name="osm_live_plan_pricing">الأسعار والاشتراك</string>
<string name="osm_live_payment_monthly_title">شهري</string>
@ -2707,14 +2707,14 @@
<string name="osm_live_payment_renews_annually">يجدد سنويا</string>
<string name="osm_live_payment_header">حدد فترة الدفع المناسبة لك:</string>
<string name="osm_live_payment_contribute_descr">تبرعات مساعدة صندوق رسم الخرائط OSM.</string>
<string name="markers_remove_dialog_msg">حذف التوجيه المباشر \'%s\'؟</string>
<string name="edit_map_marker">تعديل التوجيه المباشر</string>
<string name="markers_remove_dialog_msg">حذف العلامة \'%s\'؟</string>
<string name="edit_map_marker">تعديل العلامة</string>
<string name="search_street">بحث عن شارع</string>
<string name="start_search_from_city">اختر المدينة أولاً</string>
<string name="shared_string_restore">استعادة</string>
<string name="third_party_application">تطبيق من طرف ثالث</string>
<string name="keep_passed_markers_descr">عند التفعيل سيبقى التوجيه المباشر المضاف من مجموعة إحداثيات أو من نقاط طريق على الخريطة عند اختيار \"تجاوز التوجيه المباشر\". إذا كانت المجموعة غير نشطة ستختفي الوجهات المباشرة من الخريطة.</string>
<string name="keep_passed_markers">إبقاء التوجيه المباشر المتجاوز</string>
<string name="keep_passed_markers_descr">ستبقى العلامات المضافة من مجموعة إحداثيات أو من نقاط طريق على الخريطة عند اختيار \"تجاوز العلامة\". إذا كانت المجموعة غير نشطة ستختفي العلامات من الخريطة.</string>
<string name="keep_passed_markers">إبقاء العلامة المتجاوز</string>
<string name="more_transport_on_stop_hint">هناك المزيد من وسائل النقل في هذا الموقف.</string>
<string name="ask_for_location_permission">يرجى إعطاء إذن تحديد الموقع للتطبيق لكي يواصل.</string>
<string name="thank_you_for_feedback">شكرا على الرد</string>
@ -2842,7 +2842,7 @@
<string name="empty_state_av_notes_desc">إضافة ملاحظة صوتية أو فيديو أو صورة لكل نقطة على الخريطة، باستخدام قائمة السياق أو القطعة.</string>
<string name="looking_for_tracks_with_waypoints">ابحث عن المسارات مع نقاط الطريق</string>
<string name="add_track_to_markers_descr">حدد مسار لإضافة نقاط الطريق إلى العلامات(يتم سرد المسارات فقط مع نقاط الطريق).</string>
<string name="empty_state_markers_active_desc">نقرة طويلة أو قصيرة على الأماكن ثم اضغط على زر التوجيه المباشر.</string>
<string name="empty_state_markers_active_desc">نقرة طويلة أو قصيرة على الأماكن ثم اضغط على زر علامة.</string>
<string name="empty_state_markers_groups_desc">يمكنك استيراد المجموعات المفضلة أو نقاط المسار كتوجيه.</string>
<string name="empty_state_markers_history_desc">ستظهر العلامات التي تم تجاوزها على هذه الشاشة.</string>
<string name="show_guide_line_descr">خط مباشر من موقعك إلى الهدف.</string>
@ -2992,7 +2992,7 @@
<string name="years_5">سنوات</string>
<string name="months_3">ثلاثة أشهر</string>
<string name="price_free">مجاناً</string>
<string name="rendering_attr_showCycleNodeNetworkRoutes_name">إظهار شبكة مسارات الدارجات الهوائية</string>
<string name="rendering_attr_showCycleNodeNetworkRoutes_name">إظهار شبكة طرق الدارجات الهوائية</string>
<string name="download_map_dialog">نافذة تحميل الخريطة</string>
<string name="dialogs_and_notifications_title">النوافذ والإشعارات</string>
<string name="dialogs_and_notifications_descr">التحكم في النوافذ المنبثقة ، ومربعات الحوار والإشعارات.</string>
@ -3017,7 +3017,7 @@
<string name="paste_Osmand_data_folder_path">لصق مسار مجلد بيانات أوسماند</string>
<string name="change_osmand_data_folder_question">تغيير مجلد التخزين ؟</string>
<string name="move_maps_to_new_destination">نقل للموقع الجديد</string>
<string name="avoid_in_routing_descr_">تجنب بعض الطرق</string>
<string name="avoid_in_routing_descr_">تجنب بعض أنواع الطرق</string>
<string name="app_mode_utv">جنبًا إلى جنب</string>
<string name="rendering_attr_piste_difficulty_aerialway_name">طريق تلفريك</string>
<string name="rendering_attr_piste_difficulty_connection_name">اتصال</string>
@ -3042,7 +3042,7 @@
<string name="routing_attr_prefer_unpaved_name">تفضيل الطرق الغير معبدة</string>
<string name="routing_attr_prefer_unpaved_description">تفضيل الطرق الغير معبدة.</string>
<string name="update_all_maps">تحديث كل الخرائط</string>
<string name="update_all_maps_q">هل أنت متأكد من رغبتك بتحديث (%1$d) خريطة؟</string>
<string name="update_all_maps_q">تحديث (%1$d) خريطة؟</string>
<string name="release_3_5">• تحديث التطبيق وإعدادات الأوضاع: يتم ترتيب الإعدادات الآن حسب النوع. يمكن تخصيص كل وضع بشكل منفصل.
\n
\n • نافذة جديدة لتنزيل الخريطة المقترحة أثناء تصفح الخرائط
@ -3328,14 +3328,14 @@
<string name="routing_attr_piste_type_skitour_description">طرق لجولات التزلج.</string>
<string name="routing_attr_piste_type_sled_name">تزلج</string>
<string name="routing_attr_piste_type_sled_description">منحدرات لاستخدام الزلاجات.</string>
<string name="routing_attr_allow_intermediate_name">السماح بالمسارات المتوسطة</string>
<string name="routing_attr_allow_intermediate_description">طرق أكثر صعوبة مع أقسام أكثر حدة. بعض العقبات التي ينبغي تجنبها.</string>
<string name="routing_attr_allow_intermediate_name">السماح بالطرق المتوسطة</string>
<string name="routing_attr_allow_intermediate_description">طرق أكثر صعوبة مع أقسام أكثر حدة. بعض العقبات ينبغي تجنبها.</string>
<string name="routing_attr_allow_advanced_name">السماح للطرق المتقدمة</string>
<string name="routing_attr_allow_advanced_description">طرق صعبة ، مع عقبات خطيرة وأقسام شديدة الانحدار.</string>
<string name="routing_attr_allow_expert_name">السماح بطرق المتخصصين</string>
<string name="routing_attr_allow_expert_description">طرق صعبة للغاية ، مع عقبات خطيرة والمناطق المحيطة بها.</string>
<string name="routing_attr_allow_skating_only_name">السماح بالتزلج على الطرق فقط</string>
<string name="routing_attr_allow_skating_only_description">الطريق مصممة خصيصا بحرية أو التزلج على الجليد.</string>
<string name="routing_attr_allow_skating_only_description">طرق مصممة للأسلوب الحر أو التزلج فقط بدون المسارات الكلاسيكية.</string>
<string name="routing_attr_allow_classic_only_name">السماح للطرق الكلاسيكية فقط</string>
<string name="routing_attr_allow_classic_only_description">تم إعداد الطرق للأسلوب الكلاسيكي فقط دون مسارات التزلج. يشمل ذلك الطرق التي يتم إعدادها بواسطة عربة ثلجية أصغر مع زحلقة مرنة ومسارات مصنوعة يدوياً بواسطة المتزلجين.</string>
<string name="routing_attr_difficulty_preference_name">الصعوبة المفضلة</string>
@ -3355,8 +3355,8 @@
<string name="sett_generic_ext_input">لوحة المفاتيح</string>
<string name="sett_wunderlinq_ext_input">وندرلينك</string>
<string name="sett_parrot_ext_input">ببغاء</string>
<string name="new_route_calculated_dist_dbg">المسار: المسافة%2$s، وقت التوجيه %1$s.
\nالحساب: %3$.1f ث، %4$d طريق، %5$d تجانب)</string>
<string name="new_route_calculated_dist_dbg">"المسار: المسافة%1$s، الوقت %2$s.
\nالحساب: %3$.1f ث، %4$d طريق، %5$d تجانب"</string>
<string name="lang_oc">الأوكيتانية</string>
<string name="get_discount_second_part">ثم %1$s</string>
<string name="apply_to_current_profile">تطبيق فقط على \"%1$s\"</string>
@ -3378,7 +3378,7 @@
<string name="select_color">اختر اللون</string>
<string name="edit_profiles_descr">لا يمكنك حذف أوضاع أوسماند الافتراضية ، ولكن يمكنك تعطيلها في الشاشة السابقة ، أو نقلها إلى الأسفل.</string>
<string name="edit_profiles">تحرير الأوضاع</string>
<string name="select_nav_profile_dialog_message">يؤثر نوع التنقل على قواعد حسابات المسار.</string>
<string name="select_nav_profile_dialog_message">يؤثر نوع التنقل على قواعد حساب الطرق.</string>
<string name="profile_appearance">مظهر الوضع</string>
<string name="choose_icon_color_name">اختر الايقونة واللون والاسم</string>
<string name="reorder_profiles">تحرير قائمة الأوضاع</string>
@ -3534,7 +3534,7 @@
<string name="restore_all_profile_settings">استعادة جميع إعدادات الوضع؟</string>
<string name="saving_new_profile">حفظ الوضع الجديد</string>
<string name="profile_backup_failed">لا يمكن عمل نسخة احتياطية لهذا الوضع.</string>
<string name="clear_recorded_data_warning">هل أنت متأكد من أنك تريد مسح البيانات المسجلة؟</string>
<string name="clear_recorded_data_warning">مسح البيانات المسجلة؟</string>
<string name="importing_from">استيراد البيانات من %1$s</string>
<string name="shared_string_importing">استيراد</string>
<string name="checking_for_duplicate_description">OsmAnd تحقق %1$s للتكرارات مع العناصر الموجودة في التطبيق.
@ -3730,7 +3730,7 @@
<string name="default_screen_timeout">مهلة الشاشة الافتراضية</string>
<string name="export_import_quick_actions_with_profiles_promo">يمكنك تصدير أو استيراد إجراءات سريعة باستخدام أوضاع التطبيق .</string>
<string name="shared_string_delete_all_q">حذف الكل؟</string>
<string name="delete_all_actions_message_q">هل أنت متأكد من رغبتك في حذف الاختصارات السريعة %d نهائيًا؟</string>
<string name="delete_all_actions_message_q">حذف الاختصارات السريعة %d نهائيًا؟</string>
<string name="screen_timeout">مهلة الشاشة</string>
<string name="shared_string_tones">نغمات</string>
<string name="width_limit_description">أدل بعرض مركبتك، قد يتم تطبيق بعض القيود على المركبات العريضة.</string>
@ -3787,7 +3787,7 @@
<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="plan_a_route">تخطيط طريق</string>
<string name="add_to_a_track">إضافة إلى مسار</string>
<string name="add_hidden_group_info">لن تكون النقطة المضافة مرئية على الخريطة، نظرًا لأن المجموعة المحددة مخفية، يمكنك العثور عليها في \"%s\".</string>
<string name="track_show_start_finish_icons">إظهار رموز البدء والانتهاء</string>
@ -3816,7 +3816,7 @@
<string name="route_between_points_warning_desc">بعد ذلك ، ألقط مسارك بأقرب طريق مسموح به باستخدام أحد أوضاع التنقل الخاصة بك لاستخدام هذا الخيار.</string>
<string name="threshold_distance">بداية المسافة</string>
<string name="street_level_imagery">صور للشارع</string>
<string name="plan_route_exit_dialog_descr">هل أنت متأكد أنك تريد إغلاق مسار الرحلة دون حفظ؟ سوف تفقد كل التغييرات؟</string>
<string name="plan_route_exit_dialog_descr">إغلاق مسار الرحلة دون حفظ؟ ستفقد كل التغييرات؟</string>
<string name="in_case_of_reverse_direction">في حالة الاتجاه المعاكس</string>
<string name="save_track_to_gpx">تسجيل المسار أثناء الملاحة</string>
<string name="shared_string_save_as_gpx">حفظ كملف مسار جديد</string>
@ -3997,8 +3997,8 @@
\n • دعم ألوان مخصصة للمفضلة ونقاط لمسار الطريق
\n
\n</string>
<string name="profile_type_osmand_string">وضع الاستعراض</string>
<string name="profile_type_user_string">ملف تعريف المستخدم</string>
<string name="profile_type_osmand_string">وضع أساسي</string>
<string name="profile_type_user_string">وضع المستخدم</string>
<string name="reverse_all_points">عكس جميع النقاط</string>
<string name="profile_by_default_description">حدد الوضع الذي سيتم استخدامه في بدء التطبيق.</string>
<string name="shared_string_last_used">آخر استخدام</string>
@ -4074,4 +4074,13 @@
<string name="uploading_count">رفع %1$d من %2$d</string>
<string name="uploaded_count">تم رفع %1$d من %2$d</string>
<string name="toast_select_edits_for_upload">تحديد التعديلات للتحميل</string>
<string name="hillshade_slope_contour_lines">التضاريس / الانحدار / الخطوط المحيطية</string>
<string name="open_place_reviews_plugin_description">OpenPlaceReviews هو مشروع يحركه المجتمع حول الأماكن العامة مثل المطاعم والفنادق والمتاحف ونقاط الطريق. يقوم بجمع جميع المعلومات العامة المتعلقة بهم مثل الصور والتعليقات والروابط إلى ارتباط الأنظمة الأخرى OpenStreetMap و Wikipedia.
\n
\nجميع بيانات OpenPlaceReview مفتوحة ومتاحة للجميع: http://openplacereviews.org/data.
\n
\nيمكنك قراءة المزيد على: http://openplacereviews.org</string>
<string name="open_place_reviews">مراجعات الأمكنة</string>
<string name="opr_use_dev_url">استخدام test.openplacereviews.org</string>
<string name="login_open_place_reviews">الدخول إلى OpenPlaceReviews</string>
</resources>

View file

@ -3601,7 +3601,7 @@
<string name="poi_vehicle_military">Přístup vozidel: vojenské</string>
<string name="poi_vehicle_delivery">Přístup vozidel: zásobování</string>
<string name="poi_vehicle_forestry">Přístup vozidel: lesnictví</string>
<string name="poi_motorcar_yes">Přístup aut:</string>
<string name="poi_motorcar_yes">Přístup aut: ano</string>
<string name="poi_motorcar_private">Přístup aut: soukromý</string>
<string name="poi_motorcar_no">Přístup aut: ne</string>
<string name="poi_motorcar_destination">Přístup aut: cíl</string>
@ -3835,4 +3835,50 @@
<string name="poi_diplomatic_services_non_immigrant_visas_filter">Neimigrační víza</string>
<string name="poi_consulate_filter">Konzulát</string>
<string name="poi_embassy_filter">Ambasáda</string>
<string name="poi_mobile_money_agent">Mobilní směnárna</string>
<string name="poi_diplomatic_liaison">Prostředník</string>
<string name="poi_liaison_filter">Prostředník</string>
<string name="poi_wildlife_crossing_bat_tunnel">Netopýří tunel</string>
<string name="poi_wildlife_crossing_bat_bridge">Netopýří most</string>
<string name="poi_wildlife_crossing">Ekodukt</string>
<string name="poi_swimming_area">Plovárna</string>
<string name="poi_lavoir">Veřejná prádelna</string>
<string name="poi_waste_transfer_station">Překladiště odpadů</string>
<string name="poi_weightbridge">Mostní váha</string>
<string name="poi_ranger_station">Stanice rangera</string>
<string name="poi_water_source_lake">Jezero</string>
<string name="poi_water_source_river">Řeka</string>
<string name="poi_water_source_well">Studna</string>
<string name="poi_water_source_powered_pump">Poháněné čerpadlo</string>
<string name="poi_water_source_water_tank">Vodní nádrž</string>
<string name="poi_water_source_tap">Kohoutek</string>
<string name="poi_water_source_water_works">Zásobování vodou</string>
<string name="poi_water_source_tube_well">Trubková studna</string>
<string name="poi_vaccination_covid19">Očkování: COVID19</string>
<string name="poi_health_specialty_vaccination_yes">Očkování</string>
<string name="poi_lifeguard_base">Záchranářská základna</string>
<string name="poi_siren">Siréna</string>
<string name="poi_nurse">Zdravotní sestra</string>
<string name="poi_diplomatic_services_citizen_services_no">Ne</string>
<string name="poi_diplomatic_services_citizen_services_yes">Ano</string>
<string name="poi_diplomatic_services_immigrant_visas_no">Ne</string>
<string name="poi_diplomatic_services_immigrant_visas_yes">Ano</string>
<string name="poi_diplomatic_services_non_immigrant_visas_no">Ne</string>
<string name="poi_diplomatic_services_non_immigrant_visas_yes">Ano</string>
<string name="poi_liaison_subnational">Podnárodní</string>
<string name="poi_liaison_representative_office">Reprezentační kancelář</string>
<string name="poi_liaison_liaison_office">Kancelář</string>
<string name="poi_consulate_honorary_consul">Honorární konzul</string>
<string name="poi_consulate_consulate_general">Generální konzulát</string>
<string name="poi_consulate_consular_office">Kancelář konzula</string>
<string name="poi_consulate_consular_agency">Konzulární zastupitelstvo</string>
<string name="poi_consulate_yes">Vedená konzulem</string>
<string name="poi_embassy_residence">Rezidence</string>
<string name="poi_embassy_nunciature">Nunciatura</string>
<string name="poi_embassy_mission">Mise</string>
<string name="poi_embassy_interests_section">Zájmová sekce</string>
<string name="poi_embassy_high_commission">Vysoký komisař</string>
<string name="poi_embassy_delegation">Delegace</string>
<string name="poi_embassy_branch_embassy">Pobočka</string>
<string name="poi_embassy_yes">Vedená velvyslancem</string>
</resources>

View file

@ -3425,7 +3425,7 @@
<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_open_existing_track">Otevřít existující stopu</string>
<string name="plan_route_create_new_route">Vytvořit novou trasu</string>
<string name="plan_route_select_track_file_for_open">Vyberte stopu k otevření.</string>
<string name="shared_string_done">Hotovo</string>
@ -3442,10 +3442,10 @@
<string name="quick_action_add_gpx">Přidat mezicíl</string>
<string name="map_widget_monitoring">Záznam trasy</string>
<string name="marker_save_as_track">Uložit jako soubor trasy</string>
<string name="follow_track">Sledovat trasu</string>
<string name="follow_track">Sledovat stopu</string>
<string name="follow_track_descr">Zvolte soubor trasy, kterou chcete sledovat</string>
<string name="import_track_descr">Zvolte soubor stopy, kterou chcete sledovat, nebo jej importujte ze svého zařízení.</string>
<string name="select_another_track">Zvolit jinou trasu</string>
<string name="select_another_track">Zvolit jinou stopu</string>
<string name="navigate_to_track_descr">Navigovat z mé polohy k trase</string>
<string name="pass_whole_track_descr">Bod trasy pro navigování</string>
<string name="start_of_the_track">Začátek trasy</string>
@ -3490,7 +3490,7 @@
<string name="save_track_to_gpx_globally">Ukládat trasu do GPX souboru</string>
<string name="shared_string_gpx_route">Trasa ze stopy</string>
<string name="empty_state_my_tracks">Přidat soubory stop</string>
<string name="simplified_track">Zjednodušená trasa</string>
<string name="simplified_track">Zjednodušená stopa</string>
<string name="simplified_track_description">Uloží se pouze linie trasy, mezicíle budou odstraněny.</string>
<string name="shared_string_file_name">Název souboru</string>
<string name="number_of_gpx_files_selected_pattern">%s vybraných souborů stop</string>
@ -3505,7 +3505,7 @@
<string name="only_selected_segment_recalc">Pouze vybraný úsek bude přepočítán pomocí vybraného profilu.</string>
<string name="all_next_segments_will_be_recalc">Všechny následující úseky budou přepočítány pomocí vybraného profilu.</string>
<string name="all_previous_segments_will_be_recalc">Všechny předcházející úseky budou přepočítány pomocí vybraného profilu.</string>
<string name="open_saved_track">Otevřít uloženou trasu</string>
<string name="open_saved_track">Otevřít uloženou stopu</string>
<string name="shared_string_is_saved">je uloženo</string>
<string name="one_point_error">Přidejte prosím alespoň dva body.</string>
<string name="shared_string_redo">Znovu</string>
@ -3967,7 +3967,7 @@
<string name="select_folder">Zvolte složku</string>
<string name="select_folder_descr">Zvolte složku nebo vytvořte novou</string>
<string name="shared_string_empty">Prázdné</string>
<string name="analyze_by_intervals">Analyzovat podle intervalů (rozdělit interval)</string>
<string name="analyze_by_intervals">Analyzovat rozdělené intervaly</string>
<string name="upload_to_openstreetmap">Nahrát do OpenStreetMap</string>
<string name="edit_track">Editovat stopu</string>
<string name="rename_track">Přejmenovat stopu</string>
@ -4011,4 +4011,13 @@
<string name="uploading_count">Nahrávám %1$d z %2$d</string>
<string name="uploaded_count">Nahráno %1$d z %2$d</string>
<string name="toast_select_edits_for_upload">Vyberte úpravy pro nahrání</string>
<string name="hillshade_slope_contour_lines">Stínované svahy / Sklon svahů / Vrstevnice</string>
<string name="open_place_reviews_plugin_description">OpenPlaceReviews je komunitní projekt o veřejných místech, jako jsou restaurace, hotely, muzea a další. Shromažďuje o nich veškeré veřejné informace, např. fotografie, hodnocení, odkazy do dalších systémů jako OpenStreetMap či Wikipedie.
\n
\nVšechna data OpenPlaceReviews jsou otevřená a přístupná každému: http://openplacereviews.org/data.
\n
\nPřečtěte si více na http://openplacereviews.org</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="opr_use_dev_url">Použít test.openplacereviews.org</string>
<string name="login_open_place_reviews">Přihlásit se do OpenPlaceReviews</string>
</resources>

View file

@ -3694,7 +3694,7 @@
<string name="quick_action_showhide_mapillary_title">Mapillary ein-/ausblenden</string>
<string name="quick_action_mapillary_hide">Mapillary ausblenden</string>
<string name="quick_action_mapillary_show">Mapillary anzeigen</string>
<string name="quick_action_showhide_mapillary_descr">Eine Umschaltfläche zum ein- oder ausblenden der Mapillary-Layer auf der Karte.</string>
<string name="quick_action_showhide_mapillary_descr">Eine Umschaltfläche zum Ein- oder Ausblenden des Mapillary-Layers auf der Karte.</string>
<string name="uninstall_speed_cameras">Blitzer deinstallieren</string>
<string name="shared_string_legal">Rechtliches</string>
<string name="speed_camera_pois">Blitzer-POIs</string>
@ -4013,4 +4013,13 @@
<string name="uploading_count">Lade %1$d von %2$d hoch</string>
<string name="uploaded_count">%1$d von %2$d hochgeladen</string>
<string name="toast_select_edits_for_upload">Bearbeitungen zum Hochladen auswählen</string>
<string name="hillshade_slope_contour_lines">Relief / Hangneigung / Höhenlinien</string>
<string name="open_place_reviews_plugin_description">OpenPlaceReviews ist ein von der Gemeinschaft betriebenes Projekt über öffentliche Orte wie Restaurants, Hotels, Museen, Wegpunkte. Es sammelt alle öffentlichen Informationen über sie wie Fotos, Bewertungen, Links zu anderen Systemen, Link OpenStreetMap, Wikipedia.
\n
\nAlle OpenPlaceReview-Daten sind offen und für jedermann zugänglich: http://openplacereviews.org/data.
\n
\nMehr Informationen finden Sie unter: http://openplacereviews.org</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="opr_use_dev_url">test.openplacereviews.org verwenden</string>
<string name="login_open_place_reviews">Anmelden bei OpenPlaceReviews</string>
</resources>

View file

@ -778,7 +778,7 @@
<string name="context_menu_item_update_map">Ενημέρωση χάρτη</string>
<string name="context_menu_item_create_poi">Δημιουργία ΣΕ</string>
<string name="shared_string_yes">Ναι</string>
<string name="shared_string_cancel">Ακύρωση</string>
<string name="shared_string_cancel">Άκυρο</string>
<string name="shared_string_apply">Εφαρμογή</string>
<string name="shared_string_no">Όχι</string>
<string name="add_favorite_dialog_top_text">Εισαγωγή ονόματος αγαπημένου</string>
@ -1270,7 +1270,7 @@
<string name="dash_download_new_one">Λήψη Νέου Χάρτη</string>
<string name="map_locale">Γλώσσα χάρτη</string>
<string name="rendering_attr_roadStyle_name">Μορφή δρόμου</string>
<string name="rendering_value_default_name">Προκαθορισμένο</string>
<string name="rendering_value_default_name">Προεπιλογή</string>
<string name="rendering_value_orange_name">Πορτοκαλί</string>
<string name="traffic_warning_railways">Διασταύρωση σιδηροτροχιάς</string>
<string name="show_railway_warnings">Διασταυρώσεις σιδηροτροχιάς</string>
@ -1467,7 +1467,7 @@
<string name="track_segments">Τμήματα διαδρομής</string>
<string name="track_points">Σημεία της διαδρομής</string>
<string name="location_on_map">Τοποθεσία:\n Γ. Πλ %1$s\n Γ. Μηκ %2$s</string>
<string name="rendering_value__name">Προκαθορισμένο</string>
<string name="rendering_value__name">Προεπιλογή</string>
<string name="print_route">Εκτύπωση διαδρομής</string>
<string name="osmand_parking_overdue">εκπρόθεσμο</string>
<string name="simulate_your_location">Προσομοίωση της θέση σας</string>
@ -3013,7 +3013,7 @@
<string name="rendering_attr_showLez_description">Εμφάνιση στον χάρτη ζωνών για χαμηλή εκπομπή καυσαερίων. Δεν επηρεάζει τη δρομολόγηση.</string>
<string name="rendering_attr_showLez_name">Εμφάνιση ζωνών χαμηλής εκπομπής καυσαερίων</string>
<string name="temporary_conditional_routing">Λάβετε υπόψη τους προσωρινούς περιορισμούς</string>
<string name="shared_string_default">Προεπιλεγμένο</string>
<string name="shared_string_default">Προεπιλογή</string>
<string name="app_mode_pickup_truck">Ημιφορτηγό</string>
<string name="day">Ημέρα</string>
<string name="days_2_4">Ημέρες</string>

View file

@ -654,7 +654,7 @@
<string name="select_index_file_to_download">Trovis nenion. Se vi ne povas trovi vian regionon, vi povas fari ĝin mem (rigardu https://osmand.net).</string>
<string name="none_selected_gpx">Unue elektu GPXdosieron per frapetadi.</string>
<string name="local_index_select_gpx_file">Elektu kurson</string>
<string name="gpx_split_interval">Intertempo de divido</string>
<string name="gpx_split_interval">Fragmento</string>
<string name="sort_by_distance">Ordigi laŭ distanco</string>
<string name="sort_by_name">Ordigi laŭ nomo</string>
<string name="plugin_touringview_name">Turisma map-vido</string>
@ -2405,7 +2405,7 @@
<string name="mapillary_action_descr">Kontribui viajn strat-nivelajn vidaĵojn pri tiu ĉi loko al Mapillary.</string>
<string name="plugin_mapillary_descr">Strat-nivelaj fotoj por ĉiuj. Esplori lokojn, kunlabori kaj foti la mondon.</string>
<string name="online_photos">Enretaj fotoj</string>
<string name="no_photos_descr">Neniuj fotoj tie ĉi.</string>
<string name="no_photos_descr">Neniu foto tie ĉi.</string>
<string name="shared_string_install">Instali</string>
<string name="improve_coverage_mapillary">Pliigi fotan atingon de Mapillary</string>
<string name="improve_coverage_install_mapillary_desc">Instalu la aplikaĵon Mapillary por aldoni fotojn al tiu ĉi loko sur la mapo.</string>
@ -3967,7 +3967,7 @@
<string name="select_folder">Elekti dosierujon</string>
<string name="select_folder_descr">Elekti dosierujon aŭ krei novan</string>
<string name="shared_string_empty">Malplena</string>
<string name="analyze_by_intervals">Analizi laŭ intertempoj (dividoj)</string>
<string name="analyze_by_intervals">Analizi laŭ fragmentoj</string>
<string name="upload_to_openstreetmap">Alŝuti al OpenStreetMap</string>
<string name="edit_track">Redakti spuron</string>
<string name="rename_track">Renomi spuron</string>
@ -4011,4 +4011,13 @@
<string name="uploading_count">Sendado de %1$d el %2$d</string>
<string name="uploaded_count">Sendis %1$d el %2$d</string>
<string name="toast_select_edits_for_upload">Elektu redaktojn por sendi</string>
<string name="hillshade_slope_contour_lines">Nivelombrumo / dekliveco / nivelkurboj</string>
<string name="open_place_reviews_plugin_description">OpenPlaceReviews estas komunuma projekto pri publikaj lokoj, kiel restoracioj, hoteloj, muzeoj, rekoniloj, ktp. Ĝi kolektas diversajn publikajn informojn pri tiuj punktoj: fotojn, opiniojn, ligilojn al OpenStreetMap kaj Vikipedio.
\n
\nĈiuj OpenPlaceReviewdatumoj estas malfermaj kaj disponeblaj por ĉiu: http://openplacereviews.org/data
\n
\nPliaj informoj ĉe http://openplacereviews.org</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="opr_use_dev_url">Uzi test.openplacereviews.org</string>
<string name="login_open_place_reviews">Ensaluti al OpenPlaceReviews</string>
</resources>

View file

@ -2723,7 +2723,7 @@
<string name="poi_aquaculture_mussels">Acuicultura: mejillones</string>
<string name="poi_min_age">Edad mínima</string>
<string name="poi_organic_yes"></string>
<string name="poi_organic_no">No</string>
<string name="poi_organic_no">Productos orgánicos: no</string>
<string name="poi_organic_only">Únicamente</string>
<string name="poi_traffic_mirror">Espejo de tráfico</string>
<string name="poi_diplomatic_consulate">Consulado</string>

View file

@ -774,7 +774,7 @@
<string name="osmand_plus_short_description_80_chars">Visor y navegador móvil global de mapas OSM con y sin conexión</string>
<string name="osmand_plus_long_description_1000_chars">OsmAnd+ (OSM Automated Navigation Directions, y en español, Guía de Navegación Automatizada de OSM)
\n
\nOsmAnd+ es un software de navegación de código abierto con acceso a una amplia variedad de datos globales de OSM. Todos los datos del mapa (vectores y teselas), pueden ser almacenados en la memoria del teléfono para su uso sin conexión. Ofrece funcionalidades de rutas con y sin conexión, incluyendo guía de giro-a-giro por voz.
\n OsmAnd+ es un software de navegación de código abierto con acceso a una amplia variedad de datos globales de OSM. Todos los datos del mapa (vectores y teselas), pueden ser almacenados en la memoria del teléfono para su uso sin conexión. Ofrece funcionalidades de rutas con y sin conexión, incluyendo guía de giro-a-giro por voz.
\n
\n OsmAnd+ es la versión de pago de la aplicación, comprándola ayudas al proyecto, financias el desarrollo de nuevas funciones, y recibes las últimas actualizaciones.
\n
@ -1222,8 +1222,7 @@
<string name="osmand_net_previously_installed">Todos los datos sin conexión en la versión vieja de OsmAnd son compatibles con la nueva versión, pero los puntos de Favoritos deben exportarse desde la versión vieja y luego, importarse en la nueva.</string>
<string name="build_installed">Compilación {0} instalada ({1}).</string>
<string name="downloading_build">Descargando compilación…</string>
<string name="install_selected_build">¿Instalar OsmAnd?
\nVersión: {0}
<string name="install_selected_build">¿Instalar OsmAnd {0}\?
\nFecha: {1}
\nTamaño: {2} MB</string>
<string name="loading_builds_failed">Error al recuperar la lista de compilaciones de OsmAnd</string>
@ -2063,7 +2062,7 @@
<string name="shared_string_notifications">Notificaciones</string>
<string name="gpx_no_tracks_title">Sin archivos de trazas aún</string>
<string name="gpx_no_tracks_title_folder">También puedes añadir archivos de trazas a la carpeta</string>
<string name="gpx_add_track">Añadir GPX</string>
<string name="gpx_add_track">Añadir más…</string>
<string name="shared_string_appearance">Aspecto</string>
<string name="rendering_value_fine_name">Muy fino</string>
<string name="route_calculation">Cálculo de la ruta</string>
@ -3732,8 +3731,8 @@
<string name="add_hidden_group_info">El punto añadido no será visible en el mapa, ya que el grupo elegido está oculto, se puede encontrar en «%s».</string>
<string name="track_show_start_finish_icons">Mostrar los iconos de inicio y fin</string>
<string name="select_track_width">Elegir la anchura</string>
<string name="gpx_split_interval_descr">Marca el intervalo en el que se mostrarán las marcas con distancia o tiempo en la traza.</string>
<string name="gpx_split_interval_none_descr">Marca la opción de división deseada: por tiempo o por distancia.</string>
<string name="gpx_split_interval_descr">Elige el intervalo de la traza en el que se mostrarán las marcas con la distancia o el tiempo.</string>
<string name="gpx_split_interval_none_descr">Elige la opción de división deseada: por tiempo o por distancia.</string>
<string name="shared_string_custom">Personalizado</string>
<string name="gpx_direction_arrows">Flechas de dirección</string>
<string name="track_coloring_solid">Sólido</string>
@ -3970,7 +3969,7 @@
<string name="select_folder">Elegir carpeta</string>
<string name="select_folder_descr">Elegir carpeta o añadir una nueva</string>
<string name="shared_string_empty">Vacío</string>
<string name="analyze_by_intervals">Analizar por intervalos (intervalo de división)</string>
<string name="analyze_by_intervals">Analizar intervalos divididos</string>
<string name="upload_to_openstreetmap">Subir a OpenStreetMap</string>
<string name="edit_track">Editar traza</string>
<string name="rename_track">Renombrar traza</string>
@ -4014,4 +4013,13 @@
<string name="uploading_count">Subiendo %1$d de %2$d</string>
<string name="uploaded_count">Se subieron %1$d de %2$d</string>
<string name="toast_select_edits_for_upload">Marcar ediciones a subir</string>
<string name="hillshade_slope_contour_lines">Sombreado / Pendiente / Curvas de nivel</string>
<string name="open_place_reviews_plugin_description">OpenPlaceReviews es un proyecto impulsado por la comunidad sobre lugares públicos como restaurantes, hoteles, museos, puntos de referencia. Recoge toda la información pública sobre ellos como fotos, reseñas, enlaces a otros servicios como OpenStreetMap y Wikipedia.
\n
\nTodos los datos de OpenPlaceReviews son abiertos y están disponibles para todos: http://openplacereviews.org/data.
\n
\nPuedes leer más en: https://openplacereviews.org</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="opr_use_dev_url">Usar test.openplacereviews.org</string>
<string name="login_open_place_reviews">Acceder a OpenPlaceReviews</string>
</resources>

View file

@ -2382,7 +2382,7 @@
<string name="store_tracks_in_monthly_directories">Enregistrer les traces dans des dossiers mensuels</string>
<string name="store_tracks_in_monthly_directories_descrp">Enregistrer les traces dans des sous-dossiers organisés par mois (par exemple 2018-01).</string>
<string name="of">%1$d de %2$d</string>
<string name="moving_time">Durée de déplacement</string>
<string name="moving_time">Durée de mouvement</string>
<string name="min_max">Min / Max</string>
<string name="rendering_value_translucent_pink_name">Rose translucide</string>
<string name="quick_action_resume_pause_navigation">Suspendre / Reprendre la Navigation</string>
@ -3981,7 +3981,7 @@
<string name="message_name_is_already_exists">Ce nom existe déjà</string>
<string name="routing_engine_vehicle_type_hgv">Poids lourd</string>
<string name="announcement_time_passing">Durée</string>
<string name="analyze_by_intervals">Analyser par intervalles (fractionner)</string>
<string name="analyze_by_intervals">Analyser par intervalles de fractionnement</string>
<string name="announcement_time_intervals">Intervalles de temps et de distance</string>
<string name="announcement_time_descr">Le délai d\'annonce des alertes vocales dépend du type d\'annonce, de la vitesse actuelle et du type de navigation.</string>
<string name="announcement_time_title">Délai de l\'annonce</string>
@ -4001,4 +4001,8 @@
<string name="uploaded_count">%1$d sur %2$d envoyé</string>
<string name="upload_photo">Envoi en cours</string>
<string name="upload_photo_completed">Envoi terminé</string>
<string name="hillshade_slope_contour_lines">Ombrage du relief / Pente / Courbes de niveaux</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="opr_use_dev_url">Utilisez test.openplacereviews.org</string>
<string name="login_open_place_reviews">Se connecter à OpenPlaceReviews</string>
</resources>

View file

@ -3998,4 +3998,35 @@ Lon %2$s</string>
<string name="routing_engine_vehicle_type_mtb">Bicicleta de montaña</string>
<string name="message_server_error">Erro do servidor: %1$s</string>
<string name="message_name_is_already_exists">O nome xa existe</string>
<string name="analyze_by_intervals">Analizar intres divididos</string>
<string name="upload_to_openstreetmap">Subir ao OpenStreetMap</string>
<string name="edit_track">Editar pista</string>
<string name="rename_track">Renomear pista</string>
<string name="change_folder">Mudar cartafol</string>
<string name="shared_string_sec">seg</string>
<string name="announcement_time_passing">Pasando</string>
<string name="announcement_time_approach">Aproximación</string>
<string name="announcement_time_prepare_long">Longa preparación</string>
<string name="announcement_time_prepare">Preparar</string>
<string name="announcement_time_off_route">Fóra da ruta</string>
<string name="delete_online_routing_engine">Eliminar este motor de navegación en liña\?</string>
<string name="context_menu_read_full">Ler completo</string>
<string name="context_menu_edit_descr">Editar descrición</string>
<string name="delete_waypoints">Eliminar puntos de referencia</string>
<string name="copy_to_map_markers">Copiar ás marcaxes do mapa</string>
<string name="copy_to_map_favorites">Copiar aos favoritos</string>
<string name="upload_photo">Subindo</string>
<string name="upload_photo_completed">Subida completa</string>
<string name="uploading_count">Subindo %1$d de %2$d</string>
<string name="uploaded_count">Subíronse %1$d de %2$d</string>
<string name="toast_select_edits_for_upload">Seleccionar edicións para subir</string>
<string name="hillshade_slope_contour_lines">Sombras do relevo / Pendentes / Curvas de nivel</string>
<string name="open_place_reviews_plugin_description">O OpenPlaceReviews é un proxecto impulsado pola comunidade sobre lugares públicos como restaurantes, hoteis, museos, puntos de referencia. Recolle toda a información pública sobre eles como imaxes, recesións, ligazóns a outros servizos como OpenStreetMap e Wikipedia.
\n
\nTodos os datos do OpenPlaceReviews son abertos e están dispoñíbeis para todos: http://openplacereviews.org/data.
\n
\nPodes ler máis en: https://openplacereviews.org</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="opr_use_dev_url">Empregar test.openplacereviews.org</string>
<string name="login_open_place_reviews">Iniciar sesión ao OpenPlaceReviews</string>
</resources>

View file

@ -4013,4 +4013,7 @@
<string name="uploading_count">נשלחות %1$d מתוך %2$d</string>
<string name="uploaded_count">נשלחו %1$d מתוך %2$d</string>
<string name="toast_select_edits_for_upload">נא לבחור עריכות לשליחה</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="opr_use_dev_url">להשתמש ב־test.openplacereviews.org</string>
<string name="login_open_place_reviews">כניסה ל־OpenPlaceReviews</string>
</resources>

View file

@ -3782,7 +3782,7 @@
<string name="plan_route_change_route_type_before">Alterar o tipo de rota antes</string>
<string name="plan_route_change_route_type_after">Alterar o tipo de rota após</string>
<string name="simplified_track">Trilha simplificada</string>
<string name="simplified_track_description">Apenas a linha da rota será salva, os waypoints serão excluídos.</string>
<string name="simplified_track_description">Apenas a linha da rota será salva, os pontos de passagem serão excluídos.</string>
<string name="shared_string_file_name">Nome do arquivo</string>
<string name="number_of_gpx_files_selected_pattern">%s arquivos de trilha selecionados</string>
<string name="disable_recording_once_app_killed_descrp">O registro de trilhas fará uma pausa quando o aplicativo for encerrado (por meio de aplicativos recentes). (A indicação de segundo plano do OsmAnd desaparece da barra de notificação do Android.)</string>
@ -3962,7 +3962,7 @@
<string name="select_folder">Selecione a pasta</string>
<string name="select_folder_descr">Selecione a pasta ou adicione uma nova</string>
<string name="shared_string_empty">Vazio</string>
<string name="analyze_by_intervals">Analisar por intervalos (intervalo de divisão)</string>
<string name="analyze_by_intervals">Analisar intervalos de divisão</string>
<string name="upload_to_openstreetmap">Carregar para OpenStreetMap</string>
<string name="edit_track">Editar trilha</string>
<string name="rename_track">Renomear trilha</string>
@ -4006,4 +4006,5 @@
<string name="uploading_count">Carregando %1$d de %2$d</string>
<string name="uploaded_count">Carregado %1$d de %2$d</string>
<string name="toast_select_edits_for_upload">Selecione as edições para carregamento</string>
<string name="hillshade_slope_contour_lines">Sombras de relevo / Encostas / Curvas de nível</string>
</resources>

View file

@ -3878,4 +3878,5 @@
<string name="poi_waste_transfer_station">Станция перекачки отходов</string>
<string name="poi_ranger_station">Станция рейнджеров</string>
<string name="poi_swimming_area">Место для купания</string>
<string name="poi_wildlife_crossing">Экодук</string>
</resources>

View file

@ -3992,4 +3992,13 @@
<string name="uploading_count">Отправка %1$d из %2$d</string>
<string name="uploaded_count">Отправлено %1$d из %2$d</string>
<string name="toast_select_edits_for_upload">Выберите правки для отправки</string>
<string name="hillshade_slope_contour_lines">Рельеф / Уклон/ Контурные линии</string>
<string name="shared_string_vehicle">Транспортное средство</string>
<string name="routing_engine_vehicle_type_bike">Велосипед</string>
<string name="routing_engine_vehicle_type_cycling_electric">Электрический велосипед</string>
<string name="routing_engine_vehicle_type_cycling_mountain">Горный велосипед</string>
<string name="routing_engine_vehicle_type_cycling_road">Шоссейный велосипед</string>
<string name="routing_engine_vehicle_type_cycling_regular">Обычный велосипед</string>
<string name="routing_engine_vehicle_type_racingbike">Гоночный велосипед</string>
<string name="routing_engine_vehicle_type_mtb">Горный велосипед</string>
</resources>

View file

@ -2415,7 +2415,7 @@
<string name="distance_moving">Vzdialenosť opravená</string>
<string name="shared_string_permissions">Povolenia</string>
<string name="import_gpx_failed_descr">Nepodarilo sa naimportovať súbor. Prosím zabezpečte, že OsmAnd má oprávnenie čítať súbor.</string>
<string name="map_widget_ruler_control">Polomerové pravítko</string>
<string name="map_widget_ruler_control">Kruhové pravítko</string>
<string name="shared_string_reset">Resetovať</string>
<string name="shared_string_reload">Znovu načítať</string>
<string name="mapillary_menu_descr_tile_cache">Znovu načítať dlaždice pre získanie aktuálnych dát.</string>
@ -3580,7 +3580,7 @@
<string name="tracker_item">Stopovanie OsmAnd</string>
<string name="mapillary_item">OsmAnd + Mapillary</string>
<string name="quick_action_item">Rýchla akcia</string>
<string name="radius_ruler_item">Polomerové pravítko</string>
<string name="radius_ruler_item">Kruhové pravítko</string>
<string name="measure_distance_item">Merať vzdialenosť</string>
<string name="travel_item">Cestovanie (Wikivoyage a Wikipédia)</string>
<string name="map_markers_item">Mapové značky</string>
@ -3962,7 +3962,7 @@
<string name="select_folder">Zvoľte priečinok</string>
<string name="select_folder_descr">Zvoľte priečinok alebo pridajte nový</string>
<string name="shared_string_empty">Prázdne</string>
<string name="analyze_by_intervals">Analyzovať podľa intervalov (rozdeliť interval)</string>
<string name="analyze_by_intervals">Analyzovať rozdelené intervaly</string>
<string name="upload_to_openstreetmap">Nahrať do OpenStreetMap</string>
<string name="edit_track">Upraviť stopu</string>
<string name="rename_track">Premenovať stopu</string>
@ -4006,4 +4006,5 @@
<string name="uploading_count">Odosiela sa %1$d z %2$d</string>
<string name="uploaded_count">Odoslané %1$d z %2$d</string>
<string name="toast_select_edits_for_upload">Zvoľte úpravy na odoslanie</string>
<string name="hillshade_slope_contour_lines">Tieňované svahy / Sklony svahov / Vrstevnice</string>
</resources>

View file

@ -2971,7 +2971,7 @@
<string name="app_mode_skiing">Лижі</string>
<string name="base_profile_descr_ski">Лижі</string>
<string name="show_compass_ruler">Показати компас-лінійку</string>
<string name="hide_compass_ruler">Приховати компас-лінійку</string>
<string name="hide_compass_ruler">Сховати компас-лінійку</string>
<string name="select_icon_profile_dialog_title">Оберіть значок</string>
<string name="settings_routing_mode_string">Режим: %s</string>
<string name="settings_derived_routing_mode_string">Користувацький режим, похідний від: %s</string>
@ -2988,7 +2988,7 @@
<string name="profile_alert_need_save_title">Зберегти зміни</string>
<string name="profile_alert_need_save_msg">Спочатку збережіть зміни в профілі</string>
<string name="profile_alert_delete_title">Видалити профіль</string>
<string name="profile_alert_delete_msg">Ви дійсно хочете видалити профіль %s\?</string>
<string name="profile_alert_delete_msg">Ви дійсно хочете видалити профіль «%s»</string>
<string name="select_base_profile_dialog_title">Виберіть профіль для початку</string>
<string name="process_downloading_service">Служба завантаження OsmAnd</string>
<string name="shared_string_color_magenta">Пурпуровий</string>
@ -3302,7 +3302,7 @@
<string name="added_profiles_descr">Профілі, додані втулком</string>
<string name="shared_string_turn_off">Вимкнути</string>
<string name="new_plugin_added">Нова втулка додана</string>
<string name="join_segments">Приєднати частки</string>
<string name="join_segments">Об’єднати сегменти</string>
<string name="add_new_profile_q">Додати новий профіль \'%1$s\'\?</string>
<string name="save_heading">Зберегти заголовок</string>
<string name="save_heading_descr">Зберегти заголовок для кожної точки треку під час запису.</string>
@ -3736,7 +3736,7 @@
<string name="track_coloring_solid">Суцільний</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_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>
@ -3966,7 +3966,7 @@
<string name="select_folder">Вибрати теку</string>
<string name="select_folder_descr">Виберіть теку або додайте нову</string>
<string name="shared_string_empty">Порожньо</string>
<string name="analyze_by_intervals">Аналіз за інтервалами (розділений інтервал)</string>
<string name="analyze_by_intervals">Аналізувати розділені інтервали</string>
<string name="upload_to_openstreetmap">Відвантажити на OpenStreetMap</string>
<string name="edit_track">Редагувати трек</string>
<string name="rename_track">Перейменувати трек</string>
@ -4010,4 +4010,5 @@
<string name="uploading_count">Вивантаження %1$d з %2$d</string>
<string name="uploaded_count">Вивантажено %1$d з %2$d</string>
<string name="toast_select_edits_for_upload">Виберіть зміни для вивантаження</string>
<string name="hillshade_slope_contour_lines">Рельєф місцевості / Схили / Горизонталі</string>
</resources>

View file

@ -35,7 +35,7 @@
<string name="avoid_motorway">避開高速路</string>
<string name="auto_zoom_map">自动缩放地图</string>
<string name="recalculate_route_to_your_location">運輸方式:</string>
<string name="select_navigation_mode">選擇傳輸模式</string>
<string name="select_navigation_mode">运输模式:</string>
<string name="map_widget_renderer">地图风格</string>
<string name="map_widget_fluorescent">熒光路線</string>
<string name="map_widget_show_ruler">統治者</string>
@ -430,9 +430,9 @@
<string name="local_indexes_cat_srtm">等高线数据</string>
<string name="av_def_action_video">录制视频</string>
<string name="av_def_action_audio">录制音频</string>
<string name="av_widget_action_descr">选择缺省窗体动作。</string>
<string name="av_widget_action_descr">默认小部件操作:</string>
<string name="av_widget_action">缺省窗体动作</string>
<string name="av_video_format_descr">选择视频输出格式。</string>
<string name="av_video_format_descr">视频输出格式:</string>
<string name="av_video_format">视频输出格式</string>
<string name="av_use_external_recorder_descr">使用系统程序录制视频。</string>
<string name="av_use_external_camera_descr">使用系统程序拍照</string>
@ -481,7 +481,7 @@
<string name="map_widget_mini_route">路线小地图</string>
<string name="bg_service_interval">设置唤醒间隔:</string>
<string name="continue_follow_previous_route_auto">上次导航未完成。是否继续?(%1$s 秒)</string>
<string name="select_animate_speedup">选择模拟导航速度</string>
<string name="select_animate_speedup">路线模拟速度:</string>
<string name="global_app_allocated_memory_descr">已分配内存 %1$s MB (Android 限制 %2$s MBDalvik %3$s MB)。</string>
<string name="shared_location">分享位置</string>
<string name="osmand_parking_lim_text">有时间限制</string>
@ -555,7 +555,7 @@
<string name="animate_route">开始模拟导航</string>
<string name="file_can_not_be_renamed">文件无法重命名。</string>
<string name="file_with_name_already_exists">同名文件已存在。</string>
<string name="poi_query_by_name_matches_categories">找到多个满足查询的POI类别</string>
<string name="poi_query_by_name_matches_categories">找到了几个相关的 POI 类别。</string>
<string name="data_to_search_poi_not_available">用于搜索POI的本地数据不存在。</string>
<string name="poi_filter_by_name">按名称搜索</string>
<string name="old_poi_file_should_be_deleted">兴趣点数据文件 \'%1$s\' 是多余的,可以删除。</string>
@ -2020,7 +2020,7 @@
<string name="first_time_msg">感谢您使用 OsmAnd。对于此应用程序的许多功能您需要一些地区的离线数据您可以透过\'设置\' -&gt; \'管理地图文件\'来下载。之后您可浏览地图、位置的地址、查看兴趣点以及寻找大众运输工具。</string>
<string name="basemap_was_selected_to_download">底图为某些特别的应用功能必需使用的,并且缺省为下载。</string>
<string name="prefs_plugins_descr">启动插件的高级设置和更多的附加功能。</string>
<string name="play_commands_of_currently_selected_voice">用所选择的语音播放指令</string>
<string name="play_commands_of_currently_selected_voice">通过播放通知选择语音和测试:</string>
<string name="back_to_location">回到目前位置</string>
<string name="direction_style_sidewise">横向8 个扇区)</string>
<string name="direction_style_clockwise">顺时针12 个扇区)</string>
@ -3068,7 +3068,7 @@
<string name="expire_time">到期时间</string>
<string name="tiles_storage_descr">选择如何储存下载的数据。</string>
<string name="export_import_quick_actions_with_profiles_promo">你可以在应用配置中导入导出快捷操作。</string>
<string name="delete_all_actions_message_q">你确定要删除d快捷操作吗?</string>
<string name="delete_all_actions_message_q">你确定要不可撤销地删除 %d 快捷操作吗?</string>
<string name="speed_cameras_legal_descr">在某些国家或地区,使用测速摄像头提示应用是非法的。
\n
\n你需要根据你所在的国家的法律作出选择。

View file

@ -3960,7 +3960,7 @@
<string name="select_folder">選取資料夾</string>
<string name="select_folder_descr">選取資料夾或新增</string>
<string name="shared_string_empty"></string>
<string name="analyze_by_intervals">按時間間隔分析分割時間間隔</string>
<string name="analyze_by_intervals">分析分割間隔</string>
<string name="upload_to_openstreetmap">上傳到 OpenStreetMap</string>
<string name="edit_track">編輯軌跡</string>
<string name="rename_track">重新命名軌跡</string>
@ -4004,4 +4004,5 @@
<string name="uploading_count">正在上傳 %1$d共 %2$d</string>
<string name="uploaded_count">已上傳 %1$d共 %2$d</string>
<string name="toast_select_edits_for_upload">選取要上傳的檔案</string>
<string name="hillshade_slope_contour_lines">地形陰影/斜坡/等高線</string>
</resources>

View file

@ -4340,4 +4340,9 @@
<string name="poi_piste_status_open">Piste status: open</string>
<string name="poi_piste_status_closed">Piste status: closed</string>
<string name="poi_summit_register_yes">Summit register: yes</string>
<string name="poi_summit_register_no">Summit register: no</string>
<string name="poi_mobile_library">Mobile library stop position</string>
</resources>

View file

@ -63,11 +63,11 @@ public class LocationServiceHelperImpl extends LocationServiceHelper {
// Sets the fastest rate for active location updates. This interval is exact, and your
// application will never receive updates more frequently than this value.
.setFastestInterval(50)
//.setFastestInterval(50)
// Sets the maximum time when batched location updates are delivered. Updates may be
// delivered sooner than this interval.
.setMaxWaitTime(200)
.setMaxWaitTime(0)
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

View file

@ -8,10 +8,10 @@ import androidx.annotation.Nullable;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.plus.track.GpxSplitType;
import net.osmand.GPXUtilities.GPXTrackAnalysis;
import net.osmand.plus.GPXDatabase.GpxDataItem;
import net.osmand.plus.api.SQLiteAPI.SQLiteConnection;
import net.osmand.plus.track.GpxSplitType;
import net.osmand.plus.track.GradientScaleType;
import java.io.File;
@ -238,7 +238,7 @@ public class GpxDbHelper {
gpxFile = readingItems.poll();
while (gpxFile != null && !isCancelled()) {
GpxDataItem item = readingItemsMap.remove(gpxFile);
if (item.getFile() == null) {
if (item != null && item.getFile() == null) {
item = db.getItem(gpxFile, conn);
}
if (isAnalyseNeeded(gpxFile, item)) {

View file

@ -57,9 +57,6 @@ public abstract class MenuBottomSheetDialogFragment extends BottomSheetDialogFra
private LinearLayout itemsContainer;
private LinearLayout buttonsContainer;
@StringRes
protected int dismissButtonStringRes = R.string.shared_string_cancel;
public void setUsedOnMap(boolean usedOnMap) {
this.usedOnMap = usedOnMap;
}
@ -261,11 +258,7 @@ public abstract class MenuBottomSheetDialogFragment extends BottomSheetDialogFra
@StringRes
protected int getDismissButtonTextId() {
return dismissButtonStringRes;
}
protected void setDismissButtonTextId(@StringRes int stringRes) {
dismissButtonStringRes = stringRes;
return R.string.shared_string_cancel;
}
protected int getDismissButtonHeight(){

View file

@ -257,7 +257,7 @@ public class IntentHelper {
if (intent.hasExtra(TrackMenuFragment.OPEN_TRACK_MENU)) {
String path = intent.getStringExtra(TRACK_FILE_NAME);
boolean currentRecording = intent.getBooleanExtra(CURRENT_RECORDING, false);
TrackMenuFragment.showInstance(mapActivity, path, currentRecording);
TrackMenuFragment.showInstance(mapActivity, path, currentRecording, null);
mapActivity.setIntent(null);
}
}

View file

@ -74,6 +74,7 @@ import net.osmand.plus.views.layers.POIMapLayer;
import net.osmand.plus.views.layers.TransportStopsLayer;
import net.osmand.plus.widgets.TextViewEx;
import net.osmand.plus.widgets.tools.ClickableSpanTouchListener;
import net.osmand.plus.wikipedia.WikiArticleHelper;
import net.osmand.util.Algorithms;
import net.osmand.util.MapUtils;
@ -801,18 +802,98 @@ public class MenuBuilder {
return ll;
}
public View buildDescriptionRow(final View view, final String textPrefix, final String description, int textColor,
int textLinesLimit, boolean matchWidthDivider) {
OnClickListener clickListener = new OnClickListener() {
public View buildDescriptionRow(final View view, final String description) {
final String descriptionLabel = app.getString(R.string.shared_string_description);
View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
POIMapLayer.showDescriptionDialog(view.getContext(), app, description, textPrefix);
POIMapLayer.showHtmlDescriptionDialog(view.getContext(), app, description, descriptionLabel);
}
};
return buildRow(view, null, null, textPrefix, description, textColor,
null, false, null, true, textLinesLimit,
false, false, false, clickListener, matchWidthDivider);
if (!isFirstRow()) {
buildRowDivider(view);
}
LinearLayout baseView = new LinearLayout(view.getContext());
baseView.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams llBaseViewParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
baseView.setLayoutParams(llBaseViewParams);
LinearLayout ll = new LinearLayout(view.getContext());
ll.setOrientation(LinearLayout.HORIZONTAL);
LinearLayout.LayoutParams llParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
ll.setLayoutParams(llParams);
ll.setBackgroundResource(AndroidUtils.resolveAttribute(view.getContext(), android.R.attr.selectableItemBackground));
ll.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
copyToClipboard(description, view.getContext());
return true;
}
});
baseView.addView(ll);
// Text
LinearLayout llText = new LinearLayout(view.getContext());
llText.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams llTextViewParams = new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT);
llTextViewParams.weight = 1f;
AndroidUtils.setMargins(llTextViewParams, 0, 0, dpToPx(10f), 0);
llTextViewParams.gravity = Gravity.CENTER_VERTICAL;
llText.setLayoutParams(llTextViewParams);
ll.addView(llText);
// Description label
TextViewEx textPrefixView = new TextViewEx(view.getContext());
LinearLayout.LayoutParams llTextParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
AndroidUtils.setMargins(llTextParams, dpToPx(16f), dpToPx(8f), 0, 0);
textPrefixView.setLayoutParams(llTextParams);
textPrefixView.setTypeface(FontCache.getRobotoRegular(view.getContext()));
textPrefixView.setTextSize(12);
textPrefixView.setTextColor(app.getResources().getColor(light ? R.color.text_color_secondary_light : R.color.text_color_secondary_dark));
textPrefixView.setMinLines(1);
textPrefixView.setMaxLines(1);
textPrefixView.setText(descriptionLabel);
llText.addView(textPrefixView);
// Description
TextViewEx textView = new TextViewEx(view.getContext());
LinearLayout.LayoutParams llDescriptionParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
AndroidUtils.setMargins(llDescriptionParams, dpToPx(16f), dpToPx(2f), 0, dpToPx(8f));
textView.setLayoutParams(llDescriptionParams);
textView.setTypeface(FontCache.getRobotoRegular(view.getContext()));
textView.setTextSize(16);
textView.setTextColor(app.getResources().getColor(light ? R.color.text_color_primary_light : R.color.text_color_primary_dark));
textView.setText(WikiArticleHelper.getPartialContent(description));
if (Linkify.addLinks(textView, Linkify.ALL)) {
textView.setMovementMethod(null);
int linkTextColor = ContextCompat.getColor(view.getContext(), light ?
R.color.ctx_menu_bottom_view_url_color_light : R.color.ctx_menu_bottom_view_url_color_dark);
textView.setLinkTextColor(linkTextColor);
textView.setOnTouchListener(new ClickableSpanTouchListener());
AndroidUtils.removeLinkUnderline(textView);
}
textView.setMinLines(1);
textView.setMaxLines(10);
textView.setEllipsize(TextUtils.TruncateAt.END);
llText.addView(textView);
// Read Full button
buildReadFullButton(llText, app.getString(R.string.context_menu_read_full), onClickListener);
if (onClickListener != null) {
ll.setOnClickListener(onClickListener);
}
((LinearLayout) view).addView(baseView);
rowBuilt();
setDividerWidth(true);
return ll;
}
protected void showDialog(String text, final String actionType, final String dataPrefix, final View v) {
@ -908,6 +989,38 @@ public class MenuBuilder {
((LinearLayout) view).addView(horizontalLine);
}
protected void buildReadFullButton(LinearLayout container, String btnText, View.OnClickListener onClickListener) {
Context ctx = container.getContext();
TextViewEx button = new TextViewEx(new ContextThemeWrapper(ctx, light ? R.style.OsmandLightTheme : R.style.OsmandDarkTheme));
LinearLayout.LayoutParams llButtonParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, dpToPx(36f));
AndroidUtils.setMargins(llButtonParams, dpToPx(16f), 0, 0, dpToPx(16f));
button.setLayoutParams(llButtonParams);
button.setTypeface(FontCache.getRobotoMedium(app));
button.setBackgroundResource(light ? R.drawable.context_menu_controller_bg_light : R.drawable.context_menu_controller_bg_dark);
button.setTextSize(14);
int paddingSides = dpToPx(10f);
button.setPadding(paddingSides, 0, paddingSides, 0);
ColorStateList buttonColorStateList = AndroidUtils.createPressedColorStateList(ctx, !light,
R.color.ctx_menu_controller_button_text_color_light_n, R.color.ctx_menu_controller_button_text_color_light_p,
R.color.ctx_menu_controller_button_text_color_dark_n, R.color.ctx_menu_controller_button_text_color_dark_p);
button.setTextColor(buttonColorStateList);
button.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
button.setSingleLine(true);
button.setEllipsize(TextUtils.TruncateAt.END);
button.setOnClickListener(onClickListener);
button.setAllCaps(true);
button.setText(btnText);
Drawable normal = app.getUIUtilities().getIcon(R.drawable.ic_action_read_text,
light ? R.color.ctx_menu_controller_button_text_color_light_n : R.color.ctx_menu_controller_button_text_color_dark_n);
Drawable pressed = app.getUIUtilities().getIcon(R.drawable.ic_action_read_text,
light ? R.color.ctx_menu_controller_button_text_color_light_p : R.color.ctx_menu_controller_button_text_color_dark_p);
AndroidUtils.setCompoundDrawablesWithIntrinsicBounds(button, Build.VERSION.SDK_INT >= 21
? AndroidUtils.createPressedStateListDrawable(normal, pressed) : normal, null, null, null);
button.setCompoundDrawablePadding(dpToPx(8f));
container.addView(button);
}
public boolean hasCustomAddressLine() {
return false;
}
@ -1144,7 +1257,9 @@ public class MenuBuilder {
controller.setOnBackButtonClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mapContextMenu.show();
if (mapContextMenu != null) {
mapContextMenu.show();
}
}
});
controller.setOnTitleClickListener(new OnClickListener() {

View file

@ -2,10 +2,8 @@ package net.osmand.plus.mapcontextmenu.builders;
import android.content.Context;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.text.TextUtils;
import android.text.util.Linkify;
import android.view.Gravity;
@ -15,10 +13,6 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.view.ContextThemeWrapper;
import androidx.core.content.ContextCompat;
import net.osmand.AndroidUtils;
import net.osmand.PlatformUtil;
import net.osmand.data.Amenity;
@ -31,7 +25,6 @@ import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.Version;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.helpers.FontCache;
import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.mapcontextmenu.CollapsableView;
import net.osmand.plus.mapcontextmenu.MenuBuilder;
@ -67,6 +60,9 @@ import java.util.Locale;
import java.util.Map;
import java.util.Set;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
public class AmenityMenuBuilder extends MenuBuilder {
private static final String WIKI_LINK = ".wikipedia.org/w";
@ -259,38 +255,12 @@ public class AmenityMenuBuilder extends MenuBuilder {
}
if (isWiki) {
TextViewEx button = new TextViewEx(new ContextThemeWrapper(view.getContext(), light ? R.style.OsmandLightTheme : R.style.OsmandDarkTheme));
LinearLayout.LayoutParams llWikiButtonParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, dpToPx(36f));
AndroidUtils.setMargins(llWikiButtonParams, dpToPx(16f), 0, 0, dpToPx(16f));
button.setLayoutParams(llWikiButtonParams);
button.setTypeface(FontCache.getRobotoMedium(app));
button.setBackgroundResource(light ? R.drawable.context_menu_controller_bg_light : R.drawable.context_menu_controller_bg_dark);
button.setTextSize(14);
int paddingSides = dpToPx(10f);
button.setPadding(paddingSides, 0, paddingSides, 0);
ColorStateList buttonColorStateList = AndroidUtils.createPressedColorStateList(view.getContext(), !light,
R.color.ctx_menu_controller_button_text_color_light_n, R.color.ctx_menu_controller_button_text_color_light_p,
R.color.ctx_menu_controller_button_text_color_dark_n, R.color.ctx_menu_controller_button_text_color_dark_p);
button.setTextColor(buttonColorStateList);
button.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
button.setSingleLine(true);
button.setEllipsize(TextUtils.TruncateAt.END);
button.setOnClickListener(new View.OnClickListener() {
buildReadFullButton(llText, app.getString(R.string.context_menu_read_full_article), new View.OnClickListener() {
@Override
public void onClick(View view) {
WikipediaDialogFragment.showInstance(mapActivity, amenity);
}
});
button.setAllCaps(true);
button.setText(R.string.context_menu_read_full_article);
Drawable normal = app.getUIUtilities().getIcon(R.drawable.ic_action_read_text,
light ? R.color.ctx_menu_controller_button_text_color_light_n : R.color.ctx_menu_controller_button_text_color_dark_n);
Drawable pressed = app.getUIUtilities().getIcon(R.drawable.ic_action_read_text,
light ? R.color.ctx_menu_controller_button_text_color_light_p : R.color.ctx_menu_controller_button_text_color_dark_p);
AndroidUtils.setCompoundDrawablesWithIntrinsicBounds(button, Build.VERSION.SDK_INT >= 21
? AndroidUtils.createPressedStateListDrawable(normal, pressed) : normal, null, null, null);
button.setCompoundDrawablePadding(dpToPx(8f));
llText.addView(button);
}
((LinearLayout) view).addView(baseView);

View file

@ -4,8 +4,6 @@ import android.content.Context;
import android.view.View;
import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import net.osmand.PlatformUtil;
import net.osmand.ResultMatcher;
import net.osmand.binary.BinaryMapIndexReader;
@ -19,8 +17,8 @@ import net.osmand.osm.PoiCategory;
import net.osmand.plus.FavouritesDbHelper.FavoriteGroup;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.mapcontextmenu.MenuBuilder;
import net.osmand.plus.mapcontextmenu.CollapsableView;
import net.osmand.plus.mapcontextmenu.MenuBuilder;
import net.osmand.plus.myplaces.FavoritesActivity;
import net.osmand.plus.widgets.TextViewEx;
import net.osmand.util.Algorithms;
@ -29,6 +27,8 @@ import net.osmand.util.MapUtils;
import java.io.IOException;
import java.util.List;
import androidx.annotation.NonNull;
public class FavouritePointMenuBuilder extends MenuBuilder {
private static final org.apache.commons.logging.Log LOG = PlatformUtil.getLog(FavouritePointMenuBuilder.class);
@ -85,7 +85,7 @@ public class FavouritePointMenuBuilder extends MenuBuilder {
protected void buildDescription(View view) {
String desc = fav.getDescription();
if (!Algorithms.isEmpty(desc)) {
buildDescriptionRow(view, app.getString(R.string.shared_string_description), desc, 0, 10, true);
buildDescriptionRow(view, desc);
}
}

View file

@ -4,10 +4,6 @@ import android.content.Context;
import android.view.View;
import android.widget.LinearLayout;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.IndexConstants;
@ -30,6 +26,10 @@ import java.text.DateFormat;
import java.util.Date;
import java.util.List;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
public class WptPtMenuBuilder extends MenuBuilder {
private final WptPt wpt;
@ -52,10 +52,22 @@ public class WptPtMenuBuilder extends MenuBuilder {
}
@Override
protected void buildDescription(View view) {
if (!Algorithms.isEmpty(wpt.desc)) {
buildDescriptionRow(view, app.getString(R.string.shared_string_description), wpt.desc, 0, 10, true);
protected void buildDescription(final View view) {
if (Algorithms.isEmpty(wpt.desc)) {
return;
}
final String textPrefix = app.getString(R.string.shared_string_description);
View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
POIMapLayer.showDescriptionDialog(view.getContext(), app, wpt.desc, textPrefix);
}
};
buildRow(view, null, null, textPrefix, wpt.desc, 0,
null, false, null, true, 10,
false, false, false, clickListener, matchWidthDivider);
}
@Override

View file

@ -45,7 +45,9 @@ public class SelectedGpxMenuController extends MenuController {
mapContextMenu.hide(false);
WptPt wptPt = selectedGpxPoint.selectedPoint;
LatLon latLon = new LatLon(wptPt.lat, wptPt.lon);
TrackMenuFragment.showInstance(mapActivity, selectedGpxPoint.getSelectedGpxFile(), latLon);
SelectedGpxFile selectedGpxFile = selectedGpxPoint.getSelectedGpxFile();
String path = selectedGpxFile.getGpxFile().path;
TrackMenuFragment.showInstance(mapActivity, path, selectedGpxFile.isShowCurrentTrack(), latLon);
}
};
leftTitleButtonController.caption = mapActivity.getString(R.string.shared_string_open_track);

View file

@ -1,6 +1,7 @@
package net.osmand.plus.mapcontextmenu.controllers;
import android.graphics.drawable.Drawable;
import android.util.Pair;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
@ -11,25 +12,27 @@ import net.osmand.data.LatLon;
import net.osmand.data.PointDescription;
import net.osmand.plus.GpxSelectionHelper;
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
import net.osmand.plus.mapmarkers.MapMarkersHelper;
import net.osmand.plus.mapmarkers.MapMarker;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.base.PointImageDrawable;
import net.osmand.plus.mapcontextmenu.MenuBuilder;
import net.osmand.plus.mapcontextmenu.MenuController;
import net.osmand.plus.mapmarkers.MapMarker;
import net.osmand.plus.mapmarkers.MapMarkersHelper;
import net.osmand.plus.track.TrackMenuFragment;
import net.osmand.plus.wikivoyage.menu.WikivoyageWptPtMenuBuilder;
import net.osmand.plus.wikivoyage.menu.WikivoyageWptPtMenuController;
import net.osmand.util.Algorithms;
import java.io.File;
import java.util.ArrayList;
public class WptPtMenuController extends MenuController {
private WptPt wpt;
private MapMarker mapMarker;
public WptPtMenuController(@NonNull MenuBuilder menuBuilder, @NonNull MapActivity mapActivity, @NonNull PointDescription pointDescription, @NonNull final WptPt wpt) {
public WptPtMenuController(@NonNull MenuBuilder menuBuilder, @NonNull MapActivity mapActivity,
@NonNull PointDescription pointDescription, @NonNull final WptPt wpt) {
super(menuBuilder, pointDescription, mapActivity);
this.wpt = wpt;
MapMarkersHelper markersHelper = mapActivity.getMyApplication().getMapMarkersHelper();
@ -37,11 +40,34 @@ public class WptPtMenuController extends MenuController {
if (mapMarker == null) {
mapMarker = markersHelper.getMapMarker(new LatLon(wpt.lat, wpt.lon));
}
TitleButtonController openTrackButtonController = new TitleButtonController() {
@Override
public void buttonPressed() {
MapActivity mapActivity = getMapActivity();
if (mapActivity != null) {
GpxSelectionHelper selectionHelper = mapActivity.getMyApplication().getSelectedGpxHelper();
SelectedGpxFile selectedGpxFile = selectionHelper.getSelectedGPXFile(wpt);
if (selectedGpxFile != null) {
String path = selectedGpxFile.getGpxFile().path;
TrackMenuFragment.showInstance(mapActivity, path, selectedGpxFile.isShowCurrentTrack(), new LatLon(wpt.lon, wpt.lat));
}
}
}
};
openTrackButtonController.startIconId = R.drawable.ic_action_polygom_dark;
openTrackButtonController.caption = mapActivity.getString(R.string.shared_string_open_track);
if (mapMarker != null) {
MapMarkerMenuController markerMenuController =
new MapMarkerMenuController(mapActivity, mapMarker.getPointDescription(mapActivity), mapMarker);
PointDescription description = mapMarker.getPointDescription(mapActivity);
MapMarkerMenuController markerMenuController = new MapMarkerMenuController(mapActivity, description, mapMarker);
leftTitleButtonController = markerMenuController.getLeftTitleButtonController();
rightTitleButtonController = markerMenuController.getRightTitleButtonController();
additionalButtonsControllers = new ArrayList<>();
additionalButtonsControllers.add(Pair.<TitleButtonController, TitleButtonController>create(openTrackButtonController, null));
} else {
leftTitleButtonController = openTrackButtonController;
}
}
@ -143,10 +169,6 @@ public class WptPtMenuController extends MenuController {
}
public static WptPtMenuController getInstance(@NonNull MapActivity mapActivity, @NonNull PointDescription pointDescription, @NonNull final WptPt wpt) {
WptPtMenuController controller = WikivoyageWptPtMenuController.getInstance(mapActivity, pointDescription, wpt);
if (controller == null) {
controller = new WptPtMenuController(new WikivoyageWptPtMenuBuilder(mapActivity, wpt), mapActivity, pointDescription, wpt);
}
return controller;
return new WptPtMenuController(new WikivoyageWptPtMenuBuilder(mapActivity, wpt), mapActivity, pointDescription, wpt);
}
}

View file

@ -1236,11 +1236,10 @@ public class MapMarkersHelper {
removeGroupActiveMarkers(group, true);
return;
}
for (FavouritePoint fp : favGroup.getPoints()) {
List<FavouritePoint> points = new ArrayList<>(favGroup.getPoints());
for (FavouritePoint fp : points) {
addNewMarkerIfNeeded(group, groupMarkers, new LatLon(fp.getLatitude(), fp.getLongitude()), fp.getName(), fp, null);
}
} else if (group.getType() == MapMarkersGroup.GPX_TYPE) {
GpxSelectionHelper gpxHelper = ctx.getSelectedGpxHelper();
File file = new File(group.getId());

View file

@ -10,11 +10,11 @@ import net.osmand.AndroidUtils;
import net.osmand.FileUtils;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.Metadata;
import net.osmand.GPXUtilities.Route;
import net.osmand.GPXUtilities.Track;
import net.osmand.GPXUtilities.TrkSegment;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.GPXUtilities.Metadata;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.Version;
@ -104,6 +104,10 @@ class SaveGpxRouteAsyncTask extends AsyncTask<Void, Void, Exception> {
MeasurementToolFragment.showGpxOnMap(app, gpx, false);
}
}
if (res == null) {
savedGpxFile.addGeneralTrack();
}
return res;
}

View file

@ -143,6 +143,12 @@ public class SaveGPXBottomSheetFragment extends MenuBottomSheetDialogFragment {
return UiUtilities.DialogButtonType.SECONDARY;
}
@Override
protected int getDismissButtonTextId() {
return R.string.shared_string_close;
}
@Override
protected int getRightBottomButtonTextId() {
return R.string.shared_string_open_track;

View file

@ -542,6 +542,7 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment {
mapActivity.getContextMenu().showOrUpdate(
new LatLon(point.getLatitude(), point.getLongitude()),
plugin.getOsmEditsLayer(mapActivity).getObjectName(point), point);
mapActivity.getMapLayers().getContextMenuLayer().updateContextMenu();
}
}
@ -869,6 +870,7 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment {
mapActivity.getContextMenu().showOrUpdate(
new LatLon(point.getLatitude(), point.getLongitude()),
plugin.getOsmEditsLayer(mapActivity).getObjectName(point), point);
mapActivity.getMapLayers().getContextMenuLayer().updateContextMenu();
}
} else {
Toast.makeText(activity, R.string.poi_remove_success, Toast.LENGTH_LONG)

View file

@ -387,6 +387,7 @@ public class OsmBugsLayer extends OsmandMapLayer implements IContextMenuProvider
PointDescription pd = new PointDescription(PointDescription.POINT_TYPE_OSM_BUG, obj.local.getText());
activity.getContextMenu().show(new LatLon(obj.local.getLatitude(), obj.local.getLongitude()),
pd, obj.local);
activity.getMapLayers().getContextMenuLayer().updateContextMenu();
}
} else {
if (action == Action.REOPEN) {

View file

@ -7,6 +7,7 @@ import android.os.AsyncTask;
import android.view.ViewGroup;
import com.github.scribejava.core.builder.api.DefaultApi10a;
import com.github.scribejava.core.exceptions.OAuthException;
import com.github.scribejava.core.model.OAuth1AccessToken;
import com.github.scribejava.core.model.OAuth1RequestToken;
import com.github.scribejava.core.model.OAuthAsyncRequestCallback;
@ -171,6 +172,8 @@ public class OsmOAuthAuthorizationAdapter {
log.error(e);
} catch (XmlPullParserException e) {
log.error(e);
} catch (OAuthException e) {
log.error(e);
}
app.getSettings().OSM_USER_DISPLAY_NAME.set(userName);
}

View file

@ -27,10 +27,14 @@ public abstract class AppModesBottomSheetDialogFragment<T extends AbstractProfil
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setDismissButtonTextId(R.string.shared_string_close);
getData();
}
@Override
protected int getDismissButtonTextId() {
return R.string.shared_string_close;
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);

View file

@ -0,0 +1,253 @@
package net.osmand.plus.track;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.ColorInt;
import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import net.osmand.AndroidUtils;
import net.osmand.GPXUtilities.GPXTrackAnalysis;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayGroup;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType;
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType;
import net.osmand.plus.myplaces.SegmentActionsListener;
import net.osmand.plus.widgets.TextViewEx;
import net.osmand.util.Algorithms;
import java.util.ArrayList;
import java.util.List;
public class GpxBlockStatisticsBuilder {
private final OsmandApplication app;
private RecyclerView blocksView;
private final SelectedGpxFile selectedGpxFile;
private final TrackDisplayHelper displayHelper;
private final GpxDisplayItemType[] filterTypes = {GpxDisplayItemType.TRACK_SEGMENT};
public GpxBlockStatisticsBuilder(OsmandApplication app, SelectedGpxFile selectedGpxFile, TrackDisplayHelper displayHelper) {
this.app = app;
this.selectedGpxFile = selectedGpxFile;
this.displayHelper = displayHelper;
}
public void setBlocksView(RecyclerView blocksView) {
this.blocksView = blocksView;
}
private GPXTrackAnalysis getAnalysis() {
return selectedGpxFile.getTrackAnalysis(app);
}
public void initStatBlocks(SegmentActionsListener actionsListener, @ColorInt int activeColor, boolean nightMode) {
GPXTrackAnalysis analysis = getAnalysis();
float totalDistance = analysis.totalDistance;
float timeSpan = analysis.timeSpan;
String asc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationUp, app);
String desc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationDown, app);
String avg = OsmAndFormatter.getFormattedSpeed(analysis.avgSpeed, app);
String max = OsmAndFormatter.getFormattedSpeed(analysis.maxSpeed, app);
List<StatBlock> items = new ArrayList<>();
prepareData(analysis, items, app.getString(R.string.distance), OsmAndFormatter.getFormattedDistance(totalDistance, app),
R.drawable.ic_action_track_16, R.color.icon_color_default_light, GPXDataSetType.ALTITUDE, GPXDataSetType.SPEED, ItemType.ITEM_DISTANCE);
prepareData(analysis, items, app.getString(R.string.altitude_ascent), asc,
R.drawable.ic_action_arrow_up_16, R.color.gpx_chart_red, GPXDataSetType.SLOPE, null, ItemType.ITEM_ALTITUDE);
prepareData(analysis, items, app.getString(R.string.altitude_descent), desc,
R.drawable.ic_action_arrow_down_16, R.color.gpx_pale_green, GPXDataSetType.ALTITUDE, GPXDataSetType.SLOPE, ItemType.ITEM_ALTITUDE);
prepareData(analysis, items, app.getString(R.string.average_speed), avg,
R.drawable.ic_action_speed_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_SPEED);
prepareData(analysis, items, app.getString(R.string.max_speed), max,
R.drawable.ic_action_max_speed_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_SPEED);
prepareData(analysis, items, app.getString(R.string.shared_string_time_span),
Algorithms.formatDuration((int) (timeSpan / 1000), app.accessibilityEnabled()),
R.drawable.ic_action_time_span_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_TIME);
if (Algorithms.isEmpty(items)) {
AndroidUiHelper.updateVisibility(blocksView, false);
} else {
final BlockStatisticsAdapter sbAdapter = new BlockStatisticsAdapter(items, actionsListener, activeColor, nightMode);
blocksView.setLayoutManager(new LinearLayoutManager(app, LinearLayoutManager.HORIZONTAL, false));
blocksView.setAdapter(sbAdapter);
}
}
public void prepareData(GPXTrackAnalysis analysis, List<StatBlock> listItems, String title,
String value, @DrawableRes int imageResId, @ColorRes int imageColorId,
GPXDataSetType firstType, GPXDataSetType secondType, ItemType itemType) {
StatBlock statBlock = new StatBlock(title, value, imageResId, imageColorId, firstType, secondType, itemType);
switch (statBlock.itemType) {
case ITEM_DISTANCE: {
if (analysis.totalDistance != 0f) {
listItems.add(statBlock);
}
break;
}
case ITEM_ALTITUDE: {
if (analysis.hasElevationData) {
listItems.add(statBlock);
}
break;
}
case ITEM_SPEED: {
if (analysis.isSpeedSpecified()) {
listItems.add(statBlock);
}
break;
}
case ITEM_TIME: {
if (analysis.hasSpeedData) {
listItems.add(statBlock);
}
break;
}
}
}
private void setImageDrawable(ImageView iv, @DrawableRes Integer resId, @ColorRes int color) {
Drawable icon = resId != null ? app.getUIUtilities().getIcon(resId, color)
: UiUtilities.tintDrawable(iv.getDrawable(), getResolvedColor(color));
iv.setImageDrawable(icon);
}
@ColorInt
protected int getResolvedColor(@ColorRes int colorId) {
return ContextCompat.getColor(app, colorId);
}
public class StatBlock {
private final String title;
private final String value;
private final int imageResId;
private final int imageColorId;
private final GPXDataSetType firstType;
private final GPXDataSetType secondType;
private final ItemType itemType;
public StatBlock(String title, String value, @DrawableRes int imageResId, @ColorRes int imageColorId,
GPXDataSetType firstType, GPXDataSetType secondType, ItemType itemType) {
this.title = title;
this.value = value;
this.imageResId = imageResId;
this.imageColorId = imageColorId;
this.firstType = firstType;
this.secondType = secondType;
this.itemType = itemType;
}
}
public enum ItemType {
ITEM_DISTANCE,
ITEM_ALTITUDE,
ITEM_SPEED,
ITEM_TIME;
}
private class BlockStatisticsAdapter extends RecyclerView.Adapter<BlockStatisticsViewHolder> {
@ColorInt
private final int activeColor;
private final List<StatBlock> statBlocks;
private final boolean nightMode;
private final SegmentActionsListener actionsListener;
public BlockStatisticsAdapter(List<StatBlock> statBlocks, SegmentActionsListener actionsListener, @ColorInt int activeColor, boolean nightMode) {
this.statBlocks = statBlocks;
this.actionsListener = actionsListener;
this.activeColor = activeColor;
this.nightMode = nightMode;
}
@Override
public int getItemCount() {
return statBlocks.size();
}
@NonNull
@Override
public BlockStatisticsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_gpx_stat_block, parent, false);
return new BlockStatisticsViewHolder(itemView);
}
@Override
public void onBindViewHolder(BlockStatisticsViewHolder holder, int position) {
final StatBlock item = statBlocks.get(position);
holder.valueText.setText(item.value);
holder.titleText.setText(item.title);
holder.valueText.setTextColor(activeColor);
holder.titleText.setTextColor(app.getResources().getColor(R.color.text_color_secondary_light));
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List<GpxDisplayGroup> groups = displayHelper.getDisplayGroups(filterTypes);
GpxDisplayGroup group = null;
for (GpxDisplayGroup g : groups) {
if (g.isGeneralTrack()) {
group = g;
}
}
if (group == null && !groups.isEmpty()) {
group = groups.get(0);
}
if (group != null) {
GpxDisplayItem displayItem = group.getModifiableList().get(0);
if (displayItem != null && displayItem.analysis != null) {
ArrayList<GPXDataSetType> list = new ArrayList<>();
if (displayItem.analysis.hasElevationData || displayItem.analysis.isSpeedSpecified() || displayItem.analysis.hasSpeedData) {
if (item.firstType != null) {
list.add(item.firstType);
}
if (item.secondType != null) {
list.add(item.secondType);
}
}
displayItem.chartTypes = list.size() > 0 ? list.toArray(new GPXDataSetType[0]) : null;
displayItem.locationOnMap = displayItem.locationStart;
actionsListener.openAnalyzeOnMap(displayItem);
}
}
}
});
setImageDrawable(holder.imageView, item.imageResId, item.imageColorId);
AndroidUtils.setBackgroundColor(app, holder.divider, nightMode, R.color.divider_color_light, R.color.divider_color_dark);
AndroidUiHelper.updateVisibility(holder.divider, position != statBlocks.size() - 1);
}
}
private class BlockStatisticsViewHolder extends RecyclerView.ViewHolder {
private final TextViewEx valueText;
private final TextView titleText;
private final AppCompatImageView imageView;
private final View divider;
public BlockStatisticsViewHolder(View view) {
super(view);
valueText = view.findViewById(R.id.value);
titleText = view.findViewById(R.id.title);
imageView = view.findViewById(R.id.image);
divider = view.findViewById(R.id.divider);
}
}
}

View file

@ -2,73 +2,46 @@ package net.osmand.plus.track;
import android.annotation.SuppressLint;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import net.osmand.AndroidUtils;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.GPXTrackAnalysis;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayGroup;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType;
import net.osmand.plus.myplaces.SegmentActionsListener;
import net.osmand.plus.routepreparationmenu.cards.BaseCard;
import net.osmand.plus.widgets.TextViewEx;
import net.osmand.util.Algorithms;
import java.util.ArrayList;
import java.util.List;
import static net.osmand.plus.myplaces.TrackActivityFragmentAdapter.isGpxFileSelected;
import static net.osmand.plus.track.OptionsCard.APPEARANCE_BUTTON_INDEX;
import static net.osmand.plus.track.OptionsCard.DIRECTIONS_BUTTON_INDEX;
import static net.osmand.plus.track.OptionsCard.EDIT_BUTTON_INDEX;
import static net.osmand.plus.track.OptionsCard.SHOW_ON_MAP_BUTTON_INDEX;
import static net.osmand.plus.track.OverviewCard.StatBlock.ItemType.*;
public class OverviewCard extends BaseCard {
private RecyclerView rvOverview;
private View showButton;
private View appearanceButton;
private View editButton;
private View directionsButton;
private final TrackDisplayHelper displayHelper;
private final GPXFile gpxFile;
private final GpxDisplayItemType[] filterTypes = {GpxDisplayItemType.TRACK_SEGMENT};
private final SegmentActionsListener listener;
private boolean gpxFileSelected;
private GpxDisplayItem gpxItem;
private final SegmentActionsListener actionsListener;
private final SelectedGpxFile selectedGpxFile;
private final GpxBlockStatisticsBuilder blockStatisticsBuilder;
public OverviewCard(@NonNull MapActivity mapActivity, @NonNull TrackDisplayHelper displayHelper,
@NonNull SegmentActionsListener listener) {
@NonNull SegmentActionsListener actionsListener, SelectedGpxFile selectedGpxFile) {
super(mapActivity);
this.displayHelper = displayHelper;
this.listener = listener;
gpxFile = displayHelper.getGpx();
gpxFileSelected = isGpxFileSelected(app, gpxFile);
List<GpxDisplayGroup> groups = displayHelper.getOriginalGroups(filterTypes);
if (!Algorithms.isEmpty(groups)) {
gpxItem = TrackDisplayHelper.flatten(displayHelper.getOriginalGroups(filterTypes)).get(0);
}
this.actionsListener = actionsListener;
this.selectedGpxFile = selectedGpxFile;
blockStatisticsBuilder = new GpxBlockStatisticsBuilder(app, selectedGpxFile, displayHelper);
}
@Override
@ -80,13 +53,15 @@ public class OverviewCard extends BaseCard {
protected void updateContent() {
int iconColorDef = nightMode ? R.color.icon_color_active_dark : R.color.icon_color_active_light;
int iconColorPres = R.color.active_buttons_and_links_text_dark;
GPXFile gpxFile = getGPXFile();
boolean fileAvailable = gpxFile.path != null && !gpxFile.showCurrentTrack;
showButton = view.findViewById(R.id.show_button);
appearanceButton = view.findViewById(R.id.appearance_button);
editButton = view.findViewById(R.id.edit_button);
directionsButton = view.findViewById(R.id.directions_button);
rvOverview = view.findViewById(R.id.recycler_overview);
RecyclerView blocksView = view.findViewById(R.id.recycler_overview);
blockStatisticsBuilder.setBlocksView(blocksView);
initShowButton(iconColorDef, iconColorPres);
initAppearanceButton(iconColorDef, iconColorPres);
@ -94,51 +69,16 @@ public class OverviewCard extends BaseCard {
initEditButton(iconColorDef, iconColorPres);
initDirectionsButton(iconColorDef, iconColorPres);
}
initStatBlocks();
blockStatisticsBuilder.initStatBlocks(actionsListener, getActiveColor(), nightMode);
}
void initStatBlocks() {
if (gpxItem != null) {
GPXTrackAnalysis analysis = gpxItem.analysis;
boolean joinSegments = displayHelper.isJoinSegments();
float totalDistance = !joinSegments && gpxItem.isGeneralTrack() ? analysis.totalDistanceWithoutGaps : analysis.totalDistance;
float timeSpan = !joinSegments && gpxItem.isGeneralTrack() ? analysis.timeSpanWithoutGaps : analysis.timeSpan;
String asc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationUp, app);
String desc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationDown, app);
String avg = OsmAndFormatter.getFormattedSpeed(analysis.avgSpeed, app);
String max = OsmAndFormatter.getFormattedSpeed(analysis.maxSpeed, app);
List<StatBlock> items = new ArrayList<>();
StatBlock.prepareData(analysis, items, app.getString(R.string.distance), OsmAndFormatter.getFormattedDistance(totalDistance, app),
R.drawable.ic_action_track_16, R.color.icon_color_default_light, GPXDataSetType.ALTITUDE, GPXDataSetType.SPEED, ITEM_DISTANCE);
StatBlock.prepareData(analysis, items, app.getString(R.string.altitude_ascent), asc,
R.drawable.ic_action_arrow_up_16, R.color.gpx_chart_red, GPXDataSetType.SLOPE, null, ITEM_ALTITUDE);
StatBlock.prepareData(analysis, items, app.getString(R.string.altitude_descent), desc,
R.drawable.ic_action_arrow_down_16, R.color.gpx_pale_green, GPXDataSetType.ALTITUDE, GPXDataSetType.SLOPE, ITEM_ALTITUDE);
StatBlock.prepareData(analysis, items, app.getString(R.string.average_speed), avg,
R.drawable.ic_action_speed_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ITEM_SPEED);
StatBlock.prepareData(analysis, items, app.getString(R.string.max_speed), max,
R.drawable.ic_action_max_speed_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ITEM_SPEED);
StatBlock.prepareData(analysis, items, app.getString(R.string.shared_string_time_span),
Algorithms.formatDuration((int) (timeSpan / 1000), app.accessibilityEnabled()),
R.drawable.ic_action_time_span_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ITEM_TIME);
if (Algorithms.isEmpty(items)) {
AndroidUiHelper.updateVisibility(rvOverview, false);
} else {
final StatBlockAdapter sbAdapter = new StatBlockAdapter(items);
rvOverview.setLayoutManager(new LinearLayoutManager(app, LinearLayoutManager.HORIZONTAL, false));
rvOverview.setAdapter(sbAdapter);
}
} else {
AndroidUiHelper.updateVisibility(rvOverview, false);
}
private GPXFile getGPXFile() {
return selectedGpxFile.getGpxFile();
}
@DrawableRes
private int getActiveShowHideIcon() {
gpxFileSelected = isGpxFileSelected(app, gpxFile);
return gpxFileSelected ? R.drawable.ic_action_view : R.drawable.ic_action_hide;
return isGpxFileSelected(app, getGPXFile()) ? R.drawable.ic_action_view : R.drawable.ic_action_hide;
}
private void initShowButton(final int iconColorDef, final int iconColorPres) {
@ -207,135 +147,4 @@ public class OverviewCard extends BaseCard {
}
});
}
private class StatBlockAdapter extends RecyclerView.Adapter<StatBlockViewHolder> {
private final List<StatBlock> statBlocks;
public StatBlockAdapter(List<StatBlock> StatBlocks) {
this.statBlocks = StatBlocks;
}
@Override
public int getItemCount() {
return statBlocks.size();
}
@NonNull
@Override
public StatBlockViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_gpx_stat_block, parent, false);
return new StatBlockViewHolder(itemView);
}
@Override
public void onBindViewHolder(StatBlockViewHolder holder, int position) {
final StatBlock item = statBlocks.get(position);
holder.valueText.setText(item.value);
holder.titleText.setText(item.title);
holder.valueText.setTextColor(getActiveColor());
holder.titleText.setTextColor(app.getResources().getColor(R.color.text_color_secondary_light));
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (gpxItem != null && gpxItem.analysis != null) {
ArrayList<GPXDataSetType> list = new ArrayList<>();
if (gpxItem.analysis.hasElevationData || gpxItem.analysis.isSpeedSpecified() || gpxItem.analysis.hasSpeedData) {
if (item.firstType != null) {
list.add(item.firstType);
}
if (item.secondType != null) {
list.add(item.secondType);
}
}
gpxItem.chartTypes = list.size() > 0 ? list.toArray(new GPXDataSetType[0]) : null;
gpxItem.locationOnMap = gpxItem.locationStart;
listener.openAnalyzeOnMap(gpxItem);
}
}
});
setImageDrawable(holder.imageView, item.imageResId, item.imageColorId);
AndroidUtils.setBackgroundColor(view.getContext(), holder.divider, nightMode, R.color.divider_color_light, R.color.divider_color_dark);
AndroidUiHelper.updateVisibility(holder.divider, position != statBlocks.size() - 1);
}
}
private static class StatBlockViewHolder extends RecyclerView.ViewHolder {
private final TextViewEx valueText;
private final TextView titleText;
private final AppCompatImageView imageView;
private final View divider;
StatBlockViewHolder(View view) {
super(view);
valueText = view.findViewById(R.id.value);
titleText = view.findViewById(R.id.title);
imageView = view.findViewById(R.id.image);
divider = view.findViewById(R.id.divider);
}
}
protected static class StatBlock {
private final String title;
private final String value;
private final int imageResId;
private final int imageColorId;
private final GPXDataSetType firstType;
private final GPXDataSetType secondType;
private final ItemType itemType;
public StatBlock(String title, String value, @DrawableRes int imageResId, @ColorRes int imageColorId,
GPXDataSetType firstType, GPXDataSetType secondType, ItemType itemType) {
this.title = title;
this.value = value;
this.imageResId = imageResId;
this.imageColorId = imageColorId;
this.firstType = firstType;
this.secondType = secondType;
this.itemType = itemType;
}
public static void prepareData(GPXTrackAnalysis analysis, List<StatBlock> listItems, String title,
String value, @DrawableRes int imageResId, @ColorRes int imageColorId,
GPXDataSetType firstType, GPXDataSetType secondType, ItemType itemType) {
StatBlock statBlock = new StatBlock(title, value, imageResId, imageColorId, firstType, secondType, itemType);
switch (statBlock.itemType) {
case ITEM_DISTANCE: {
if (analysis.totalDistance != 0f) {
listItems.add(statBlock);
}
break;
}
case ITEM_ALTITUDE: {
if (analysis.hasElevationData) {
listItems.add(statBlock);
}
break;
}
case ITEM_SPEED: {
if (analysis.isSpeedSpecified()) {
listItems.add(statBlock);
}
break;
}
case ITEM_TIME: {
if (analysis.hasSpeedData) {
listItems.add(statBlock);
}
break;
}
}
}
public enum ItemType {
ITEM_DISTANCE,
ITEM_ALTITUDE,
ITEM_SPEED,
ITEM_TIME;
}
}
}

View file

@ -312,7 +312,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
}
headerContainer.addView(overviewCard.getView());
} else {
overviewCard = new OverviewCard(getMapActivity(), displayHelper, this);
overviewCard = new OverviewCard(getMapActivity(), displayHelper, this, selectedGpxFile);
overviewCard.setListener(this);
headerContainer.addView(overviewCard.build(getMapActivity()));
}
@ -897,6 +897,9 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
@Override
public void updateContent() {
if (overviewCard != null) {
overviewCard.updateContent();
}
if (segmentsCard != null) {
segmentsCard.updateContent();
}
@ -1096,7 +1099,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
boolean currentRecording = file == null;
String path = file != null ? file.getAbsolutePath() : null;
if (context instanceof MapActivity) {
TrackMenuFragment.showInstance((MapActivity) context, path, currentRecording);
TrackMenuFragment.showInstance((MapActivity) context, path, currentRecording, null);
} else {
Bundle bundle = new Bundle();
bundle.putString(TRACK_FILE_NAME, path);
@ -1106,7 +1109,8 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
}
}
public static void showInstance(@NonNull final MapActivity mapActivity, @Nullable String path, boolean showCurrentTrack) {
public static void showInstance(@NonNull final MapActivity mapActivity, @Nullable String path,
boolean showCurrentTrack, @Nullable final LatLon latLon) {
OsmandApplication app = mapActivity.getMyApplication();
SelectedGpxFile selectedGpxFile;
if (showCurrentTrack) {
@ -1115,7 +1119,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
selectedGpxFile = app.getSelectedGpxHelper().getSelectedFileByPath(path);
}
if (selectedGpxFile != null) {
showInstance(mapActivity, selectedGpxFile, null);
showInstance(mapActivity, selectedGpxFile, latLon);
} else if (!Algorithms.isEmpty(path)) {
String title = app.getString(R.string.loading_smth, "");
final ProgressDialog progress = ProgressDialog.show(mapActivity, title, app.getString(R.string.loading_data));
@ -1129,7 +1133,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
OsmandApplication app = mapActivity.getMyApplication();
SelectedGpxFile selectedGpxFile = app.getSelectedGpxHelper().selectGpxFile(result, true, false);
if (selectedGpxFile != null) {
showInstance(mapActivity, selectedGpxFile, null);
showInstance(mapActivity, selectedGpxFile, latLon);
}
}
if (progress != null && AndroidUtils.isActivityNotDestroyed(mapActivity)) {

View file

@ -3,9 +3,11 @@ package net.osmand.plus.views.layers;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.PointF;
import android.graphics.drawable.Drawable;
import android.text.util.Linkify;
import android.util.Base64;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
@ -41,6 +43,7 @@ import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.views.OsmandMapLayer;
import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.views.layers.MapTextLayer.MapTextProvider;
import net.osmand.plus.widgets.WebViewEx;
import net.osmand.util.Algorithms;
import java.util.ArrayList;
@ -272,7 +275,39 @@ public class POIMapLayer extends OsmandMapLayer implements ContextMenuLayer.ICon
}
public static void showDescriptionDialog(Context ctx, OsmandApplication app, String text, String title) {
showText(ctx, app, text, title);
final TextView textView = new TextView(ctx);
LinearLayout.LayoutParams llTextParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
int textMargin = dpToPx(app, 10f);
boolean light = app.getSettings().isLightContent();
textView.setLayoutParams(llTextParams);
textView.setPadding(textMargin, textMargin, textMargin, textMargin);
textView.setTextSize(16);
textView.setTextColor(ContextCompat.getColor(app, light ? R.color.text_color_primary_light : R.color.text_color_primary_dark));
textView.setAutoLinkMask(Linkify.ALL);
textView.setLinksClickable(true);
textView.setText(text);
showText(ctx, app, textView, title);
}
public static void showHtmlDescriptionDialog(Context ctx, OsmandApplication app, String html, String title) {
final WebViewEx webView = new WebViewEx(ctx);
LinearLayout.LayoutParams llTextParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
webView.setLayoutParams(llTextParams);
int margin = dpToPx(app, 10f);
webView.setPadding(margin, margin, margin, margin);
webView.setScrollbarFadingEnabled(true);
webView.setVerticalScrollBarEnabled(false);
webView.setBackgroundColor(Color.TRANSPARENT);
webView.getSettings().setTextZoom((int) (app.getResources().getConfiguration().fontScale * 100f));
boolean light = app.getSettings().isLightContent();
int textColor = ContextCompat.getColor(app, light ? R.color.text_color_primary_light : R.color.text_color_primary_dark);
String rgbHex = Algorithms.colorToString(textColor);
html = "<body style=\"color:" + rgbHex + ";\">" + html + "</body>";
String encoded = Base64.encodeToString(html.getBytes(), Base64.NO_PADDING);
webView.loadData(encoded, "text/html", "base64");
showText(ctx, app, webView, title);
}
static int getResIdFromAttribute(final Context ctx, final int attr) {
@ -284,7 +319,7 @@ public class POIMapLayer extends OsmandMapLayer implements ContextMenuLayer.ICon
return typedvalueattr.resourceId;
}
private static void showText(final Context ctx, final OsmandApplication app, final String text, String title) {
private static void showText(final Context ctx, final OsmandApplication app, final View view, String title) {
final Dialog dialog = new Dialog(ctx,
app.getSettings().isLightContent() ? R.style.OsmandLightTheme : R.style.OsmandDarkTheme);
@ -306,24 +341,12 @@ public class POIMapLayer extends OsmandMapLayer implements ContextMenuLayer.ICon
}
});
final TextView textView = new TextView(ctx);
LinearLayout.LayoutParams llTextParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
int textMargin = dpToPx(app, 10f);
boolean light = app.getSettings().isLightContent();
textView.setLayoutParams(llTextParams);
textView.setPadding(textMargin, textMargin, textMargin, textMargin);
textView.setTextSize(16);
textView.setTextColor(ContextCompat.getColor(app, light ? R.color.text_color_primary_light : R.color.text_color_primary_dark));
textView.setAutoLinkMask(Linkify.ALL);
textView.setLinksClickable(true);
textView.setText(text);
ScrollView scrollView = new ScrollView(ctx);
ll.addView(topBar);
LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0);
lp.weight = 1;
ll.addView(scrollView, lp);
scrollView.addView(textView);
scrollView.addView(view);
dialog.setContentView(ll);
dialog.setCancelable(true);

View file

@ -130,7 +130,9 @@ public class PointLocationLayer extends OsmandMapLayer implements ContextMenuLay
canvas.restore();
}
// Issue 5538: Some devices return positives for hasBearing() at rest, hence add 0.0 check:
boolean isBearing = lastKnownLocation.hasBearing() && (lastKnownLocation.getBearing() != 0.0);
boolean isBearing = lastKnownLocation.hasBearing() && (lastKnownLocation.getBearing() != 0.0)
&& (!lastKnownLocation.hasSpeed() || lastKnownLocation.getSpeed() > 0.1);
if (!locationOutdated && isBearing) {
float bearing = lastKnownLocation.getBearing();
canvas.rotate(bearing - 90, locationX, locationY);

View file

@ -2,8 +2,6 @@ package net.osmand.plus.wikivoyage.menu;
import android.view.View;
import androidx.annotation.NonNull;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
@ -12,6 +10,8 @@ import net.osmand.util.Algorithms;
import java.util.HashMap;
import androidx.annotation.NonNull;
public class WikivoyageWptPtMenuBuilder extends WptPtMenuBuilder {
private final static String KEY_PHONE = "Phone: ";
@ -30,12 +30,13 @@ public class WikivoyageWptPtMenuBuilder extends WptPtMenuBuilder {
@Override
protected void buildDescription(View view) {
final String desc = descTokens.get(KEY_DESCRIPTION);
String desc = descTokens.get(KEY_DESCRIPTION);
if (!Algorithms.isEmpty(desc)) {
buildDescriptionRow(view, app.getString(R.string.shared_string_description), desc, 0, 10, true);
buildDescriptionRow(view, desc);
}
}
@Override
protected void prepareDescription(final WptPt wpt, View view) {
String phones = descTokens.get(KEY_PHONE);