Merge branch 'master' of ssh://github.com/osmandapp/Osmand into sensors_innacuracy

This commit is contained in:
PavelRatushny 2017-09-04 16:36:00 +03:00
commit 0396aa5300
95 changed files with 1776 additions and 319 deletions

View file

@ -15,7 +15,6 @@ import java.io.RandomAccessFile;
import java.text.DecimalFormat;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
@ -72,19 +71,19 @@ public class BinaryInspector {
// test cases show info
if ("test".equals(args[0])) {
in.inspector(new String[] {
// "-vpoi",
"-vmap", "-vmapobjects", // "-vmapcoordinates",
"-vpoi",
// "-vmap", "-vmapobjects",
// "-vmapcoordinates",
// "-vrouting",
// "-vtransport",
// "-vaddress", "-vcities","-vstreetgroups",
// "-vstreets", "-vbuildings", "-vintersections",
// "-lang=ru",
// "-bbox=30.4981,50.4424,30.5195,50.4351",
// "-osm="+System.getProperty("maps.dir")+"/map_full.obf.osm",
System.getProperty("maps.dir")+"/diff/2017_08_28_01_00.obf"
// System.getProperty("maps.dir")+"../temp/kiev/Ukraine_kiev-city_europe_17_06_05.obf",
// System.getProperty("maps.dir")+"Ukraine_kiev-city_europe_2.obf",
// "-osm="+System.getProperty("maps.dir")+"/map_full_1.obf.osm",
System.getProperty("maps.dir")+"/diff/Bulgaria_europe_01_00.obf"
// System.getProperty("maps.dir")+"/diff/Diff.obf"
// System.getProperty("maps.dir")+"/Ukraine_kiev-city_europe_2.obf"
});
} else {
in.inspector(args);
@ -895,7 +894,6 @@ public class BinaryInspector {
} catch (IOException e) {
throw new RuntimeException(e);
}
// } else if(obj.getId() >> 1 == 205743436l) {
} else {
printMapDetails(obj, b, vInfo.vmapCoordinates);
println(b.toString());
@ -923,7 +921,7 @@ public class BinaryInspector {
}
private static void printMapDetails(BinaryMapDataObject obj, StringBuilder b, boolean vmapCoordinates) {
public static void printMapDetails(BinaryMapDataObject obj, StringBuilder b, boolean vmapCoordinates) {
boolean multipolygon = obj.getPolygonInnerCoordinates() != null && obj.getPolygonInnerCoordinates().length > 0;
if (multipolygon) {
b.append("Multipolygon");
@ -1242,7 +1240,7 @@ public class BinaryInspector {
}
}
println(object.getType().getKeyName() + " : " + object.getSubType() + " " + object.getName() + " " + object.getLocation() + " id=" + (object.getId() >> 1) + " " + s);
println(object.getType().getKeyName() + ": " + object.getSubType() + " " + object.getName() + " " + object.getLocation() + " osmid=" + (object.getId() >> 1) + " " + s);
return false;
}

View file

@ -196,19 +196,37 @@ public class BinaryMapDataObject {
}
public boolean compareBinary(BinaryMapDataObject thatObj) {
public boolean compareBinary(BinaryMapDataObject thatObj, int coordinatesPrecision) {
if(this.objectType == thatObj.objectType
&& this.id == thatObj.id
&& this.area == thatObj.area
&& Arrays.equals(this.polygonInnerCoordinates, thatObj.polygonInnerCoordinates)
&& Arrays.equals(this.coordinates, thatObj.coordinates) ) {
&& compareCoordinates(this.coordinates, thatObj.coordinates, coordinatesPrecision) ) {
if(mapIndex == null) {
throw new IllegalStateException("Illegal binary object: " + id);
}
if(thatObj.mapIndex == null) {
throw new IllegalStateException("Illegal binary object: " + thatObj.id);
}
boolean equals = true;
if(equals) {
if(polygonInnerCoordinates == null || thatObj.polygonInnerCoordinates == null) {
equals = polygonInnerCoordinates == thatObj.polygonInnerCoordinates;
} else if(polygonInnerCoordinates.length != thatObj.polygonInnerCoordinates.length){
equals = false;
} else {
for(int i = 0; i < polygonInnerCoordinates.length && equals; i++) {
if(polygonInnerCoordinates[i] == null || thatObj.polygonInnerCoordinates[i] == null) {
equals = polygonInnerCoordinates[i] == thatObj.polygonInnerCoordinates[i];
} else if(polygonInnerCoordinates[i].length != thatObj.polygonInnerCoordinates[i].length){
equals = false;
} else {
equals = compareCoordinates(polygonInnerCoordinates[i], thatObj.polygonInnerCoordinates[i], coordinatesPrecision);
}
}
}
}
if(equals) {
if(types == null || thatObj.types == null) {
equals = types == thatObj.types;
@ -218,7 +236,7 @@ public class BinaryMapDataObject {
for(int i = 0; i < types.length && equals; i++) {
TagValuePair o = mapIndex.decodeType(types[i]);
TagValuePair s = thatObj.mapIndex.decodeType(thatObj.types[i]);
equals = o.equals(s);
equals = o.equals(s) && equals;
}
}
}
@ -265,11 +283,81 @@ public class BinaryMapDataObject {
return equals;
}
// thatObj.mapIndex.decodeType(thatObj.types[0])
// mapIndex.decodeType(types[0]) id >>7
return false;
}
private static boolean compareCoordinates(int[] coordinates, int[] coordinates2, int precision) {
if(precision == 0) {
return Arrays.equals(coordinates, coordinates2);
}
TIntArrayList cd = simplify(coordinates, precision);
TIntArrayList cd2 = simplify(coordinates2, precision);
return cd.equals(cd2);
}
private static TIntArrayList simplify(int[] c, int precision) {
int len = c.length / 2;
TIntArrayList lt = new TIntArrayList(len * 3);
for (int i = 0; i < len; i++) {
lt.add(0);
lt.add(c[i * 2]);
lt.add(c[i * 2 + 1]);
}
lt.set(0, 1);
lt.set((len - 1) * 3, 1);
simplifyLine(lt, precision, 0, len - 1);
TIntArrayList res = new TIntArrayList(len * 2);
for (int i = 0; i < len; i++) {
if (lt.get(i * 3) == 1) {
res.add(lt.get(i * 3 + 1));
res.add(lt.get(i * 3 + 2));
}
}
return res;
}
private static double orthogonalDistance(int x, int y, int x1, int y1, int x2, int y2) {
long A = (x - x1);
long B = (y - y1);
long C = (x2 - x1);
long D = (y2 - y1);
return Math.abs(A * D - C * B) / Math.sqrt(C * C + D * D);
}
private static void simplifyLine(TIntArrayList lt, int precision, int start, int end) {
if(start == end - 1) {
return;
}
int x = lt.get(start*3 + 1);
int y = lt.get(start*3 + 2);
int ex = lt.get(end*3 + 1);
int ey = lt.get(end*3 + 2);
double max = 0;
int maxK = -1;
for(int k = start + 1; k < end ; k++) {
double ld = orthogonalDistance(lt.get(k*3 + 1), lt.get(k*3 + 2), x, y, ex, ey);
if(maxK == -1 || max < ld) {
maxK = k;
max = ld;
}
}
if(max < precision) {
return;
}
lt.set(maxK*3, 1); // keep point
simplifyLine(lt, precision, start, maxK);
simplifyLine(lt, precision, maxK, end);
}
public int[] getCoordinates() {
return coordinates;
}

View file

@ -77,11 +77,7 @@ public class RouteDataObject {
boolean equals = true;
equals = equals && Arrays.equals(this.restrictions, thatObj.restrictions);
if (equals) {
if (this.names != null && thatObj.names != null) {
equals = Arrays.equals(this.names.values(), thatObj.names.values());
}
}
if (equals) {
if (this.types == null || thatObj.types == null) {
equals = this.types == thatObj.types;
@ -158,7 +154,7 @@ public class RouteDataObject {
}
}
}
return equals;
}
return false;
}
@ -398,6 +394,10 @@ public class RouteDataObject {
return (int) (restrictions[i] & RESTRICTION_MASK);
}
public long getRawRestriction(int i) {
return restrictions[i];
}
public long getRestrictionId(int i) {
return restrictions[i] >> RESTRICTION_SHIFT;
}

View file

@ -36,8 +36,9 @@ public class Amenity extends MapObject {
private String openingHours;
private Map<String, String> additionalInfo;
private AmenityRoutePoint routePoint; // for search on path
private TIntArrayList x;
// context menu geometry;
private TIntArrayList y;
private TIntArrayList x;
public Amenity() {
}
@ -65,20 +66,6 @@ public class Amenity extends MapObject {
this.subType = subType;
}
public TIntArrayList getX() {
if (x == null) {
x = new TIntArrayList();
}
return x;
}
public TIntArrayList getY() {
if (y == null) {
y = new TIntArrayList();
}
return y;
}
public String getOpeningHours() {
// getAdditionalInfo("opening_hours");
return openingHours;
@ -271,6 +258,19 @@ public class Amenity extends MapObject {
setAdditionalInfo(OPENING_HOURS, openingHours);
}
public boolean comparePoi(Amenity thatObj) {
if (this.id.longValue() == thatObj.id.longValue() &&
Algorithms.objectEquals(this.type.getKeyName(), thatObj.type.getKeyName()) &&
Algorithms.objectEquals(getLocation(), thatObj.getLocation()) &&
Algorithms.objectEquals(this.subType, thatObj.subType) &&
Algorithms.objectEquals(this.additionalInfo, thatObj.additionalInfo) &&
Algorithms.objectEquals(this.getNamesMap(true), thatObj.getNamesMap(true))) {
return true;
}
return false;
}
@Override
public int compareTo(MapObject o) {
int cmp = super.compareTo(o);
@ -293,4 +293,18 @@ public class Amenity extends MapObject {
}
return res;
}
public TIntArrayList getY() {
if(y == null) {
y = new TIntArrayList();
}
return y;
}
public TIntArrayList getX() {
if (x == null) {
x = new TIntArrayList();
}
return x;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -101,7 +101,7 @@
android:layout_toLeftOf="@id/up_down_button"
android:layout_toRightOf="@id/measurement_points_text_view"
android:layout_toStartOf="@id/up_down_button"
android:textColor="?android:textColorSecondary"
android:textColor="@color/color_distance"
android:textSize="@dimen/default_list_text_size"
tools:text=" 700 m"/>

View file

@ -96,7 +96,7 @@
android:layout_toLeftOf="@id/up_down_button"
android:layout_toRightOf="@id/measurement_points_text_view"
android:layout_toStartOf="@id/up_down_button"
android:textColor="?android:textColorSecondary"
android:textColor="@color/color_distance"
android:textSize="@dimen/default_list_text_size"
tools:text=" 700 m"/>

View file

@ -78,7 +78,8 @@
android:text="•"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_sub_text_size"
android:visibility="gone"/>
android:visibility="gone"
tools:visibility="visible"/>
<android.support.v7.widget.AppCompatTextView
android:id="@+id/map_marker_description"
@ -101,12 +102,12 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:layout_marginBottom="16dp"
android:layout_marginLeft="14dp"
android:layout_marginRight="14dp"
android:layout_marginTop="16dp"
android:background="?attr/selectableItemBackground"
android:focusableInTouchMode="true"
android:paddingBottom="16dp"
android:paddingLeft="14dp"
android:paddingRight="14dp"
android:paddingTop="16dp"
tools:src="@drawable/ic_overflow_menu_white"/>
</LinearLayout>

View file

@ -336,7 +336,7 @@
<string name="map_widget_plain_time">Hazırki vaxt</string>
<string name="selected_gpx_info_show">"
\n
\nXəritədə görmək üçün basıb saxlayın"</string>
\nXəritədə görmək üçün uzun basın"</string>
<string name="local_index_gpx_info_show">"
\n
\nSeçimlər üçün basıb saxlayın"</string>
@ -472,7 +472,7 @@
<string name="map_widget_renderer">Xəritə stili</string>
<string name="map_widget_show_ruler">Xətkeş</string>
<string name="map_widget_transparent">Şəffaf widget-lər</string>
<string name="screen_is_locked">Ekran kilidini açmaq üçün kilid ikonuna basın</string>
<string name="screen_is_locked">Ekran kilidini açmaq üçün kilid ikonuna toxunun</string>
<string name="map_widget_top_text">Küçə adı</string>
<string name="map_widget_back_to_loc">Haradayam</string>
<string name="map_widget_compass">Kompas</string>
@ -842,7 +842,7 @@
<string name="osm_live_subscription_desc">Abunəlik bütün qlobal xəritələr üçün saatlıq, günlük, həftəlik yenilənmələri və limitsiz endirmələri təmin edir.</string>
<string name="get_for">%1$s ödəyib al</string>
<string name="get_for_month">Aylıq %1$s ödəyib al</string>
<string name="osmand_plus_banner_desc">Limitsiz xəritə endirmələri və aylıq xəritə yenilənmələri ilə OsmAnd-ın tam versiyası.</string>
<string name="osmand_plus_banner_desc">Limitsiz xəritə endirmələri, yenilənmələri və Vikipediya qoşması.</string>
<string name="skip_map_downloading">Endirilən xəritələri keç</string>
<string name="skip_map_downloading_desc">Quraşdırılmış offlayn xəritəniz yoxdur. Siyahıdan bir xəritə seçə və ya xəritələri daha sonra Menyudan endirə bilərsiniz - %1$s.</string>
<string name="search_another_country">Başqa region seçin</string>
@ -1348,7 +1348,7 @@
<string name="av_use_external_recorder_descr">Video çəkmək üçün sistem proqramını istifadə et</string>
<string name="av_use_external_recorder">Sistem proqramını istifadə et</string>
<string name="recording_error">Qeydetmə zamanı səhv baş verdi</string>
<string name="recording_is_recorded">Səs/video qeyd edilir. Dayandırmaq üçün AV widget-inə basın.</string>
<string name="recording_is_recorded">Səs/video qeyd edilir. Dayandırmaq üçün AV widget-inə toxunun.</string>
<string name="building_number">Bina nömrəsi</string>
<string name="shared_string_permissions">İcazələr</string>
<string name="import_gpx_failed_descr">OsmAnd faylı idxal edə bilmir. OsmAnd-ın həmin yerdən fayl oxumaq icazəsi olub-olmadığını yoxlayın.</string>
@ -1365,7 +1365,7 @@
<string name="gpx_no_tracks_title_folder">Qovluğa izlər əlavə edə də bilərsiniz</string>
<string name="gpx_add_track">İz əlavə et</string>
<string name="storage_place_description">OsmAnd-ın məlumat saxlama yeri (xəritələr, izlər və s.): %1$s.</string>
<string name="shared_string_save_as_gpx">GPX izi olaraq saxla</string>
<string name="shared_string_save_as_gpx">Yeni GPX izi olaraq saxla</string>
<string name="shared_string_my_tracks">İzlərim</string>
<string name="shared_string_currently_recording_track">Hazırki qeyd edilən iz</string>
<string name="track_segments">İz seqmentləri</string>
@ -1513,7 +1513,7 @@
<string name="routing_attr_allow_motorway_name">Avtomagistrallara icazə ver</string>
<string name="routing_attr_allow_motorway_description">Avtomagistrallara icazə ver</string>
<string name="trip_rec_notification_settings">Səyahət qeydetmə (məlumat yoxdur)</string>
<string name="trip_rec_notification_settings_desc">“Qeyd et” düyməsinə basaraq səyahət qeydetməni başlatmağa icazə verən bildirişi göstər</string>
<string name="trip_rec_notification_settings_desc">Səyahət qeydinə başlamağa imkan verən sistem bildirişi göstər</string>
<string name="save_track_min_speed">Minimum qeydiyyat sürəti</string>
<string name="new_filter_desc">Yeni filtr üçün ad daxil edin. Bu, sizin Kateqoriyalar bölmənizə əlavə olunur.</string>
<string name="donation_to_osm">OpenStreetMap cəmiyyəti üçün ianə</string>
@ -1704,4 +1704,16 @@
<string name="shared_string_create">Yarat</string>
<string name="shared_string_options">Seçimlər</string>
<string name="enter_gpx_name">GPX fayl adı:</string>
<string name="move_all_to_history">Hamısını tarixçəyə daşı</string>
<string name="show_direction">İstiqaməti göstər</string>
<string name="sort_by">Sırala</string>
<string name="marker_options">İşarə seçimləri</string>
<string name="exit_without_saving">Yadda saxlamadan çıxılsın?</string>
<string name="save_as_route_point">Marşrut nöqtələri kimi saxla</string>
<string name="route_point">Marşrut nöqtəsi</string>
<string name="show_on_map_after_saving">Saxladıqdan sonra xəritədə göstər</string>
<string name="measurement_tool_action_bar">Xəritəyə baxın və nöqtələr əlavə edin</string>
<string name="add_route_points">Marşrut nöqtələri əlavə et</string>
<string name="add_waypoint">Yol nöqtəsi əlavə et</string>
<string name="empty_state_favourites">Favoritlər əlavə et</string>
</resources>

View file

@ -2810,4 +2810,9 @@ U vypadku, kali vy lubіcie OsmAnd і OSM і chočacie padtrymać jaho, heta іd
<string name="exit_without_saving">Vyjsci biez zachavańnia?</string>
<string name="do_not_use_animations">Nie ŭžyvać animacyju</string>
<string name="do_not_use_animations_descr">Adklučeńnie animacyi ŭ prahramie</string>
<string name="move_all_to_history">Pieramiascić usio ŭ historyju</string>
<string name="build_route">Pabudavać maršrut</string>
<string name="show_direction">Pakazać napramak</string>
<string name="sort_by">Sartavać pa</string>
<string name="marker_options">Nalady markiera</string>
</resources>

View file

@ -3520,4 +3520,6 @@
<string name="poi_boat_canoe_rental_rental_yes">Каноэ: так</string>
<string name="poi_boat_canoe_rental_rental_no">Каноэ: не</string>
<string name="poi_network">Сетка</string>
</resources>

View file

@ -2859,4 +2859,9 @@
<string name="exit_without_saving">Выйсці без захавання?</string>
<string name="do_not_use_animations">Не ўжываць анімацыю</string>
<string name="do_not_use_animations_descr">Адключэньне анімацыі ў праграме</string>
<string name="move_all_to_history">Перамясціць усё ў гісторыю</string>
<string name="build_route">Пабудаваць маршрут</string>
<string name="show_direction">Паказаць напрамак</string>
<string name="sort_by">Сартаваць па</string>
<string name="marker_options">Налады маркера</string>
</resources>

View file

@ -2595,9 +2595,9 @@ Abasta l\'àrea: %1$s x %2$s</string>
<string name="add_point_before">Afegeix un punt abans de</string>
<string name="add_point_after">Afegeix un punt després de</string>
<string name="shared_string_options">Opcions</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd afegirà punts addicionals, en funció del tipus de navegació.</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd enllaçarà els punts amb rutes segons el perfil seleccionat.</string>
<string name="measurement_tool_save_as_new_track_descr">Podeu desar els punts, ja sigui com a punts de la ruta o com una línia.</string>
<string name="choose_navigation_type">Escolliu el tipus de navegació</string>
<string name="choose_navigation_type">Escolliu el perfil de navegació</string>
<string name="add_route_points">Afegeix punts de la ruta</string>
<string name="add_line">Afegeix una línia</string>
<string name="empty_state_my_tracks">Afegeix i enregistra traces</string>
@ -2612,4 +2612,9 @@ Abasta l\'àrea: %1$s x %2$s</string>
<string name="exit_without_saving">Voleu sortir sense desar?</string>
<string name="do_not_use_animations">Sense ús d\'animacions</string>
<string name="do_not_use_animations_descr">Desactiva les animacions a l\'aplicació</string>
<string name="move_all_to_history">Mou tot a l\'històric</string>
<string name="build_route">Calcula la ruta</string>
<string name="show_direction">Mostra la direcció</string>
<string name="sort_by">Ordena per</string>
<string name="marker_options">Opcions de marcador</string>
</resources>

View file

@ -3565,4 +3565,6 @@
<string name="poi_boat_canoe_rental_rental_yes">Kano: ja</string>
<string name="poi_boat_canoe_rental_rental_no">Kano: nej</string>
<string name="poi_network">Netværk</string>
</resources>

View file

@ -2666,7 +2666,7 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="full_version_thanks">Tak for købet af den fulde version af OsmAnd!</string>
<string name="parking_options">Parkeringsmuligheder</string>
<string name="do_not_send_anonymous_app_usage">Send ikke anonyme brugsstatistikker</string>
<string name="do_not_send_anonymous_app_usage_desc">Osmand indsamler oplysninger om hvilke dele der åbnes. Placering bliver aldrig sendt, heller ikke noget der indtastes eller oplysninger om områder der søges eller hentes.</string>
<string name="do_not_send_anonymous_app_usage_desc">Der indsamles oplysninger om hvilke dele der åbnes. Placering bliver aldrig sendt, heller ikke noget der indtastes eller oplysninger om områder der søges eller hentes.</string>
<string name="do_not_show_startup_messages">Vis ikke meddelelser ved opstart</string>
<string name="do_not_show_startup_messages_desc">Undertrykker visning af rabatter &amp; særlige lokale hændelsesmeddelelser</string>
<string name="right_side_navigation">Højrekørsel</string>
@ -2705,7 +2705,7 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="nautical_maps">Søkort</string>
<string name="depth_contour_descr">Kortsæt der indeholder dybdekonturlinjer og -punkter.</string>
<string name="subscribe_email_error">Fejl</string>
<string name="subscribe_email_desc">Abonner på e-mail listen om OsmAnd rabatter og hent yderligere 3 kort!</string>
<string name="subscribe_email_desc">Abonner på e-mail listen om rabatter og hent yderligere 3 kort!</string>
<string name="no_overlay">Ingen overleejring</string>
<string name="no_underlay">Ingen underlejring</string>
<string name="quick_action_add_destination">Tilføj destination</string>
@ -2776,7 +2776,7 @@ Tidligere destination bliver sidste mellemliggende punkt.</string>
<string name="mapillary_image">Mapillary foto</string>
<string name="distance_moving">Korrigeret afstand</string>
<string name="shared_string_permissions">Tilladelser</string>
<string name="import_gpx_failed_descr">OsmAnd kan ikke importere filen. Kontroller om OsmAnd har læsetilladelse på filplaceringen.</string>
<string name="import_gpx_failed_descr">Kan ikke importere filen. Kontroller om der er læsetilladelse på filplaceringen.</string>
<string name="map_widget_ruler_control">Cirkel lineal</string>
<string name="wrong_user_name">Forkert brugernavn!</string>
@ -2844,9 +2844,9 @@ Tidligere destination bliver sidste mellemliggende punkt.</string>
<string name="add_point_before">Tilføj punkt før</string>
<string name="add_point_after">Tilføj punkt efter</string>
<string name="shared_string_options">Indstillinger</string>
<string name="measurement_tool_snap_to_road_descr">Tilføjer yderligere punkter, tilpasset typen af navigation.</string>
<string name="measurement_tool_snap_to_road_descr">Forbinder punkterne med ruter for den valgte profil.</string>
<string name="measurement_tool_save_as_new_track_descr">Gem punkterne enten som rutepunkter eller som en linje.</string>
<string name="choose_navigation_type">Vælg navigationstype</string>
<string name="choose_navigation_type">Vælg navigationsprofil</string>
<string name="add_route_points">Tilføj rutepunkter</string>
<string name="add_line">Tilføj linje</string>
<string name="empty_state_my_tracks">Tilføj og optag spor</string>
@ -2861,4 +2861,9 @@ Tidligere destination bliver sidste mellemliggende punkt.</string>
<string name="exit_without_saving">Afslut uden at gemme?</string>
<string name="do_not_use_animations">Brug ikke animationer</string>
<string name="do_not_use_animations_descr">Deaktiverer animationer i programmet</string>
<string name="move_all_to_history">Flyt alle til historik</string>
<string name="build_route">Beregn rute</string>
<string name="show_direction">Vis retning</string>
<string name="sort_by">Sorter efter</string>
<string name="marker_options">Markør indstillinger</string>
</resources>

View file

@ -2657,10 +2657,10 @@
<string name="poi_free_flying_hanggliding_yes">Drachenfliegen</string>
<string name="poi_free_flying_hanggliding_no">Drachenfliegen: nein</string>
<string name="poi_free_flying_rigid_yes">Strikt</string>
<string name="poi_free_flying_rigid_no">Freies Fliegen strikt: nein</string>
<string name="poi_free_flying_rigid_no">Freeflying starr: nein</string>
<string name="poi_free_flying_site_orientation_n">Freeflying Ausrichtung: N</string>
<string name="poi_free_flying_site_orientation_ne">Freeflying Ausrichtung: NO</string>
<string name="poi_free_flying_site_orientation_e">Freier Flugplatz Ausrichtung: O</string>
<string name="poi_free_flying_site_orientation_e">Freeflying Standort Ausrichtung: O</string>
<string name="poi_free_flying_site_orientation_se">Freeflying Ausrichtung: SO</string>
<string name="poi_free_flying_site_orientation_s">Freeflying Ausrichtung: S</string>
<string name="poi_free_flying_site_orientation_sw">Freeflying Ausrichtung: SW</string>
@ -3481,4 +3481,6 @@
<string name="poi_boat_canoe_rental_rental_yes">Kanus: ja</string>
<string name="poi_boat_canoe_rental_rental_no">Kanus: nein</string>
<string name="poi_network">Netzwerk</string>
</resources>

View file

@ -115,32 +115,29 @@
<string name="snap_to_road">Auf Straße einrasten</string>
<string name="osmand_play_title_30_chars">OsmAnd Karten &amp; Navigation</string>
<string name="osmand_short_description_80_chars">Globale Landkarten- und Navigationsanwendung für Offline- und Online-OSM-Karten</string>
<string name="osmand_long_description_1000_chars">"
OsmAnd (OSM Automated Navigation Directions)
OsmAnd ist eine Open-Source-Navigationsanwendung mit Zugriff auf eine große Vielfalt öffentlich zugänglicher OpenStreetMap-(OSM)-Karten weltweit. Alle Karten (Vektor- oder Kachelformate) können lokal auf der Speicherkarte abgelegt und offline verwendet werden. OsmAnd bietet ferner eine Offline- und Online-Routing-Funktion inklusive Sprachnavigation.
Einige der Kernfunktionen:
- Komplette Offline-Funktionalität (Kartenmaterial kann auf dem Gerät abgelegt werden)
- Kompakte Vektorkarten für die ganze Welt verfügbar
- Direktes Herunterladen von Länder- oder Regionenkarten aus der App heraus
- Darstellung mehrerer überlagerter Kartenschichten wie GPX oder Navigations-Tracks, POIs (Points of Interest), Favoriten, Höhenlinien, ÖPNV-Haltestellen, zusätzliche Karten mit wählbarer Transparenz
- Offline Adress- und POI-Suche
- Offlinenavigation für mittelstrecken Distanzen
- Auto-, Fahrrad- und Fußgänger-Modus mit
- optionaler automatischer Tag-Nacht-Umschaltung der Anzeige
- optionalem geschwindigkeitsabhängigem Kartenmaßstab
- optionaler Kartenausrichtung nach Kompass oder Bewegungsrichtung
- optionaler Fahrspuranzeige, Geschwindigkeitswarnung, aufgenommene oder TTS-Sprachansagen
Einschränkungen dieser kostenlosen Version von OsmAnd:
- Anzahl der Kartendownloads -
Kein Zugriff auf Wikipedia Offline-POIs
OsmAnd wird aktiv weiterentwickelt und das Projekt benötigt Mittel für die Entwicklung, die Komplettierung und den Test (Fahrten) neuer Funktionen.
Bitte erwägen Sie den Kauf von OsmAnd+, die Förderung spezieller Funktionen oder eine allgemeine Spende auf osmand.net.
"</string>
<string name="osmand_long_description_1000_chars">OsmAnd (OSM Automated Navigation Directions)
\n
\nOsmAnd ist eine Open-Source-Navigationsanwendung mit Zugriff auf eine große Vielfalt öffentlich zugänglicher OpenStreetMap-(OSM)-Karten weltweit. Alle Karten (Vektor- oder Kachelformate) können lokal auf der Speicherkarte abgelegt und offline verwendet werden. OsmAnd bietet ferner eine Offline- und Online-Routing-Funktion inklusive Sprachnavigation.
\n
\nEinige der Kernfunktionen:
\n- Komplette Offline-Funktionalität (Kartenmaterial kann auf dem Gerät abgelegt werden)
\n- Kompakte Vektorkarten für die ganze Welt verfügbar
\n- Direktes Herunterladen von Länder- oder Regionenkarten aus der App heraus
\n- Darstellung mehrerer überlagerter Kartenschichten wie GPX oder Navigations-Tracks, POIs (Points of Interest), Favoriten, Höhenlinien, ÖPNV-Haltestellen, zusätzliche Karten mit wählbarer Transparenz
\n- Offline Adress- und POI-Suche
\n- Offlinenavigation für mittelstrecken Distanzen
\n
\n- Auto-, Fahrrad- und Fußgänger-Modus mit
\n- optionaler automatischer Tag-Nacht-Umschaltung der Anzeige
\n- optionalem geschwindigkeitsabhängigem Kartenmaßstab - optionaler Kartenausrichtung nach Kompass oder Bewegungsrichtung
\n- optionaler Fahrspuranzeige, Geschwindigkeitswarnung, aufgenommene oder TTS-Sprachansagen
\n
\nEinschränkungen dieser kostenlosen Version von OsmAnd:
\n- Anzahl der Kartendownloads -
\nKein Zugriff auf Wikipedia Offline-POIs
\n
\nOsmAnd wird aktiv weiterentwickelt und das Projekt benötigt Mittel für die Entwicklung, die Komplettierung und den Test (Fahrten) neuer Funktionen.
\nBitte erwägen Sie den Kauf von OsmAnd+, die Förderung spezieller Funktionen oder eine allgemeine Spende auf osmand.net.</string>
<string name="osmand_plus_play_title_30_chars">OsmAnd+ Karten &amp; Navigation</string>
<string name="osmand_plus_short_description_80_chars">Globale Landkarten- und Navigationsanwendung für Offline- und Online-OSM-Karten</string>
@ -1102,7 +1099,7 @@ Proportionaler Speicher %4$s MB (Android Limit %5$s MB, Dalvik %6$s MB).</string
<string name="osmand_srtm_long_description_1000_chars">Diese Erweiterung beinhaltet Höhenlinien und Relief-Schattierungen, die als Ergänzung zu den Standard-Offline-Karten von OsmAnd angezeigt werden können. Diese Funktionalität ist vor allem für Sportler, Wanderer, Radfahrer, Trekker und jeden interessant, der sich für das Geländerelief einer Landschaft interessiert.
\n
\nDie globalen Daten (zwischen 70° Nord und 70° Süd) basieren auf Messungen von SRTM (Shuttle Radar Topography Mission) und ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), einem bildgebenden System an Bord des Satelliten Terra, dem Flaggschiff des NASA-Erd-Beobachtungsprogramms. ASTER beruht auf der erfolgreichen Zusammenarbeit zwischen der NASA, dem japanischen Ministerium für Wirtschaft, Handel und Industrie und dem japanischen Raumfahrtprogramm (J-spacesystems).</string>
<string name="stop_routing_confirm">Wollen Sie die Navigation wirklich beenden?</string>
<string name="stop_routing_confirm">Sind Sie sicher, dass Sie die Navigation stoppen möchten?</string>
<string name="clear_dest_confirm">Sind Sie sicher, dass Sie Ihr Ziel (und die Zwischenziele) löschen möchten?</string>
<string name="precise_routing_mode_descr">Aktivieren, um Routen fehlerfrei zu berechnen. Diese Funktion ist weiterhin auf kurze Entfernung begrenzt und langsam.</string>
<string name="precise_routing_mode">Präzises Routing (experimentell)</string>
@ -1134,7 +1131,7 @@ Proportionaler Speicher %4$s MB (Android Limit %5$s MB, Dalvik %6$s MB).</string
<string name="available_downloads_left">Es können noch %1$d Dateien herunter geladen werden.</string>
<string name="install_paid">Vollversion</string>
<string name="cancel_navigation">Navigation stoppen</string>
<string name="cancel_route">Route verwerfen</string>
<string name="cancel_route">Route ablehnen</string>
<string name="use_kalman_filter_compass_descr">Kompass-Rauschreduzierung (erhöht die Kompassträgheit etwas)</string>
<string name="use_kalman_filter_compass">Kalman-Filter verwenden</string>
<string name="use_magnetic_sensor_descr">Für den Kompass Magnetsensor statt Lagesensor verwenden</string>
@ -1186,9 +1183,9 @@ Proportionaler Speicher %4$s MB (Android Limit %5$s MB, Dalvik %6$s MB).</string
<string name="new_directions_point_dialog">Es sind bereits Zwischenziele gesetzt.</string>
<string name="context_menu_item_directions_to">Navigiere zu</string>
<string name="route_descr_map_location">Karte:</string>
<string name="route_to">nach:</string>
<string name="route_via">über:</string>
<string name="route_from">von:</string>
<string name="route_to">Nach:</string>
<string name="route_via">Über:</string>
<string name="route_from">Von:</string>
<string name="osb_author_dialog_password">OSM-Passwort (optional)</string>
<string name="context_menu_item_directions_from">Navigiere von</string>
<string name="av_camera_focus_hiperfocal">Hyperfokaler Fokus</string>
@ -1276,10 +1273,10 @@ Proportionaler Speicher %4$s MB (Android Limit %5$s MB, Dalvik %6$s MB).</string
<string name="route_preferences">Routing-Einstellungen</string>
<string name="route_info">Routen-Informationen</string>
<string name="calculate_osmand_route_without_internet">OsmAnd-Route ohne Internetverbindung berechnen</string>
<string name="use_displayed_track_for_navigation">Soll der angezeigte Track zum Navigieren genutzt werden?</string>
<string name="use_displayed_track_for_navigation">Möchten Sie die angezeigte Strecke zur Navigation verwenden?</string>
<string name="keep_and_add_destination_point">Als letztes Ziel hinzufügen</string>
<string name="select_gpx">GPX-Datei auswählen…</string>
<string name="route_descr_select_destination">Ziel wählen</string>
<string name="route_descr_select_destination">Ziel auswählen</string>
<string name="interrupt_music_descr">Sprachansagen pausieren (nicht nur dämpfen) Musikwiedergabe</string>
<string name="always_center_position_on_map">Standort immer in Bildschirmmitte anzeigen</string>
<string name="voice_pref_title">Stimme</string>
@ -1287,7 +1284,7 @@ Proportionaler Speicher %4$s MB (Android Limit %5$s MB, Dalvik %6$s MB).</string
<string name="share_route_as_gpx">Route als GPX-Datei teilen</string>
<string name="share_route_subject">Route über OsmAnd teilen</string>
<string name="localization_pref_title">Ländereinstellungen</string>
<string name="interrupt_music">Musikwiedergabe pausieren</string>
<string name="interrupt_music">Musik pausieren</string>
<string name="navigation_intent_invalid">Ungültiges Format: %s</string>
<string name="shared_string_share">Teilen</string>
<string name="share_fav_subject">Über OsmAnd geteilte Favoriten</string>
@ -1311,7 +1308,7 @@ Proportionaler Speicher %4$s MB (Android Limit %5$s MB, Dalvik %6$s MB).</string
<string name="save_as_favorites_points">als Favoritengruppe speichern</string>
<string name="select_destination_and_intermediate_points">Ziele auswählen</string>
<string name="sort_by_distance">Nach Entfernung sortieren</string>
<string name="sort_by_name">Nach Namen sortieren</string>
<string name="sort_by_name">Nach Name sortieren</string>
<string name="show_zoom_buttons_navigation_descr">Zoomtasten bei Navigation anzeigen</string>
<string name="show_zoom_buttons_navigation">Zoomtasten anzeigen</string>
@ -1720,9 +1717,9 @@ Mit Neuanmeldung fortfahren?</string>
<string name="settings_privacy">Privatsphäre</string>
<string name="points">Punkte</string>
<string name="shared_string_my_location">Mein Standort</string>
<string name="shared_string_my_location">Meine Position</string>
<string name="navigation_over_track">Navigation der Strecke entlang starten?</string>
<string name="navigation_over_track">Navigation entlang der Strecke starten?</string>
<string name="avoid_roads_msg">Sie können die Route ändern, indem Sie Straßen auswählen, die vermieden werden sollen</string>
<string name="enable_proxy_title">HTTP-Proxy aktivieren</string>
<string name="enable_proxy_descr">HTTP-Proxy für alle Netzwerkanfragen einrichten</string>
@ -2620,7 +2617,7 @@ Abgedeckte Fläche: %1$s x %2$s</string>
<string name="do_not_send_anonymous_app_usage">Keine anonymen App-Nutzungsdaten versenden</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd sammelt Informationen über durch Sie geöffnete App-Teile. Es wird niemals Ihre Position noch irgendeine Ihrer App-Eingaben oder Einzelheiten zu den von Ihnen betrachteten, gesuchten oder heruntergeladenen Gebieten versandt.</string>
<string name="do_not_show_startup_messages">Keine Meldungen beim App-Start einblenden</string>
<string name="do_not_show_startup_messages_desc">Es werden Meldungen zu App-Angeboten und besonderen lokalen Ereignissen angezeigt</string>
<string name="do_not_show_startup_messages_desc">Unterdrückt Meldungen zu App-Sonderangeboten und besonderen lokalen Ereignissen</string>
<string name="parking_options">Parkmöglichkeiten</string>
<string name="full_version_thanks">Vielen Dank, dass Sie die Vollversion von OsmAnd erworben haben!</string>
<string name="routing_attr_relief_smoothness_factor_hills_name">Bergig</string>
@ -2690,7 +2687,7 @@ Abgedeckte Fläche: %1$s x %2$s</string>
<string name="edit_name">Namen ändern</string>
<string name="animate_my_location">Meine Position animieren</string>
<string name="animate_my_location_desc">Animation meiner Position während der Navigation aktivieren</string>
<string name="route_is_too_long_v2">Die Route ist für eine Berechnung unter Umständen zu lang. Fügen Sie bitte Zwischenstopps ein, wenn nach 10 Minuten kein Routenvorschlag erscheint.</string>
<string name="route_is_too_long_v2">Diese Route könnte zu lang sein, um berechnet zu werden. Bitte fügen Sie Zwischenziele hinzu, wenn innerhalb von 10 Minuten kein Ergebnis gefunden wird.</string>
<string name="save_poi_too_many_uppercase">Der Name enthält zu viele Großbuchstaben. Möchten Sie den Vorgang fortsetzen?</string>
<string name="display_zoom_level">Darstellung ab Zoomstufe: %1$s</string>
<string name="routing_attr_allow_private_name">Privatwege erlauben</string>
@ -2797,9 +2794,9 @@ Abgedeckte Fläche: %1$s x %2$s</string>
<string name="add_point_before">Punkt davor hinzufügen</string>
<string name="add_point_after">Punkt dahinter hinzufügen</string>
<string name="shared_string_options">Optionen</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd wird, abhängig von der Navigationsart, zusätzliche Punkte hinzufügen.</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd wird die Punkte mit Routen für das gewählte Profil verbinden.</string>
<string name="measurement_tool_save_as_new_track_descr">Die Punkte können entweder als Routenpunkte oder als Strecke gespeichert werden.</string>
<string name="choose_navigation_type">Navigationsart auswählen</string>
<string name="choose_navigation_type">Navigationsprofil wählen</string>
<string name="add_route_points">Routenpunkte hinzufügen</string>
<string name="add_line">Strecke hinzufügen</string>
<string name="empty_state_my_tracks">Tracks hinzufügen und aufzeichnen</string>
@ -2814,4 +2811,9 @@ Abgedeckte Fläche: %1$s x %2$s</string>
<string name="do_not_use_animations_descr">Deaktiviert Animationen in der App</string>
<string name="keep_showing_on_map">Weiterhin auf der Karte anzeigen</string>
<string name="exit_without_saving">Beenden ohne zu speichern?</string>
<string name="move_all_to_history">Alles zu Historie verschieben</string>
<string name="build_route">Route erstellen</string>
<string name="show_direction">Richtung anzeigen</string>
<string name="sort_by">Sortieren nach</string>
<string name="marker_options">Marker-Optionen</string>
</resources>

View file

@ -107,9 +107,9 @@
<string name="osmand_parking_warning_text">Ειδοποίηση για παραλαβή το αυτοκινήτου σας είχε προστεθεί προηγουμένως στο Ημερολόγιό σας. Θα παραμείνει εκεί μέχρι να το διαγράψετε χειροκίνητα.</string>
<string name="osmand_parking_time_limit_title">Ορισμός χρονικού ορίου στάθμευσης</string>
<string name="osmand_parking_delete_confirm">Θέλετε να αφαιρέσετε την τοποθεσία του παρκαρισμένου αυτοκινήτου;</string>
<string name="osmand_parking_delete">Διαγράψτε ένα δείκτη στάθμευσης</string>
<string name="osmand_parking_choose_type">Επιλέξτε τον τύπο της στάθμευσης</string>
<string name="osmand_parking_lim_text">Ορισμένου χρόνου</string>
<string name="osmand_parking_delete">Διαγράψτε ένα δείκτη στάθμευσης</string>
<string name="osmand_parking_choose_type">Επιλέξτε τον τύπο της στάθμευσης</string>
<string name="osmand_parking_lim_text">Ορισμένου χρόνου</string>
<string name="osmand_parking_no_lim_text">Απεριορίστου χρόνου</string>
<string name="osmand_parking_add_event">Προσθέστε μια ειδοποίηση στην εφαρμογή Ημερολόγιο</string>
<string name="osmand_parking_time_limit">Στάθμευση περιορισμένου χρόνου</string>
@ -118,19 +118,19 @@
<string name="osmand_parking_position_description_add">Παραλαβή αυτοκινήτου στις:</string>
<string name="osmand_parking_pm">ΜΜ</string>
<string name="osmand_parking_am">ΠΜ</string>
<string name="osmand_parking_position_name">Σημείο στάθμευσης</string>
<string name="osmand_parking_plugin_description">Αυτό το πρόσθετο σας επιτρέπει να αποθηκεύσετε τη θέση του σταθμευμένου αυτοκινήτου σας.</string>
<string name="osmand_parking_position_name">Σημείο στάθμευσης</string>
<string name="osmand_parking_plugin_description">Αυτό το πρόσθετο σας επιτρέπει να αποθηκεύσετε τη θέση του σταθμευμένου αυτοκινήτου σας.</string>
<string name="osmand_parking_plugin_name">Θέση Στάθμευσης</string>
<string name="context_menu_item_add_parking_point">Σήμανση ως μια θέση στάθμευσης</string>
<string name="context_menu_item_delete_parking_point">Διαγραφή ενός δείκτη στάθμευσης</string>
<string name="context_menu_item_add_parking_point">Σήμανση ως μια θέση στάθμευσης</string>
<string name="context_menu_item_delete_parking_point">Διαγραφή ενός δείκτη στάθμευσης</string>
<string name="gpxup_public">Δημόσιο</string>
<string name="gpxup_identifiable">Αναγνωρίσιμες</string>
<string name="gpxup_trackable">Ιχνηλάσιμο</string>
<string name="gpxup_identifiable">Αναγνωρίσιμες</string>
<string name="gpxup_trackable">Ιχνηλάσιμο</string>
<string name="gpxup_private">Ιδιωτικό</string>
<string name="asap">ASAP</string>
<string name="route_roundabout">Κυκλικός κόμβος: βγείτε στην %1$d έξοδο και προχωρήστε</string>
<string name="route_kl">Μείνετε αριστερά και προχωρήστε</string>
<string name="route_kl">Μείνετε αριστερά και προχωρήστε</string>
<string name="route_kr">Μείνετε δεξιά και προχωρήστε</string>
<string name="rendering_attr_noPolygons_description">Κάντε όλα τα επιφανειακά χαρακτηριστικά εδάφους στο χάρτη διάφανα</string>
<string name="rendering_attr_noPolygons_name">Απόκρυψη πολυγώνων</string>
@ -139,23 +139,23 @@
<string name="rendering_attr_contourLines_description">Εμφάνιση από το επίπεδο εστίασης (χρειάζεται αρχείο ισοϋψών):</string>
<string name="rendering_attr_contourLines_name">Εμφάνιση ισοϋψών γραμμών</string>
<string name="rendering_attr_hmRendered_description">Αύξηση ποσότητας των λεπτομερειών του χάρτη</string>
<string name="rendering_attr_hmRendered_name">Εμφάνιση περισσότερων λεπτομερειών χάρτη</string>
<string name="rendering_attr_hmRendered_name">Εμφάνιση περισσότερων λεπτομερειών χάρτη</string>
<string name="local_index_routing_data">Δεδομένα δρομολόγησης</string>
<string name="navigate_point_format">Μορφή</string>
<string name="poi_search_desc">Αναζήτηση ΣΕ (σημείο ενδιαφέροντος)</string>
<string name="address_search_desc">Αναζήτηση διεύθυνσης</string>
<string name="poi_search_desc">Αναζήτηση ΣΕ (σημείο ενδιαφέροντος)</string>
<string name="address_search_desc">Αναζήτηση διεύθυνσης</string>
<string name="navpoint_search_desc">Συντεταγμένες</string>
<string name="transport_search_desc">Αναζήτηση ΜΜΜ</string>
<string name="favourites_search_desc">Αναζήτηση αγαπημένων</string>
<string name="favourites_search_desc">Αναζήτηση αγαπημένων</string>
<string name="offline_navigation_not_available">Η εκτός σύνδεσης πλοήγηση του OsmAnd δεν είναι διαθέσιμη προσωρινά.</string>
<string name="left_side_navigation">Οδήγηση αριστερά</string>
<string name="left_side_navigation_descr">Επιλέξτε για χώρες με κυκλοφορία αριστερά</string>
<string name="left_side_navigation">Οδήγηση αριστερά</string>
<string name="left_side_navigation_descr">Επιλέξτε για χώρες με κυκλοφορία αριστερά</string>
<string name="unknown_from_location">Το αφετηρία δεν έχει ακόμη καθοριστεί</string>
<string name="unknown_from_location">Το αφετηρία δεν έχει ακόμη καθοριστεί</string>
<string name="unknown_location">Η Θέση σας δεν είναι ακόμα γνωστή</string>
<string name="modify_transparency">Τροποποίηση διαφάνειας (0 - διάφανο, 255 - αδιαφανές)</string>
<string name="confirm_interrupt_download">Θέλετε να διακόψετε τη λήψη αρχείων;</string>
<string name="modify_transparency">Τροποποίηση διαφάνειας (0 - διάφανο, 255 - αδιαφανές)</string>
<string name="confirm_interrupt_download">Θέλετε να διακόψετε τη λήψη αρχείων;</string>
<string name="first_time_msg">Ευχαριστούμε που χρησιμοποιείτε το OsmAnd. Για πολλά χαρακτηριστικά αυτής της εφαρμογής χρειάζεστε μερικά τοπικά offline δεδομένα τα οποία μπορείτε να κατεβάσετε μέσω του \'Ρυθμίσεις\' → \'Διαχείριση αρχείων χάρτη\'. Μετά από αυτό θα μπορείτε να δείτε χάρτες, να εντοπίσετε διευθύνσεις, να ψάξετε Σημ. Ενδ. και να βρείτε δημόσιες μεταφορές.</string>
<string name="basemap_was_selected_to_download">Ο βασικός χάρτης είναι απαραίτητος για τη σωστή λειτουργία της εφαρμογής και επιλέχθηκε προς λήψη.</string>
<string name="select_index_file_to_download">Δεν βρέθηκε τίποτα. Εάν δεν μπορείτε να βρείτε την περιοχή σας, μπορείτε να τη φτιάξετε μόνοι σας (βλέπε http://osmand.net).</string>
@ -197,33 +197,33 @@
<string name="validate_gpx_upload_name_pwd">Παρακαλώ καθορίστε το όνομα χρήστη OSM και τον κωδικό πρόσβασης για να ανεβάσετε τα αρχεία GPX.</string>
<string name="default_buttons_support">Υποστήριξη</string>
<string name="support_new_features">Υποστηρίξτε νέα χαρακτηριστικά</string>
<string name="show_ruler_level">Εμφάνιση χάρακα</string>
<string name="show_ruler_level">Εμφάνιση χάρακα</string>
<string name="info_button">Πληροφορίες</string>
<string name="back_to_location">Επιστροφή στη θέση</string>
<string name="back_to_location">Επιστροφή στη θέση</string>
<string name="accessibility_mode">Λειτουργία προσβασιμότητας</string>
<string name="accessibility_mode_descr">Ενεργοποιεί τις δυνατότητες προσβασιμότητας</string>
<string name="accessibility_mode">Λειτουργία προσβασιμότητας</string>
<string name="accessibility_mode_descr">Ενεργοποιεί τις δυνατότητες προσβασιμότητας</string>
<string name="shared_string_on">Ενεργό</string>
<string name="shared_string_off">Ανενεργό</string>
<string name="accessibility_default">Σύμφωνα με την καθολική ρύθμιση του συστήματος</string>
<string name="backToMenu">Πίσω Στο Μενού</string>
<string name="backToMenu">Πίσω Στο Μενού</string>
<string name="zoomOut">Σμίκρυνση</string>
<string name="zoomIn">Μεγέθυνση</string>
<string name="zoomIs">Η κλίμακα εστίασης είναι</string>
<string name="north">βόρεια</string>
<string name="north_north_east">βόρεια-βορειοανατολικά</string>
<string name="north_east">βορειοανατολικά</string>
<string name="east_north_east">ανατολικά-βορειοανατολικά</string>
<string name="north_north_east">βόρεια-βορειοανατολικά</string>
<string name="north_east">βορειοανατολικά</string>
<string name="east_north_east">ανατολικά-βορειοανατολικά</string>
<string name="east">ανατολικά</string>
<string name="east_south_east">ανατολικά-νοτιοανατολικά</string>
<string name="south_east">νοτιοανατολικά</string>
<string name="south_south_east">νότια-νοτιοανατολικά</string>
<string name="south_south_east">νότια-νοτιοανατολικά</string>
<string name="south">νότια</string>
<string name="south_south_west">νότια-νοτιοδυτικά</string>
<string name="south_west">νοτιοδυτικά</string>
<string name="west_south_west">δυτικά-νοτιοδυτικά</string>
<string name="south_south_west">νότια-νοτιοδυτικά</string>
<string name="south_west">νοτιοδυτικά</string>
<string name="west_south_west">δυτικά-νοτιοδυτικά</string>
<string name="west">δυτικά</string>
<string name="west_north_west">δυτικά-βορειοδυτικά</string>
<string name="west_north_west">δυτικά-βορειοδυτικά</string>
<string name="north_west">βορειοδυτικά</string>
<string name="north_north_west">βόρεια-βορειοδυτικά</string>
<string name="front">εμπρός</string>

View file

@ -3483,4 +3483,6 @@
<string name="poi_boat_canoe_rental_rental_yes">Kanuoj: jes</string>
<string name="poi_boat_canoe_rental_rental_no">Kanuoj: ne</string>
<string name="poi_network">Reto</string>
</resources>

View file

@ -1351,7 +1351,7 @@ Proporcia memoro %4$s MB (limito de Android %5$s MB, Dalvik %6$s MB).</string>
<string name="basemap_was_selected_to_download">Bazmapo endas por ĝusta agado de aplikaĵo kaj ĝi estas elektita por elŝuto.</string>
<string name="plugins_screen">Kromprogramoj</string>
<string name="local_indexes_cat_tile">Enretaj mapoj kaj kaŝmemorigitaj kaheloj</string>
<string name="local_indexes_cat_map">Normalaj mapoj (vektoraj)</string>
<string name="local_indexes_cat_map">Normaj mapoj (vektoraj)</string>
<string name="index_settings_descr">Elŝuti kaj administri eksterretajn mapojn konservitajn en via aparato</string>
<string name="i_am_here">Mi estas tie ĉi</string>
<string name="free_version_title">Senpaga versio</string>
@ -2772,5 +2772,10 @@ Indikas lokon: %1$s x %2$s"</string>
<string name="keep_showing_on_map">Daŭre montri sur mapo</string>
<string name="exit_without_saving">Ĉu eliri sen konservi?</string>
<string name="do_not_use_animations">Ne uzi movbildojn</string>
<string name="do_not_use_animations_descr">Malaktivigi animaciojn en aplikaĵo</string>
<string name="do_not_use_animations_descr">Malaktivigi animaciojn en la aplikaĵo</string>
<string name="move_all_to_history">Movi ĉiujn al historio</string>
<string name="build_route">Kalkuli kurson</string>
<string name="show_direction">Montri direkton</string>
<string name="sort_by">Ordigi laŭ</string>
<string name="marker_options">Agordo de marko</string>
</resources>

View file

@ -3531,4 +3531,6 @@
<string name="poi_boat_canoe_rental_rental_yes">Canoas: Sí</string>
<string name="poi_boat_canoe_rental_rental_no">Canoas: No</string>
<string name="poi_network">Red</string>
</resources>

View file

@ -863,7 +863,7 @@ Se aprecia la participación activa, y las contribuciones pueden hacerse directa
<string name="avoid_motorway">Evitar autopistas</string>
<string name="auto_zoom_map_descr">Ampliación automática del mapa, según la velocidad (mientras el mapa se sincroniza con la ubicación actual)</string>
<string name="auto_zoom_map">Ampliación automática del mapa</string>
<string name="snap_to_road_descr">Ajusta la ubicación al camino durante la navegación</string>
<string name="snap_to_road_descr">Ajusta la ubicación al camino durante la navegación</string>
<string name="snap_to_road">Ajustar al camino</string>
<string name="interrupt_music_descr">El aviso por voz, pausa la reproducción de música (no sólo reduce el volumen)</string>
<string name="interrupt_music">Pausar música</string>
@ -2720,9 +2720,9 @@ Proporciona un código completo</string>
<string name="add_point_before">Añadir punto anterior</string>
<string name="add_point_after">Añadir punto posterior</string>
<string name="shared_string_options">Opciones</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd añadirá puntos adicionales, según el tipo de navegación utilizado.</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd conectará los puntos con las rutas del perfil elegido.</string>
<string name="measurement_tool_save_as_new_track_descr">Puedes guardar los puntos, ya sea como puntos de ruta o como una línea.</string>
<string name="choose_navigation_type">Elegir tipo de navegación</string>
<string name="choose_navigation_type">Elegir perfil de navegación</string>
<string name="add_route_points">Añadir puntos de ruta</string>
<string name="add_line">Añadir línea</string>
<string name="empty_state_my_tracks">Añadir y grabar trazas</string>
@ -2737,4 +2737,9 @@ Proporciona un código completo</string>
<string name="exit_without_saving">¿Salir sin guardar?</string>
<string name="do_not_use_animations">No usar animaciones</string>
<string name="do_not_use_animations_descr">Desactiva las animaciones en la aplicación</string>
<string name="move_all_to_history">Mover todo al historial</string>
<string name="build_route">Crear ruta</string>
<string name="show_direction">Mostrar dirección</string>
<string name="sort_by">Ordenar por</string>
<string name="marker_options">Opciones del marcador</string>
</resources>

View file

@ -3276,8 +3276,8 @@
<string name="poi_boat_rental_type">Barcos de alquiler</string>
<string name="poi_boat_rental">Alquiler de barcos</string>
<string name="poi_boat_motorboat_rental_yes">Barcos a motor: Sí</string>
<string name="poi_boat_motorboat_rental_no">Barcos a motor: No</string>
<string name="poi_boat_motorboat_rental_yes">Lanchas de motor: Sí</string>
<string name="poi_boat_motorboat_rental_no">Lanchas de motor: No</string>
<string name="poi_boat_houseboat_rental_yes">Casas flotantes: Sí</string>
<string name="poi_boat_houseboat_rental_no">Casas flotantes: No</string>
<string name="poi_boat_pedalboat_rental_yes">Barcos a pedal: Sí</string>
@ -3293,4 +3293,6 @@
<string name="poi_boat_canoe_rental_rental_yes">Canoas: Sí</string>
<string name="poi_boat_canoe_rental_rental_no">Canoas: No</string>
<string name="poi_network">Red</string>
</resources>

View file

@ -863,7 +863,7 @@ Se aprecia la participación activa, y las contribuciones pueden hacerse directa
<string name="avoid_motorway">Evitar autopistas</string>
<string name="auto_zoom_map_descr">Ampliación automática del mapa, según la velocidad (mientras el mapa se sincroniza con la ubicación actual)</string>
<string name="auto_zoom_map">Ampliación automática del mapa</string>
<string name="snap_to_road_descr">Ajusta la ubicación al camino durante la navegación</string>
<string name="snap_to_road_descr">Ajusta la ubicación al camino durante la navegación</string>
<string name="snap_to_road">Ajustar al camino</string>
<string name="interrupt_music_descr">El aviso por voz, pausa la reproducción de música (no sólo reduce el volumen)</string>
<string name="interrupt_music">Pausar música</string>
@ -2721,9 +2721,9 @@ Proporciona un código completo</string>
<string name="add_point_before">Añadir punto anterior</string>
<string name="add_point_after">Añadir punto posterior</string>
<string name="shared_string_options">Opciones</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd añadirá puntos adicionales, según el tipo de navegación utilizado.</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd conectará los puntos con las rutas del perfil elegido.</string>
<string name="measurement_tool_save_as_new_track_descr">Puedes guardar los puntos, ya sea como puntos de ruta o como una línea.</string>
<string name="choose_navigation_type">Elegir tipo de navegación</string>
<string name="choose_navigation_type">Elegir perfil de navegación</string>
<string name="add_route_points">Añadir puntos de ruta</string>
<string name="add_line">Añadir línea</string>
<string name="empty_state_my_tracks">Añadir y grabar trazas</string>
@ -2738,4 +2738,9 @@ Proporciona un código completo</string>
<string name="exit_without_saving">¿Salir sin guardar?</string>
<string name="do_not_use_animations">No usar animaciones</string>
<string name="do_not_use_animations_descr">Desactiva las animaciones en la aplicación</string>
<string name="move_all_to_history">Mover todo al historial</string>
<string name="build_route">Crear ruta</string>
<string name="show_direction">Mostrar dirección</string>
<string name="sort_by">Ordenar por</string>
<string name="marker_options">Opciones del marcador</string>
</resources>

View file

@ -3520,4 +3520,6 @@
<string name="poi_boat_canoe_rental_rental_yes">Canoas: sí</string>
<string name="poi_boat_canoe_rental_rental_no">Canoas: no</string>
<string name="poi_network">Red</string>
</resources>

View file

@ -835,7 +835,7 @@ Tanto la ubicación como el tiempo de estacionamiento se muestran en el panel de
\n - Orientación del mapa opcional a la brújula o a la dirección de movimiento
\n - Indicación de carriles, mostrar límites de velocidad, voces grabadas y generadas opcionales</string>
<string name="avoid_motorway">Evitar autopistas</string>
<string name="snap_to_road_descr">Ajusta la posición a las carreteras durante la navegación</string>
<string name="snap_to_road_descr">Ajusta la posición a las carreteras durante la navegación</string>
<string name="snap_to_road">Ajustar a carreteras</string>
<string name="context_menu_item_first_intermediate_point">Añadir como primer destino intermedio</string>
<string name="context_menu_item_last_intermediate_point">Añadir como último destino intermedio</string>
@ -2674,4 +2674,9 @@ Por favor proporciona un código completo</string>
<string name="import_track_desc">El archivo «%1$s» no contiene puntos de referencia, ¿Quiere importarlo como una traza?</string>
<string name="move_point">Mover punto</string>
<string name="add_segment_to_the_track">Añadir a una traza GPX</string>
<string name="move_all_to_history">Mover todo al historial</string>
<string name="build_route">Crear ruta</string>
<string name="show_direction">Mostrar dirección</string>
<string name="sort_by">Ordenar por</string>
<string name="marker_options">Opciones del marcador</string>
</resources>

View file

@ -685,7 +685,7 @@ Au-delà la navigation bascule automatiquement sur le service en ligne CloudMade
<string name="osmand_rastermaps_plugin_description">Ce greffon permet d\'accéder à une grand nombre de cartes en ligne (aussi appelées tuiles ou cartes raster) qui vont de cartes OpenStreetMap (comme Mapnik) jusqu\'aux images satellites en passant par des cartes spécialisées comme des cartes météo, des cartes de climat, des cartes géologiques, des couches de relief, etc.
\n
\nChacune de ces cartes est utilisable soit comme carte principale soit comme sur-couche ou sous-couche d\'une autre carte. Afin de gérer au mieux la superposition des cartes, vous pouvez masquer certains éléments des cartes vectorielles hors ligne depuis le menu \"Configurer la carte\".
\nChacune de ces cartes est utilisable, comme carte principale, sur-couche ou sous-couche d\'une autre carte. Afin de gérer au mieux la superposition des cartes, vous pouvez masquer certains éléments des cartes vectorielles hors ligne depuis le menu \"Configurer la carte\".
\n
\nLes cartes tuiles peuvent être obtenues directement en ligne ou peuvent être préparées pour un usage hors ligne grâce à des outils tiers puis copiées dans le dossier de données d\'OsmAnd sous forme de base de données SQLite.</string>
<string name="osmand_background_plugin_description">Affiche les préférences afin d\'activer le suivi et la navigation en tâche de fond (écran éteint) en réveillant périodiquement le GPS.</string>
@ -1128,10 +1128,10 @@ Fonctionnalités principales :
<string name="local_osm_changes_backup">Sauvegarder comme une modification OSM</string>
<string name="delete_point">Supprimer le point de mesure</string>
<string name="plugin_distance_point">Point</string>
<string name="use_distance_measurement_help">* Appui bref sur la carte pour ajouter un point.
\n* Appui long sur la carte pour supprimer le point précédent.
\n* Appui long sur un point pour ajouter ou modifier une description.
\n* Appui sur le gadget de mesure pour voir plus d\'actions.</string>
<string name="use_distance_measurement_help">* Ajouter un point : appui bref sur la carte
\n* Supprimer le dernier point : appui long sur la carte
\n* Ajouter ou modifier la description d\'un point : appui long sur le point
\n* Autres actions : utilisez le gadget de mesure.</string>
<string name="distance_measurement_finish_subtrack">Ajouter une nouvelle mesure</string>
<string name="distance_measurement_clear_route">Supprimer la mesure</string>
<string name="shared_string_downloading">Téléchargement en cours</string>
@ -1479,7 +1479,7 @@ Fonctionnalités principales :
<string name="sort_by_distance">Trier par distance</string>
<string name="sort_by_name">Trier par nom</string>
<string name="no_index_file_to_download">Aucun téléchargement trouvé, veuillez vérifier votre connexion Internet.</string>
<string name="none_selected_gpx">Aucun fichier GPX sélectionné. Pour sélectionner, presser longuement sur une trace disponible.</string>
<string name="none_selected_gpx">Aucun fichier GPX sélectionné. Pour sélectionner un fichier, pressez longuement sur une trace disponible.</string>
<string name="local_index_select_gpx_file">Sélectionnez pour afficher</string>
<string name="osmo_group_information_desc">- Créez un groupe : donnez-lui un nom et indiquez une description
@ -2651,7 +2651,7 @@ représentant la zone : %1$s x %2$s</string>
\n • Signalez des anomalies
\n • Envoyez des traces GPX vers OSM directement depuis l\'application
\n • Ajoutez des Points d\'Intérêt et envoyez-les vers OSM (immédiatement ou plus tard si vous êtes hors-ligne)</string>
<string name="osmand_plus_extended_description_part8">" Couverture et qualité des cartes (de 1 à 4 étoiles)
<string name="osmand_plus_extended_description_part8">Couverture et qualité des cartes (de 1 à 4 étoiles)
\n • Europe de l\'Ouest : **** (4)
\n • Europe de l\'Est : *** (3)
\n • Russie : *** (3)
@ -2662,15 +2662,13 @@ représentant la zone : %1$s x %2$s</string>
\n • Moyen-Orient : ** (2)
\n • Afrique : ** (2)
\n • Antarctique : * (1)
\n La grande majorité des pays sont couverts de l\'Afghanistan au Zimbabwe, téléchargez les cartes dont vous avez besoin ! "</string>
\n La grande majorité des pays sont couverts de l\'Afghanistan au Zimbabwe, téléchargez les cartes dont vous avez besoin !</string>
<string name="fonts_header">Polices pour les textes de la carte</string>
<string name="osmand_plus_extended_description_part5">"
Fonctionnalités liées à la sécurité
• Bascule automatique en mode jour / nuit (option)
• Affichage des limitations de vitesse avec rappels en cas de dépassement (option)
• Zoom adapté à la vitesse (option)
• Partage de votre position pour que n\'importe qui puisse vous rejoindre rapidement
"</string>
<string name="osmand_plus_extended_description_part5">Fonctions liées à la sécurité
\n • Bascule automatique en mode jour / nuit (option)
\n • Affichage des limitations de vitesse avec rappels en cas de dépassement (option)
\n • Zoom adapté à la vitesse (option)
\n • Partage de votre position afin qu\'on puisse vous rejoindre rapidement</string>
<string name="restore_purchases">Restaurer vos achats</string>
<string name="shared_string_visible">Visible</string>
<string name="osmand_plus_extended_description_part7">"
@ -2722,15 +2720,13 @@ Fonctionnalités principales :
<string name="shared_string_overview">Vue d\'ensemble</string>
<string name="animate_my_location_desc">Activer l\'animation de votre position pendant la navigation</string>
<string name="animate_my_location">Animer ma position</string>
<string name="osmand_plus_extended_description_part6">"
Fonctionnalités adaptées aux cyclistes et piétons
• Affichage des itinéraires piétons et des circuits de randonnée ou encore des pistes cyclables; idéal pour les activités de plein air
• Modes de guidage adaptés aux cyclistes et piétons
• Affichage des arrêts de transports publics (bus, tram, train) avec identification des lignes (option)
• Enregistrement GPX du trajet en local ou en ligne (option)
• Affichage de la vitesse et de l\'altitude (option)
• Affichage des courbes de niveaux et ombrage du relief (nécessite un greffon additionnel)
"</string>
<string name="osmand_plus_extended_description_part6">Fonctions adaptées aux cyclistes et piétons
\n • Affichage des itinéraires piétons et des circuits de randonnée ou encore des pistes cyclables; idéal pour les activités de plein air
\n • Modes de guidage adaptés aux cyclistes et piétons
\n • Affichage des arrêts de transports publics (bus, tram, train) avec identification des lignes (option)
\n • Enregistrement GPX du trajet en local ou en ligne (option)
\n • Affichage de la vitesse et de l\'altitude (option)
\n • Affichage des courbes de niveaux et ombrage du relief (nécessite un greffon additionnel)</string>
<string name="favorite_group_name">Nom du groupe</string>
<string name="change_color">Modifier la couleur</string>
<string name="edit_name">Modifier le nom</string>
@ -2884,5 +2880,15 @@ Fonctionnalités principales :
<string name="exit_without_saving">Quitter sans enregistrer ?</string>
<string name="do_not_use_animations">Ne pas utiliser les animations</string>
<string name="do_not_use_animations_descr">Désactive les animations dans l\'application</string>
<string name="osmand_extended_description_part6">Marche, randonnée, visite de la ville • La carte vous montre les sentiers pédestres et de randonnée • Wikipedia dans votre langue préférée peut vous en apprendre beaucoup durant votre visite de la ville • Arrêts de transport public (bus, tram, train), incluant les noms de lignes, aidant la navigation dans une nouvelle ville • La navigation GPS en mode piéton utilise les chemins piétons • Vous pouvez uploader et suivre une route GPX, enregistrer ou partager la vôtre</string>
<string name="osmand_extended_description_part6">Marche, randonnée, visite guidée
\n• Carte des sentiers pédestres et de randonnée
\n• Articles Wikipedia dans la langue de votre choix pour découvrir les lieux visités
\n• Arrêts de transports publics (bus, tram, train), incluant les noms de lignes, pour vous aider dans vos déplacements en ville
\n• Guidage de navigation piéton en suivant les itinéraires piétons
\n• Vous pouvez charger et suivre une trace GPX existante; enregistrer et partager un nouvel itinéraire GPX</string>
<string name="move_all_to_history">Déplacer tout dans l\'historique</string>
<string name="build_route">Calculer l\'itinéraire</string>
<string name="show_direction">Afficher les indications de direction</string>
<string name="sort_by">Trier par</string>
<string name="marker_options">Options de la marque</string>
</resources>

View file

@ -71,7 +71,7 @@ La memoria utilizzata è {1} MB.
<string name="auto_follow_route_navigation_descr">Centra automaticamente la visione della mappa solo durante la navigazione.</string>
<string name="auto_follow_location_enabled">Visualizzazione mappa centrata automaticamente.</string>
<string name="pref_vector_rendering">Opzioni specifiche per la rappresentazione vettoriale</string>
<string name="pref_overlay">Sovrapposizione / sfondo</string>
<string name="pref_overlay">Sovrapposizione / sfondo</string>
<string name="pref_raster_map">Impostazioni della fonte mappa</string>
<string name="pref_vector_map">Impostazioni della mappa vettoriale</string>
<string name="delete_confirmation_msg">Eliminare %1$s?</string>
@ -856,18 +856,18 @@ Memoria in proporzione %4$s MB (limite di Android %5$s MB, Dalvik %6$s MB).</str
<string name="show_lanes">Corsie</string>
<string name="avoid_unpaved">Evita le strade non asfaltate</string>
<string name="avoid_ferries">Evita i traghetti</string>
<string name="avoid_in_routing_title">Evita…</string>
<string name="avoid_in_routing_title">Evita…</string>
<string name="avoid_in_routing_descr">Evita strade a pagamento, sterrate, traghetti</string>
<string name="show_warnings_title">Mostra avvisi…</string>
<string name="show_warnings_descr">Configura gli avvisi sul traffico (limiti velocità, fermate forzate, dossi rallentatori), avvisi autovelox e indicazioni di corsia</string>
<string name="map_widget_fluorescent">Itinerari fluorescenti</string>
<string name="map_widget_show_ruler">Righello</string>
<string name="map_widget_view_direction">Direzione della visuale</string>
<string name="map_widget_view_direction">Direzione della visuale</string>
<string name="map_widget_transparent">Widget trasparenti</string>
<string name="gps_wakeup_interval">Intervallo di risveglio GPS: %s</string>
<string name="gps_wakeup_interval">Intervallo di risveglio GPS: %s</string>
<string name="int_continuosly">Continuo</string>
<string name="email">e-mail</string>
@ -2689,7 +2689,7 @@ Rappresenta l\'area: %1$s x %2$s</string>
<string name="do_not_send_anonymous_app_usage">Non inviare statistiche anonime sull\'utilizzo dell\'app</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd raccoglie informazioni su quale parti dell\'applicazione tu utilizzi. La tua geolocalizzazione non viene mai inviata, nemmeno qualsiasi dato che tu immetti nell\'app o dettagli sulle aree che visualizzi cerchi o scarichi.</string>
<string name="do_not_show_startup_messages">Non mostrare alcun messaggio all\'avvio</string>
<string name="do_not_show_startup_messages_desc">Mostra messaggi riguardo app in sconto ed eventi locali speciali</string>
<string name="do_not_show_startup_messages_desc">Elimina messaggi riguardo sconti dell\'app ed eventi speciali locali</string>
<string name="parking_options">Opzioni parcheggio</string>
<string name="full_version_thanks">Grazie per avere acquistato la versione completa di OsmAnd!</string>
<string name="fonts_header">Caratteri della mappa</string>
@ -2889,4 +2889,12 @@ Copertura e qualità approssimativamente:
<string name="do_not_use_animations">Non utilizzare le animazioni</string>
<string name="do_not_use_animations_descr">Disabilita le animazioni nell\'app</string>
<string name="keep_showing_on_map">Mantieni visualizzato nella mappa</string>
<string name="live_monitoring_max_interval_to_send">Tempo tampone per il tracciamento online</string>
<string name="live_monitoring_max_interval_to_send_desrc">Specifica un tempo della memoria tampone per memorizzare le localizzazioni quando non c\'è connessione</string>
<string name="retry">Riprova</string>
<string name="add_route_points">Aggiungi nuovi punti al percorso</string>
<string name="add_line">Aggiungi una linea</string>
<string name="save_route_point">Salva il Punto Percorso</string>
<string name="route_point_one">Punto Percorso 1</string>
<string name="empty_state_my_tracks">Aggiungi e registra Tracce</string>
</resources>

View file

@ -1872,7 +1872,7 @@
<string name="gpx_no_tracks_title_folder">Legg til spor i mappen</string>
<string name="gpx_add_track">Legg til spor</string>
<string name="trip_rec_notification_settings">Turopptak (ingen data)</string>
<string name="trip_rec_notification_settings_desc">Vis merknader som lar deg starte en tur ved å trykke opptaksknappen</string>
<string name="trip_rec_notification_settings_desc">Vis et systemvarsel slik at du kan starte turopptak</string>
<string name="save_track_min_speed">Minimumshastighet for logging</string>
<string name="save_track_min_speed_descr">Filter: Still inn minimumshastighet for at et punkt skal logges</string>
<string name="save_track_min_distance">Logging ved bevegelsesoppdagelse</string>
@ -2322,9 +2322,9 @@ Representerer området: %1$s x %2$s</string>
<string name="add_point_before">Legg til punkt før</string>
<string name="add_point_after">Legg til punkt etter</string>
<string name="shared_string_options">Alternativer</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd vil legge til flere punkter, avhengig av navigeringstypen.</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd vil forbinde punktene med ruter for den valgte profilen.</string>
<string name="measurement_tool_save_as_new_track_descr">Lagre punktene enten som rutepunkter eller som en linje.</string>
<string name="choose_navigation_type">Velg navigeringstype</string>
<string name="choose_navigation_type">Velg navigeringsprofil</string>
<string name="empty_state_my_tracks">Legg til og ta opp spor</string>
<string name="empty_state_my_tracks_desc">Ta opp eller importer spor som skal vises</string>
<string name="empty_state_favourites">Legg til favoritter</string>
@ -2336,9 +2336,9 @@ Representerer området: %1$s x %2$s</string>
<string name="add_route_points">Legg til rutepunkter</string>
<string name="add_line">Legg til linje</string>
<string name="do_not_use_animations">Ikke bruk animasjoner</string>
<string name="do_not_use_animations_descr">Skrur av animasjoner i programmet</string>
<string name="keep_showing_on_map">Forsett å vise på kartet</string>
<string name="exit_without_saving">Avslutt uten å lagre?</string>
<string name="do_not_use_animations_descr">Sr av animasjoner i programmet</string>
<string name="keep_showing_on_map">Fortsett å vise på kartet</string>
<string name="exit_without_saving">Avslutte uten å lagre?</string>
<string name="mapillary_menu_descr_username">Vis bilder lagt til av en gitt bruker.</string>
<string name="mapillary_image">Mapillary-bilde</string>
<string name="open_mapillary">Åpne Mapillary</string>
@ -2357,11 +2357,16 @@ Representerer området: %1$s x %2$s</string>
<string name="do_not_send_anonymous_app_usage">Ikke send anonym bruksstatistikk</string>
<string name="parking_options">Parkeringsalternativer</string>
<string name="full_version_thanks">Takk for at du kjøpte fullversjonen av OsmAnd!</string>
<string name="routing_attr_driving_style_speed_name">Kortere turer</string>
<string name="routing_attr_driving_style_speed_name">Kortere ruter</string>
<string name="routing_attr_driving_style_balance_name">Balansert</string>
<string name="track_points_category_name">Framtredne punkter på denne turen</string>
<string name="track_points_category_name">Fremtredende punkter på denne ruten</string>
<string name="shared_string_time_moving">Tid i bevegelse</string>
<string name="shared_string_time_span">Varighet</string>
<string name="shared_string_max">Maks.</string>
<string name="routing_attr_relief_smoothness_factor_name">Velg høydespenn</string>
<string name="routing_attr_relief_smoothness_factor_name">Velg høydesvingninger</string>
<string name="move_all_to_history">Flytt alle til historikk</string>
<string name="build_route">Lag rute</string>
<string name="show_direction">Vis retning</string>
<string name="sort_by">Sorter etter</string>
<string name="marker_options">Markøralternativer</string>
</resources>

View file

@ -3504,4 +3504,6 @@
<string name="poi_boat_canoe_rental_rental_yes">Kanadyjki: tak</string>
<string name="poi_boat_canoe_rental_rental_no">Kanadyjki: nie</string>
<string name="poi_network">Sieć</string>
</resources>

View file

@ -2644,7 +2644,7 @@ Reprezentuje obszar: %1$s x %2$s</string>
<string name="do_not_send_anonymous_app_usage">Nie wysyłaj anonimowych statystyk użytkowania</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd zbiera informacje o tym, z których części aplikacji korzysta użytkownik. Twoja lokalizacja nie jest nigdy wysyłana, tak jak teksty wpisywane w aplikacji i szczegóły dotyczące przeglądanych, wyszukiwanych i pobieranych obszarów.</string>
<string name="do_not_show_startup_messages">Nie pokazuj wiadomości przy starcie</string>
<string name="do_not_show_startup_messages_desc">Wyświetla wiadomości dotyczące rabatów i specjalnych wydarzeń lokalnych</string>
<string name="do_not_show_startup_messages_desc">Wyłączenie wyświetlania rabatów na program i wiadomości specjalnych o wydarzeniach lokalnych</string>
<string name="parking_options">Opcje parkowania</string>
<string name="full_version_thanks">Dziękujemy za zakup pełnej wersji OsmAnd!</string>
<string name="right_side_navigation">Ruch prawostronny</string>
@ -2816,11 +2816,11 @@ Reprezentuje obszar: %1$s x %2$s</string>
<string name="route_point">Punkt trasy</string>
<string name="shared_string_options">Opcje</string>
<string name="measurement_tool_save_as_new_track_descr">Można zapisać punkty jako punkty trasy lub linię.</string>
<string name="choose_navigation_type">Proszę wybrać rodzaj nawigacji</string>
<string name="choose_navigation_type">Wybierz profil nawigacji</string>
<string name="edit_line">Zmodyfikuj linię</string>
<string name="add_point_before">Dodaj punkt wcześniej</string>
<string name="add_point_after">Dodaj punkt dalej</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd doda dalsze punkty w zależności od rodzaju nawigacji.</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd połączy punkty z drogami w zaznaczonym profilu.</string>
<string name="add_route_points">Dodaj punkty trasy</string>
<string name="add_line">Dodaj linię</string>
<string name="empty_state_my_tracks">Dodaj i nagraj ślady</string>
@ -2834,5 +2834,10 @@ Reprezentuje obszar: %1$s x %2$s</string>
<string name="keep_showing_on_map">Wciąż wyświetlaj na mapie</string>
<string name="exit_without_saving">Czy wyjść bez zapisywania?</string>
<string name="do_not_use_animations">Wyłącz animacje</string>
<string name="do_not_use_animations_descr">Wyłącz animacje w programie</string>
<string name="do_not_use_animations_descr">Wyłącza animacje w programie</string>
<string name="move_all_to_history">Przenieś wszystkie do historii</string>
<string name="build_route">Oblicz trasę</string>
<string name="show_direction">Pokaż kierunek</string>
<string name="sort_by">Sortuj według</string>
<string name="marker_options">Opcje znacznika</string>
</resources>

View file

@ -5,7 +5,7 @@
<string name="restart_search">Искать снова</string>
<string name="increase_search_radius">Увеличить радиус поиска</string>
<string name="nothing_found">Ничего не найдено :(</string>
<string name="nothing_found_descr">Попробуйте изменить запрос или увеличить радиус поиска</string>
<string name="nothing_found_descr">Изменить запрос или увеличить радиус поиска</string>
<string name="quick_action_showhide_osmbugs_title">Показать/скрыть заметки OSM</string>
<string name="quick_action_osmbugs_show">Показать заметки OSM</string>
<string name="quick_action_osmbugs_hide">Скрыть заметки OSM</string>
@ -2401,10 +2401,10 @@
<string name="mapillary">Mapillary</string>
<string name="plugin_mapillary_descr">Уличные фотографии для всех. Исследуйте места, сотрудничайте, снимайте мир.</string>
<string name="save_poi_too_many_uppercase">Название содержит слишком много заглавных букв. Вы действительно хотите продолжить?</string>
<string name="quick_action_resume_pause_navigation_descr">Нажмите эту кнопку, чтобы приостановить навигацию или возобновить ее, если она уже приостановлена.</string>
<string name="quick_action_resume_pause_navigation_descr">Нажмите эту кнопку, чтобы приостановить навигацию или возобновить ее.</string>
<string name="quick_action_show_navigation_finish_dialog">Показывать диалог завершения навигации</string>
<string name="quick_action_start_stop_navigation">Старт/финиш навигации</string>
<string name="quick_action_start_stop_navigation_descr">Нажмите эту кнопку, чтобы начать навигацию, или остановить ее, если она уже была запущена.</string>
<string name="quick_action_start_stop_navigation">Запуск/остановка навигации</string>
<string name="quick_action_start_stop_navigation_descr">Нажмите эту кнопку, чтобы начать навигацию, или остановить ее.</string>
<string name="store_tracks_in_monthly_directories">Сохранять записанные треки в папках помесячно</string>
<string name="store_tracks_in_monthly_directories_descrp">Сохранять записанные треки в подпапках с записью месяца (например, 2017-01).</string>
<string name="mapillary_menu_title_tile_cache">Кэш тайлов</string>
@ -2432,7 +2432,7 @@
<string name="moving_time">Время в движении</string>
<string name="max_min">Макс/Мин</string>
<string name="min_max">Мин/Макс</string>
<string name="quick_action_resume_pause_navigation">Возобновить/Приостановить навигацию</string>
<string name="quick_action_resume_pause_navigation">Возобновить/приостановить навигацию</string>
<string name="mapillary_menu_descr_tile_cache">Перезагрузка тайлов для отображения актуальных данных.</string>
<string name="mapillary_menu_edit_text_hint">Введите имя пользователя</string>
<string name="shared_string_reset">Сбросить</string>
@ -2471,4 +2471,5 @@
\nи прочее…"</string>
<string name="rendering_value_translucent_pink_name">Прозрачно-розовый</string>
<string name="lang_ber">Берберский язык</string>
<string name="move_all_to_history">Переместить все в историю</string>
</resources>

View file

@ -2670,4 +2670,6 @@
<string name="poi_boat_canoe_rental_rental_yes">Canoas: eja</string>
<string name="poi_boat_canoe_rental_rental_no">Canoas: nono</string>
<string name="poi_network">Retza</string>
</resources>

View file

@ -2760,4 +2760,9 @@ Pro praghere iscrie su còdighe intreu</string>
<string name="exit_without_saving">Essire chene sarvare?</string>
<string name="do_not_use_animations">No imprees sas animatziones</string>
<string name="do_not_use_animations_descr">Disabilitat sas animatziones in s\'aplicatzione</string>
<string name="move_all_to_history">Pone totu in s\'istòria</string>
<string name="build_route">Càlcula s\'àndala</string>
<string name="show_direction">Ammustra sas indicatziones de diretzione</string>
<string name="sort_by">Òrdina pro</string>
<string name="marker_options">Optziones de sos marcadores</string>
</resources>

View file

@ -2537,7 +2537,7 @@ Zodpovedá oblasti: %1$s x %2$s</string>
<string name="do_not_send_anonymous_app_usage">Neodosielať anonymné štatistiky o používaní aplikácie</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd zbiera informácie o tom, ktoré časti aplikácie otvárate. Nikdy sa neodosiela vaša poloha ani nič čo zapíšete do aplikácie ani detaily o oblastiach, ktoré si prezeráte, hľadáte alebo sťahujete.</string>
<string name="do_not_show_startup_messages">Nezobrazovať oznamy pri štarte</string>
<string name="do_not_show_startup_messages_desc">Zobrazuje zľavy a oznamy o miestnych udalostiach</string>
<string name="do_not_show_startup_messages_desc">Zakáže zobrazovanie zľav aplikácie a oznamov o miestnych udalostiach</string>
<string name="parking_options">Možnosti parkovania</string>
<string name="full_version_thanks">Ďakujeme za zakúpenie plnej verzie OsmAnd!</string>
<string name="routing_attr_relief_smoothness_factor_name">Zvoľte fluktuáciu nadmorskej výšky</string>
@ -2852,5 +2852,9 @@ Zodpovedá oblasti: %1$s x %2$s</string>
<string name="import_track">Importovať stopu</string>
<string name="import_track_desc">Súbor %1$s neobsahuje body trasy, naimportovať ako stopu?</string>
<string name="move_point">Presunúť bod</string>
<string name="add_segment_to_the_track">Pridať do stopy</string>
<string name="add_segment_to_the_track">Pridať do stopy GPX</string>
<string name="do_not_use_animations">Nepoužívať animácie</string>
<string name="do_not_use_animations_descr">Vypne animácie v aplikácii</string>
<string name="keep_showing_on_map">Zobrazovať ďalej na mape</string>
<string name="exit_without_saving">Ukončiť bez uloženia?</string>
</resources>

View file

@ -3474,4 +3474,6 @@
<string name="poi_boat_canoe_rental_rental_yes">Каное: так</string>
<string name="poi_boat_canoe_rental_rental_no">Каное: немає</string>
<string name="poi_network">Мережа</string>
</resources>

View file

@ -232,7 +232,7 @@
<string name="file_can_not_be_renamed">Файл не можна перейменувати.</string>
<string name="file_with_name_already_exists">Файл з таким ім’ям вже існує.</string>
<string name="gpx_navigation">GPX маршрут</string>
<string name="gpx_navigation">Маршрут GPX</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>
@ -319,9 +319,9 @@
<string name="tts_language_not_supported">Вибрана мова не підтримується встановленим рушієм Android TTS (перетворення тексту в мову). Ви бажаєте пошукати інший рушій TTS? Якщо ні, буде використовуватись інша встановлена мова рушія TTS.</string>
<string name="tts_missing_language_data_title">Дані відсутні</string>
<string name="tts_missing_language_data">Для даної мови відсутні дані TTS. Завантажити дані з Маркету?</string>
<string name="gpx_option_reverse_route">Виберіть зворотній напрямок</string>
<string name="gpx_option_reverse_route">Зворотній напрямок GPX</string>
<string name="gpx_option_destination_point">Використовувати поточний пункт призначення</string>
<string name="gpx_option_from_start_point">Пройти увесь шлях спочатку</string>
<string name="gpx_option_from_start_point">Пройдіть по усьому треку</string>
<string name="switch_to_vector_map_to_see">Для цього регіону доступні оффлайн векторні мапи\n\t\n\tДля їх використання виберіть пункт меню \'Налаштування Мапи\' → \'Джерело мапи…\' → \'Локальні векторні мапи\'.</string>
<string name="choose_audio_stream">Голосові інструкції</string>
<string name="choose_audio_stream_descr">Виберіть канал для голосових інструкцій</string>
@ -1522,8 +1522,8 @@
<string name="index_name_canada">Північна Америка - Канада</string>
<string name="index_name_italy">Європа - Італія</string>
<string name="index_name_gb">Європа - Великобританія</string>
<string name="calculate_osmand_route_without_internet">Розрахувати відрізок маршруту OsmAnd без Інтернету</string>
<string name="gpx_option_calculate_first_last_segment">Розрахувати маршрут OsmAnd для першого і останнього відрізку маршруту</string>
<string name="calculate_osmand_route_without_internet">Розрахувати ділянку маршруту OsmAnd без Інтернету</string>
<string name="gpx_option_calculate_first_last_segment">Обчислити маршрут OsmAnd для першого та останнього сегментів маршруту</string>
<string name="use_displayed_track_for_navigation">Бажаєте використовувати показаний трек для навігації?</string>
<string name="keep_and_add_destination_point">Додати як наступний пункт призначення</string>
<string name="select_gpx">Обрати GPX…</string>
@ -1669,7 +1669,7 @@
<string name="wake_on_voice_descr">Вмикати екран телефону (якщо він вимкнутий) під час наближення до повороту</string>
<string name="shared_string_never">Ніколи</string>
<string name="impassable_road">Уникати дороги</string>
<string name="impassable_road">Уникати доріг</string>
<string name="rendering_attr_trainLightrailRoutes_name">Маршрути поїздів</string>
<string name="rendering_attr_tramRoutes_name">Маршрути трамваїв</string>
@ -1814,7 +1814,7 @@
<string name="short_location_on_map">Шир %1$s↵
Дов %2$s</string>
<string name="tips_and_tricks_descr">Запитання та відповіді, останні зміни та інше</string>
<string name="routing_settings_2">Параметри навігації</string>
<string name="routing_settings_2">Налаштування навігації</string>
<string name="general_settings_2">Загальні налаштування</string>
<string name="shared_string_ellipsis"></string>
<string name="shared_string_selected">Вибрані</string>
@ -2172,7 +2172,7 @@
<string name="available_maps">Доступні мапи</string>
<string name="select_voice_provider">Виберіть голосові вказівки</string>
<string name="select_voice_provider_descr">Виберіть або завантажте голосові вказівки для вашої мови</string>
<string name="impassable_road_desc">Виберіть дороги, яких ви бажаєте уникати під час навігації</string>
<string name="impassable_road_desc">Виберіть дороги, які потрібно уникнути під час навігації</string>
<string name="shared_string_sound">Звук</string>
<string name="poi_deleted_localy">POI буде вилучено після того, як ви вивантажите ваші зміни</string>
<string name="confirm_download_roadmaps">Ви впевнені, що бажаєте завантажити мапу з дорогами, хоча ви вже маєете стандартну (повну) мапу?</string>
@ -2674,7 +2674,7 @@
<string name="animate_my_location_desc">Задіяти анімацію мого місця розташування під час навігації</string>
<string name="do_not_show_startup_messages">Не показувати повідомлення при запуску</string>
<string name="subscribe_email_desc">Підпишіться на наше email-розсилання про знижки на OsmAnd та отримаєте 3 додаткові завантаження мап!</string>
<string name="do_not_show_startup_messages_desc">Відображаються знижки та спеціальні повідомлення про місцеві події</string>
<string name="do_not_show_startup_messages_desc">Пригнічує відображення знижок на застосунок та спеціальні повідомлення про місцеві події</string>
<string name="restart_search">Шукати знову</string>
<string name="increase_search_radius">Збільшити радіус пошуку</string>
<string name="nothing_found">Нічого не знайдено :(</string>
@ -2977,9 +2977,9 @@
<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">OsmAnd додасть додаткові точки в залежності від типу навігації.</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd з’єднає точки з маршрутами для обраного профілю.</string>
<string name="measurement_tool_save_as_new_track_descr">Ви може зберегти точки, як точки маршруту або як лінію.</string>
<string name="choose_navigation_type">Вибрати тип навігації</string>
<string name="choose_navigation_type">Виберіть профіль навігації</string>
<string name="add_route_points">Додати точки маршруту</string>
<string name="add_line">Додати лінію</string>
<string name="empty_state_my_tracks">Додавати і записувати треки</string>
@ -2992,4 +2992,11 @@
<string name="add_segment_to_the_track">Додати до GPX-треку</string>
<string name="keep_showing_on_map">Продовжувати показувати на мапі</string>
<string name="exit_without_saving">Вийти без збереження?</string>
<string name="move_all_to_history">Перемістити усе в історію</string>
<string name="build_route">Побудувати маршрут</string>
<string name="show_direction">Показати напрямок</string>
<string name="sort_by">Сортувати за</string>
<string name="marker_options">Параметри маркера</string>
<string name="do_not_use_animations">Не застосовувати анімацію</string>
<string name="do_not_use_animations_descr">Відключення анімації в програмі</string>
</resources>

View file

@ -3509,4 +3509,6 @@
<string name="poi_boat_canoe_rental_rental_yes">獨木舟:有</string>
<string name="poi_boat_canoe_rental_rental_no">獨木舟:無</string>
<string name="poi_network">網路</string>
</resources>

View file

@ -2649,7 +2649,7 @@ OsmAnd (Automated Navigation Directions) 是一個地圖和導航的應用程式
<string name="parking_options">停車選項</string>
<string name="do_not_send_anonymous_app_usage">不要傳送匿名應用程式使用方式統計</string>
<string name="do_not_show_startup_messages">不要在啟動時顯示訊息</string>
<string name="do_not_show_startup_messages_desc">隱匿顯示應用程式折扣和專用的在地事件訊息</string>
<string name="do_not_show_startup_messages_desc">封鎖顯示應用程式折扣和專用的在地事件訊息</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd 收集您開了應用程式哪些部件的資訊。絕不會傳送您所在的位置,也沒有您向應用程式輸入的任何內容或您所查看區域的詳細資料、搜尋或下載。</string>
<string name="select_street">選擇街道</string>
<string name="shared_string_in_name">在 %1$s</string>
@ -2826,9 +2826,9 @@ OsmAnd (Automated Navigation Directions) 是一個地圖和導航的應用程式
<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">OsmAnd 將依據導航類型,增加輔助的標點</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd 將連接標點與已選取設定檔的路線</string>
<string name="measurement_tool_save_as_new_track_descr">您可以將標點儲存為路線標點或是一條線路。</string>
<string name="choose_navigation_type">選擇導航類型</string>
<string name="choose_navigation_type">選擇導航設定檔</string>
<string name="add_route_points">增加路線標點</string>
<string name="add_line">增加線路</string>
<string name="empty_state_my_tracks">增加並錄製軌跡</string>
@ -2843,4 +2843,9 @@ OsmAnd (Automated Navigation Directions) 是一個地圖和導航的應用程式
<string name="exit_without_saving">離開而不儲存嗎?</string>
<string name="do_not_use_animations">不使用動畫</string>
<string name="do_not_use_animations_descr">停用在應用程式中的動畫</string>
<string name="move_all_to_history">全部移動到歷程</string>
<string name="build_route">建立路線</string>
<string name="show_direction">顯示方向</string>
<string name="sort_by">排序方式</string>
<string name="marker_options">標記選項</string>
</resources>

View file

@ -3467,4 +3467,6 @@
<string name="poi_boat_canoe_rental_rental_yes">Canoe: yes</string>
<string name="poi_boat_canoe_rental_rental_no">Canoe: no</string>
<string name="poi_network">Network</string>
</resources>

View file

@ -28,9 +28,9 @@
<string name="add_point_before">Add point before</string>
<string name="add_point_after">Add point after</string>
<string name="shared_string_options">Options</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd will add additional points, depending on the navigation type.</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd will connect the points with routes for the selected profile.</string>
<string name="measurement_tool_save_as_new_track_descr">You can save the points either as route points or as a line.</string>
<string name="choose_navigation_type">Choose navigation type</string>
<string name="choose_navigation_type">Select navigation profile</string>
<string name="none_point_error">Please add at least one point.</string>
<string name="enter_gpx_name">GPX file name:</string>
<string name="show_on_map_after_saving">Show on map after saving</string>

View file

@ -392,53 +392,53 @@
<style name="Animations"/>
<style name="Animations.NoAnimation">
<item name="@android:windowEnterAnimation">@null</item>
<item name="@android:windowExitAnimation">@null</item>
<item name="android:windowEnterAnimation">@null</item>
<item name="android:windowExitAnimation">@null</item>
</style>
<!-- PopDownMenu -->
<style name="Animations.PopDownMenu"/>
<style name="Animations.PopDownMenu.Left">
<item name="@android:windowEnterAnimation">@anim/grow_from_topleft_to_bottomright</item>
<item name="@android:windowExitAnimation">@anim/shrink_from_bottomright_to_topleft</item>
<item name="android:windowEnterAnimation">@anim/grow_from_topleft_to_bottomright</item>
<item name="android:windowExitAnimation">@anim/shrink_from_bottomright_to_topleft</item>
</style>
<style name="Animations.PopDownMenu.Right">
<item name="@android:windowEnterAnimation">@anim/grow_from_topright_to_bottomleft</item>
<item name="@android:windowExitAnimation">@anim/shrink_from_bottomleft_to_topright</item>
<item name="android:windowEnterAnimation">@anim/grow_from_topright_to_bottomleft</item>
<item name="android:windowExitAnimation">@anim/shrink_from_bottomleft_to_topright</item>
</style>
<style name="Animations.PopDownMenu.Center">
<item name="@android:windowEnterAnimation">@anim/grow_from_top</item>
<item name="@android:windowExitAnimation">@anim/shrink_from_bottom</item>
<item name="android:windowEnterAnimation">@anim/grow_from_top</item>
<item name="android:windowExitAnimation">@anim/shrink_from_bottom</item>
</style>
<!-- PopUpMenu -->
<style name="Animations.PopUpMenu"/>
<style name="Animations.PopUpMenu.Fade">
<item name="@android:windowEnterAnimation">@anim/popup_show</item>
<item name="@android:windowExitAnimation">@anim/popup_hide</item>
<item name="android:windowEnterAnimation">@anim/popup_show</item>
<item name="android:windowExitAnimation">@anim/popup_hide</item>
</style>
<style name="Animations.PopUpMenu.Left">
<item name="@android:windowEnterAnimation">@anim/grow_from_bottomleft_to_topright</item>
<item name="@android:windowExitAnimation">@anim/shrink_from_topright_to_bottomleft</item>
<item name="android:windowEnterAnimation">@anim/grow_from_bottomleft_to_topright</item>
<item name="android:windowExitAnimation">@anim/shrink_from_topright_to_bottomleft</item>
</style>
<style name="Animations.PopUpMenu.Right">
<item name="@android:windowEnterAnimation">@anim/grow_from_bottomright_to_topleft</item>
<item name="@android:windowExitAnimation">@anim/shrink_from_topleft_to_bottomright</item>
<item name="android:windowEnterAnimation">@anim/grow_from_bottomright_to_topleft</item>
<item name="android:windowExitAnimation">@anim/shrink_from_topleft_to_bottomright</item>
</style>
<style name="Animations.PopUpMenu.Center">
<item name="@android:windowEnterAnimation">@anim/grow_from_bottom</item>
<item name="@android:windowExitAnimation">@anim/shrink_from_top</item>
<item name="android:windowEnterAnimation">@anim/grow_from_bottom</item>
<item name="android:windowExitAnimation">@anim/shrink_from_top</item>
</style>
<style name="Animations.PopUpMenu.Bottom">
<item name="@android:windowEnterAnimation">@anim/slide_in_bottom</item>
<item name="@android:windowExitAnimation">@anim/slide_out_bottom</item>
<item name="android:windowEnterAnimation">@anim/slide_in_bottom</item>
<item name="android:windowExitAnimation">@anim/slide_out_bottom</item>
</style>
<style name="create_poi_text_field">

View file

@ -41,6 +41,14 @@ import net.osmand.aidl.maplayer.AddMapLayerParams;
import net.osmand.aidl.maplayer.RemoveMapLayerParams;
import net.osmand.aidl.maplayer.UpdateMapLayerParams;
import net.osmand.aidl.navigation.NavigateParams;
import net.osmand.aidl.navigation.NavigateGpxParams;
import net.osmand.aidl.note.TakePhotoNoteParams;
import net.osmand.aidl.note.StartVideoRecordingParams;
import net.osmand.aidl.note.StartAudioRecordingParams;
import net.osmand.aidl.note.StopRecordingParams;
// NOTE: Add new methods at the end of file!!!
interface IOsmAndAidlInterface {
@ -82,4 +90,12 @@ interface IOsmAndAidlInterface {
boolean startGpxRecording(in StartGpxRecordingParams params);
boolean stopGpxRecording(in StopGpxRecordingParams params);
boolean takePhotoNote(in TakePhotoNoteParams params);
boolean startVideoRecording(in StartVideoRecordingParams params);
boolean startAudioRecording(in StartAudioRecordingParams params);
boolean stopRecording(in StopRecordingParams params);
boolean navigate(in NavigateParams params);
boolean navigateGpx(in NavigateGpxParams params);
}

View file

@ -2,11 +2,14 @@ package net.osmand.aidl;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.ParcelFileDescriptor;
import android.support.v7.app.AlertDialog;
import android.view.View;
import net.osmand.IndexConstants;
@ -22,6 +25,7 @@ import net.osmand.aidl.mapwidget.AMapWidget;
import net.osmand.data.FavouritePoint;
import net.osmand.data.LatLon;
import net.osmand.data.PointDescription;
import net.osmand.plus.ApplicationMode;
import net.osmand.plus.FavouritesDbHelper;
import net.osmand.plus.GPXDatabase.GpxDataItem;
import net.osmand.plus.GPXUtilities;
@ -32,10 +36,13 @@ import net.osmand.plus.MapMarkersHelper;
import net.osmand.plus.MapMarkersHelper.MapMarker;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.TargetPointsHelper;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.audionotes.AudioVideoNotesPlugin;
import net.osmand.plus.dialogs.ConfigureMapMenu;
import net.osmand.plus.helpers.ColorDialogs;
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.views.AidlMapLayer;
import net.osmand.plus.views.MapInfoLayer;
import net.osmand.plus.views.OsmandMapLayer;
@ -49,6 +56,7 @@ import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
@ -65,6 +73,17 @@ public class OsmandAidlApi {
private static final String AIDL_ZOOM = "aidl_zoom";
private static final String AIDL_ANIMATED = "aidl_animated";
private static final String AIDL_START_NAME = "aidl_start_name";
private static final String AIDL_START_LAT = "aidl_start_lat";
private static final String AIDL_START_LON = "aidl_start_lon";
private static final String AIDL_DEST_NAME = "aidl_dest_name";
private static final String AIDL_DEST_LAT = "aidl_dest_lat";
private static final String AIDL_DEST_LON = "aidl_dest_lon";
private static final String AIDL_PROFILE = "aidl_profile";
private static final String AIDL_DATA = "aidl_data";
private static final String AIDL_URI = "aidl_uri";
private static final String AIDL_FORCE = "aidl_force";
private static final String AIDL_OBJECT_ID = "aidl_object_id";
private static final String AIDL_ADD_MAP_WIDGET = "aidl_add_map_widget";
@ -73,6 +92,22 @@ public class OsmandAidlApi {
private static final String AIDL_ADD_MAP_LAYER = "aidl_add_map_layer";
private static final String AIDL_REMOVE_MAP_LAYER = "aidl_remove_map_layer";
private static final String AIDL_TAKE_PHOTO_NOTE = "aidl_take_photo_note";
private static final String AIDL_START_VIDEO_RECORDING = "aidl_start_video_recording";
private static final String AIDL_START_AUDIO_RECORDING = "aidl_start_audio_recording";
private static final String AIDL_STOP_RECORDING = "aidl_stop_recording";
private static final String AIDL_NAVIGATE = "aidl_navigate";
private static final String AIDL_NAVIGATE_GPX = "aidl_navigate_gpx";
private static final ApplicationMode DEFAULT_PROFILE = ApplicationMode.CAR;
private static final ApplicationMode[] VALID_PROFILES = new ApplicationMode[]{
ApplicationMode.CAR,
ApplicationMode.BICYCLE,
ApplicationMode.PEDESTRIAN
};
private OsmandApplication app;
private Map<String, AMapWidget> widgets = new ConcurrentHashMap<>();
private Map<String, TextInfoWidget> widgetControls = new ConcurrentHashMap<>();
@ -85,6 +120,12 @@ public class OsmandAidlApi {
private BroadcastReceiver removeMapWidgetReceiver;
private BroadcastReceiver addMapLayerReceiver;
private BroadcastReceiver removeMapLayerReceiver;
private BroadcastReceiver takePhotoNoteReceiver;
private BroadcastReceiver startVideoRecordingReceiver;
private BroadcastReceiver startAudioRecordingReceiver;
private BroadcastReceiver stopRecordingReceiver;
private BroadcastReceiver navigateReceiver;
private BroadcastReceiver navigateGpxReceiver;
public OsmandAidlApi(OsmandApplication app) {
this.app = app;
@ -97,6 +138,12 @@ public class OsmandAidlApi {
registerRemoveMapWidgetReceiver(mapActivity);
registerAddMapLayerReceiver(mapActivity);
registerRemoveMapLayerReceiver(mapActivity);
registerTakePhotoNoteReceiver(mapActivity);
registerStartVideoRecordingReceiver(mapActivity);
registerStartAudioRecordingReceiver(mapActivity);
registerStopRecordingReceiver(mapActivity);
registerNavigateReceiver(mapActivity);
registerNavigateGpxReceiver(mapActivity);
}
public void onDestroyMapActivity(final MapActivity mapActivity) {
@ -151,6 +198,54 @@ public class OsmandAidlApi {
}
removeMapLayerReceiver = null;
}
if (takePhotoNoteReceiver != null) {
try {
mapActivity.unregisterReceiver(takePhotoNoteReceiver);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
takePhotoNoteReceiver = null;
}
if (startVideoRecordingReceiver != null) {
try {
mapActivity.unregisterReceiver(startVideoRecordingReceiver);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
startVideoRecordingReceiver = null;
}
if (startAudioRecordingReceiver != null) {
try {
mapActivity.unregisterReceiver(startAudioRecordingReceiver);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
startAudioRecordingReceiver = null;
}
if (stopRecordingReceiver != null) {
try {
mapActivity.unregisterReceiver(stopRecordingReceiver);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
stopRecordingReceiver = null;
}
if (navigateReceiver != null) {
try {
mapActivity.unregisterReceiver(navigateReceiver);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
navigateReceiver = null;
}
if (navigateGpxReceiver != null) {
try {
mapActivity.unregisterReceiver(navigateGpxReceiver);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
navigateGpxReceiver = null;
}
}
private void registerRefreshMapReceiver(final MapActivity mapActivity) {
@ -303,6 +398,208 @@ public class OsmandAidlApi {
mapActivity.registerReceiver(removeMapLayerReceiver, new IntentFilter(AIDL_REMOVE_MAP_LAYER));
}
private void registerTakePhotoNoteReceiver(final MapActivity mapActivity) {
takePhotoNoteReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final AudioVideoNotesPlugin plugin = OsmandPlugin.getEnabledPlugin(AudioVideoNotesPlugin.class);
if (plugin != null) {
double lat = intent.getDoubleExtra(AIDL_LATITUDE, Double.NaN);
double lon = intent.getDoubleExtra(AIDL_LONGITUDE, Double.NaN);
plugin.takePhoto(lat, lon, mapActivity, false, true);
}
}
};
mapActivity.registerReceiver(takePhotoNoteReceiver, new IntentFilter(AIDL_TAKE_PHOTO_NOTE));
}
private void registerStartVideoRecordingReceiver(final MapActivity mapActivity) {
startVideoRecordingReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final AudioVideoNotesPlugin plugin = OsmandPlugin.getEnabledPlugin(AudioVideoNotesPlugin.class);
if (plugin != null) {
double lat = intent.getDoubleExtra(AIDL_LATITUDE, Double.NaN);
double lon = intent.getDoubleExtra(AIDL_LONGITUDE, Double.NaN);
plugin.recordVideo(lat, lon, mapActivity, true);
}
}
};
mapActivity.registerReceiver(startVideoRecordingReceiver, new IntentFilter(AIDL_START_VIDEO_RECORDING));
}
private void registerStartAudioRecordingReceiver(final MapActivity mapActivity) {
startVideoRecordingReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final AudioVideoNotesPlugin plugin = OsmandPlugin.getEnabledPlugin(AudioVideoNotesPlugin.class);
if (plugin != null) {
double lat = intent.getDoubleExtra(AIDL_LATITUDE, Double.NaN);
double lon = intent.getDoubleExtra(AIDL_LONGITUDE, Double.NaN);
plugin.recordAudio(lat, lon, mapActivity);
}
}
};
mapActivity.registerReceiver(startVideoRecordingReceiver, new IntentFilter(AIDL_START_AUDIO_RECORDING));
}
private void registerStopRecordingReceiver(final MapActivity mapActivity) {
stopRecordingReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final AudioVideoNotesPlugin plugin = OsmandPlugin.getEnabledPlugin(AudioVideoNotesPlugin.class);
if (plugin != null) {
plugin.stopRecording(mapActivity, false);
}
}
};
mapActivity.registerReceiver(stopRecordingReceiver, new IntentFilter(AIDL_STOP_RECORDING));
}
private void registerNavigateReceiver(final MapActivity mapActivity) {
navigateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String profileStr = intent.getStringExtra(AIDL_PROFILE);
final ApplicationMode profile = ApplicationMode.valueOfStringKey(profileStr, DEFAULT_PROFILE);
boolean validProfile = false;
for (ApplicationMode mode : VALID_PROFILES) {
if (mode == profile) {
validProfile = true;
break;
}
}
if (validProfile) {
String startName = intent.getStringExtra(AIDL_START_NAME);
if (Algorithms.isEmpty(startName)) {
startName = "";
}
String destName = intent.getStringExtra(AIDL_DEST_NAME);
if (Algorithms.isEmpty(destName)) {
destName = "";
}
final LatLon start;
final PointDescription startDesc;
double startLat = intent.getDoubleExtra(AIDL_START_LAT, 0);
double startLon = intent.getDoubleExtra(AIDL_START_LON, 0);
if (startLat != 0 && startLon != 0) {
start = new LatLon(startLat, startLon);
startDesc = new PointDescription(PointDescription.POINT_TYPE_LOCATION, startName);
} else {
start = null;
startDesc = null;
}
double destLat = intent.getDoubleExtra(AIDL_DEST_LAT, 0);
double destLon = intent.getDoubleExtra(AIDL_DEST_LON, 0);
final LatLon dest = new LatLon(destLat, destLon);
final PointDescription destDesc = new PointDescription(PointDescription.POINT_TYPE_LOCATION, destName);
final RoutingHelper routingHelper = app.getRoutingHelper();
boolean force = intent.getBooleanExtra(AIDL_FORCE, true);
if (routingHelper.isFollowingMode() && !force) {
AlertDialog dlg = mapActivity.getMapActions().stopNavigationActionConfirm();
dlg.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
if (!routingHelper.isFollowingMode()) {
startNavigation(mapActivity, null, start, startDesc, dest, destDesc, profile);
}
}
});
} else {
startNavigation(mapActivity, null, start, startDesc, dest, destDesc, profile);
}
}
}
};
mapActivity.registerReceiver(navigateReceiver, new IntentFilter(AIDL_NAVIGATE));
}
private void registerNavigateGpxReceiver(final MapActivity mapActivity) {
navigateGpxReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
boolean force = intent.getBooleanExtra(AIDL_FORCE, false);
GPXFile gpx = null;
if (intent.getStringExtra(AIDL_DATA) != null) {
String gpxStr = intent.getStringExtra(AIDL_DATA);
if (!Algorithms.isEmpty(gpxStr)) {
gpx = GPXUtilities.loadGPXFile(mapActivity, new ByteArrayInputStream(gpxStr.getBytes()));
}
} else if (intent.getParcelableExtra(AIDL_URI) != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
Uri gpxUri = intent.getParcelableExtra(AIDL_URI);
ParcelFileDescriptor gpxParcelDescriptor = null;
try {
gpxParcelDescriptor = mapActivity.getContentResolver().openFileDescriptor(gpxUri, "r");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
if (gpxParcelDescriptor != null) {
FileDescriptor fileDescriptor = gpxParcelDescriptor.getFileDescriptor();
gpx = GPXUtilities.loadGPXFile(mapActivity, new FileInputStream(fileDescriptor));
}
}
}
if (gpx != null) {
final RoutingHelper routingHelper = app.getRoutingHelper();
if (routingHelper.isFollowingMode() && !force) {
final GPXFile gpxFile = gpx;
AlertDialog dlg = mapActivity.getMapActions().stopNavigationActionConfirm();
dlg.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
if (!routingHelper.isFollowingMode()) {
startNavigation(mapActivity, gpxFile, null, null, null, null, null);
}
}
});
} else {
startNavigation(mapActivity, gpx, null, null, null, null, null);
}
}
}
};
mapActivity.registerReceiver(navigateGpxReceiver, new IntentFilter(AIDL_NAVIGATE_GPX));
}
private void startNavigation(MapActivity mapActivity,
GPXFile gpx,
LatLon from, PointDescription fromDesc,
LatLon to, PointDescription toDesc,
ApplicationMode mode) {
OsmandApplication app = mapActivity.getMyApplication();
RoutingHelper routingHelper = app.getRoutingHelper();
if (gpx == null) {
app.getSettings().APPLICATION_MODE.set(mode);
final TargetPointsHelper targets = mapActivity.getMyApplication().getTargetPointsHelper();
targets.removeAllWayPoints(false, true);
targets.navigateToPoint(to, true, -1, toDesc);
}
mapActivity.getMapActions().enterRoutePlanningModeGivenGpx(gpx, from, fromDesc, true, false);
if (!app.getTargetPointsHelper().checkPointToNavigateShort()) {
mapActivity.getMapLayers().getMapControlsLayer().getMapRouteInfoMenu().show();
} else {
if (app.getSettings().APPLICATION_MODE.get() != routingHelper.getAppMode()) {
app.getSettings().APPLICATION_MODE.set(routingHelper.getAppMode());
}
mapActivity.getMapViewTrackingUtilities().backToLocationImpl();
app.getSettings().FOLLOW_THE_ROUTE.set(true);
routingHelper.setFollowingMode(true);
routingHelper.setRoutePlanningMode(false);
mapActivity.getMapViewTrackingUtilities().switchToRoutePlanningMode();
app.getRoutingHelper().notifyIfRouteIsCalculated();
routingHelper.setCurrentLocation(app.getLocationProvider().getLastKnownLocation(), false);
}
}
public void registerMapLayers(MapActivity mapActivity) {
for (AMapLayer layer : layers.values()) {
OsmandMapLayer mapLayer = mapLayers.get(layer.getId());
@ -521,7 +818,7 @@ public class OsmandAidlApi {
if (m.getOnlyName().equals(markerPrev.getName()) && latLon.equals(new LatLon(m.getLatitude(), m.getLongitude()))) {
PointDescription pd = new PointDescription(
PointDescription.POINT_TYPE_MAP_MARKER, markerNew.getName() != null ? markerNew.getName() : "");
MapMarker marker = new MapMarker(m.point, pd, m.colorIndex, m.selected, m.index);
MapMarker marker = new MapMarker(m.point, pd, m.colorIndex, m.selected, m.creationDate, m.index);
markersHelper.moveMapMarker(marker, latLonNew);
refreshMap();
return true;
@ -865,4 +1162,63 @@ public class OsmandAidlApi {
}
return false;
}
boolean takePhotoNote(double latitude, double longitude) {
Intent intent = new Intent();
intent.setAction(AIDL_TAKE_PHOTO_NOTE);
intent.putExtra(AIDL_LATITUDE, latitude);
intent.putExtra(AIDL_LONGITUDE, longitude);
app.sendBroadcast(intent);
return true;
}
boolean startVideoRecording(double latitude, double longitude) {
Intent intent = new Intent();
intent.setAction(AIDL_START_VIDEO_RECORDING);
intent.putExtra(AIDL_LATITUDE, latitude);
intent.putExtra(AIDL_LONGITUDE, longitude);
app.sendBroadcast(intent);
return true;
}
boolean startAudioRecording(double latitude, double longitude) {
Intent intent = new Intent();
intent.setAction(AIDL_START_AUDIO_RECORDING);
intent.putExtra(AIDL_LATITUDE, latitude);
intent.putExtra(AIDL_LONGITUDE, longitude);
app.sendBroadcast(intent);
return true;
}
boolean stopRecording() {
Intent intent = new Intent();
intent.setAction(AIDL_STOP_RECORDING);
app.sendBroadcast(intent);
return true;
}
boolean navigate(String startName, double startLat, double startLon, String destName, double destLat, double destLon, String profile, boolean force) {
Intent intent = new Intent();
intent.setAction(AIDL_NAVIGATE);
intent.putExtra(AIDL_START_NAME, startName);
intent.putExtra(AIDL_START_LAT, startLat);
intent.putExtra(AIDL_START_LON, startLon);
intent.putExtra(AIDL_DEST_NAME, destName);
intent.putExtra(AIDL_DEST_LAT, destLat);
intent.putExtra(AIDL_DEST_LON, destLon);
intent.putExtra(AIDL_PROFILE, profile);
intent.putExtra(AIDL_FORCE, force);
app.sendBroadcast(intent);
return true;
}
boolean navigateGpx(String data, Uri uri, boolean force) {
Intent intent = new Intent();
intent.setAction(AIDL_NAVIGATE_GPX);
intent.putExtra(AIDL_DATA, data);
intent.putExtra(AIDL_URI, uri);
intent.putExtra(AIDL_FORCE, force);
app.sendBroadcast(intent);
return true;
}
}

View file

@ -31,6 +31,12 @@ import net.osmand.aidl.mapmarker.UpdateMapMarkerParams;
import net.osmand.aidl.mapwidget.AddMapWidgetParams;
import net.osmand.aidl.mapwidget.RemoveMapWidgetParams;
import net.osmand.aidl.mapwidget.UpdateMapWidgetParams;
import net.osmand.aidl.navigation.NavigateGpxParams;
import net.osmand.aidl.navigation.NavigateParams;
import net.osmand.aidl.note.StartAudioRecordingParams;
import net.osmand.aidl.note.StopRecordingParams;
import net.osmand.aidl.note.TakePhotoNoteParams;
import net.osmand.aidl.note.StartVideoRecordingParams;
import net.osmand.plus.OsmandApplication;
import net.osmand.util.Algorithms;
@ -340,5 +346,59 @@ public class OsmandAidlService extends Service {
return false;
}
}
@Override
public boolean takePhotoNote(TakePhotoNoteParams params) throws RemoteException {
try {
return params != null && getApi().takePhotoNote(params.getLatitude(), params.getLongitude());
} catch (Exception e) {
return false;
}
}
@Override
public boolean startVideoRecording(StartVideoRecordingParams params) throws RemoteException {
try {
return params != null && getApi().startVideoRecording(params.getLatitude(), params.getLongitude());
} catch (Exception e) {
return false;
}
}
@Override
public boolean startAudioRecording(StartAudioRecordingParams params) throws RemoteException {
try {
return params != null && getApi().startAudioRecording(params.getLatitude(), params.getLongitude());
} catch (Exception e) {
return false;
}
}
@Override
public boolean stopRecording(StopRecordingParams params) throws RemoteException {
try {
return getApi().stopRecording();
} catch (Exception e) {
return false;
}
}
@Override
public boolean navigate(NavigateParams params) throws RemoteException {
try {
return params != null && getApi().navigate(params.getStartName(), params.getStartLat(), params.getStartLon(), params.getDestName(), params.getDestLat(), params.getDestLon(), params.getProfile(), params.isForce());
} catch (Exception e) {
return false;
}
}
@Override
public boolean navigateGpx(NavigateGpxParams params) throws RemoteException {
try {
return params != null && getApi().navigateGpx(params.getData(), params.getUri(), params.isForce());
} catch (Exception e) {
return false;
}
}
};
}

View file

@ -0,0 +1,3 @@
package net.osmand.aidl.navigation;
parcelable NavigateGpxParams;

View file

@ -0,0 +1,69 @@
package net.osmand.aidl.navigation;
import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
public class NavigateGpxParams implements Parcelable {
private String data;
private Uri uri;
private boolean force;
public NavigateGpxParams(String data, boolean force) {
this.data = data;
this.force = force;
}
public NavigateGpxParams(Uri uri, boolean force) {
this.uri = uri;
this.force = force;
}
public NavigateGpxParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<NavigateGpxParams> CREATOR = new Creator<NavigateGpxParams>() {
@Override
public NavigateGpxParams createFromParcel(Parcel in) {
return new NavigateGpxParams(in);
}
@Override
public NavigateGpxParams[] newArray(int size) {
return new NavigateGpxParams[size];
}
};
public String getData() {
return data;
}
public Uri getUri() {
return uri;
}
public boolean isForce() {
return force;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(data);
out.writeParcelable(uri, flags);
out.writeByte((byte) (force ? 1 : 0));
}
private void readFromParcel(Parcel in) {
data = in.readString();
uri = in.readParcelable(Uri.class.getClassLoader());
force = in.readByte() != 0;
}
@Override
public int describeContents() {
return 0;
}
}

View file

@ -0,0 +1,3 @@
package net.osmand.aidl.navigation;
parcelable NavigateParams;

View file

@ -0,0 +1,104 @@
package net.osmand.aidl.navigation;
import android.os.Parcel;
import android.os.Parcelable;
public class NavigateParams implements Parcelable {
private String startName;
private double startLat;
private double startLon;
private String destName;
private double destLat;
private double destLon;
private String profile;
private boolean force;
public NavigateParams(String startName, double startLat, double startLon, String destName, double destLat, double destLon, String profile, boolean force) {
this.startName = startName;
this.startLat = startLat;
this.startLon = startLon;
this.destName = destName;
this.destLat = destLat;
this.destLon = destLon;
this.profile = profile;
this.force = force;
}
public NavigateParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<NavigateParams> CREATOR = new Creator<NavigateParams>() {
@Override
public NavigateParams createFromParcel(Parcel in) {
return new NavigateParams(in);
}
@Override
public NavigateParams[] newArray(int size) {
return new NavigateParams[size];
}
};
public String getStartName() {
return startName;
}
public double getStartLat() {
return startLat;
}
public double getStartLon() {
return startLon;
}
public String getDestName() {
return destName;
}
public double getDestLat() {
return destLat;
}
public double getDestLon() {
return destLon;
}
public String getProfile() {
return profile;
}
public boolean isForce() {
return force;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(startName);
out.writeDouble(startLat);
out.writeDouble(startLon);
out.writeString(destName);
out.writeDouble(destLat);
out.writeDouble(destLon);
out.writeString(profile);
out.writeByte((byte) (force ? 1 : 0));
}
private void readFromParcel(Parcel in) {
startName = in.readString();
startLat = in.readDouble();
startLon = in.readDouble();
destName = in.readString();
destLat = in.readDouble();
destLon = in.readDouble();
profile = in.readString();
force = in.readByte() != 0;
}
@Override
public int describeContents() {
return 0;
}
}

View file

@ -0,0 +1,3 @@
package net.osmand.aidl.note;
parcelable StartAudioRecordingParams;

View file

@ -0,0 +1,56 @@
package net.osmand.aidl.note;
import android.os.Parcel;
import android.os.Parcelable;
public class StartAudioRecordingParams implements Parcelable {
private double latitude;
private double longitude;
public StartAudioRecordingParams(double latitude, double longitude) {
this.latitude = latitude;
this.longitude = longitude;
}
public StartAudioRecordingParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<StartAudioRecordingParams> CREATOR = new Creator<StartAudioRecordingParams>() {
@Override
public StartAudioRecordingParams createFromParcel(Parcel in) {
return new StartAudioRecordingParams(in);
}
@Override
public StartAudioRecordingParams[] newArray(int size) {
return new StartAudioRecordingParams[size];
}
};
public double getLatitude() {
return latitude;
}
public double getLongitude() {
return longitude;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeDouble(latitude);
out.writeDouble(longitude);
}
private void readFromParcel(Parcel in) {
latitude = in.readDouble();
longitude = in.readDouble();
}
@Override
public int describeContents() {
return 0;
}
}

View file

@ -0,0 +1,3 @@
package net.osmand.aidl.note;
parcelable StartVideoRecordingParams;

View file

@ -0,0 +1,56 @@
package net.osmand.aidl.note;
import android.os.Parcel;
import android.os.Parcelable;
public class StartVideoRecordingParams implements Parcelable {
private double latitude;
private double longitude;
public StartVideoRecordingParams(double latitude, double longitude) {
this.latitude = latitude;
this.longitude = longitude;
}
public StartVideoRecordingParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<StartVideoRecordingParams> CREATOR = new Creator<StartVideoRecordingParams>() {
@Override
public StartVideoRecordingParams createFromParcel(Parcel in) {
return new StartVideoRecordingParams(in);
}
@Override
public StartVideoRecordingParams[] newArray(int size) {
return new StartVideoRecordingParams[size];
}
};
public double getLatitude() {
return latitude;
}
public double getLongitude() {
return longitude;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeDouble(latitude);
out.writeDouble(longitude);
}
private void readFromParcel(Parcel in) {
latitude = in.readDouble();
longitude = in.readDouble();
}
@Override
public int describeContents() {
return 0;
}
}

View file

@ -0,0 +1,3 @@
package net.osmand.aidl.note;
parcelable StopRecordingParams;

View file

@ -0,0 +1,42 @@
package net.osmand.aidl.note;
import android.os.Parcel;
import android.os.Parcelable;
public class StopRecordingParams implements Parcelable {
public StopRecordingParams() {
}
public StopRecordingParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<StopRecordingParams> CREATOR = new Creator<StopRecordingParams>() {
@Override
public StopRecordingParams createFromParcel(Parcel in) {
return new StopRecordingParams(in);
}
@Override
public StopRecordingParams[] newArray(int size) {
return new StopRecordingParams[size];
}
};
@Override
public void writeToParcel(Parcel out, int flags) {
}
private void readFromParcel(Parcel in) {
}
@Override
public int describeContents() {
return 0;
}
}

View file

@ -0,0 +1,3 @@
package net.osmand.aidl.note;
parcelable TakePhotoNoteParams;

View file

@ -0,0 +1,56 @@
package net.osmand.aidl.note;
import android.os.Parcel;
import android.os.Parcelable;
public class TakePhotoNoteParams implements Parcelable {
private double latitude;
private double longitude;
public TakePhotoNoteParams(double latitude, double longitude) {
this.latitude = latitude;
this.longitude = longitude;
}
public TakePhotoNoteParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<TakePhotoNoteParams> CREATOR = new Creator<TakePhotoNoteParams>() {
@Override
public TakePhotoNoteParams createFromParcel(Parcel in) {
return new TakePhotoNoteParams(in);
}
@Override
public TakePhotoNoteParams[] newArray(int size) {
return new TakePhotoNoteParams[size];
}
};
public double getLatitude() {
return latitude;
}
public double getLongitude() {
return longitude;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeDouble(latitude);
out.writeDouble(longitude);
}
private void readFromParcel(Parcel in) {
latitude = in.readDouble();
longitude = in.readDouble();
}
@Override
public int describeContents() {
return 0;
}
}

View file

@ -35,13 +35,15 @@ public class MapMarkersHelper {
public boolean history;
public boolean selected;
public int dist;
public long creationDate;
public MapMarker(LatLon point, PointDescription name, int colorIndex,
boolean selected, int index) {
boolean selected, long creationDate, int index) {
this.point = point;
this.pointDescription = name;
this.colorIndex = colorIndex;
this.selected = selected;
this.creationDate = creationDate;
this.index = index;
}
@ -169,6 +171,7 @@ public class MapMarkersHelper {
List<String> desc = settings.getMapMarkersPointDescriptions(ips.size());
List<Integer> colors = settings.getMapMarkersColors(ips.size());
List<Boolean> selections = settings.getMapMarkersSelections(ips.size());
List<Long> creationDates = settings.getMapMarkersCreationDates(ips.size());
int colorIndex = 0;
for (int i = 0; i < ips.size(); i++) {
if (colors.size() > i) {
@ -176,15 +179,21 @@ public class MapMarkersHelper {
}
MapMarker mapMarker = new MapMarker(ips.get(i),
PointDescription.deserializeFromString(desc.get(i), ips.get(i)), colorIndex,
selections.get(i), i);
selections.get(i), creationDates.get(i), i);
mapMarkers.add(mapMarker);
}
ips = settings.getMapMarkersHistoryPoints();
desc = settings.getMapMarkersHistoryPointDescriptions(ips.size());
colors = settings.getMapMarkersHistoryColors(ips.size());
creationDates = settings.getMapMarkersHistoryCreationDates(ips.size());
for (int i = 0; i < ips.size(); i++) {
if (colors.size() > i) {
colorIndex = colors.get(i);
}
MapMarker mapMarker = new MapMarker(ips.get(i),
PointDescription.deserializeFromString(desc.get(i), ips.get(i)), 0, false, i);
PointDescription.deserializeFromString(desc.get(i), ips.get(i)),
colorIndex, false, creationDates.get(i), i);
mapMarker.history = true;
mapMarkersHistory.add(mapMarker);
}
@ -207,10 +216,10 @@ public class MapMarkersHelper {
}
if (history) {
settings.updateMapMarkerHistory(mapMarker.point.getLatitude(), mapMarker.point.getLongitude(),
mapMarker.pointDescription, mapMarker.colorIndex);
mapMarker.pointDescription, mapMarker.colorIndex, mapMarker.creationDate);
} else {
settings.updateMapMarker(mapMarker.point.getLatitude(), mapMarker.point.getLongitude(),
mapMarker.pointDescription, mapMarker.colorIndex, mapMarker.selected);
mapMarker.pointDescription, mapMarker.colorIndex, mapMarker.selected, mapMarker.creationDate);
}
updateMarker(mapMarker);
}
@ -312,6 +321,12 @@ public class MapMarkersHelper {
refresh();
}
public void addMapMarker(MapMarker marker, int index) {
settings.insertMapMarker(marker.getLatitude(), marker.getLongitude(), marker.pointDescription,
marker.colorIndex, marker.selected, marker.creationDate, index);
readFromSettings();
}
public void addMapMarker(LatLon point, PointDescription historyName) {
List<LatLon> points = new ArrayList<>(1);
List<PointDescription> historyNames = new ArrayList<>(1);
@ -376,7 +391,7 @@ public class MapMarkersHelper {
public void updateMapMarker(MapMarker marker, boolean refresh) {
if (marker != null) {
settings.updateMapMarker(marker.getLatitude(), marker.getLongitude(),
marker.pointDescription, marker.colorIndex, marker.selected);
marker.pointDescription, marker.colorIndex, marker.selected, marker.creationDate);
if (refresh) {
readFromSettings();
refresh();
@ -387,7 +402,7 @@ public class MapMarkersHelper {
public void moveMapMarker(@Nullable MapMarker marker, LatLon latLon) {
if (marker != null) {
settings.moveMapMarker(new LatLon(marker.getLatitude(), marker.getLongitude()), latLon,
marker.pointDescription, marker.colorIndex, marker.selected);
marker.pointDescription, marker.colorIndex, marker.selected, marker.creationDate);
marker.point = new LatLon(latLon.getLatitude(), latLon.getLongitude());
readFromSettings();
refresh();
@ -404,7 +419,8 @@ public class MapMarkersHelper {
public void addMapMarkerHistory(MapMarker marker) {
if (marker != null) {
settings.insertMapMarkerHistory(marker.getLatitude(), marker.getLongitude(), marker.pointDescription, marker.colorIndex, 0);
settings.insertMapMarkerHistory(marker.getLatitude(), marker.getLongitude(),
marker.pointDescription, marker.colorIndex, marker.creationDate, 0);
readFromSettings();
refresh();
}
@ -424,25 +440,29 @@ public class MapMarkersHelper {
List<String> names = new ArrayList<>(markers.size());
List<Integer> colors = new ArrayList<>(markers.size());
List<Boolean> selections = new ArrayList<>(markers.size());
List<Long> creationDates = new ArrayList<>(markers.size());
for (MapMarker marker : markers) {
ls.add(marker.point);
names.add(PointDescription.serializeToString(marker.pointDescription));
colors.add(marker.colorIndex);
selections.add(marker.selected);
creationDates.add(marker.creationDate);
}
settings.saveMapMarkers(ls, names, colors, selections);
settings.saveMapMarkers(ls, names, colors, selections, creationDates);
}
if (markersHistory != null) {
List<LatLon> ls = new ArrayList<>(markersHistory.size());
List<String> names = new ArrayList<>(markersHistory.size());
List<Integer> colors = new ArrayList<>(markersHistory.size());
List<Long> creationDates = new ArrayList<>(markersHistory.size());
for (MapMarker marker : markersHistory) {
ls.add(marker.point);
names.add(PointDescription.serializeToString(marker.pointDescription));
colors.add(marker.colorIndex);
creationDates.add(marker.creationDate);
}
settings.saveMapMarkersHistory(ls, names, colors);
settings.saveMapMarkersHistory(ls, names, colors, creationDates);
}
if (markers != null || markersHistory != null) {

View file

@ -1786,8 +1786,11 @@ public class OsmandSettings {
public final static String MAP_MARKERS_COLOR = "map_markers_color"; //$NON-NLS-1$
public final static String MAP_MARKERS_DESCRIPTION = "map_markers_description"; //$NON-NLS-1$
public final static String MAP_MARKERS_SELECTION = "map_markers_selection"; //$NON-NLS-1$
public final static String MAP_MARKERS_CREATION_DATE = "map_markers_creation_date"; //$NON-NLS-1$
public final static String MAP_MARKERS_HISTORY_POINT = "map_markers_history_point"; //$NON-NLS-1$
public final static String MAP_MARKERS_HISTORY_COLOR = "map_markers_history_color"; //$NON-NLS-1$
public final static String MAP_MARKERS_HISTORY_DESCRIPTION = "map_markers_history_description"; //$NON-NLS-1$
public final static String MAP_MARKERS_HISTORY_CREATION_DATE = "map_markers_history_creation_date"; //$NON-NLS-1$
public final static int MAP_MARKERS_HISTORY_LIMIT = 30;
private MapMarkersStorage mapMarkersStorage = new MapMarkersStorage();
private MapMarkersHistoryStorage mapMarkersHistoryStorage = new MapMarkersHistoryStorage();
@ -1899,6 +1902,7 @@ public class OsmandSettings {
.remove(MAP_MARKERS_DESCRIPTION)
.remove(MAP_MARKERS_COLOR)
.remove(MAP_MARKERS_SELECTION)
.remove(MAP_MARKERS_CREATION_DATE)
.commit();
}
@ -1906,6 +1910,8 @@ public class OsmandSettings {
return settingsAPI.edit(globalPreferences)
.remove(MAP_MARKERS_HISTORY_POINT)
.remove(MAP_MARKERS_HISTORY_DESCRIPTION)
.remove(MAP_MARKERS_HISTORY_COLOR)
.remove(MAP_MARKERS_HISTORY_CREATION_DATE)
.commit();
}
@ -1930,18 +1936,175 @@ public class OsmandSettings {
private class MapMarkersHistoryStorage extends MapPointsStorage {
protected String colorsKey;
protected String creationDatesKey;
public MapMarkersHistoryStorage() {
pointsKey = MAP_MARKERS_HISTORY_POINT;
descriptionsKey = MAP_MARKERS_HISTORY_DESCRIPTION;
colorsKey = MAP_MARKERS_HISTORY_COLOR;
creationDatesKey = MAP_MARKERS_HISTORY_CREATION_DATE;
}
public List<Integer> getColors(int sz) {
List<Integer> list = new ArrayList<>();
String ip = settingsAPI.getString(globalPreferences, colorsKey, "");
if (ip.trim().length() > 0) {
StringTokenizer tok = new StringTokenizer(ip, ",");
while (tok.hasMoreTokens()) {
String colorStr = tok.nextToken();
list.add(Integer.parseInt(colorStr));
}
}
while (list.size() > sz) {
list.remove(list.size() - 1);
}
int i = 0;
while (list.size() < sz) {
list.add(i % MapMarkersHelper.MAP_MARKERS_COLORS_COUNT);
i++;
}
return list;
}
public List<Long> getCreationDates(int sz) {
List<Long> list = new ArrayList<>();
String ip = settingsAPI.getString(globalPreferences, creationDatesKey, "");
if (ip.trim().length() > 0) {
StringTokenizer tok = new StringTokenizer(ip, ",");
while (tok.hasMoreTokens()) {
String creationDateStr = tok.nextToken();
list.add(Long.parseLong(creationDateStr));
}
}
while (list.size() > sz) {
list.remove(list.size() - 1);
}
while (list.size() < sz) {
list.add(0L);
}
return list;
}
public boolean savePoints(List<LatLon> ps, List<String> ds, List<Integer> cs, List<Long> cds) {
while (ps.size() > MAP_MARKERS_HISTORY_LIMIT) {
ps.remove(ps.size() - 1);
ds.remove(ds.size() - 1);
cs.remove(cs.size() - 1);
cds.remove(cds.size() - 1);
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < ps.size(); i++) {
if (i > 0) {
sb.append(",");
}
sb.append(((float) ps.get(i).getLatitude() + "")).append(",").append(((float) ps.get(i).getLongitude() + ""));
}
StringBuilder tb = new StringBuilder();
for (int i = 0; i < ds.size(); i++) {
if (i > 0) {
tb.append("--");
}
if (ds.get(i) == null) {
tb.append("");
} else {
tb.append(ds.get(i));
}
}
StringBuilder cb = new StringBuilder();
for (int i = 0; i < cs.size(); i++) {
if (i > 0) {
cb.append(",");
}
cb.append(Integer.toString(cs.get(i)));
}
StringBuilder cdb = new StringBuilder();
if (cds != null) {
for (int i = 0; i < cds.size(); i++) {
if (i > 0) {
cdb.append(",");
}
cdb.append(Long.toString(cds.get(i)));
}
}
return settingsAPI.edit(globalPreferences)
.putString(pointsKey, sb.toString())
.putString(descriptionsKey, tb.toString())
.putString(colorsKey, cb.toString())
.putString(creationDatesKey, cdb.toString())
.commit();
}
public boolean insertPoint(double latitude, double longitude,
PointDescription historyDescription, int colorIndex,
long creationDate, int index) {
List<LatLon> ps = getPoints();
List<String> ds = getPointDescriptions(ps.size());
List<Integer> cs = getColors(ps.size());
List<Long> cds = getCreationDates(ps.size());
ps.add(index, new LatLon(latitude, longitude));
ds.add(index, PointDescription.serializeToString(historyDescription));
cs.add(index, colorIndex);
cds.add(index, creationDate);
if (historyDescription != null && !historyDescription.isSearchingAddress(ctx)) {
SearchHistoryHelper.getInstance(ctx).addNewItemToHistory(latitude, longitude, historyDescription);
}
return savePoints(ps, ds, cs, cds);
}
public boolean updatePoint(double latitude, double longitude,
PointDescription historyDescription, int colorIndex,
long creationDate) {
List<LatLon> ps = getPoints();
List<String> ds = getPointDescriptions(ps.size());
List<Integer> cs = getColors(ps.size());
List<Long> cds = getCreationDates(ps.size());
int index = ps.indexOf(new LatLon(latitude, longitude));
if (index != -1) {
ds.set(index, PointDescription.serializeToString(historyDescription));
if (cs.size() > index) {
cs.set(index, colorIndex);
}
if (cds.size() > index) {
cds.set(index, creationDate);
}
if (historyDescription != null && !historyDescription.isSearchingAddress(ctx)) {
SearchHistoryHelper.getInstance(ctx).addNewItemToHistory(latitude, longitude, historyDescription);
}
return savePoints(ps, ds, cs, cds);
} else {
return false;
}
}
@Override
public boolean deletePoint(int index) {
List<LatLon> ps = getPoints();
List<String> ds = getPointDescriptions(ps.size());
List<Integer> cs = getColors(ps.size());
List<Long> cds = getCreationDates(ps.size());
ps.remove(index);
ds.remove(index);
cds.remove(index);
if (cs.size() > index) {
cs.remove(index);
}
return savePoints(ps, ds, cs, cds);
}
@Override
public boolean savePoints(List<LatLon> ps, List<String> ds) {
while (ps.size() > MAP_MARKERS_HISTORY_LIMIT) {
ps.remove(ps.size() - 1);
ds.remove(ds.size() - 1);
return false;
}
return super.savePoints(ps, ds);
@Override
public boolean insertPoint(double latitude, double longitude, PointDescription historyDescription, int index) {
return false;
}
@Override
public boolean updatePoint(double latitude, double longitude, PointDescription historyDescription) {
return false;
}
}
@ -1949,12 +2112,14 @@ public class OsmandSettings {
protected String colorsKey;
protected String selectionKey;
protected String creationDatesKey;
public MapMarkersStorage() {
pointsKey = MAP_MARKERS_POINT;
descriptionsKey = MAP_MARKERS_DESCRIPTION;
colorsKey = MAP_MARKERS_COLOR;
selectionKey = MAP_MARKERS_SELECTION;
creationDatesKey = MAP_MARKERS_CREATION_DATE;
}
public List<Integer> getColors(int sz) {
@ -1997,21 +2162,42 @@ public class OsmandSettings {
return list;
}
public List<Long> getCreationDates(int sz) {
List<Long> list = new ArrayList<>();
String ip = settingsAPI.getString(globalPreferences, creationDatesKey, "");
if (ip.trim().length() > 0) {
StringTokenizer tok = new StringTokenizer(ip, ",");
while (tok.hasMoreTokens()) {
String creationDateStr = tok.nextToken();
list.add(Long.parseLong(creationDateStr));
}
}
while (list.size() > sz) {
list.remove(list.size() - 1);
}
while (list.size() < sz) {
list.add(0L);
}
return list;
}
public boolean insertPoint(double latitude, double longitude,
PointDescription historyDescription, int colorIndex, int pos,
boolean selected, int index) {
PointDescription historyDescription, int colorIndex,
boolean selected, long creationDate, int index) {
List<LatLon> ps = getPoints();
List<String> ds = getPointDescriptions(ps.size());
List<Integer> cs = getColors(ps.size());
List<Boolean> bs = getSelections(ps.size());
List<Long> cds = getCreationDates(ps.size());
ps.add(index, new LatLon(latitude, longitude));
ds.add(index, PointDescription.serializeToString(historyDescription));
cs.add(index, colorIndex);
bs.add(index, selected);
cds.add(index, creationDate == 0 ? System.currentTimeMillis() : creationDate);
if (historyDescription != null && !historyDescription.isSearchingAddress(ctx)) {
SearchHistoryHelper.getInstance(ctx).addNewItemToHistory(latitude, longitude, historyDescription);
}
return savePoints(ps, ds, cs, bs);
return savePoints(ps, ds, cs, bs, cds);
}
public boolean insertPoints(double[] latitudes, double[] longitudes,
@ -2021,6 +2207,7 @@ public class OsmandSettings {
List<String> ds = getPointDescriptions(ps.size());
List<Integer> cs = getColors(ps.size());
List<Boolean> bs = getSelections(ps.size());
List<Long> cds = getCreationDates(ps.size());
for (int i = 0; i < latitudes.length; i++) {
double latitude = latitudes[i];
double longitude = longitudes[i];
@ -2032,20 +2219,22 @@ public class OsmandSettings {
ds.add(index, PointDescription.serializeToString(historyDescription));
cs.add(index, colorIndex);
bs.add(index, selected);
cds.add(index, System.currentTimeMillis());
if (historyDescription != null && !historyDescription.isSearchingAddress(ctx)) {
SearchHistoryHelper.getInstance(ctx).addNewItemToHistory(latitude, longitude, historyDescription);
}
}
return savePoints(ps, ds, cs, bs);
return savePoints(ps, ds, cs, bs, cds);
}
public boolean updatePoint(double latitude, double longitude,
PointDescription historyDescription, int colorIndex,
boolean selected) {
boolean selected, long creationDate) {
List<LatLon> ps = getPoints();
List<String> ds = getPointDescriptions(ps.size());
List<Integer> cs = getColors(ps.size());
List<Boolean> bs = getSelections(ps.size());
List<Long> cds = getCreationDates(ps.size());
int index = ps.indexOf(new LatLon(latitude, longitude));
if (index != -1) {
ds.set(index, PointDescription.serializeToString(historyDescription));
@ -2055,10 +2244,13 @@ public class OsmandSettings {
if (bs.size() > index) {
bs.set(index, selected);
}
if (cds.size() > index) {
cds.set(index, creationDate);
}
if (historyDescription != null && !historyDescription.isSearchingAddress(ctx)) {
SearchHistoryHelper.getInstance(ctx).addNewItemToHistory(latitude, longitude, historyDescription);
}
return savePoints(ps, ds, cs, bs);
return savePoints(ps, ds, cs, bs, cds);
} else {
return false;
}
@ -2068,11 +2260,13 @@ public class OsmandSettings {
LatLon latLonNew,
PointDescription historyDescription,
int colorIndex,
boolean selected) {
boolean selected,
long creationDate) {
List<LatLon> ps = getPoints();
List<String> ds = getPointDescriptions(ps.size());
List<Integer> cs = getColors(ps.size());
List<Boolean> bs = getSelections(ps.size());
List<Long> cds = getCreationDates(ps.size());
int index = ps.indexOf(latLonEx);
if (index != -1) {
if (ps.size() > index) {
@ -2085,12 +2279,15 @@ public class OsmandSettings {
if (bs.size() > index) {
bs.set(index, selected);
}
if (cds.size() > index) {
cds.set(index, creationDate);
}
if (historyDescription != null && !historyDescription.isSearchingAddress(ctx)) {
double lat = latLonNew.getLatitude();
double lon = latLonNew.getLongitude();
SearchHistoryHelper.getInstance(ctx).addNewItemToHistory(lat, lon, historyDescription);
}
return savePoints(ps, ds, cs, bs);
return savePoints(ps, ds, cs, bs, cds);
} else {
return false;
}
@ -2102,19 +2299,21 @@ public class OsmandSettings {
List<String> ds = getPointDescriptions(ps.size());
List<Integer> cs = getColors(ps.size());
List<Boolean> bs = getSelections(ps.size());
List<Long> cds = getCreationDates(ps.size());
ps.remove(index);
ds.remove(index);
cds.remove(index);
if (cs.size() > index) {
cs.remove(index);
}
if (bs.size() > index) {
bs.remove(index);
}
return savePoints(ps, ds, cs, bs);
return savePoints(ps, ds, cs, bs, cds);
}
public boolean savePoints(List<LatLon> ps, List<String> ds, List<Integer> cs,
List<Boolean> bs) {
List<Boolean> bs, List<Long> cds) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < ps.size(); i++) {
if (i > 0) {
@ -2149,11 +2348,21 @@ public class OsmandSettings {
bb.append(Boolean.toString(bs.get(i)));
}
}
StringBuilder cdb = new StringBuilder();
if (cds != null) {
for (int i = 0; i < cds.size(); i++) {
if (i > 0) {
cdb.append(",");
}
cdb.append(Long.toString(cds.get(i)));
}
}
return settingsAPI.edit(globalPreferences)
.putString(pointsKey, sb.toString())
.putString(descriptionsKey, tb.toString())
.putString(colorsKey, cb.toString())
.putString(selectionKey, bb.toString())
.putString(creationDatesKey, cdb.toString())
.commit();
}
@ -2347,15 +2556,19 @@ public class OsmandSettings {
return mapMarkersStorage.getSelections(sz);
}
public List<Long> getMapMarkersCreationDates(int sz) {
return mapMarkersStorage.getCreationDates(sz);
}
public List<LatLon> getMapMarkersPoints() {
return mapMarkersStorage.getPoints();
}
public boolean insertMapMarker(double latitude, double longitude,
PointDescription historyDescription, int colorIndex, int pos,
boolean selected, int index) {
PointDescription historyDescription, int colorIndex,
boolean selected, long creationDate, int index) {
return mapMarkersStorage.insertPoint(latitude, longitude, historyDescription, colorIndex,
index, selected, pos);
selected, creationDate, index);
}
public boolean insertMapMarkers(double[] latitudes, double[] longitudes,
@ -2366,24 +2579,27 @@ public class OsmandSettings {
}
public boolean updateMapMarker(double latitude, double longitude,
PointDescription historyDescription, int colorIndex, boolean selected) {
return mapMarkersStorage.updatePoint(latitude, longitude, historyDescription, colorIndex, selected);
PointDescription historyDescription, int colorIndex, boolean selected,
long creationDate) {
return mapMarkersStorage.updatePoint(latitude, longitude, historyDescription, colorIndex, selected, creationDate);
}
public boolean moveMapMarker(LatLon latLonEx,
LatLon latLonNew,
PointDescription historyDescription,
int colorIndex,
boolean selected) {
return mapMarkersStorage.movePoint(latLonEx, latLonNew, historyDescription, colorIndex, selected);
boolean selected,
long creationDate) {
return mapMarkersStorage.movePoint(latLonEx, latLonNew, historyDescription, colorIndex, selected, creationDate);
}
public boolean deleteMapMarker(int index) {
return mapMarkersStorage.deletePoint(index);
}
public boolean saveMapMarkers(List<LatLon> ps, List<String> ds, List<Integer> cs, List<Boolean> bs) {
return mapMarkersStorage.savePoints(ps, ds, cs, bs);
public boolean saveMapMarkers(List<LatLon> ps, List<String> ds, List<Integer> cs, List<Boolean> bs,
List<Long> cds) {
return mapMarkersStorage.savePoints(ps, ds, cs, bs, cds);
}
@ -2395,22 +2611,31 @@ public class OsmandSettings {
return mapMarkersHistoryStorage.getPoints();
}
public List<Long> getMapMarkersHistoryCreationDates(int sz) {
return mapMarkersHistoryStorage.getCreationDates(sz);
}
public List<Integer> getMapMarkersHistoryColors(int sz) {
return mapMarkersHistoryStorage.getColors(sz);
}
public boolean insertMapMarkerHistory(double latitude, double longitude,
PointDescription historyDescription, int colorIndex, int index) {
return mapMarkersHistoryStorage.insertPoint(latitude, longitude, historyDescription, index);
PointDescription historyDescription, int colorIndex,
long creationDate, int index) {
return mapMarkersHistoryStorage.insertPoint(latitude, longitude, historyDescription, colorIndex, creationDate, index);
}
public boolean updateMapMarkerHistory(double latitude, double longitude,
PointDescription historyDescription, int colorIndex) {
return mapMarkersHistoryStorage.updatePoint(latitude, longitude, historyDescription);
PointDescription historyDescription, int colorIndex, long creationDate) {
return mapMarkersHistoryStorage.updatePoint(latitude, longitude, historyDescription, colorIndex, creationDate);
}
public boolean deleteMapMarkerHistory(int index) {
return mapMarkersHistoryStorage.deletePoint(index);
}
public boolean saveMapMarkersHistory(List<LatLon> ps, List<String> ds, List<Integer> cs) {
return mapMarkersHistoryStorage.savePoints(ps, ds);
public boolean saveMapMarkersHistory(List<LatLon> ps, List<String> ds, List<Integer> cs, List<Long> cds) {
return mapMarkersHistoryStorage.savePoints(ps, ds, cs, cds);
}

View file

@ -641,7 +641,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
@Override
public boolean onContextMenuClick(ArrayAdapter<ContextMenuItem> adapter, int itemId, int pos, boolean isChecked) {
recordVideo(latitude, longitude, mapActivity);
recordVideo(latitude, longitude, mapActivity, false);
return true;
}
})
@ -651,7 +651,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
.setListener(new ItemClickListener() {
@Override
public boolean onContextMenuClick(ArrayAdapter<ContextMenuItem> adapter, int itemId, int pos, boolean isChecked) {
takePhoto(latitude, longitude, mapActivity, false);
takePhoto(latitude, longitude, mapActivity, false, false);
return true;
}
@ -769,9 +769,9 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
private void takeAction(final MapActivity mapActivity, double lon, double lat, int action) {
if (action == AV_DEFAULT_ACTION_VIDEO) {
recordVideo(lat, lon, mapActivity);
recordVideo(lat, lon, mapActivity, false);
} else if (action == AV_DEFAULT_ACTION_TAKEPICTURE) {
takePhoto(lat, lon, mapActivity, false);
takePhoto(lat, lon, mapActivity, false, false);
} else if (action == AV_DEFAULT_ACTION_AUDIO) {
recordAudio(lat, lon, mapActivity);
}
@ -874,8 +874,8 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
}
}
public void recordVideo(final double lat, final double lon, final MapActivity mapActivity) {
if (AV_EXTERNAL_RECORDER.get()) {
public void recordVideo(final double lat, final double lon, final MapActivity mapActivity, final boolean forceExternal) {
if (AV_EXTERNAL_RECORDER.get() || forceExternal) {
captureVideoExternal(lat, lon, mapActivity);
} else {
if (ActivityCompat.checkSelfPermission(mapActivity, Manifest.permission.CAMERA)
@ -1192,10 +1192,10 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
}
public void takePhoto(final double lat, final double lon, final MapActivity mapActivity,
final boolean forceInternal) {
final boolean forceInternal, final boolean forceExternal) {
if (ActivityCompat.checkSelfPermission(mapActivity, Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED) {
if (!AV_EXTERNAL_PHOTO_CAM.get() || forceInternal) {
if ((!AV_EXTERNAL_PHOTO_CAM.get() || forceInternal) && !forceExternal) {
takePhotoInternalOrExternal(lat, lon, mapActivity);
} else {
takePhotoExternal(lat, lon, mapActivity);

View file

@ -31,7 +31,7 @@ public class TakePhotoNoteAction extends QuickAction {
AudioVideoNotesPlugin plugin = OsmandPlugin.getPlugin(AudioVideoNotesPlugin.class);
if (plugin != null)
plugin.takePhoto(latLon.getLatitude(), latLon.getLongitude(), activity, false);
plugin.takePhoto(latLon.getLatitude(), latLon.getLongitude(), activity, false, false);
}
@Override

View file

@ -31,7 +31,7 @@ public class TakeVideoNoteAction extends QuickAction {
AudioVideoNotesPlugin plugin = OsmandPlugin.getPlugin(AudioVideoNotesPlugin.class);
if (plugin != null)
plugin.recordVideo(latLon.getLatitude(), latLon.getLongitude(), activity);
plugin.recordVideo(latLon.getLatitude(), latLon.getLongitude(), activity, false);
}
@Override

View file

@ -285,9 +285,9 @@ public class ExternalApiHelper {
if (API_CMD_RECORD_AUDIO.equals(cmd)) {
plugin.recordAudio(lat, lon, mapActivity);
} else if (API_CMD_RECORD_VIDEO.equals(cmd)) {
plugin.recordVideo(lat, lon, mapActivity);
plugin.recordVideo(lat, lon, mapActivity, false);
} else if (API_CMD_RECORD_PHOTO.equals(cmd)) {
plugin.takePhoto(lat, lon, mapActivity, true);
plugin.takePhoto(lat, lon, mapActivity, true, false);
}
}

View file

@ -13,9 +13,11 @@ import android.webkit.WebView;
import android.widget.LinearLayout;
import android.widget.TextView;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.dialogs.DirectionsDialogs;
import net.osmand.plus.mapillary.MapillaryPlugin;
import net.osmand.util.Algorithms;
public class ContextMenuCardDialogFragment extends Fragment {
@ -115,6 +117,14 @@ public class ContextMenuCardDialogFragment extends Fragment {
public void dismiss() {
MapActivity activity = dialog.getMapActivity();
if (activity != null) {
if (dialog.getType() == ContextMenuCardDialog.CardDialogType.MAPILLARY) {
if (!activity.getMyApplication().getSettings().SHOW_MAPILLARY.get()) {
MapillaryPlugin mapillaryPlugin = OsmandPlugin.getPlugin(MapillaryPlugin.class);
if (mapillaryPlugin != null) {
mapillaryPlugin.updateLayers(activity.getMapView(), activity);
}
}
}
try {
activity.getSupportFragmentManager().popBackStack(TAG,
FragmentManager.POP_BACK_STACK_INCLUSIVE);

View file

@ -3,6 +3,7 @@ package net.osmand.plus.mapillary;
import android.view.View;
import android.view.View.OnClickListener;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard;
@ -21,9 +22,15 @@ public class MapillaryImageCard extends ImageCard {
OnClickListener onClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (!getMyApplication().getSettings().SHOW_MAPILLARY.get()) {
MapillaryPlugin mapillaryPlugin = OsmandPlugin.getPlugin(MapillaryPlugin.class);
if (mapillaryPlugin != null) {
mapillaryPlugin.updateLayers(getMapActivity().getMapView(), getMapActivity(), true);
}
}
getMapActivity().getContextMenu().hideMenues();
MapillaryImageDialog.show(getMapActivity(), getKey(), getImageHiresUrl(), getUrl(), getLocation(),
getCa(), getMyApplication().getString(R.string.mapillary), null);
getCa(), getMyApplication().getString(R.string.mapillary), null, true);
}
};
if (!Algorithms.isEmpty(buttonText)) {

View file

@ -80,6 +80,7 @@ public class MapillaryImageDialog extends ContextMenuCardDialog {
private String viewerUrl;
private LatLon latLon;
private double ca = Double.NaN;
private boolean sync;
private View staticImageView;
private View noInternetView;
@ -97,7 +98,7 @@ public class MapillaryImageDialog extends ContextMenuCardDialog {
}
public MapillaryImageDialog(MapActivity mapActivity, String key, String sKey, String imageUrl,
String viewerUrl, LatLon latLon, double ca, String title, String description) {
String viewerUrl, LatLon latLon, double ca, String title, String description, boolean sync) {
super(mapActivity, CardDialogType.MAPILLARY);
this.title = title;
this.description = description;
@ -108,6 +109,7 @@ public class MapillaryImageDialog extends ContextMenuCardDialog {
this.latLon = latLon;
this.ca = ca;
this.ic = mapActivity.getMyApplication().getIconsCache();
this.sync = sync;
}
public String getKey() {
@ -475,8 +477,13 @@ public class MapillaryImageDialog extends ContextMenuCardDialog {
// asking tile image async
boolean imgExist = mgr.tileExistOnFileSystem(tileId, map, tileX, tileY, TILE_ZOOM);
if (imgExist) {
if (sync) {
tile = mgr.getGeometryTilesCache().getTileForMapSync(tileId, map, tileX, tileY, TILE_ZOOM, false);
sync = false;
} else {
tile = mgr.getGeometryTilesCache().getTileForMapAsync(tileId, map, tileX, tileY, TILE_ZOOM, false);
}
}
if (tile != null) {
tiles.put(tileId, new Pair<>(new QuadPointDouble(tileX, tileY), tile));
}
@ -492,7 +499,16 @@ public class MapillaryImageDialog extends ContextMenuCardDialog {
String viewerUrl, LatLon latLon, double ca,
String title, String description) {
MapillaryImageDialog dialog = new MapillaryImageDialog(mapActivity, key, null, imageUrl,
viewerUrl, latLon, ca, title, description);
viewerUrl, latLon, ca, title, description, false);
ContextMenuCardDialogFragment.showInstance(dialog);
return dialog;
}
public static MapillaryImageDialog show(MapActivity mapActivity, String key, String imageUrl,
String viewerUrl, LatLon latLon, double ca,
String title, String description, boolean sync) {
MapillaryImageDialog dialog = new MapillaryImageDialog(mapActivity, key, null, imageUrl,
viewerUrl, latLon, ca, title, description, sync);
ContextMenuCardDialogFragment.showInstance(dialog);
return dialog;
}
@ -503,7 +519,7 @@ public class MapillaryImageDialog extends ContextMenuCardDialog {
String viewerUrl = MAPILLARY_VIEWER_URL_TEMPLATE + key;
LatLon latLon = new LatLon(latitude, longitude);
MapillaryImageDialog dialog = new MapillaryImageDialog(mapActivity, key, sKey, imageUrl, viewerUrl,
latLon, ca, title, description);
latLon, ca, title, description, false);
ContextMenuCardDialogFragment.showInstance(dialog);
return dialog;
}

View file

@ -2,7 +2,6 @@ package net.osmand.plus.mapillary;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
@ -36,7 +35,6 @@ import net.osmand.plus.views.mapwidgets.MapWidgetRegistry.MapWidgetRegInfo;
import net.osmand.plus.views.mapwidgets.TextInfoWidget;
import net.osmand.util.Algorithms;
import java.lang.reflect.Method;
import java.text.MessageFormat;
import java.util.List;
@ -96,17 +94,21 @@ public class MapillaryPlugin extends OsmandPlugin {
@Override
public void updateLayers(OsmandMapTileView mapView, MapActivity activity) {
updateMapLayers(mapView, activity.getMapLayers());
updateMapLayers(mapView, activity.getMapLayers(), false);
}
private void updateMapLayers(OsmandMapTileView mapView, final MapActivityLayers layers) {
public void updateLayers(OsmandMapTileView mapView, MapActivity activity, boolean force) {
updateMapLayers(mapView, activity.getMapLayers(), force);
}
private void updateMapLayers(OsmandMapTileView mapView, final MapActivityLayers layers, boolean force) {
if (rasterLayer == null || vectorLayer == null) {
createLayers();
}
if (isActive()) {
ITileSource rasterSource = null;
ITileSource vectorSource = null;
if (settings.SHOW_MAPILLARY.get()) {
if (settings.SHOW_MAPILLARY.get() || force) {
rasterSource = settings.getTileSourceByName(TileSourceManager.getMapillaryRasterSource().getName(), false);
vectorSource = settings.getTileSourceByName(TileSourceManager.getMapillaryVectorSource().getName(), false);
}
@ -156,7 +158,7 @@ public class MapillaryPlugin extends OsmandPlugin {
OsmandMapTileView mapView = mapActivity.getMapView();
MapActivityLayers mapLayers = mapActivity.getMapLayers();
settings.SHOW_MAPILLARY.set(!settings.SHOW_MAPILLARY.get());
updateMapLayers(mapView, mapLayers);
updateMapLayers(mapView, mapLayers, false);
ContextMenuItem item = adapter.getItem(pos);
if (item != null) {
item.setSelected(settings.SHOW_MAPILLARY.get());

View file

@ -121,6 +121,12 @@ public class MapMarkersActiveFragment extends Fragment implements OsmAndCompassL
return null;
}
void updateAdapter() {
if (adapter != null) {
adapter.notifyDataSetChanged();
}
}
private void updateLocationUi() {
final MapActivity mapActivity = (MapActivity) getActivity();
if (mapActivity != null) {

View file

@ -78,11 +78,17 @@ public class MapMarkersDialogFragment extends android.support.v4.app.DialogFragm
switch (menuItem.getItemId()) {
case R.id.action_active:
((MapMarkersActiveFragment) adapter.getItem(0)).startLocationUpdate();
if (viewPager.getCurrentItem() != 0) {
((MapMarkersActiveFragment) adapter.getItem(0)).updateAdapter();
}
viewPager.setCurrentItem(0);
optionsButton.setVisibility(View.VISIBLE);
return true;
case R.id.action_history:
((MapMarkersActiveFragment) adapter.getItem(0)).stopLocationUpdate();
if (viewPager.getCurrentItem() != 1) {
((MapMarkersHistoryFragment) adapter.getItem(1)).updateAdapter();
}
viewPager.setCurrentItem(1);
optionsButton.setVisibility(View.GONE);
return true;

View file

@ -2,6 +2,7 @@ package net.osmand.plus.mapmarkers;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
@ -9,11 +10,15 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import net.osmand.data.PointDescription;
import net.osmand.plus.MapMarkersHelper.MapMarker;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.mapmarkers.adapters.MapMarkersHistoryAdapter;
public class MapMarkersHistoryFragment extends Fragment {
MapMarkersHistoryAdapter adapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@ -21,8 +26,27 @@ public class MapMarkersHistoryFragment extends Fragment {
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
final MapActivity mapActivity = (MapActivity) getActivity();
recyclerView.setAdapter(new MapMarkersHistoryAdapter(mapActivity.getMyApplication()));
adapter = new MapMarkersHistoryAdapter(mapActivity.getMyApplication());
adapter.setAdapterListener(new MapMarkersHistoryAdapter.MapMarkersHistoryAdapterListener() {
@Override
public void onItemClick(View view) {
int pos = recyclerView.indexOfChild(view);
MapMarker marker = adapter.getItem(pos);
mapActivity.getMyApplication().getSettings().setMapLocationToShow(marker.getLatitude(), marker.getLongitude(),
15, new PointDescription(PointDescription.POINT_TYPE_LOCATION, marker.getPointDescription(mapActivity).getName()),
false, null);
MapActivity.launchMapActivityMoveToTop(mapActivity);
((DialogFragment) getParentFragment()).dismiss();
}
});
recyclerView.setAdapter(adapter);
return recyclerView;
}
void updateAdapter() {
if (adapter != null) {
adapter.notifyDataSetChanged();
}
}
}

View file

@ -17,7 +17,7 @@ public class MapMarkerItemViewHolder extends RecyclerView.ViewHolder {
final TextView distance;
final TextView point;
final TextView description;
final ImageButton options;
final ImageButton optionsBtn;
public MapMarkerItemViewHolder(View view) {
super(view);
@ -28,6 +28,6 @@ public class MapMarkerItemViewHolder extends RecyclerView.ViewHolder {
distance = (TextView) view.findViewById(R.id.map_marker_distance);
point = (TextView) view.findViewById(R.id.map_marker_point_text_view);
description = (TextView) view.findViewById(R.id.map_marker_description);
options = (ImageButton) view.findViewById(R.id.map_marker_options_button);
optionsBtn = (ImageButton) view.findViewById(R.id.map_marker_options_button);
}
}

View file

@ -1,5 +1,6 @@
package net.osmand.plus.mapmarkers.adapters;
import android.support.design.widget.Snackbar;
import android.support.v4.view.MotionEventCompat;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
@ -87,6 +88,42 @@ public class MapMarkersActiveAdapter extends RecyclerView.Adapter<MapMarkerItemV
holder.title.setText(marker.getName(mapActivity));
holder.description.setText(marker.creationDate + "");
holder.optionsBtn.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_remove_dark));
holder.optionsBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final int position = holder.getAdapterPosition();
if (position < 0) {
return;
}
final MapMarker marker = markers.get(position);
final boolean[] undone = new boolean[1];
mapActivity.getMyApplication().getMapMarkersHelper().removeMapMarker(marker.index);
notifyItemRemoved(position);
Snackbar.make(holder.itemView, R.string.item_removed, Snackbar.LENGTH_LONG)
.setAction(R.string.shared_string_undo, new View.OnClickListener() {
@Override
public void onClick(View view) {
undone[0] = true;
mapActivity.getMyApplication().getMapMarkersHelper().addMapMarker(marker, position);
notifyItemInserted(position);
}
})
.addCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar transientBottomBar, int event) {
if (!undone[0]) {
mapActivity.getMyApplication().getMapMarkersHelper().addMapMarkerHistory(marker);
}
}
}).show();
}
});
DashLocationFragment.updateLocationView(useCenter, location,
heading, holder.iconDirection, holder.distance,
marker.getLatitude(), marker.getLongitude(),

View file

@ -16,20 +16,31 @@ public class MapMarkersHistoryAdapter extends RecyclerView.Adapter<MapMarkerItem
private OsmandApplication app;
private List<MapMarker> markers;
private MapMarkersHistoryAdapterListener listener;
public MapMarkersHistoryAdapter(OsmandApplication app) {
this.app = app;
markers = app.getMapMarkersHelper().getMapMarkersHistory();
}
public void setAdapterListener(MapMarkersHistoryAdapterListener listener) {
this.listener = listener;
}
@Override
public MapMarkerItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.map_marker_item_new, viewGroup, false);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onItemClick(view);
}
});
return new MapMarkerItemViewHolder(view);
}
@Override
public void onBindViewHolder(MapMarkerItemViewHolder holder, int pos) {
public void onBindViewHolder(final MapMarkerItemViewHolder holder, int pos) {
IconsCache iconsCache = app.getIconsCache();
MapMarker marker = markers.get(pos);
@ -39,10 +50,34 @@ public class MapMarkersHistoryAdapter extends RecyclerView.Adapter<MapMarkerItem
holder.icon.setImageDrawable(iconsCache.getIcon(R.drawable.ic_action_flag_dark, color));
holder.title.setText(marker.getName(app));
holder.optionsBtn.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_refresh_dark));
holder.optionsBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = holder.getAdapterPosition();
if (position < 0) {
return;
}
MapMarker marker = markers.get(position);
app.getMapMarkersHelper().removeMapMarkerHistory(marker);
app.getMapMarkersHelper().addMapMarker(marker, 0);
notifyItemRemoved(position);
}
});
}
@Override
public int getItemCount() {
return markers.size();
}
public MapMarker getItem(int position) {
return markers.get(position);
}
public interface MapMarkersHistoryAdapterListener {
void onItemClick(View view);
}
}

View file

@ -180,8 +180,10 @@ public class MeasurementEditingContext {
before.points.clear();
after.points.clear();
if (inSnapToRoadMode) {
if (beforeCacheForSnap != null && afterCacheForSnap != null) {
beforeCacheForSnap.points.clear();
afterCacheForSnap.points.clear();
}
needUpdateCacheForSnap = true;
} else {
beforeCacheForSnap = null;

View file

@ -1395,7 +1395,7 @@ public class MeasurementToolFragment extends Fragment {
hidePointsList();
return;
}
if (editingCtx.getPointsCount() < 1 || saved) {
if (editingCtx.getPointsCount() == 0 || saved) {
dismiss(mapActivity);
return;
}

View file

@ -30,6 +30,7 @@ public class RulerControlLayer extends OsmandMapLayer {
private static final long DRAW_TIME = 2000;
private static final long DELAY_BEFORE_DRAW = 500;
private static final int TEXT_SIZE = 14;
private static final int MAX_ITERATIONS = 50;
private final MapActivity mapActivity;
private OsmandApplication app;
@ -272,12 +273,18 @@ public class RulerControlLayer extends OsmandMapLayer {
int currY = (int) tb.getPixYFromLatLon(currentLoc.getLatitude(), currentLoc.getLongitude());
int width = tb.getPixWidth();
int height = tb.getPixHeight();
boolean needDraw = true;
if (currX < 0 || currY < 0 || currX > width || currY > height) {
if ((currX < 0 && x == 0) || (currY < 0 && y == 0)
|| (currX > width && x == width) || (currY > height && y == height)) {
needDraw = false;
} else if (currX < 0 || currY < 0 || currX > width || currY > height) {
float xNew = (currX + x) / 2;
float yNew = (currY + y) / 2;
int count = 0;
while (true) {
while (count < MAX_ITERATIONS) {
count++;
if (xNew < 0 || yNew < 0 || xNew > width || yNew > height) {
currX = (int) xNew;
currY = (int) yNew;
@ -289,11 +296,13 @@ public class RulerControlLayer extends OsmandMapLayer {
}
}
if (needDraw) {
canvas.rotate(-tb.getRotate(), tb.getCenterPixelX(), tb.getCenterPixelY());
canvas.drawLine(currX, currY, x, y, lineAttrs.paint);
drawFingerTouchIcon(canvas, x, y, nightMode);
canvas.rotate(tb.getRotate(), tb.getCenterPixelX(), tb.getCenterPixelY());
}
}
private void updateData(RotatedTileBox tb, QuadPoint center) {
if (tb.getPixHeight() > 0 && tb.getPixWidth() > 0 && maxRadiusInDp > 0) {