From bd0d4a9c9e4f1a660db52ff32a338c6bbda262f6 Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Tue, 18 Feb 2020 14:12:40 +0200 Subject: [PATCH 01/62] Avoid saved roads initial commit --- .../osmand/router/RoutingConfiguration.java | 21 +++--- .../src/net/osmand/plus/AppInitializer.java | 2 +- .../src/net/osmand/plus/OsmandSettings.java | 10 +-- .../plus/helpers/AvoidSpecificRoads.java | 64 ++++++++++--------- .../plus/mapcontextmenu/MenuController.java | 6 +- .../ImpassibleRoadsMenuController.java | 14 ++-- .../MapRouteInfoMenu.java | 23 +++---- .../plus/views/ImpassableRoadsLayer.java | 35 +++++----- 8 files changed, 91 insertions(+), 84 deletions(-) diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RoutingConfiguration.java b/OsmAnd-java/src/main/java/net/osmand/router/RoutingConfiguration.java index 0a1b87e6e5..4a84a9c6df 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RoutingConfiguration.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RoutingConfiguration.java @@ -1,6 +1,5 @@ package net.osmand.router; -import net.osmand.Location; import net.osmand.PlatformUtil; import net.osmand.binary.RouteDataObject; import net.osmand.router.GeneralRouter.GeneralRouterProfile; @@ -13,8 +12,10 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.io.InputStream; -import java.util.HashMap; +import java.util.ArrayList; +import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.Stack; @@ -55,7 +56,7 @@ public class RoutingConfiguration { private String defaultRouter = ""; private Map routers = new LinkedHashMap<>(); private Map attributes = new LinkedHashMap<>(); - private HashMap impassableRoadLocations = new HashMap<>(); + private List impassableRoadLocations = new ArrayList<>(); public Builder() { @@ -95,7 +96,7 @@ public class RoutingConfiguration { i.initialDirection = direction; i.recalculateDistance = parseSilentFloat(getAttribute(i.router, "recalculateDistanceHelp"), i.recalculateDistance) ; i.heuristicCoefficient = parseSilentFloat(getAttribute(i.router, "heuristicCoefficient"), i.heuristicCoefficient); - i.router.addImpassableRoads(impassableRoadLocations.keySet()); + i.router.addImpassableRoads(new HashSet<>(impassableRoadLocations)); i.ZOOM_TO_LOAD_TILES = parseSilentInt(getAttribute(i.router, "zoomToLoadTiles"), i.ZOOM_TO_LOAD_TILES); int desirable = parseSilentInt(getAttribute(i.router, "memoryLimitInMB"), 0); if(desirable != 0) { @@ -111,13 +112,13 @@ public class RoutingConfiguration { return i; } - public Map getImpassableRoadLocations() { + public List getImpassableRoadLocations() { return impassableRoadLocations; } - public boolean addImpassableRoad(RouteDataObject route, Location location) { - if (!impassableRoadLocations.containsKey(route.id)){ - impassableRoadLocations.put(route.id, location); + public boolean addImpassableRoad(RouteDataObject route) { + if (!impassableRoadLocations.contains(route.id)) { + impassableRoadLocations.add(route.id); return true; } return false; @@ -159,8 +160,8 @@ public class RoutingConfiguration { return routers; } - public void removeImpassableRoad(RouteDataObject obj) { - impassableRoadLocations.remove(obj.id); + public void removeImpassableRoad(long routeId) { + impassableRoadLocations.remove(routeId); } } diff --git a/OsmAnd/src/net/osmand/plus/AppInitializer.java b/OsmAnd/src/net/osmand/plus/AppInitializer.java index e786c80f12..bf9720c037 100644 --- a/OsmAnd/src/net/osmand/plus/AppInitializer.java +++ b/OsmAnd/src/net/osmand/plus/AppInitializer.java @@ -739,7 +739,7 @@ public class AppInitializer implements IProgress { notifyEvent(InitEvents.RESTORE_BACKUPS); app.mapMarkersHelper.syncAllGroupsAsync(); app.searchUICore.initSearchUICore(); - app.avoidSpecificRoads.initRouteObjects(); + app.avoidSpecificRoads.initRouteObjects(false); checkLiveUpdatesAlerts(); diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java index 6a7e45a409..89bfd57513 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java @@ -42,6 +42,7 @@ import net.osmand.plus.api.SettingsAPI; import net.osmand.plus.api.SettingsAPI.SettingsEditor; import net.osmand.plus.api.SettingsAPIImpl; import net.osmand.plus.dialogs.RateUsBottomSheetDialogFragment; +import net.osmand.plus.helpers.AvoidSpecificRoads.AvoidRoadInfo; import net.osmand.plus.helpers.SearchHistoryHelper; import net.osmand.plus.mapillary.MapillaryPlugin; import net.osmand.plus.mapmarkers.CoordinateInputFormats.Format; @@ -2627,6 +2628,7 @@ public class OsmandSettings { private static final String IMPASSABLE_ROAD_POINTS = "impassable_road_points"; private static final String IMPASSABLE_ROADS_DESCRIPTIONS = "impassable_roads_descriptions"; + private static final String IMPASSABLE_ROADS_IDS = "impassable_roads_ids"; private ImpassableRoadsStorage mImpassableRoadsStorage = new ImpassableRoadsStorage(); public void backupPointToStart() { @@ -2989,11 +2991,11 @@ public class OsmandSettings { return settingsAPI.edit(globalPreferences).putInt(POINT_NAVIGATE_ROUTE, NAVIGATE).commit(); } - public List getImpassableRoadPoints() { - return mImpassableRoadsStorage.getPoints(); + public List getImpassableRoadPoints() { + return mImpassableRoadsStorage.getImpassableRoadsInfo(); } - public boolean addImpassableRoad(double latitude, double longitude) { - return mImpassableRoadsStorage.insertPoint(latitude, longitude, null, 0); + public boolean addImpassableRoad(AvoidRoadInfo avoidRoadInfo) { + return mImpassableRoadsStorage.addImpassableRoadInfo(avoidRoadInfo); } public boolean removeImpassableRoad(int index) { diff --git a/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java b/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java index a815efedb4..00b811ad25 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java +++ b/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java @@ -50,22 +50,24 @@ public class AvoidSpecificRoads { private OsmandApplication app; - private Map impassableRoads = new LinkedHashMap<>(); + private Map impassableRoads = new LinkedHashMap<>(); public AvoidSpecificRoads(final OsmandApplication app) { this.app = app; - for (LatLon latLon : app.getSettings().getImpassableRoadPoints()) { - impassableRoads.put(latLon, null); + for (AvoidRoadInfo avoidRoadInfo : app.getSettings().getImpassableRoadPoints()) { + impassableRoads.put(new LatLon(avoidRoadInfo.lat, avoidRoadInfo.lon), avoidRoadInfo); } } - public Map getImpassableRoads() { + public Map getImpassableRoads() { return impassableRoads; } - public void initRouteObjects() { - for (LatLon latLon : impassableRoads.keySet()) { - addImpassableRoad(null, latLon, false, true); + public void initRouteObjects(boolean force) { + for (Map.Entry entry : impassableRoads.entrySet()) { + if (force || entry.getValue().id == 0) { + addImpassableRoad(null, entry.getKey(), false, true); + } } } @@ -117,25 +119,15 @@ public class AvoidSpecificRoads { public String getText(@Nullable LatLon point) { if (point != null) { - RouteDataObject obj = impassableRoads.get(point); - if (obj != null) { - String locale = app.getSettings().MAP_PREFERRED_LOCALE.get(); - boolean transliterate = app.getSettings().MAP_TRANSLITERATE_NAMES.get(); - String name = RoutingHelper.formatStreetName( - obj.getName(locale, transliterate), - obj.getRef(locale, transliterate, true), - obj.getDestinationName(locale, transliterate, true), - app.getString(R.string.towards) - ); - if (!TextUtils.isEmpty(name)) { - return name; - } + AvoidRoadInfo obj = impassableRoads.get(point); + if (obj != null && !TextUtils.isEmpty(obj.name)) { + return obj.name; } } return app.getString(R.string.shared_string_road); } - public String getText(@Nullable RouteDataObject obj) { + public String getRoadName(@Nullable RouteDataObject obj) { if (obj != null) { String locale = app.getSettings().MAP_PREFERRED_LOCALE.get(); boolean transliterate = app.getSettings().MAP_TRANSLITERATE_NAMES.get(); @@ -347,21 +339,35 @@ public class AvoidSpecificRoads { MapActivity.launchMapActivityMoveToTop(ctx); } - public LatLon getLocation(RouteDataObject object) { - Location location = null; + public LatLon getLocation(AvoidRoadInfo avoidRoadInfo) { for (RoutingConfiguration.Builder builder : app.getAllRoutingConfigs()) { - location = builder.getImpassableRoadLocations().get(object.getId()); - if (location != null) { - break; + if (builder.getImpassableRoadLocations().contains(avoidRoadInfo.id)) { + return new LatLon(avoidRoadInfo.lat, avoidRoadInfo.lon); } } - return location == null ? null : new LatLon(location.getLatitude(), location.getLongitude()); + return null; } public interface AvoidSpecificRoadsCallback { - void onAddImpassableRoad(boolean success, RouteDataObject newObject); + void onAddImpassableRoad(boolean success, AvoidRoadInfo avoidRoadInfo); boolean isCancelled(); } -} + + private AvoidRoadInfo createAvoidRoadInfo(@Nullable RouteDataObject object, double lat, double lon) { + AvoidRoadInfo avoidRoadInfo = new AvoidRoadInfo(); + avoidRoadInfo.id = object != null ? object.id : 0; + avoidRoadInfo.lat = lat; + avoidRoadInfo.lon = lon; + avoidRoadInfo.name = getRoadName(object); + return avoidRoadInfo; + } + + public static class AvoidRoadInfo { + public long id; + public double lat; + public double lon; + public String name; + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java index 00012480a1..8d25fae1bb 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java @@ -22,7 +22,6 @@ import net.osmand.PlatformUtil; import net.osmand.aidl.AidlMapPointWrapper; import net.osmand.binary.BinaryMapDataObject; import net.osmand.binary.BinaryMapIndexReader.TagValuePair; -import net.osmand.binary.RouteDataObject; import net.osmand.data.Amenity; import net.osmand.data.FavouritePoint; import net.osmand.data.LatLon; @@ -45,6 +44,7 @@ import net.osmand.plus.download.DownloadActivityType; import net.osmand.plus.download.DownloadIndexesThread; import net.osmand.plus.download.DownloadValidationManager; import net.osmand.plus.download.IndexItem; +import net.osmand.plus.helpers.AvoidSpecificRoads; import net.osmand.plus.helpers.SearchHistoryHelper; import net.osmand.plus.mapcontextmenu.MenuBuilder.CollapsableView; import net.osmand.plus.mapcontextmenu.MenuBuilder.CollapseExpandListener; @@ -220,8 +220,8 @@ public abstract class MenuController extends BaseMenuController implements Colla } else if (pointDescription.isMyLocation()) { menuController = new MyLocationMenuController(mapActivity, pointDescription); } - } else if (object instanceof RouteDataObject) { - menuController = new ImpassibleRoadsMenuController(mapActivity, pointDescription, (RouteDataObject) object); + } else if (object instanceof AvoidSpecificRoads.AvoidRoadInfo) { + menuController = new ImpassibleRoadsMenuController(mapActivity, pointDescription, (AvoidSpecificRoads.AvoidRoadInfo) object); } else if (object instanceof RenderedObject) { menuController = new RenderedObjectMenuController(mapActivity, pointDescription, (RenderedObject) object); } else if (object instanceof MapillaryImage) { diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/ImpassibleRoadsMenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/ImpassibleRoadsMenuController.java index 5a48de2998..7c78eeface 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/ImpassibleRoadsMenuController.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/ImpassibleRoadsMenuController.java @@ -4,24 +4,24 @@ import android.graphics.drawable.Drawable; import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; -import net.osmand.binary.RouteDataObject; import net.osmand.data.PointDescription; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.helpers.AvoidSpecificRoads.AvoidRoadInfo; import net.osmand.plus.mapcontextmenu.MenuBuilder; import net.osmand.plus.mapcontextmenu.MenuController; import net.osmand.plus.routing.RoutingHelper; public class ImpassibleRoadsMenuController extends MenuController { - private RouteDataObject route; + private AvoidRoadInfo avoidRoadInfo; public ImpassibleRoadsMenuController(@NonNull MapActivity mapActivity, @NonNull PointDescription pointDescription, - @NonNull RouteDataObject route) { + @NonNull AvoidRoadInfo avoidRoadInfo) { super(new MenuBuilder(mapActivity), pointDescription, mapActivity); - this.route = route; + this.avoidRoadInfo = avoidRoadInfo; final OsmandApplication app = mapActivity.getMyApplication(); leftTitleButtonController = new TitleButtonController() { @Override @@ -29,7 +29,7 @@ public class ImpassibleRoadsMenuController extends MenuController { MapActivity activity = getMapActivity(); if (activity != null) { app.getAvoidSpecificRoads().removeImpassableRoad( - ImpassibleRoadsMenuController.this.route); + ImpassibleRoadsMenuController.this.avoidRoadInfo); RoutingHelper rh = app.getRoutingHelper(); if (rh.isRouteCalculated() || rh.isRouteBeingCalculated()) { rh.recalculateRouteDueToSettingsChange(); @@ -44,12 +44,12 @@ public class ImpassibleRoadsMenuController extends MenuController { @Override protected void setObject(Object object) { - route = (RouteDataObject) object; + avoidRoadInfo = (AvoidRoadInfo) object; } @Override protected Object getObject() { - return route; + return avoidRoadInfo; } @NonNull diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java index a59fbe8a48..acf76e74dd 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java @@ -38,7 +38,6 @@ import net.osmand.Location; import net.osmand.PlatformUtil; import net.osmand.StateChangedListener; import net.osmand.ValueHolder; -import net.osmand.binary.RouteDataObject; import net.osmand.data.FavouritePoint; import net.osmand.data.LatLon; import net.osmand.data.PointDescription; @@ -67,6 +66,7 @@ import net.osmand.plus.base.ContextMenuFragment.MenuState; import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.helpers.GpxUiHelper; import net.osmand.plus.helpers.WaypointHelper; +import net.osmand.plus.helpers.AvoidSpecificRoads.AvoidRoadInfo; import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenuFragment; import net.osmand.plus.mapmarkers.MapMarkerSelectionFragment; import net.osmand.plus.poi.PoiUIFilter; @@ -110,13 +110,13 @@ import org.apache.commons.logging.Log; import java.io.IOException; import java.lang.ref.WeakReference; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Stack; -import java.util.TreeMap; public class MapRouteInfoMenu implements IRouteInformationListener, CardListener, FavoritesListener { @@ -1204,7 +1204,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener final LinearLayout item = createToolbarOptionView(false, null, -1, -1, null); if (item != null) { item.findViewById(R.id.route_option_container).setVisibility(View.GONE); - Map impassableRoads = new TreeMap<>(); + Map impassableRoads = new HashMap<>(); if (parameter instanceof AvoidRoadsRoutingParameter) { impassableRoads = app.getAvoidSpecificRoads().getImpassableRoads(); } @@ -1232,22 +1232,19 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener return avoidedParameters; } - private void createImpassableRoadsItems(MapActivity mapActivity, Map impassableRoads, final LocalRoutingParameter parameter, final RouteMenuAppModes mode, final LinearLayout item) { - OsmandApplication app = mapActivity.getMyApplication(); - Iterator it = impassableRoads.values().iterator(); + private void createImpassableRoadsItems(MapActivity mapActivity, Map impassableRoads, + final LocalRoutingParameter parameter, final RouteMenuAppModes mode, final LinearLayout item) { + Iterator it = impassableRoads.values().iterator(); while (it.hasNext()) { - final RouteDataObject routeDataObject = it.next(); - final View container = createToolbarSubOptionView(false, app.getAvoidSpecificRoads().getText(routeDataObject), R.drawable.ic_action_remove_dark, !it.hasNext(), new OnClickListener() { + final AvoidRoadInfo avoidRoadInfo = it.next(); + final View container = createToolbarSubOptionView(false, avoidRoadInfo.name, R.drawable.ic_action_remove_dark, !it.hasNext(), new OnClickListener() { @Override public void onClick(View v) { MapActivity mapActivity = getMapActivity(); if (mapActivity != null) { OsmandApplication app = mapActivity.getMyApplication(); - RoutingHelper routingHelper = app.getRoutingHelper(); - if (routeDataObject != null) { - app.getAvoidSpecificRoads().removeImpassableRoad(routeDataObject); - } - routingHelper.recalculateRouteDueToSettingsChange(); + app.getAvoidSpecificRoads().removeImpassableRoad(avoidRoadInfo); + app.getRoutingHelper().recalculateRouteDueToSettingsChange(); if (app.getAvoidSpecificRoads().getImpassableRoads().isEmpty() && getAvoidedParameters(app).isEmpty()) { mode.parameters.remove(parameter); } diff --git a/OsmAnd/src/net/osmand/plus/views/ImpassableRoadsLayer.java b/OsmAnd/src/net/osmand/plus/views/ImpassableRoadsLayer.java index 7bef99b217..b5b1d80ae1 100644 --- a/OsmAnd/src/net/osmand/plus/views/ImpassableRoadsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/ImpassableRoadsLayer.java @@ -10,7 +10,6 @@ import android.graphics.PointF; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import net.osmand.binary.RouteDataObject; import net.osmand.data.LatLon; import net.osmand.data.PointDescription; import net.osmand.data.RotatedTileBox; @@ -18,6 +17,7 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.helpers.AvoidSpecificRoads; +import net.osmand.plus.helpers.AvoidSpecificRoads.AvoidRoadInfo; import net.osmand.plus.helpers.AvoidSpecificRoads.AvoidSpecificRoadsCallback; import net.osmand.plus.views.ContextMenuLayer.ApplyMovedObjectCallback; @@ -55,7 +55,7 @@ public class ImpassableRoadsLayer extends OsmandMapLayer implements @Override public void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) { - if (contextMenuLayer.getMoveableObject() instanceof RouteDataObject) { + if (contextMenuLayer.getMoveableObject() instanceof AvoidRoadInfo) { PointF pf = contextMenuLayer.getMovableCenterPoint(tileBox); drawPoint(canvas, pf.x, pf.y, true); } @@ -64,11 +64,11 @@ public class ImpassableRoadsLayer extends OsmandMapLayer implements @Override public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) { if (tileBox.getZoom() >= START_ZOOM) { - for (Map.Entry entry : avoidSpecificRoads.getImpassableRoads().entrySet()) { + for (Map.Entry entry : avoidSpecificRoads.getImpassableRoads().entrySet()) { LatLon location = entry.getKey(); - RouteDataObject road = entry.getValue(); - if (road != null && contextMenuLayer.getMoveableObject() instanceof RouteDataObject) { - RouteDataObject object = (RouteDataObject) contextMenuLayer.getMoveableObject(); + AvoidRoadInfo road = entry.getValue(); + if (road != null && contextMenuLayer.getMoveableObject() instanceof AvoidRoadInfo) { + AvoidRoadInfo object = (AvoidRoadInfo) contextMenuLayer.getMoveableObject(); if (object.id == road.id) { continue; } @@ -146,9 +146,9 @@ public class ImpassableRoadsLayer extends OsmandMapLayer implements int compare = getRadiusPoi(tileBox); int radius = compare * 3 / 2; - for (Map.Entry entry : avoidSpecificRoads.getImpassableRoads().entrySet()) { + for (Map.Entry entry : avoidSpecificRoads.getImpassableRoads().entrySet()) { LatLon location = entry.getKey(); - RouteDataObject road = entry.getValue(); + AvoidRoadInfo road = entry.getValue(); if (location != null && road != null) { int x = (int) tileBox.getPixXFromLatLon(location.getLatitude(), location.getLongitude()); int y = (int) tileBox.getPixYFromLatLon(location.getLatitude(), location.getLongitude()); @@ -163,36 +163,37 @@ public class ImpassableRoadsLayer extends OsmandMapLayer implements @Override public LatLon getObjectLocation(Object o) { - if (o instanceof RouteDataObject) { - return avoidSpecificRoads.getLocation((RouteDataObject) o); + if (o instanceof AvoidRoadInfo) { + AvoidRoadInfo avoidRoadInfo = (AvoidRoadInfo) o; + return new LatLon(avoidRoadInfo.lat, avoidRoadInfo.lon); } return null; } @Override public PointDescription getObjectName(Object o) { - if (o instanceof RouteDataObject) { - RouteDataObject route = (RouteDataObject) o; - return new PointDescription(PointDescription.POINT_TYPE_BLOCKED_ROAD, route.getName()); + if (o instanceof AvoidRoadInfo) { + AvoidRoadInfo route = (AvoidRoadInfo) o; + return new PointDescription(PointDescription.POINT_TYPE_BLOCKED_ROAD, route.name); } return null; } @Override public boolean isObjectMovable(Object o) { - return o instanceof RouteDataObject; + return o instanceof AvoidRoadInfo; } @Override public void applyNewObjectPosition(@NonNull Object o, @NonNull LatLon position, @Nullable final ApplyMovedObjectCallback callback) { - if (o instanceof RouteDataObject) { - final RouteDataObject object = (RouteDataObject) o; + if (o instanceof AvoidRoadInfo) { + final AvoidRoadInfo object = (AvoidRoadInfo) o; final OsmandApplication application = activity.getMyApplication(); application.getAvoidSpecificRoads().replaceImpassableRoad(activity, object, position, false, new AvoidSpecificRoadsCallback() { @Override - public void onAddImpassableRoad(boolean success, RouteDataObject newObject) { + public void onAddImpassableRoad(boolean success, AvoidRoadInfo newObject) { if (callback != null) { callback.onApplyMovedObject(success, newObject); } From ffc52efb4122b37ce1ab440bb19479bdb78885ac Mon Sep 17 00:00:00 2001 From: MadWasp79 Date: Tue, 18 Feb 2020 15:37:26 +0200 Subject: [PATCH 02/62] settings cleaning added angle preference --- .../res/layout/recalculation_angle_dialog.xml | 129 ++++++++++++++++++ OsmAnd/res/values/strings.xml | 4 + .../src/net/osmand/plus/ApplicationMode.java | 8 ++ .../RouteOptionsBottomSheet.java | 24 +++- .../osmand/plus/routing/RouteProvider.java | 1 - .../osmand/plus/routing/RoutingHelper.java | 1 - .../settings/RouteParametersFragment.java | 101 ++++++++++++-- 7 files changed, 257 insertions(+), 11 deletions(-) create mode 100644 OsmAnd/res/layout/recalculation_angle_dialog.xml diff --git a/OsmAnd/res/layout/recalculation_angle_dialog.xml b/OsmAnd/res/layout/recalculation_angle_dialog.xml new file mode 100644 index 0000000000..bdea145131 --- /dev/null +++ b/OsmAnd/res/layout/recalculation_angle_dialog.xml @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 0e25650f90..356e2d599e 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -11,6 +11,10 @@ Thx - Hardy --> + Angle: %s° + Angle + Angle to calculate back-to-route path from current location + Acceptable deviation angle Show system notification while navigation with navigation instructions. Navigation notification App Default (%s) diff --git a/OsmAnd/src/net/osmand/plus/ApplicationMode.java b/OsmAnd/src/net/osmand/plus/ApplicationMode.java index 90b13ae2ff..88c4cffcc7 100644 --- a/OsmAnd/src/net/osmand/plus/ApplicationMode.java +++ b/OsmAnd/src/net/osmand/plus/ApplicationMode.java @@ -420,6 +420,14 @@ public class ApplicationMode { app.getSettings().MAX_SPEED.setModeValue(this, defaultSpeed); } + public float getStrAngle() { + return app.getSettings().ROUTE_STRAIGHT_ANGLE.getModeValue(this); + } + + public void setStrAngle(float angle) { + app.getSettings().ROUTE_STRAIGHT_ANGLE.setModeValue(this, angle); + } + public String getUserProfileName() { return app.getSettings().USER_PROFILE_NAME.getModeValue(this); } diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java index b7771fcf14..d31cc6dc2f 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java @@ -430,7 +430,13 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { boolean osmandRouter = applicationMode.getRouteService() == RouteProvider.RouteService.OSMAND; if (!osmandRouter) { - routingParameters = AppModeOptions.OTHER.routingParameters; + if (applicationMode.getRouteService() == RouteProvider.RouteService.STRAIGHT) { + routingParameters = AppModeOptions.STRAIGHT.routingParameters; + } else if (applicationMode.getRouteService() == RouteProvider.RouteService.DIRECT_TO) { + routingParameters = AppModeOptions.DIRECT_TO.routingParameters; + } else { + routingParameters = AppModeOptions.OTHER.routingParameters; + } } else if (applicationMode.isDerivedRoutingFrom(ApplicationMode.CAR)) { routingParameters = AppModeOptions.CAR.routingParameters; } else if (applicationMode.isDerivedRoutingFrom(ApplicationMode.BICYCLE)) { @@ -579,6 +585,22 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { DividerItem.KEY, GpxLocalRoutingParameter.KEY, OtherSettingsRoutingParameter.KEY, + RouteSimulationItem.KEY), + + STRAIGHT(MuteSoundRoutingParameter.KEY, + DividerItem.KEY, + ShowAlongTheRouteItem.KEY, + DividerItem.KEY, + GpxLocalRoutingParameter.KEY, + OtherSettingsRoutingParameter.KEY, + RouteSimulationItem.KEY), + + DIRECT_TO(MuteSoundRoutingParameter.KEY, + DividerItem.KEY, + ShowAlongTheRouteItem.KEY, + DividerItem.KEY, + GpxLocalRoutingParameter.KEY, + OtherSettingsRoutingParameter.KEY, RouteSimulationItem.KEY); diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java index 530811c812..3d4c23125d 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java @@ -1240,7 +1240,6 @@ public class RouteProvider { } private RouteCalculationResult findStraightRoute(RouteCalculationParams params) { - Location currentLocation = params.currentLocation; LinkedList points = new LinkedList<>(); List segments = new ArrayList<>(); points.add(params.start); diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index 10ededaa3a..7ff55f74c5 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -430,7 +430,6 @@ public class RoutingHelper { // 0. Route empty or needs to be extended? Then re-calculate route. if(route.isEmpty()) { calculateRoute = true; - //originalRoute = null; } else { // 1. Update current route position status according to latest received location boolean finished = updateCurrentRouteStatus(currentLocation, posTolerance); diff --git a/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java b/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java index 99aac76ca8..8f4e68966e 100644 --- a/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java @@ -1,14 +1,23 @@ package net.osmand.plus.settings; +import android.app.Activity; +import android.content.Context; +import android.content.DialogInterface; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.support.v4.content.ContextCompat; +import android.support.v7.app.AlertDialog; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; import android.support.v7.preference.PreferenceViewHolder; +import android.view.LayoutInflater; +import android.view.View; import android.widget.ImageView; +import android.widget.SeekBar; +import android.widget.TextView; +import net.osmand.GPXUtilities; import net.osmand.Location; import net.osmand.StateChangedListener; import net.osmand.plus.ApplicationMode; @@ -17,6 +26,7 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.OsmandSettings.BooleanPreference; import net.osmand.plus.R; +import net.osmand.plus.UiUtilities; import net.osmand.plus.activities.SettingsBaseActivity; import net.osmand.plus.activities.SettingsNavigationActivity; import net.osmand.plus.routing.RouteProvider; @@ -83,7 +93,6 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP routeParametersInfo.setTitle(getString(R.string.route_parameters_info, getSelectedAppMode().toHumanString())); setupRoutingPrefs(); - setupTimeConditionalRoutingPref(); } @Override @@ -131,21 +140,19 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP } PreferenceScreen screen = getPreferenceScreen(); + ApplicationMode am = getSelectedAppMode(); + SwitchPreferenceEx fastRoute = createSwitchPreferenceEx(app.getSettings().FAST_ROUTE_MODE.getId(), R.string.fast_route_mode, R.layout.preference_with_descr_dialog_and_switch); fastRoute.setIcon(getRoutingPrefIcon(app.getSettings().FAST_ROUTE_MODE.getId())); fastRoute.setDescription(getString(R.string.fast_route_mode_descr)); fastRoute.setSummaryOn(R.string.shared_string_on); fastRoute.setSummaryOff(R.string.shared_string_off); - - ApplicationMode am = getSelectedAppMode(); float defaultAllowedDeviation = RoutingHelper.getDefaultAllowedDeviation(settings, am, RoutingHelper.getPosTolerance(0)); - if (am.getRouteService() != RouteProvider.RouteService.OSMAND) { - screen.addPreference(fastRoute); - setupSelectRouteRecalcDistance(screen, defaultAllowedDeviation); - } else { - setupSelectRouteRecalcDistance(screen, defaultAllowedDeviation); + setupSelectRouteRecalcDistance(screen, defaultAllowedDeviation); + + if (am.getRouteService() == RouteProvider.RouteService.OSMAND){ GeneralRouter router = app.getRouter(am); clearParameters(); if (router != null) { @@ -231,9 +238,87 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP } } } + setupTimeConditionalRoutingPref(); + } else if (am.getRouteService() == RouteProvider.RouteService.BROUTER) { + screen.addPreference(fastRoute); + setupTimeConditionalRoutingPref(); + } else if (am.getRouteService() == RouteProvider.RouteService.STRAIGHT) { + Preference straightAngle = new Preference(app.getApplicationContext()); + straightAngle.setPersistent(false); + straightAngle.setKey(settings.ROUTE_STRAIGHT_ANGLE.getId()); + straightAngle.setTitle(getString(R.string.recalc_angle_dialog_title)); + straightAngle.setSummary(String.format(getString(R.string.shared_string_angle_param), (int) am.getStrAngle())); + straightAngle.setLayoutResource(R.layout.preference_with_descr); + getPreferenceScreen().addPreference(straightAngle); } } + @Override + public boolean onPreferenceClick(Preference preference) { + if (preference.getKey().equals(settings.ROUTE_STRAIGHT_ANGLE.getId())) { + showSeekbarSettingsDialog(getActivity(), settings.getApplicationMode()); + } + return super.onPreferenceClick(preference); + } + + private void showSeekbarSettingsDialog(Activity activity, final ApplicationMode mode) { + if (activity == null || mode == null) { + return; + } + final OsmandApplication app = (OsmandApplication) activity.getApplication(); + final float[] angleValue = new float[] {mode.getStrAngle()}; + boolean nightMode = !app.getSettings().isLightContentForMode(mode); + Context themedContext = UiUtilities.getThemedContext(activity, nightMode); + AlertDialog.Builder builder = new AlertDialog.Builder(themedContext); + View seekbarView = LayoutInflater.from(themedContext).inflate(R.layout.recalculation_angle_dialog, null, false); + builder.setView(seekbarView); + builder.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + mode.setStrAngle(angleValue[0]); + getPreferenceScreen().getPreference(1) + .setSummary(String.format(getString(R.string.shared_string_angle_param), (int) angleValue[0])); + RoutingHelper routingHelper = app.getRoutingHelper(); + if (mode.equals(routingHelper.getAppMode()) && (routingHelper.isRouteCalculated() || routingHelper.isRouteBeingCalculated())) { + routingHelper.recalculateRouteDueToSettingsChange(); + } + } + }); + builder.setNegativeButton(R.string.shared_string_cancel, null); + + int selectedModeColor = ContextCompat.getColor(app, mode.getIconColorInfo().getColor(nightMode)); + setupAngleSlider(angleValue, seekbarView, nightMode, selectedModeColor); + builder.show(); + } + + private static void setupAngleSlider(final float[] angleValue, + View seekbarView, + final boolean nightMode, + final int activeColor) { + + final SeekBar angleBar = seekbarView.findViewById(R.id.angle_seekbar); + final TextView angleTv = seekbarView.findViewById(R.id.angle_text); + + angleTv.setText(String.valueOf(angleValue[0])); + angleBar.setProgress((int) angleValue[0]); + angleBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + int value = progress - (progress % 5); + angleValue[0] = value; + angleTv.setText(String.valueOf(value)); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) {} + + @Override + public void onStopTrackingTouch(SeekBar seekBar) {} + }); + UiUtilities.setupSeekBar(angleBar, activeColor, nightMode); + } + private void setupSelectRouteRecalcDistance(PreferenceScreen screen, float defaultAllowedDeviation) { Float[] entryValues; OsmandSettings settings = app.getSettings(); From f00bb9a71fa7246842fa7cadbdf81157f3976f4a Mon Sep 17 00:00:00 2001 From: MadWasp79 Date: Tue, 18 Feb 2020 15:51:35 +0200 Subject: [PATCH 03/62] Preference text update fix --- .../net/osmand/plus/settings/RouteParametersFragment.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java b/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java index 8f4e68966e..315162bc80 100644 --- a/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java @@ -256,7 +256,7 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP @Override public boolean onPreferenceClick(Preference preference) { if (preference.getKey().equals(settings.ROUTE_STRAIGHT_ANGLE.getId())) { - showSeekbarSettingsDialog(getActivity(), settings.getApplicationMode()); + showSeekbarSettingsDialog(getActivity(), getSelectedAppMode()); } return super.onPreferenceClick(preference); } @@ -276,8 +276,7 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP @Override public void onClick(DialogInterface dialog, int which) { mode.setStrAngle(angleValue[0]); - getPreferenceScreen().getPreference(1) - .setSummary(String.format(getString(R.string.shared_string_angle_param), (int) angleValue[0])); + updateAllSettings(); RoutingHelper routingHelper = app.getRoutingHelper(); if (mode.equals(routingHelper.getAppMode()) && (routingHelper.isRouteCalculated() || routingHelper.isRouteBeingCalculated())) { routingHelper.recalculateRouteDueToSettingsChange(); From 1cb49fe4026c2c6c774206ab397179feb6b98fa2 Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Tue, 18 Feb 2020 16:40:39 +0200 Subject: [PATCH 04/62] Avoid roads second part --- .../osmand/router/RoutingConfiguration.java | 6 +- .../src/net/osmand/plus/AppInitializer.java | 4 +- .../src/net/osmand/plus/OsmandSettings.java | 132 ++++++++++++++++++ .../plus/helpers/AvoidSpecificRoads.java | 70 ++++++---- 4 files changed, 180 insertions(+), 32 deletions(-) diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RoutingConfiguration.java b/OsmAnd-java/src/main/java/net/osmand/router/RoutingConfiguration.java index 4a84a9c6df..005f3ba88c 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RoutingConfiguration.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RoutingConfiguration.java @@ -116,9 +116,9 @@ public class RoutingConfiguration { return impassableRoadLocations; } - public boolean addImpassableRoad(RouteDataObject route) { - if (!impassableRoadLocations.contains(route.id)) { - impassableRoadLocations.add(route.id); + public boolean addImpassableRoad(long routeId) { + if (!impassableRoadLocations.contains(routeId)) { + impassableRoadLocations.add(routeId); return true; } return false; diff --git a/OsmAnd/src/net/osmand/plus/AppInitializer.java b/OsmAnd/src/net/osmand/plus/AppInitializer.java index bf9720c037..1f89aca20b 100644 --- a/OsmAnd/src/net/osmand/plus/AppInitializer.java +++ b/OsmAnd/src/net/osmand/plus/AppInitializer.java @@ -629,6 +629,7 @@ public class AppInitializer implements IProgress { if (!customConfigs.isEmpty()) { app.getCustomRoutingConfigs().putAll(customConfigs); } + app.avoidSpecificRoads.initRouteObjects(false); callback.onRoutingFilesLoaded(); } @@ -739,8 +740,7 @@ public class AppInitializer implements IProgress { notifyEvent(InitEvents.RESTORE_BACKUPS); app.mapMarkersHelper.syncAllGroupsAsync(); app.searchUICore.initSearchUICore(); - app.avoidSpecificRoads.initRouteObjects(false); - + checkLiveUpdatesAlerts(); } catch (RuntimeException e) { diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java index 89bfd57513..b5ca671ace 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java @@ -2798,9 +2798,136 @@ public class OsmandSettings { } private class ImpassableRoadsStorage extends MapPointsStorage { + + protected String roadsIdsKey; + public ImpassableRoadsStorage() { pointsKey = IMPASSABLE_ROAD_POINTS; descriptionsKey = IMPASSABLE_ROADS_DESCRIPTIONS; + roadsIdsKey = IMPASSABLE_ROADS_IDS; + } + + public List getImpassableRoadsInfo() { + List points = mImpassableRoadsStorage.getPoints(); + List descriptions = mImpassableRoadsStorage.getPointDescriptions(points.size()); + List roadIds = getRoadIds(points.size()); + + List avoidRoadsInfo = new ArrayList<>(); + + for (int i = 0; i < points.size(); i++) { + LatLon latLon = points.get(i); + PointDescription description = PointDescription.deserializeFromString(descriptions.get(i), null); + + AvoidRoadInfo avoidRoadInfo = new AvoidRoadInfo(); + avoidRoadInfo.id = roadIds.get(i); + avoidRoadInfo.lat = latLon.getLatitude(); + avoidRoadInfo.lon = latLon.getLongitude(); + avoidRoadInfo.name = description.getName(); + avoidRoadsInfo.add(avoidRoadInfo); + } + + return avoidRoadsInfo; + } + + public boolean addImpassableRoadInfo(AvoidRoadInfo avoidRoadInfo) { + List points = getPoints(); + List descriptions = getPointDescriptions(points.size()); + List roadIds = getRoadIds(points.size()); + + points.add(0, new LatLon(avoidRoadInfo.lat, avoidRoadInfo.lon)); + descriptions.add(0, PointDescription.serializeToString(new PointDescription("", avoidRoadInfo.name))); + roadIds.add(0, avoidRoadInfo.id); + + return savePoints(points, descriptions) && saveRoadIds(roadIds); + } + + public boolean updateImpassableRoadInfo(AvoidRoadInfo avoidRoadInfo) { + List points = getPoints(); + List roadIds = getRoadIds(points.size()); + List descriptions = getPointDescriptions(points.size()); + + int index = points.indexOf(new LatLon(avoidRoadInfo.lat, avoidRoadInfo.lon)); + if (index != -1) { + roadIds.set(index, avoidRoadInfo.id); + descriptions.set(index, PointDescription.serializeToString(new PointDescription("", avoidRoadInfo.name))); + return savePoints(points, descriptions) && saveRoadIds(roadIds); + } + return false; + } + + public List getRoadIds(int size) { + List list = new ArrayList<>(); + String roadIds = settingsAPI.getString(globalPreferences, roadsIdsKey, ""); + if (roadIds.trim().length() > 0) { + StringTokenizer tok = new StringTokenizer(roadIds, ","); + while (tok.hasMoreTokens() && list.size() <= size) { + String token = tok.nextToken(); + list.add(Long.parseLong(token)); + } + } + while (list.size() < size) { + list.add(0L); + } + return list; + } + + @Override + public boolean deletePoint(int index) { + List points = getPoints(); + List roadIds = getRoadIds(points.size()); + List descriptions = getPointDescriptions(points.size()); + + if (index < points.size()) { + points.remove(index); + roadIds.remove(index); + descriptions.remove(index); + return savePoints(points, descriptions) && saveRoadIds(roadIds); + } + return false; + } + + @Override + public boolean deletePoint(LatLon latLon) { + List points = getPoints(); + List descriptions = getPointDescriptions(points.size()); + List roadIds = getRoadIds(points.size()); + int index = points.indexOf(latLon); + if (index != -1) { + points.remove(index); + roadIds.remove(index); + descriptions.remove(index); + return savePoints(points, descriptions) && saveRoadIds(roadIds); + } + return false; + } + + @Override + public boolean movePoint(LatLon latLonEx, LatLon latLonNew) { + List points = getPoints(); + List descriptions = getPointDescriptions(points.size()); + List roadIds = getRoadIds(points.size()); + + int i = points.indexOf(latLonEx); + if (i != -1) { + points.set(i, latLonNew); + return savePoints(points, descriptions) && saveRoadIds(roadIds); + } else { + return false; + } + } + + public boolean saveRoadIds(List roadIds) { + StringBuilder stringBuilder = new StringBuilder(); + Iterator iterator = roadIds.iterator(); + while (iterator.hasNext()) { + stringBuilder.append(iterator.next()); + if (iterator.hasNext()) { + stringBuilder.append(","); + } + } + return settingsAPI.edit(globalPreferences) + .putString(roadsIdsKey, stringBuilder.toString()) + .commit(); } } @@ -2994,10 +3121,15 @@ public class OsmandSettings { public List getImpassableRoadPoints() { return mImpassableRoadsStorage.getImpassableRoadsInfo(); } + public boolean addImpassableRoad(AvoidRoadInfo avoidRoadInfo) { return mImpassableRoadsStorage.addImpassableRoadInfo(avoidRoadInfo); } + public boolean updateImpassableRoadInfo(AvoidRoadInfo avoidRoadInfo) { + return mImpassableRoadsStorage.updateImpassableRoadInfo(avoidRoadInfo); + } + public boolean removeImpassableRoad(int index) { return mImpassableRoadsStorage.deletePoint(index); } diff --git a/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java b/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java index 00b811ad25..628e354e7c 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java +++ b/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java @@ -67,17 +67,21 @@ public class AvoidSpecificRoads { for (Map.Entry entry : impassableRoads.entrySet()) { if (force || entry.getValue().id == 0) { addImpassableRoad(null, entry.getKey(), false, true); + } else { + for (RoutingConfiguration.Builder builder : app.getAllRoutingConfigs()) { + builder.addImpassableRoad(entry.getValue().id); + } } } } - private ArrayAdapter createAdapter(MapActivity mapActivity, boolean nightMode) { - final ArrayList points = new ArrayList<>(impassableRoads.keySet()); + private ArrayAdapter createAdapter(MapActivity mapActivity, boolean nightMode) { + final ArrayList points = new ArrayList<>(impassableRoads.values()); final LatLon mapLocation = mapActivity.getMapLocation(); final LayoutInflater inflater = UiUtilities.getInflater(mapActivity, nightMode); Context themedContext = UiUtilities.getThemedContext(mapActivity, nightMode); - return new ArrayAdapter(themedContext, R.layout.waypoint_reached, R.id.title, points) { + return new ArrayAdapter(themedContext, R.layout.waypoint_reached, R.id.title, points) { @NonNull @Override public View getView(final int position, View convertView, @NonNull ViewGroup parent) { @@ -85,12 +89,15 @@ public class AvoidSpecificRoads { if (v == null || v.findViewById(R.id.info_close) == null) { v = inflater.inflate(R.layout.waypoint_reached, parent, false); } - final LatLon item = getItem(position); + final AvoidRoadInfo item = getItem(position); v.findViewById(R.id.all_points).setVisibility(View.GONE); ((ImageView) v.findViewById(R.id.waypoint_icon)) .setImageDrawable(getIcon(R.drawable.ic_action_road_works_dark)); - ((TextView) v.findViewById(R.id.waypoint_dist)).setText(getDist(mapLocation, item)); - ((TextView) v.findViewById(R.id.waypoint_text)).setText(getText(item)); + + LatLon latLon = item != null ? new LatLon(item.lat, item.lon) : null; + String name = item != null ? item.name : app.getString(R.string.shared_string_road); + ((TextView) v.findViewById(R.id.waypoint_dist)).setText(getDist(mapLocation, latLon)); + ((TextView) v.findViewById(R.id.waypoint_text)).setText(name); ImageButton remove = (ImageButton) v.findViewById(R.id.info_close); remove.setVisibility(View.VISIBLE); remove.setImageDrawable(getIcon(R.drawable.ic_action_remove_dark)); @@ -153,15 +160,15 @@ public class AvoidSpecificRoads { public void removeImpassableRoad(LatLon latLon) { app.getSettings().removeImpassableRoad(latLon); - RouteDataObject obj = impassableRoads.remove(latLon); + AvoidRoadInfo obj = impassableRoads.remove(latLon); if (obj != null) { for (RoutingConfiguration.Builder builder : app.getAllRoutingConfigs()) { - builder.removeImpassableRoad(obj); + builder.removeImpassableRoad(obj.id); } } } - public void removeImpassableRoad(RouteDataObject obj) { + public void removeImpassableRoad(AvoidRoadInfo obj) { removeImpassableRoad(getLocation(obj)); } @@ -174,13 +181,13 @@ public class AvoidSpecificRoads { if (impassableRoads.isEmpty()) { bld.setMessage(R.string.avoid_roads_msg); } else { - final ArrayAdapter listAdapter = createAdapter(mapActivity, nightMode); + final ArrayAdapter listAdapter = createAdapter(mapActivity, nightMode); bld.setAdapter(listAdapter, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - LatLon point = listAdapter.getItem(which); + AvoidRoadInfo point = listAdapter.getItem(which); if (point != null) { - showOnMap(mapActivity, point.getLatitude(), point.getLongitude(), getText(point)); + showOnMap(mapActivity, point.lat, point.lon, point.name); } dialog.dismiss(); } @@ -228,9 +235,12 @@ public class AvoidSpecificRoads { LatLon newLoc = new LatLon(MapUtils.get31LatitudeY((int) point.y), MapUtils.get31LongitudeX((int) point.x)); ll.setLatitude(newLoc.getLatitude()); ll.setLongitude(newLoc.getLongitude()); - addImpassableRoadInternal(roads.get(searchResult.getRoadIndex()).getObject(), ll, showDialog, mapActivity, newLoc); + + RouteDataObject object = roads.get(searchResult.getRoadIndex()).getObject(); + AvoidRoadInfo avoidRoadInfo = getAvoidRoadInfoForDataObject(object, newLoc.getLatitude(), newLoc.getLongitude()); + addImpassableRoadInternal(avoidRoadInfo, showDialog, mapActivity, newLoc); if (!skipWritingSettings) { - app.getSettings().addImpassableRoad(newLoc.getLatitude(), newLoc.getLongitude()); + app.getSettings().addImpassableRoad(avoidRoadInfo); } return; } @@ -244,7 +254,8 @@ public class AvoidSpecificRoads { Toast.makeText(mapActivity, R.string.error_avoid_specific_road, Toast.LENGTH_LONG).show(); } } else { - addImpassableRoadInternal(object, ll, showDialog, mapActivity, loc); + AvoidRoadInfo avoidRoadInfo = getAvoidRoadInfoForDataObject(object, ll.getLatitude(), ll.getLongitude()); + addImpassableRoadInternal(avoidRoadInfo, showDialog, mapActivity, loc); } return true; } @@ -256,12 +267,13 @@ public class AvoidSpecificRoads { }); if (!skipWritingSettings) { - app.getSettings().addImpassableRoad(loc.getLatitude(), loc.getLongitude()); + AvoidRoadInfo avoidRoadInfo = getAvoidRoadInfoForDataObject(null, loc.getLatitude(), loc.getLongitude()); + app.getSettings().addImpassableRoad(avoidRoadInfo); } } public void replaceImpassableRoad(final MapActivity activity, - final RouteDataObject currentObject, + final AvoidRoadInfo currentObject, final LatLon newLoc, final boolean showDialog, final AvoidSpecificRoadsCallback callback) { @@ -284,12 +296,13 @@ public class AvoidSpecificRoads { app.getSettings().moveImpassableRoad(oldLoc, newLoc); impassableRoads.remove(oldLoc); for (RoutingConfiguration.Builder builder : app.getAllRoutingConfigs()) { - builder.removeImpassableRoad(currentObject); + builder.removeImpassableRoad(currentObject.id); } - addImpassableRoadInternal(object, ll, showDialog, activity, newLoc); + AvoidRoadInfo avoidRoadInfo = getAvoidRoadInfoForDataObject(object, newLoc.getLatitude(), newLoc.getLongitude()); + addImpassableRoadInternal(avoidRoadInfo, showDialog, activity, newLoc); if (callback != null) { - callback.onAddImpassableRoad(true, object); + callback.onAddImpassableRoad(true, avoidRoadInfo); } } return true; @@ -302,19 +315,19 @@ public class AvoidSpecificRoads { }); } - private void addImpassableRoadInternal(@NonNull RouteDataObject object, - @NonNull Location ll, + private void addImpassableRoadInternal(@NonNull AvoidRoadInfo avoidRoadInfo, boolean showDialog, @Nullable MapActivity activity, @NonNull LatLon loc) { boolean roadAdded = false; for (RoutingConfiguration.Builder builder : app.getAllRoutingConfigs()) { - roadAdded |= builder.addImpassableRoad(object, ll); + roadAdded |= builder.addImpassableRoad(avoidRoadInfo.id); } if (roadAdded) { - impassableRoads.put(loc, object); + app.getSettings().updateImpassableRoadInfo(avoidRoadInfo); + impassableRoads.put(loc, avoidRoadInfo); } else { - LatLon location = getLocation(object); + LatLon location = getLocation(avoidRoadInfo); if (location != null) { app.getSettings().removeImpassableRoad(location); } @@ -355,8 +368,11 @@ public class AvoidSpecificRoads { boolean isCancelled(); } - private AvoidRoadInfo createAvoidRoadInfo(@Nullable RouteDataObject object, double lat, double lon) { - AvoidRoadInfo avoidRoadInfo = new AvoidRoadInfo(); + private AvoidRoadInfo getAvoidRoadInfoForDataObject(@Nullable RouteDataObject object, double lat, double lon) { + AvoidRoadInfo avoidRoadInfo = impassableRoads.get(new LatLon(lat, lon)); + if (avoidRoadInfo == null) { + avoidRoadInfo = new AvoidRoadInfo(); + } avoidRoadInfo.id = object != null ? object.id : 0; avoidRoadInfo.lat = lat; avoidRoadInfo.lon = lon; From 8743b53bff2a4e859f6612509f0ae1e29c6e3a91 Mon Sep 17 00:00:00 2001 From: MadWasp79 Date: Tue, 18 Feb 2020 16:55:36 +0200 Subject: [PATCH 05/62] icons --- .../src/net/osmand/plus/settings/RouteParametersFragment.java | 1 + OsmAnd/src/net/osmand/plus/views/RouteLayer.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java b/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java index 315162bc80..ee1b308c39 100644 --- a/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java @@ -249,6 +249,7 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP straightAngle.setTitle(getString(R.string.recalc_angle_dialog_title)); straightAngle.setSummary(String.format(getString(R.string.shared_string_angle_param), (int) am.getStrAngle())); straightAngle.setLayoutResource(R.layout.preference_with_descr); + straightAngle.setIcon(getRoutingPrefIcon("routing_recalc_distance")); //TODO change for appropriate icon when available getPreferenceScreen().addPreference(straightAngle); } } diff --git a/OsmAnd/src/net/osmand/plus/views/RouteLayer.java b/OsmAnd/src/net/osmand/plus/views/RouteLayer.java index 874696db07..91af884301 100644 --- a/OsmAnd/src/net/osmand/plus/views/RouteLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/RouteLayer.java @@ -319,7 +319,7 @@ public class RouteLayer extends OsmandMapLayer implements ContextMenuLayer.ICont private void drawProjectionPoint(Canvas canvas, double[] projectionXY) { if (projectionIcon == null) { - projectionIcon = (LayerDrawable) view.getResources().getDrawable(helper.getSettings().getApplicationMode().getLocationIcon().getIconId()); + projectionIcon = (LayerDrawable) view.getResources().getDrawable(helper.getSettings().getApplicationMode().getLocationIcon().DEFAULT.getIconId()); } int locationX = (int) projectionXY[0]; int locationY = (int) projectionXY[1]; From 2e15315a16b4d95ee529e2703e19e719a81c1e55 Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Tue, 18 Feb 2020 17:07:36 +0200 Subject: [PATCH 06/62] Add full names to avoid road info --- .../net/osmand/router/RoutingConfiguration.java | 16 +++++----------- OsmAnd/src/net/osmand/plus/OsmandSettings.java | 8 ++++---- .../osmand/plus/helpers/AvoidSpecificRoads.java | 16 ++++++++-------- .../osmand/plus/views/ImpassableRoadsLayer.java | 2 +- 4 files changed, 18 insertions(+), 24 deletions(-) diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RoutingConfiguration.java b/OsmAnd-java/src/main/java/net/osmand/router/RoutingConfiguration.java index 005f3ba88c..fb3432d4aa 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RoutingConfiguration.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RoutingConfiguration.java @@ -1,7 +1,6 @@ package net.osmand.router; import net.osmand.PlatformUtil; -import net.osmand.binary.RouteDataObject; import net.osmand.router.GeneralRouter.GeneralRouterProfile; import net.osmand.router.GeneralRouter.RouteAttributeContext; import net.osmand.router.GeneralRouter.RouteDataObjectAttribute; @@ -12,11 +11,10 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; +import java.util.Set; import java.util.Stack; public class RoutingConfiguration { @@ -56,7 +54,7 @@ public class RoutingConfiguration { private String defaultRouter = ""; private Map routers = new LinkedHashMap<>(); private Map attributes = new LinkedHashMap<>(); - private List impassableRoadLocations = new ArrayList<>(); + private Set impassableRoadLocations = new HashSet<>(); public Builder() { @@ -111,17 +109,13 @@ public class RoutingConfiguration { // i.planRoadDirection = 1; return i; } - - public List getImpassableRoadLocations() { + + public Set getImpassableRoadLocations() { return impassableRoadLocations; } public boolean addImpassableRoad(long routeId) { - if (!impassableRoadLocations.contains(routeId)) { - impassableRoadLocations.add(routeId); - return true; - } - return false; + return impassableRoadLocations.add(routeId); } public Map getAttributes() { diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java index b5ca671ace..bfeb7f1865 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java @@ -2820,8 +2820,8 @@ public class OsmandSettings { AvoidRoadInfo avoidRoadInfo = new AvoidRoadInfo(); avoidRoadInfo.id = roadIds.get(i); - avoidRoadInfo.lat = latLon.getLatitude(); - avoidRoadInfo.lon = latLon.getLongitude(); + avoidRoadInfo.latitude = latLon.getLatitude(); + avoidRoadInfo.longitude = latLon.getLongitude(); avoidRoadInfo.name = description.getName(); avoidRoadsInfo.add(avoidRoadInfo); } @@ -2834,7 +2834,7 @@ public class OsmandSettings { List descriptions = getPointDescriptions(points.size()); List roadIds = getRoadIds(points.size()); - points.add(0, new LatLon(avoidRoadInfo.lat, avoidRoadInfo.lon)); + points.add(0, new LatLon(avoidRoadInfo.latitude, avoidRoadInfo.longitude)); descriptions.add(0, PointDescription.serializeToString(new PointDescription("", avoidRoadInfo.name))); roadIds.add(0, avoidRoadInfo.id); @@ -2846,7 +2846,7 @@ public class OsmandSettings { List roadIds = getRoadIds(points.size()); List descriptions = getPointDescriptions(points.size()); - int index = points.indexOf(new LatLon(avoidRoadInfo.lat, avoidRoadInfo.lon)); + int index = points.indexOf(new LatLon(avoidRoadInfo.latitude, avoidRoadInfo.longitude)); if (index != -1) { roadIds.set(index, avoidRoadInfo.id); descriptions.set(index, PointDescription.serializeToString(new PointDescription("", avoidRoadInfo.name))); diff --git a/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java b/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java index 628e354e7c..965de9fe08 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java +++ b/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java @@ -55,7 +55,7 @@ public class AvoidSpecificRoads { public AvoidSpecificRoads(final OsmandApplication app) { this.app = app; for (AvoidRoadInfo avoidRoadInfo : app.getSettings().getImpassableRoadPoints()) { - impassableRoads.put(new LatLon(avoidRoadInfo.lat, avoidRoadInfo.lon), avoidRoadInfo); + impassableRoads.put(new LatLon(avoidRoadInfo.latitude, avoidRoadInfo.longitude), avoidRoadInfo); } } @@ -94,7 +94,7 @@ public class AvoidSpecificRoads { ((ImageView) v.findViewById(R.id.waypoint_icon)) .setImageDrawable(getIcon(R.drawable.ic_action_road_works_dark)); - LatLon latLon = item != null ? new LatLon(item.lat, item.lon) : null; + LatLon latLon = item != null ? new LatLon(item.latitude, item.longitude) : null; String name = item != null ? item.name : app.getString(R.string.shared_string_road); ((TextView) v.findViewById(R.id.waypoint_dist)).setText(getDist(mapLocation, latLon)); ((TextView) v.findViewById(R.id.waypoint_text)).setText(name); @@ -187,7 +187,7 @@ public class AvoidSpecificRoads { public void onClick(DialogInterface dialog, int which) { AvoidRoadInfo point = listAdapter.getItem(which); if (point != null) { - showOnMap(mapActivity, point.lat, point.lon, point.name); + showOnMap(mapActivity, point.latitude, point.longitude, point.name); } dialog.dismiss(); } @@ -355,7 +355,7 @@ public class AvoidSpecificRoads { public LatLon getLocation(AvoidRoadInfo avoidRoadInfo) { for (RoutingConfiguration.Builder builder : app.getAllRoutingConfigs()) { if (builder.getImpassableRoadLocations().contains(avoidRoadInfo.id)) { - return new LatLon(avoidRoadInfo.lat, avoidRoadInfo.lon); + return new LatLon(avoidRoadInfo.latitude, avoidRoadInfo.longitude); } } return null; @@ -374,16 +374,16 @@ public class AvoidSpecificRoads { avoidRoadInfo = new AvoidRoadInfo(); } avoidRoadInfo.id = object != null ? object.id : 0; - avoidRoadInfo.lat = lat; - avoidRoadInfo.lon = lon; + avoidRoadInfo.latitude = lat; + avoidRoadInfo.longitude = lon; avoidRoadInfo.name = getRoadName(object); return avoidRoadInfo; } public static class AvoidRoadInfo { public long id; - public double lat; - public double lon; + public double latitude; + public double longitude; public String name; } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/views/ImpassableRoadsLayer.java b/OsmAnd/src/net/osmand/plus/views/ImpassableRoadsLayer.java index b5b1d80ae1..1ab8daa1e6 100644 --- a/OsmAnd/src/net/osmand/plus/views/ImpassableRoadsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/ImpassableRoadsLayer.java @@ -165,7 +165,7 @@ public class ImpassableRoadsLayer extends OsmandMapLayer implements public LatLon getObjectLocation(Object o) { if (o instanceof AvoidRoadInfo) { AvoidRoadInfo avoidRoadInfo = (AvoidRoadInfo) o; - return new LatLon(avoidRoadInfo.lat, avoidRoadInfo.lon); + return new LatLon(avoidRoadInfo.latitude, avoidRoadInfo.longitude); } return null; } From f041992f0515f0865b7cc18f801698f584682ed0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Tue, 18 Feb 2020 10:17:13 +0000 Subject: [PATCH 07/62] Translated using Weblate (Turkish) Currently translated at 100.0% (3190 of 3190 strings) --- OsmAnd/res/values-tr/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd/res/values-tr/strings.xml b/OsmAnd/res/values-tr/strings.xml index 1dc8be3c72..847f129483 100644 --- a/OsmAnd/res/values-tr/strings.xml +++ b/OsmAnd/res/values-tr/strings.xml @@ -3497,4 +3497,8 @@ Antarktika Navigasyon talimatları ile navigasyon sırasında sistem bildirimini göster. Navigasyon bildirimi + Uygulama Varsayılanı (%s) + Yeniden hesaplamayı devre dışı bırak + Rotayı yeniden hesaplamak için minimum mesafe + Rotaya olan mesafe belirtilen parametreden daha uzunsa rota yeniden hesaplanacak \ No newline at end of file From 3131cc51d573097d0164e343b8d1ae3cdd602673 Mon Sep 17 00:00:00 2001 From: Eduardo Addad de Oliveira Date: Tue, 18 Feb 2020 10:22:09 +0000 Subject: [PATCH 08/62] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (3190 of 3190 strings) --- OsmAnd/res/values-pt-rBR/strings.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/OsmAnd/res/values-pt-rBR/strings.xml b/OsmAnd/res/values-pt-rBR/strings.xml index 8cc94ffa4e..2ecdc59a74 100644 --- a/OsmAnd/res/values-pt-rBR/strings.xml +++ b/OsmAnd/res/values-pt-rBR/strings.xml @@ -3527,4 +3527,10 @@ Pôr do Sol: %2$s O perfil importado contém dados adicionais. Clique em Importar para importar apenas dados do perfil ou selecione dados adicionais a serem importados. Você pode selecionar dados adicionais para exportar junto com o perfil. Antártida + Mostrar notificação do sistema durante a navegação com instruções de navegação. + Notificação de navegação + Aplicativo padrão (%s) + Desativar recálculo + Distância mínima para recalcular a rota + A rota será recalculada se a distância até a rota for maior que o parâmetro especificado \ No newline at end of file From f3e3d87495274077ee583a3eaaad5c15d28e9f5a Mon Sep 17 00:00:00 2001 From: Hinagiku Zeppeki Date: Tue, 18 Feb 2020 08:32:53 +0000 Subject: [PATCH 09/62] Translated using Weblate (Japanese) Currently translated at 99.1% (3159 of 3186 strings) --- OsmAnd/res/values-ja/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-ja/strings.xml b/OsmAnd/res/values-ja/strings.xml index b6dcbc5547..dd9c0209fb 100644 --- a/OsmAnd/res/values-ja/strings.xml +++ b/OsmAnd/res/values-ja/strings.xml @@ -2569,7 +2569,7 @@ POIの更新は利用できません アクティブマーカーまでの距離を示す情報をどこに表示するか選択してください。 マーカーの方向と距離を示すインジケーターの数を選択してください。 お気に入り地点のカテゴリー - 任意の場所をロングまたはショートタップで指定後、旗のボタンでマーカーを作成します。 + 任意の場所をロングタップなどで指定後、旗のボタンでマーカーをつけられます。 経路データ内の経由地点 通過済みも表示 通過済みは非表示 From 8a8d7025c4b79fc49728a7e23f22f71e113dd9cb Mon Sep 17 00:00:00 2001 From: Francesco Traduce Date: Tue, 18 Feb 2020 12:51:26 +0000 Subject: [PATCH 10/62] Translated using Weblate (Italian) Currently translated at 90.5% (2890 of 3190 strings) --- OsmAnd/res/values-it/strings.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/OsmAnd/res/values-it/strings.xml b/OsmAnd/res/values-it/strings.xml index 389bbe618e..e1bd81d19b 100644 --- a/OsmAnd/res/values-it/strings.xml +++ b/OsmAnd/res/values-it/strings.xml @@ -3522,4 +3522,15 @@ Rappresenta l\'area: %1$s x %2$s \n" Copia le coordinate Ordina per categoria + Dai un nome a questo profilo + Apri le impostazioni + Plugin disabilitato + Questo plugin è stato aggiunto tramite un\' applicazione separata. Se non vuoi più utilizzarlo, rimuovi l\' applicazione separatamente. +\n +\nSe rimuovi OsmAnd, il plugin resterà sul dispositivo. + Menu + %1$s — %2$s — %3$s + Disattiva ricalcolo percorso + Distanza minima per il ricalcolo del percorso + Il percorso viene ricalcolato quando la distanza dal percorso è maggiore di quella specificata \ No newline at end of file From 0dd5edefcad13d786849990712f806211356ff87 Mon Sep 17 00:00:00 2001 From: Ldm Public Date: Tue, 18 Feb 2020 09:31:29 +0000 Subject: [PATCH 11/62] Translated using Weblate (French) Currently translated at 100.0% (3190 of 3190 strings) --- OsmAnd/res/values-fr/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index 1978685660..52b4da66d7 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -3512,4 +3512,8 @@ représentant la zone : %1$s x %2$s Antarctique Pendant la navigation, afficher une notification système avec les directions. Notification pendant la navigation + Par défaut pour l\'application (%s) + Désactiver le re-calcul + Distance à partir de laquelle recalculer l’itinéraire + L’itinéraire sera recalculé si votre éloignement de l\'itinéraire est supérieur à ce paramètre \ No newline at end of file From 37f2043648065af457fe464cc2ff78683c5d2557 Mon Sep 17 00:00:00 2001 From: Ajeje Brazorf Date: Tue, 18 Feb 2020 13:52:01 +0000 Subject: [PATCH 12/62] Translated using Weblate (Sardinian) Currently translated at 99.1% (3164 of 3190 strings) --- OsmAnd/res/values-sc/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd/res/values-sc/strings.xml b/OsmAnd/res/values-sc/strings.xml index 13a3acdf95..26a3a09fcb 100644 --- a/OsmAnd/res/values-sc/strings.xml +++ b/OsmAnd/res/values-sc/strings.xml @@ -3540,4 +3540,8 @@ Pro praghere iscrie su còdighe intreu Antàrticu Ammustra notìficas de sistema durante sa navigatzione cun istrutziones de navigatzione. Notìfica de navigatzione + Predefinidu in s\'aplicatzione (%s) + Disabìlita su ri-càlculu de s\'àndala + Distàntzia mìnima pro torrare a calculare s\'àndala + S\'àndala at a bènnere calculada torra si sa distàntzia dae s\'àndala est prus manna de cussa dislindada \ No newline at end of file From 2c6457f3124343c9f68878aa4abe90b5126bc5c9 Mon Sep 17 00:00:00 2001 From: Franco Date: Tue, 18 Feb 2020 12:18:53 +0000 Subject: [PATCH 13/62] Translated using Weblate (Spanish (Argentina)) Currently translated at 100.0% (3190 of 3190 strings) --- OsmAnd/res/values-es-rAR/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd/res/values-es-rAR/strings.xml b/OsmAnd/res/values-es-rAR/strings.xml index 5e46790866..c2fe15971d 100644 --- a/OsmAnd/res/values-es-rAR/strings.xml +++ b/OsmAnd/res/values-es-rAR/strings.xml @@ -3542,4 +3542,8 @@ Lon %2$s Antártida Muestra la notificación del sistema durante la navegación con instrucciones de navegación. Notificación de navegación + Aplicación predefinida (%s) + Desactivar el recálculo + Distancia mínima para recalcular la ruta + La ruta será recalculada si la distancia a la ruta es mayor que el parámetro especificado \ No newline at end of file From 42b35ebc0f25fad0870e93dd1d5fbff8577f1706 Mon Sep 17 00:00:00 2001 From: Franco Date: Tue, 18 Feb 2020 12:20:10 +0000 Subject: [PATCH 14/62] Translated using Weblate (Spanish (American)) Currently translated at 100.0% (3190 of 3190 strings) --- OsmAnd/res/values-es-rUS/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd/res/values-es-rUS/strings.xml b/OsmAnd/res/values-es-rUS/strings.xml index 533b63d18c..bdc36097cc 100644 --- a/OsmAnd/res/values-es-rUS/strings.xml +++ b/OsmAnd/res/values-es-rUS/strings.xml @@ -3542,4 +3542,8 @@ Lon %2$s Antártida Muestra la notificación del sistema durante la navegación con instrucciones de navegación. Notificación de navegación + Aplicación predefinida (%s) + Desactivar el recálculo + Distancia mínima para recalcular la ruta + La ruta será recalculada si la distancia a la ruta es mayor que el parámetro especificado \ No newline at end of file From 171f3f717f16ad6e486070ce4f3772064ba9f8e3 Mon Sep 17 00:00:00 2001 From: Mirco Zorzo Date: Tue, 18 Feb 2020 10:17:45 +0000 Subject: [PATCH 15/62] Translated using Weblate (Italian) Currently translated at 70.7% (2669 of 3772 strings) --- OsmAnd/res/values-it/phrases.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-it/phrases.xml b/OsmAnd/res/values-it/phrases.xml index 61b5462356..325dbc952e 100644 --- a/OsmAnd/res/values-it/phrases.xml +++ b/OsmAnd/res/values-it/phrases.xml @@ -2710,4 +2710,5 @@ URL Tipo Stato + Reddit \ No newline at end of file From f81118a5b9ef30901a9caca8bfbd979f84ec66dc Mon Sep 17 00:00:00 2001 From: Francesco Traduce Date: Tue, 18 Feb 2020 13:04:15 +0000 Subject: [PATCH 16/62] Translated using Weblate (Italian) Currently translated at 70.7% (2669 of 3772 strings) --- OsmAnd/res/values-it/phrases.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OsmAnd/res/values-it/phrases.xml b/OsmAnd/res/values-it/phrases.xml index 325dbc952e..fed39191fb 100644 --- a/OsmAnd/res/values-it/phrases.xml +++ b/OsmAnd/res/values-it/phrases.xml @@ -2711,4 +2711,7 @@ Tipo Stato Reddit + Rubinetto + Decollo + Atterraggio \ No newline at end of file From e34d27b16903700d1c094910325097aa72e2e9f1 Mon Sep 17 00:00:00 2001 From: vshcherb Date: Tue, 18 Feb 2020 16:18:55 +0100 Subject: [PATCH 17/62] Update strings.xml --- OsmAnd/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 356e2d599e..f6f47417c9 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -13,8 +13,8 @@ --> Angle: %s° Angle - Angle to calculate back-to-route path from current location - Acceptable deviation angle + Extra straight segment between my location and calculated route will be displayed until the route is recalculated + Minimum angle between my location and route Show system notification while navigation with navigation instructions. Navigation notification App Default (%s) From ca3820c08a9283eaf4dbe0ccdefb4818f7af7cf2 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Tue, 18 Feb 2020 17:28:07 +0200 Subject: [PATCH 18/62] Add icon for Recalculation Angle --- .../res/drawable/ic_action_recalc_angle.xml | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 OsmAnd/res/drawable/ic_action_recalc_angle.xml diff --git a/OsmAnd/res/drawable/ic_action_recalc_angle.xml b/OsmAnd/res/drawable/ic_action_recalc_angle.xml new file mode 100644 index 0000000000..18e4df905d --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_recalc_angle.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + From 0ce8705b90b75598923bf2bab105bb57c535c7da Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Tue, 18 Feb 2020 16:34:06 +0100 Subject: [PATCH 19/62] Add directions --- .../src/net/osmand/plus/routing/RouteProvider.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java index 182eb909fc..ba8eaac6d2 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java @@ -79,7 +79,7 @@ public class RouteProvider { private static final org.apache.commons.logging.Log log = PlatformUtil.getLog(RouteProvider.class); private static final String OSMAND_ROUTER = "OsmAndRouter"; private static final int MIN_DISTANCE_FOR_INSERTING_ROUTE_SEGMENT = 60; - private static final int MIN_STRAIGHT_DIST = 50000; + private static final int MIN_STRAIGHT_DIST = 150; public enum RouteService { OSMAND("OsmAnd (offline)"), @@ -1247,23 +1247,31 @@ public class RouteProvider { points.add(params.start); if(params.intermediates != null) { for (LatLon l : params.intermediates) { - points.add(new Location("", l.getLatitude(), l.getLongitude())); + points.add(new Location("pnt", l.getLatitude(), l.getLongitude())); } } points.add(new Location("", params.end.getLatitude(), params.end.getLongitude())); Location lastAdded = points.poll(); segments.add(lastAdded); + float speed = params.mode.getDefaultSpeed(); + List computeDirections = new ArrayList(); while(!points.isEmpty()) { Location pl = points.peek(); if (lastAdded.distanceTo(pl) < MIN_STRAIGHT_DIST) { lastAdded = points.poll(); + if(lastAdded.getProvider().equals("pnt")) { + RouteDirectionInfo previousInfo = new RouteDirectionInfo(speed, TurnType.straight()); + previousInfo.routePointOffset = segments.size(); + previousInfo.setDescriptionRoute(params.ctx.getString(R.string.route_head)); + computeDirections.add(previousInfo); + } segments.add(lastAdded); } else { Location mp = MapUtils.calculateMidPoint(lastAdded, pl); points.add(0, mp); } } - return new RouteCalculationResult(segments, null, params, null, false); + return new RouteCalculationResult(segments, computeDirections, params, null, false); } From f429cd69abc51f4c0ea4c9428699375bdcd09a87 Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Tue, 18 Feb 2020 18:13:27 +0200 Subject: [PATCH 20/62] Save app mode keys for avoid roads --- .../src/net/osmand/plus/OsmandSettings.java | 109 +++++++++++++----- .../plus/activities/MapActivityActions.java | 2 +- .../plus/helpers/AvoidSpecificRoads.java | 36 +++--- .../PointDescriptionMenuController.java | 2 +- 4 files changed, 103 insertions(+), 46 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java index bfeb7f1865..8460556e1d 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java @@ -2629,6 +2629,7 @@ public class OsmandSettings { private static final String IMPASSABLE_ROAD_POINTS = "impassable_road_points"; private static final String IMPASSABLE_ROADS_DESCRIPTIONS = "impassable_roads_descriptions"; private static final String IMPASSABLE_ROADS_IDS = "impassable_roads_ids"; + private static final String IMPASSABLE_ROADS_APP_MODE_KEYS = "impassable_roads_app_mode_keys"; private ImpassableRoadsStorage mImpassableRoadsStorage = new ImpassableRoadsStorage(); public void backupPointToStart() { @@ -2800,17 +2801,50 @@ public class OsmandSettings { private class ImpassableRoadsStorage extends MapPointsStorage { protected String roadsIdsKey; + protected String appModeKey; public ImpassableRoadsStorage() { pointsKey = IMPASSABLE_ROAD_POINTS; descriptionsKey = IMPASSABLE_ROADS_DESCRIPTIONS; roadsIdsKey = IMPASSABLE_ROADS_IDS; + appModeKey = IMPASSABLE_ROADS_APP_MODE_KEYS; + } + + public List getRoadIds(int size) { + List list = new ArrayList<>(); + String roadIds = settingsAPI.getString(globalPreferences, roadsIdsKey, ""); + if (roadIds.trim().length() > 0) { + StringTokenizer tok = new StringTokenizer(roadIds, ","); + while (tok.hasMoreTokens() && list.size() <= size) { + list.add(Long.parseLong(tok.nextToken())); + } + } + while (list.size() < size) { + list.add(0L); + } + return list; + } + + public List getAppModeKeys(int size) { + List list = new ArrayList<>(); + String roadIds = settingsAPI.getString(globalPreferences, appModeKey, ""); + if (roadIds.trim().length() > 0) { + StringTokenizer tok = new StringTokenizer(roadIds, ","); + while (tok.hasMoreTokens() && list.size() <= size) { + list.add(tok.nextToken()); + } + } + while (list.size() < size) { + list.add(""); + } + return list; } public List getImpassableRoadsInfo() { - List points = mImpassableRoadsStorage.getPoints(); - List descriptions = mImpassableRoadsStorage.getPointDescriptions(points.size()); + List points = getPoints(); List roadIds = getRoadIds(points.size()); + List appModeKeys = getAppModeKeys(points.size()); + List descriptions = getPointDescriptions(points.size()); List avoidRoadsInfo = new ArrayList<>(); @@ -2823,6 +2857,7 @@ public class OsmandSettings { avoidRoadInfo.latitude = latLon.getLatitude(); avoidRoadInfo.longitude = latLon.getLongitude(); avoidRoadInfo.name = description.getName(); + avoidRoadInfo.appModeKey = appModeKeys.get(i); avoidRoadsInfo.add(avoidRoadInfo); } @@ -2831,57 +2866,48 @@ public class OsmandSettings { public boolean addImpassableRoadInfo(AvoidRoadInfo avoidRoadInfo) { List points = getPoints(); - List descriptions = getPointDescriptions(points.size()); List roadIds = getRoadIds(points.size()); + List appModeKeys = getAppModeKeys(points.size()); + List descriptions = getPointDescriptions(points.size()); - points.add(0, new LatLon(avoidRoadInfo.latitude, avoidRoadInfo.longitude)); - descriptions.add(0, PointDescription.serializeToString(new PointDescription("", avoidRoadInfo.name))); roadIds.add(0, avoidRoadInfo.id); + points.add(0, new LatLon(avoidRoadInfo.latitude, avoidRoadInfo.longitude)); + appModeKeys.add(0, avoidRoadInfo.appModeKey); + descriptions.add(0, PointDescription.serializeToString(new PointDescription("", avoidRoadInfo.name))); - return savePoints(points, descriptions) && saveRoadIds(roadIds); + return saveAvoidRoadData(points, descriptions, roadIds, appModeKeys); } public boolean updateImpassableRoadInfo(AvoidRoadInfo avoidRoadInfo) { List points = getPoints(); - List roadIds = getRoadIds(points.size()); - List descriptions = getPointDescriptions(points.size()); int index = points.indexOf(new LatLon(avoidRoadInfo.latitude, avoidRoadInfo.longitude)); if (index != -1) { + List roadIds = getRoadIds(points.size()); + List appModeKeys = getAppModeKeys(points.size()); + List descriptions = getPointDescriptions(points.size()); + roadIds.set(index, avoidRoadInfo.id); + appModeKeys.set(index, avoidRoadInfo.appModeKey); descriptions.set(index, PointDescription.serializeToString(new PointDescription("", avoidRoadInfo.name))); - return savePoints(points, descriptions) && saveRoadIds(roadIds); + return saveAvoidRoadData(points, descriptions, roadIds, appModeKeys); } return false; } - public List getRoadIds(int size) { - List list = new ArrayList<>(); - String roadIds = settingsAPI.getString(globalPreferences, roadsIdsKey, ""); - if (roadIds.trim().length() > 0) { - StringTokenizer tok = new StringTokenizer(roadIds, ","); - while (tok.hasMoreTokens() && list.size() <= size) { - String token = tok.nextToken(); - list.add(Long.parseLong(token)); - } - } - while (list.size() < size) { - list.add(0L); - } - return list; - } - @Override public boolean deletePoint(int index) { List points = getPoints(); List roadIds = getRoadIds(points.size()); + List appModeKeys = getAppModeKeys(points.size()); List descriptions = getPointDescriptions(points.size()); if (index < points.size()) { points.remove(index); roadIds.remove(index); + appModeKeys.remove(index); descriptions.remove(index); - return savePoints(points, descriptions) && saveRoadIds(roadIds); + return saveAvoidRoadData(points, descriptions, roadIds, appModeKeys); } return false; } @@ -2889,14 +2915,17 @@ public class OsmandSettings { @Override public boolean deletePoint(LatLon latLon) { List points = getPoints(); - List descriptions = getPointDescriptions(points.size()); List roadIds = getRoadIds(points.size()); + List appModeKeys = getAppModeKeys(points.size()); + List descriptions = getPointDescriptions(points.size()); + int index = points.indexOf(latLon); if (index != -1) { points.remove(index); roadIds.remove(index); + appModeKeys.remove(index); descriptions.remove(index); - return savePoints(points, descriptions) && saveRoadIds(roadIds); + return saveAvoidRoadData(points, descriptions, roadIds, appModeKeys); } return false; } @@ -2904,18 +2933,24 @@ public class OsmandSettings { @Override public boolean movePoint(LatLon latLonEx, LatLon latLonNew) { List points = getPoints(); - List descriptions = getPointDescriptions(points.size()); List roadIds = getRoadIds(points.size()); + List appModeKeys = getAppModeKeys(points.size()); + List descriptions = getPointDescriptions(points.size()); int i = points.indexOf(latLonEx); if (i != -1) { points.set(i, latLonNew); - return savePoints(points, descriptions) && saveRoadIds(roadIds); + return saveAvoidRoadData(points, descriptions, roadIds, appModeKeys); } else { return false; } } + public boolean saveAvoidRoadData(List points, List descriptions, + List roadIds, List appModeKeys) { + return savePoints(points, descriptions) && saveRoadIds(roadIds) && saveAppModeKeys(appModeKeys); + } + public boolean saveRoadIds(List roadIds) { StringBuilder stringBuilder = new StringBuilder(); Iterator iterator = roadIds.iterator(); @@ -2929,6 +2964,20 @@ public class OsmandSettings { .putString(roadsIdsKey, stringBuilder.toString()) .commit(); } + + public boolean saveAppModeKeys(List appModeKeys) { + StringBuilder stringBuilder = new StringBuilder(); + Iterator iterator = appModeKeys.iterator(); + while (iterator.hasNext()) { + stringBuilder.append(iterator.next()); + if (iterator.hasNext()) { + stringBuilder.append(","); + } + } + return settingsAPI.edit(globalPreferences) + .putString(appModeKey, stringBuilder.toString()) + .commit(); + } } private abstract class MapPointsStorage { diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java index 057f214a87..7338700698 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java @@ -426,7 +426,7 @@ public class MapActivityActions implements DialogProvider { mapActivity.getContextMenu().close(); MeasurementToolFragment.showInstance(mapActivity.getSupportFragmentManager(), new LatLon(latitude, longitude)); } else if (standardId == R.string.avoid_road) { - getMyApplication().getAvoidSpecificRoads().addImpassableRoad(mapActivity, new LatLon(latitude, longitude), true, false); + getMyApplication().getAvoidSpecificRoads().addImpassableRoad(mapActivity, new LatLon(latitude, longitude), true, false, null); } } }); diff --git a/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java b/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java index 965de9fe08..382de8112d 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java +++ b/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java @@ -65,11 +65,12 @@ public class AvoidSpecificRoads { public void initRouteObjects(boolean force) { for (Map.Entry entry : impassableRoads.entrySet()) { - if (force || entry.getValue().id == 0) { - addImpassableRoad(null, entry.getKey(), false, true); + AvoidRoadInfo roadInfo = entry.getValue(); + if (force || roadInfo.id == 0) { + addImpassableRoad(null, entry.getKey(), false, true, roadInfo.appModeKey); } else { for (RoutingConfiguration.Builder builder : app.getAllRoutingConfigs()) { - builder.addImpassableRoad(entry.getValue().id); + builder.addImpassableRoad(roadInfo.id); } } } @@ -209,20 +210,23 @@ public class AvoidSpecificRoads { cm.setSelectOnMap(new CallbackWithObject() { @Override public boolean processResult(LatLon result) { - addImpassableRoad(mapActivity, result, true, false); + addImpassableRoad(mapActivity, result, true, false, null); return true; } }); } public void addImpassableRoad(@Nullable final MapActivity mapActivity, - @NonNull final LatLon loc, - final boolean showDialog, - final boolean skipWritingSettings) { + @NonNull final LatLon loc, + final boolean showDialog, + final boolean skipWritingSettings, + @Nullable final String appModeKey) { final Location ll = new Location(""); ll.setLatitude(loc.getLatitude()); ll.setLongitude(loc.getLongitude()); - ApplicationMode appMode = app.getRoutingHelper().getAppMode(); + + ApplicationMode defaultAppMode = app.getRoutingHelper().getAppMode(); + final ApplicationMode appMode = ApplicationMode.valueOfStringKey(appModeKey, defaultAppMode); List roads = app.getRoutingHelper().getRoute().getOriginalRoute(); if (mapActivity != null && roads != null) { @@ -237,7 +241,7 @@ public class AvoidSpecificRoads { ll.setLongitude(newLoc.getLongitude()); RouteDataObject object = roads.get(searchResult.getRoadIndex()).getObject(); - AvoidRoadInfo avoidRoadInfo = getAvoidRoadInfoForDataObject(object, newLoc.getLatitude(), newLoc.getLongitude()); + AvoidRoadInfo avoidRoadInfo = getAvoidRoadInfoForDataObject(object, newLoc.getLatitude(), newLoc.getLongitude(), appMode.getStringKey()); addImpassableRoadInternal(avoidRoadInfo, showDialog, mapActivity, newLoc); if (!skipWritingSettings) { app.getSettings().addImpassableRoad(avoidRoadInfo); @@ -254,7 +258,7 @@ public class AvoidSpecificRoads { Toast.makeText(mapActivity, R.string.error_avoid_specific_road, Toast.LENGTH_LONG).show(); } } else { - AvoidRoadInfo avoidRoadInfo = getAvoidRoadInfoForDataObject(object, ll.getLatitude(), ll.getLongitude()); + AvoidRoadInfo avoidRoadInfo = getAvoidRoadInfoForDataObject(object, ll.getLatitude(), ll.getLongitude(), appMode.getStringKey()); addImpassableRoadInternal(avoidRoadInfo, showDialog, mapActivity, loc); } return true; @@ -267,7 +271,7 @@ public class AvoidSpecificRoads { }); if (!skipWritingSettings) { - AvoidRoadInfo avoidRoadInfo = getAvoidRoadInfoForDataObject(null, loc.getLatitude(), loc.getLongitude()); + AvoidRoadInfo avoidRoadInfo = getAvoidRoadInfoForDataObject(null, loc.getLatitude(), loc.getLongitude(), appMode.getStringKey()); app.getSettings().addImpassableRoad(avoidRoadInfo); } } @@ -280,7 +284,9 @@ public class AvoidSpecificRoads { final Location ll = new Location(""); ll.setLatitude(newLoc.getLatitude()); ll.setLongitude(newLoc.getLongitude()); - ApplicationMode appMode = app.getRoutingHelper().getAppMode(); + + ApplicationMode defaultAppMode = app.getRoutingHelper().getAppMode(); + final ApplicationMode appMode = ApplicationMode.valueOfStringKey(currentObject.appModeKey, defaultAppMode); app.getLocationProvider().getRouteSegment(ll, appMode, false, new ResultMatcher() { @@ -298,7 +304,7 @@ public class AvoidSpecificRoads { for (RoutingConfiguration.Builder builder : app.getAllRoutingConfigs()) { builder.removeImpassableRoad(currentObject.id); } - AvoidRoadInfo avoidRoadInfo = getAvoidRoadInfoForDataObject(object, newLoc.getLatitude(), newLoc.getLongitude()); + AvoidRoadInfo avoidRoadInfo = getAvoidRoadInfoForDataObject(object, newLoc.getLatitude(), newLoc.getLongitude(), appMode.getStringKey()); addImpassableRoadInternal(avoidRoadInfo, showDialog, activity, newLoc); if (callback != null) { @@ -368,7 +374,7 @@ public class AvoidSpecificRoads { boolean isCancelled(); } - private AvoidRoadInfo getAvoidRoadInfoForDataObject(@Nullable RouteDataObject object, double lat, double lon) { + private AvoidRoadInfo getAvoidRoadInfoForDataObject(@Nullable RouteDataObject object, double lat, double lon, String appModeKey) { AvoidRoadInfo avoidRoadInfo = impassableRoads.get(new LatLon(lat, lon)); if (avoidRoadInfo == null) { avoidRoadInfo = new AvoidRoadInfo(); @@ -376,6 +382,7 @@ public class AvoidSpecificRoads { avoidRoadInfo.id = object != null ? object.id : 0; avoidRoadInfo.latitude = lat; avoidRoadInfo.longitude = lon; + avoidRoadInfo.appModeKey = appModeKey; avoidRoadInfo.name = getRoadName(object); return avoidRoadInfo; } @@ -385,5 +392,6 @@ public class AvoidSpecificRoads { public double latitude; public double longitude; public String name; + public String appModeKey; } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/PointDescriptionMenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/PointDescriptionMenuController.java index 1db5444bc4..c810aa2ce8 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/PointDescriptionMenuController.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/PointDescriptionMenuController.java @@ -33,7 +33,7 @@ public class PointDescriptionMenuController extends MenuController { MapActivity activity = getMapActivity(); if (activity != null) { AvoidSpecificRoads roads = activity.getMyApplication().getAvoidSpecificRoads(); - roads.addImpassableRoad(activity, getLatLon(), false, false); + roads.addImpassableRoad(activity, getLatLon(), false, false, null); } } }; From 4b5f338fca575f43e8bf4d6dfbddde1bbd8cad93 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Tue, 18 Feb 2020 17:16:31 +0100 Subject: [PATCH 21/62] Fix left distance widget --- .../plus/routing/RouteCalculationResult.java | 26 +++++++++---------- .../osmand/plus/routing/RouteProvider.java | 7 +++-- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java index 94a56369d3..b133d185aa 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java @@ -1037,10 +1037,7 @@ public class RouteCalculationResult { nextInd++; } } - int dist = getListDistance(currentRoute); - if (fromLoc != null) { - dist += fromLoc.distanceTo(locations.get(currentRoute)); - } + int dist = getDistanceToFinish(fromLoc); if (nextInd < directions.size()) { info.directionInfo = directions.get(nextInd); if (directions.get(nextInd).routePointOffset <= currentRoute @@ -1162,10 +1159,15 @@ public class RouteCalculationResult { } public int getDistanceToFinish(Location fromLoc) { - if(listDistance != null && currentRoute < listDistance.length){ - int dist = listDistance[currentRoute]; - Location l = locations.get(currentRoute); - if(fromLoc != null){ + Location ap = this.currentStraightAnglePoint; + int rp = currentStraightAngleRoute > currentRoute ? currentStraightAngleRoute : currentRoute; + if(listDistance != null && rp < listDistance.length){ + int dist = listDistance[rp]; + Location l = locations.get(rp); + if(ap != null){ + dist += fromLoc.distanceTo(ap); + dist += ap.distanceTo(l); + } else { dist += fromLoc.distanceTo(l); } return dist; @@ -1174,12 +1176,8 @@ public class RouteCalculationResult { } public int getDistanceToNextIntermediate(Location fromLoc) { + int dist = getDistanceToFinish(fromLoc); if(listDistance != null && currentRoute < listDistance.length){ - int dist = listDistance[currentRoute]; - Location l = locations.get(currentRoute); - if(fromLoc != null){ - dist += fromLoc.distanceTo(l); - } if(nextIntermediate >= intermediatePoints.length ){ return 0; } else { @@ -1245,8 +1243,8 @@ public class RouteCalculationResult { } public void updateNextVisiblePoint(int nextPoint, Location mp) { - currentStraightAngleRoute = nextPoint; currentStraightAnglePoint = mp; + currentStraightAngleRoute = nextPoint; } public static class NextDirectionInfo { diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java index 43cd6907f6..45b15fdab1 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java @@ -78,7 +78,7 @@ public class RouteProvider { private static final org.apache.commons.logging.Log log = PlatformUtil.getLog(RouteProvider.class); private static final String OSMAND_ROUTER = "OsmAndRouter"; private static final int MIN_DISTANCE_FOR_INSERTING_ROUTE_SEGMENT = 60; - private static final int MIN_STRAIGHT_DIST = 150; + private static final int MIN_STRAIGHT_DIST = 50000; public enum RouteService { OSMAND("OsmAnd (offline)"), @@ -1249,13 +1249,12 @@ public class RouteProvider { } } points.add(new Location("", params.end.getLatitude(), params.end.getLongitude())); - Location lastAdded = points.poll(); - segments.add(lastAdded); + Location lastAdded = null; float speed = params.mode.getDefaultSpeed(); List computeDirections = new ArrayList(); while(!points.isEmpty()) { Location pl = points.peek(); - if (lastAdded.distanceTo(pl) < MIN_STRAIGHT_DIST) { + if (lastAdded == null || lastAdded.distanceTo(pl) < MIN_STRAIGHT_DIST) { lastAdded = points.poll(); if(lastAdded.getProvider().equals("pnt")) { RouteDirectionInfo previousInfo = new RouteDirectionInfo(speed, TurnType.straight()); From 7de0a92ca6479b53a1ad45a61e353bfb42ff3fe1 Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Tue, 18 Feb 2020 18:56:24 +0200 Subject: [PATCH 22/62] Recalculate avoid roads after maps downloaded --- .../osmand/plus/download/DownloadIndexesThread.java | 1 + .../net/osmand/plus/helpers/AvoidSpecificRoads.java | 13 +++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java b/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java index 18f06cc21e..98cc159720 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java @@ -118,6 +118,7 @@ public class DownloadIndexesThread { if (app.getDownloadService() != null) { app.getDownloadService().stopService(app); } + app.getAvoidSpecificRoads().initRouteObjects(true); } public void initSettingsFirstMap(WorldRegion reg) { diff --git a/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java b/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java index 382de8112d..c8891d3347 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java +++ b/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java @@ -66,12 +66,17 @@ public class AvoidSpecificRoads { public void initRouteObjects(boolean force) { for (Map.Entry entry : impassableRoads.entrySet()) { AvoidRoadInfo roadInfo = entry.getValue(); + if (roadInfo.id != 0) { + for (RoutingConfiguration.Builder builder : app.getAllRoutingConfigs()) { + if (force) { + builder.removeImpassableRoad(roadInfo.id); + } else { + builder.addImpassableRoad(roadInfo.id); + } + } + } if (force || roadInfo.id == 0) { addImpassableRoad(null, entry.getKey(), false, true, roadInfo.appModeKey); - } else { - for (RoutingConfiguration.Builder builder : app.getAllRoutingConfigs()) { - builder.addImpassableRoad(roadInfo.id); - } } } } From 762f2840f3a2a8a934a9808e7b0bb2be266ea014 Mon Sep 17 00:00:00 2001 From: MadWasp79 Date: Tue, 18 Feb 2020 18:59:17 +0200 Subject: [PATCH 23/62] fix direct to --- .../src/main/java/net/osmand/util/MapUtils.java | 5 +++++ .../src/net/osmand/plus/views/RouteLayer.java | 17 +++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java b/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java index b1c4c54566..aa206ae2fb 100644 --- a/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java +++ b/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java @@ -49,6 +49,11 @@ public class MapUtils { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '_', '~' }; + + + public static double getDistance(Location l1, Location l2) { + return getDistance(l1.getLatitude(), l1.getLongitude(), l2.getLatitude(), l2.getLongitude()); + } public static double getDistance(LatLon l, double latitude, double longitude) { return getDistance(l.getLatitude(), l.getLongitude(), latitude, longitude); } diff --git a/OsmAnd/src/net/osmand/plus/views/RouteLayer.java b/OsmAnd/src/net/osmand/plus/views/RouteLayer.java index 91af884301..f45625b466 100644 --- a/OsmAnd/src/net/osmand/plus/views/RouteLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/RouteLayer.java @@ -35,6 +35,7 @@ import net.osmand.plus.R; import net.osmand.plus.UiUtilities; import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu; import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu.TrackChartPoints; +import net.osmand.plus.profiles.LocationIcon; import net.osmand.plus.render.RenderingIcons; import net.osmand.plus.routing.RouteCalculationResult; import net.osmand.plus.routing.RouteDirectionInfo; @@ -319,7 +320,8 @@ public class RouteLayer extends OsmandMapLayer implements ContextMenuLayer.ICont private void drawProjectionPoint(Canvas canvas, double[] projectionXY) { if (projectionIcon == null) { - projectionIcon = (LayerDrawable) view.getResources().getDrawable(helper.getSettings().getApplicationMode().getLocationIcon().DEFAULT.getIconId()); + helper.getSettings().getApplicationMode().getLocationIcon(); + projectionIcon = (LayerDrawable) view.getResources().getDrawable(LocationIcon.DEFAULT.getIconId()); } int locationX = (int) projectionXY[0]; int locationY = (int) projectionXY[1]; @@ -1148,33 +1150,32 @@ public class RouteLayer extends OsmandMapLayer implements ContextMenuLayer.ICont private double[] calculateProjectionOnRoutePoint(List routeNodes, RoutingHelper helper, RotatedTileBox box) { double[] projectionXY; boolean visible; - Location previousInRoute = null; Location nextInRoute = null; - //need to change this code by fixing helper.route.getCurrentRoute() miscalculation // TODO simplifiy all culation! + Location ll = helper.getLastFixedLocation(); + Location previousInRoute = routeNodes.get(helper.getRoute().getCurrentRoute() > 0 ? helper.getRoute().getCurrentRoute() - 1 : 0); if (helper.getRoute().getIntermediatePointsToPass() > 0) { for (int i = 1; i < routeNodes.size(); i++) { LatLon routePoint = new LatLon(routeNodes.get(i).getLatitude(), routeNodes.get(i).getLongitude()); if (routePoint.equals(helper.getIntermediatePoints().get(0))) { - previousInRoute = routeNodes.get(i - 1); nextInRoute = routeNodes.get(i); } } } else { - previousInRoute = routeNodes.get(routeNodes.size() - 2); - nextInRoute = routeNodes.get(routeNodes.size() - 1); + nextInRoute = routeNodes.get(routeNodes.size()-1); } if (nextInRoute != null && previousInRoute != null) { - final Location ll = view.getApplication().getLocationProvider().getLastKnownLocation(); +// double Ri = MapUtils.getDistance(nextInRoute, ll); +// + final int aX = box.getPixXFromLonNoRot(ll.getLongitude()); final int aY = box.getPixYFromLatNoRot(ll.getLatitude()); final int centerX = box.getPixXFromLonNoRot(nextInRoute.getLongitude()); final int centerY = box.getPixYFromLatNoRot(nextInRoute.getLatitude()); final int bX = box.getPixXFromLonNoRot(previousInRoute.getLongitude()); final int bY = box.getPixYFromLatNoRot(previousInRoute.getLatitude()); - double radius = MapUtils.getVectorMagnitude(centerX, centerY, aX, aY); double angle2 = MapUtils.getAngleForRadiusVector(centerX, centerY, bX, bY); projectionXY = MapUtils.getCoordinatesFromRadiusAndAngle(centerX, centerY, radius, angle2); From a799412316e293eb94686d969fffbeb0aa1d9d74 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Tue, 18 Feb 2020 18:00:21 +0100 Subject: [PATCH 24/62] Fix left distance widget --- OsmAnd/src/net/osmand/plus/routing/RouteProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java index 45b15fdab1..fa17d2e473 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java @@ -1242,7 +1242,7 @@ public class RouteProvider { private RouteCalculationResult findStraightRoute(RouteCalculationParams params) { LinkedList points = new LinkedList<>(); List segments = new ArrayList<>(); - points.add(params.start); + points.add(new Location("pnt", params.start.getLatitude(), params.start.getLongitude())); if(params.intermediates != null) { for (LatLon l : params.intermediates) { points.add(new Location("pnt", l.getLatitude(), l.getLongitude())); From 74fe3d7cc957eda42757e3d502d53712e73667ab Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Tue, 18 Feb 2020 18:03:37 +0100 Subject: [PATCH 25/62] Remove unused --- OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java b/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java index aa206ae2fb..0db0c52635 100644 --- a/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java +++ b/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java @@ -51,9 +51,6 @@ public class MapUtils { - public static double getDistance(Location l1, Location l2) { - return getDistance(l1.getLatitude(), l1.getLongitude(), l2.getLatitude(), l2.getLongitude()); - } public static double getDistance(LatLon l, double latitude, double longitude) { return getDistance(l.getLatitude(), l.getLongitude(), latitude, longitude); } From 6ef557125bb42266c2a718bb874d57c170d48717 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Tue, 18 Feb 2020 18:27:53 +0100 Subject: [PATCH 26/62] Temporary fix Fix #7763 --- OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java b/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java index a5b0653c5b..8c0ff7129d 100644 --- a/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java +++ b/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java @@ -203,7 +203,7 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement public void onPause() { super.onPause(); updateEnable = false; - if (operationTask != null) { + if (operationTask != null && !(operationTask instanceof SelectGpxTask)) { operationTask.cancel(true); } if (actionMode != null) { From f2e911a8a04201d0a8d5dbfc94cce80a94c4cb83 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Tue, 18 Feb 2020 19:05:35 +0100 Subject: [PATCH 27/62] Fix straight to visualization --- .../main/java/net/osmand/util/MapUtils.java | 33 +-------- .../plus/routing/RouteCalculationResult.java | 7 ++ .../src/net/osmand/plus/views/RouteLayer.java | 68 +++++++++---------- 3 files changed, 42 insertions(+), 66 deletions(-) diff --git a/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java b/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java index 0db0c52635..d4731dcd8d 100644 --- a/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java +++ b/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java @@ -697,39 +697,10 @@ public class MapUtils { return new LatLon(Math.toDegrees(phi2), Math.toDegrees(lambda2)); } - public static double getVectorMagnitude(int startX, int startY, int endX, int endY) { - return Math.sqrt(Math.pow((double) (endX - startX), 2.0) + Math.pow((double) (endY - startY), 2.0)); + public static double getSqrtDistance(int startX, int startY, int endX, int endY) { + return Math.sqrt((endX - startX) * (endX - startX) + (endY - startY) * (endY - startY)); } - //angle of vector - public static double getAngleForRadiusVector(int startX, int startY, int endX, int endY) { - return 2 * Math.atan((endY - startY) / (endX - startX - + Math.sqrt(Math.pow((double) (endX - startX), 2.0) + Math.pow((double) (endY - startY), 2.0)))); - } - - //returns coordinates of point on circle - public static double[] getCoordinatesFromRadiusAndAngle(double centerX, double centerY, double radius, double angle) { - double x = centerX + radius * Math.cos(angle); - double y = centerY + radius * Math.sin(angle); - return new double[]{x,y}; - } - - //returns signed angle between vectors in radians - public static double getAngleBetweenVectors(int vectorAStartX, int vectorAStartY, int vectorAEndX, int vectorAEndY, - int vectorBStartX, int vectorBStartY, int vectorBEndX, int vectorBEndY) { - int[] vectorA = new int[] {getVectorAxisValue(vectorAStartX, vectorAEndX), getVectorAxisValue(vectorAStartY, vectorAEndY)}; - int[] vectorB = new int[] {getVectorAxisValue(vectorBStartX, vectorBEndX), getVectorAxisValue(vectorBStartY, vectorBEndY)}; - return Math.atan2(vectorA[0] * vectorB[1] - vectorA[1] * vectorB [0], vectorA[0] * vectorB[0] + vectorA[1] * vectorB[1]); - } - - //calculates vector value for axis - public static int getVectorAxisValue(int axisStart, int axisEnd) { - if (axisEnd < axisStart) { - return Math.abs(axisEnd) - Math.abs(axisStart); - } else { - return Math.abs(axisStart) - Math.abs(axisEnd); - } - } } diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java index b133d185aa..38d03884a4 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java @@ -1153,6 +1153,13 @@ public class RouteCalculationResult { } return 0; } + + public int getDistanceFromPoint(int locationIndex) { + if(listDistance != null && locationIndex < listDistance.length { + return listDistance[locationIndex]; + } + return 0; + } public boolean isPointPassed(int locationIndex) { return locationIndex <= currentRoute; diff --git a/OsmAnd/src/net/osmand/plus/views/RouteLayer.java b/OsmAnd/src/net/osmand/plus/views/RouteLayer.java index f45625b466..c97d8bd28b 100644 --- a/OsmAnd/src/net/osmand/plus/views/RouteLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/RouteLayer.java @@ -1148,44 +1148,42 @@ public class RouteLayer extends OsmandMapLayer implements ContextMenuLayer.ICont } private double[] calculateProjectionOnRoutePoint(List routeNodes, RoutingHelper helper, RotatedTileBox box) { - double[] projectionXY; - boolean visible; - Location nextInRoute = null; - // TODO simplifiy all culation! + double[] projectionXY = null; Location ll = helper.getLastFixedLocation(); - Location previousInRoute = routeNodes.get(helper.getRoute().getCurrentRoute() > 0 ? helper.getRoute().getCurrentRoute() - 1 : 0); - if (helper.getRoute().getIntermediatePointsToPass() > 0) { - for (int i = 1; i < routeNodes.size(); i++) { - LatLon routePoint = new LatLon(routeNodes.get(i).getLatitude(), routeNodes.get(i).getLongitude()); - if (routePoint.equals(helper.getIntermediatePoints().get(0))) { - nextInRoute = routeNodes.get(i); - } - } - } else { - nextInRoute = routeNodes.get(routeNodes.size()-1); + RouteCalculationResult route = helper.getRoute(); + List locs = route.getImmutableAllLocations(); + int cr = route.getCurrentRoute(); + if(cr == 0) { + cr = 1; } + int locIndex = locs.size() - 1; + if(route.getIntermediatePointsToPass() > 0) { + locIndex = route.getIndexOfIntermediate(route.getIntermediatePointsToPass() - 1); + } + if(ll != null && cr < locs.size() && locIndex >= 0 && locIndex < locs.size()) { + Location loc1 = locs.get(cr - 1); + Location loc2 = locs.get(cr); + double distDelta = route.getDistanceFromPoint(locIndex); + double baDist = route.getDistanceFromPoint(cr) - route.getDistanceFromPoint(cr - 1); + Location target = locs.get(locIndex); + double dTarget = ll.distanceTo(target); + final int aX = box.getPixXFromLonNoRot(loc1.getLongitude()); + final int aY = box.getPixYFromLatNoRot(loc1.getLatitude()); + final int bX = box.getPixXFromLonNoRot(loc2.getLongitude()); + final int bY = box.getPixYFromLatNoRot(loc2.getLatitude()); + if(baDist != 0) { + double CF = dTarget - distDelta / baDist; + double rX = bX - CF * (bX - aX); + double rY = bY - CF * (bY - aY); + projectionXY = new double[] {rX, rY}; + } + } + if(projectionXY != null) { - if (nextInRoute != null && previousInRoute != null) { - -// double Ri = MapUtils.getDistance(nextInRoute, ll); -// - - final int aX = box.getPixXFromLonNoRot(ll.getLongitude()); - final int aY = box.getPixYFromLatNoRot(ll.getLatitude()); - final int centerX = box.getPixXFromLonNoRot(nextInRoute.getLongitude()); - final int centerY = box.getPixYFromLatNoRot(nextInRoute.getLatitude()); - final int bX = box.getPixXFromLonNoRot(previousInRoute.getLongitude()); - final int bY = box.getPixYFromLatNoRot(previousInRoute.getLatitude()); - double radius = MapUtils.getVectorMagnitude(centerX, centerY, aX, aY); - double angle2 = MapUtils.getAngleForRadiusVector(centerX, centerY, bX, bY); - projectionXY = MapUtils.getCoordinatesFromRadiusAndAngle(centerX, centerY, radius, angle2); - double distanceLoc2Proj = MapUtils.getVectorMagnitude(aX, aY, (int)projectionXY[0], (int)projectionXY[1]); - boolean isProjectionOnSegment = MapUtils.getVectorMagnitude(centerX ,centerY, (int) projectionXY[0], (int) projectionXY[1]) - < MapUtils.getVectorMagnitude(centerX, centerY, bX, bY); - visible = box.containsPoint((float)projectionXY[0], (float)projectionXY[1], 20.0f) - && Math.abs(Math.toDegrees(MapUtils.getAngleBetweenVectors(centerX, centerY, aX, aY, centerX, centerY, bX, bY))) < 90 - && distanceLoc2Proj > AndroidUtils.dpToPx(view.getContext(), 52) / 2.0 - && isProjectionOnSegment; + double distanceLoc2Proj = MapUtils.getSqrtDistance((int)projectionXY[0], (int) projectionXY[1], + box.getPixXFromLonNoRot(ll.getLongitude()), box.getPixYFromLatNoRot(ll.getLatitude())); + boolean visible = box.containsPoint((float) projectionXY[0], (float) projectionXY[1], 20.0f) + && distanceLoc2Proj > AndroidUtils.dpToPx(view.getContext(), 52) / 2.0; if (visible) { return projectionXY; } From 9b5eb90b3b6b8f3de2efdadcfef3e075592d81cd Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Tue, 18 Feb 2020 19:15:02 +0100 Subject: [PATCH 28/62] Fix straight to visualization --- OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java index 38d03884a4..7b2569b2ae 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java @@ -1155,7 +1155,7 @@ public class RouteCalculationResult { } public int getDistanceFromPoint(int locationIndex) { - if(listDistance != null && locationIndex < listDistance.length { + if(listDistance != null && locationIndex < listDistance.length) { return listDistance[locationIndex]; } return 0; From f3528ce89b9a3b200c8ceb83377c3420b67ab8c7 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Tue, 18 Feb 2020 19:25:05 +0100 Subject: [PATCH 29/62] Fix straight to visualization --- OsmAnd/src/net/osmand/plus/views/RouteLayer.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/views/RouteLayer.java b/OsmAnd/src/net/osmand/plus/views/RouteLayer.java index c97d8bd28b..3996cbde5c 100644 --- a/OsmAnd/src/net/osmand/plus/views/RouteLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/RouteLayer.java @@ -1153,18 +1153,15 @@ public class RouteLayer extends OsmandMapLayer implements ContextMenuLayer.ICont RouteCalculationResult route = helper.getRoute(); List locs = route.getImmutableAllLocations(); int cr = route.getCurrentRoute(); - if(cr == 0) { - cr = 1; - } int locIndex = locs.size() - 1; if(route.getIntermediatePointsToPass() > 0) { locIndex = route.getIndexOfIntermediate(route.getIntermediatePointsToPass() - 1); } - if(ll != null && cr < locs.size() && locIndex >= 0 && locIndex < locs.size()) { + if(ll != null && cr > 0 && cr < locs.size() && locIndex >= 0 && locIndex < locs.size()) { Location loc1 = locs.get(cr - 1); Location loc2 = locs.get(cr); - double distDelta = route.getDistanceFromPoint(locIndex); - double baDist = route.getDistanceFromPoint(cr) - route.getDistanceFromPoint(cr - 1); + double distLeft = route.getDistanceFromPoint(cr) - route.getDistanceFromPoint(locIndex); + double baDist = route.getDistanceFromPoint(cr - 1) - route.getDistanceFromPoint(cr); Location target = locs.get(locIndex); double dTarget = ll.distanceTo(target); final int aX = box.getPixXFromLonNoRot(loc1.getLongitude()); @@ -1172,7 +1169,7 @@ public class RouteLayer extends OsmandMapLayer implements ContextMenuLayer.ICont final int bX = box.getPixXFromLonNoRot(loc2.getLongitude()); final int bY = box.getPixYFromLatNoRot(loc2.getLatitude()); if(baDist != 0) { - double CF = dTarget - distDelta / baDist; + double CF = (dTarget - distLeft) / baDist; double rX = bX - CF * (bX - aX); double rY = bY - CF * (bY - aY); projectionXY = new double[] {rX, rY}; From 1b9fbc5792266535efb5b92f86c1ac430bf8252d Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Wed, 19 Feb 2020 12:47:59 +0200 Subject: [PATCH 30/62] Add check for possible npe --- OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java b/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java index c8891d3347..e6c7ab9853 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java +++ b/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java @@ -232,7 +232,9 @@ public class AvoidSpecificRoads { ApplicationMode defaultAppMode = app.getRoutingHelper().getAppMode(); final ApplicationMode appMode = ApplicationMode.valueOfStringKey(appModeKey, defaultAppMode); - + if (appMode == null) { + return; + } List roads = app.getRoutingHelper().getRoute().getOriginalRoute(); if (mapActivity != null && roads != null) { RotatedTileBox tb = mapActivity.getMapView().getCurrentRotatedTileBox().copy(); From a0342f95482f7902229e03ddfc0fa7349b58c029 Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Wed, 19 Feb 2020 12:53:00 +0200 Subject: [PATCH 31/62] Add check for appModeKey --- OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java b/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java index e6c7ab9853..d724e0f9ce 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java +++ b/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java @@ -231,10 +231,8 @@ public class AvoidSpecificRoads { ll.setLongitude(loc.getLongitude()); ApplicationMode defaultAppMode = app.getRoutingHelper().getAppMode(); - final ApplicationMode appMode = ApplicationMode.valueOfStringKey(appModeKey, defaultAppMode); - if (appMode == null) { - return; - } + final ApplicationMode appMode = appModeKey != null ? ApplicationMode.valueOfStringKey(appModeKey, defaultAppMode) : defaultAppMode; + List roads = app.getRoutingHelper().getRoute().getOriginalRoute(); if (mapActivity != null && roads != null) { RotatedTileBox tb = mapActivity.getMapView().getCurrentRotatedTileBox().copy(); From 2744ca8927743a57146dd3083dc7bba8338eb60b Mon Sep 17 00:00:00 2001 From: Nazar Date: Wed, 19 Feb 2020 13:20:46 +0200 Subject: [PATCH 32/62] Fix text color / Colors refactoring --- ...heet_item_in_frame_with_descr_and_icon.xml | 1 + .../res/layout/download_build_list_item.xml | 2 ++ .../fragment_data_storage_place_dialog.xml | 1 + OsmAnd/res/layout/map_marker_item.xml | 4 +-- OsmAnd/res/layout/map_marker_item_header.xml | 2 ++ OsmAnd/src/net/osmand/AndroidUtils.java | 13 ------- OsmAnd/src/net/osmand/plus/UiUtilities.java | 35 +++++++++++++++++++ .../CoordinateInputDialogFragment.java | 5 +-- .../mapmarkers/MapMarkersDialogFragment.java | 5 +-- .../mapmarkers/MapMarkersGroupsFragment.java | 2 +- .../mapmarkers/MapMarkersHistoryFragment.java | 3 +- ...ptCategoriesBottomSheetDialogFragment.java | 3 ++ .../adapters/MapMarkersActiveAdapter.java | 9 +++-- .../adapters/MapMarkersGroupsAdapter.java | 11 +++--- .../adapters/MapMarkersHistoryAdapter.java | 8 ++--- .../plus/myplaces/TrackPointFragment.java | 3 +- ...electProfileBottomSheetDialogFragment.java | 2 +- .../mapwidgets/MapInfoWidgetsFactory.java | 3 +- .../explore/SavedArticlesRvAdapter.java | 5 ++- 19 files changed, 75 insertions(+), 42 deletions(-) diff --git a/OsmAnd/res/layout/bottom_sheet_item_in_frame_with_descr_and_icon.xml b/OsmAnd/res/layout/bottom_sheet_item_in_frame_with_descr_and_icon.xml index a4748728f0..6e64f26691 100644 --- a/OsmAnd/res/layout/bottom_sheet_item_in_frame_with_descr_and_icon.xml +++ b/OsmAnd/res/layout/bottom_sheet_item_in_frame_with_descr_and_icon.xml @@ -46,6 +46,7 @@ android:ellipsize="end" android:maxLines="2" android:lineSpacingMultiplier="@dimen/text_button_line_spacing_multiplier" + android:textColor="?android:textColorSecondary" android:textSize="@dimen/default_sub_text_size" tools:text="Some description" /> diff --git a/OsmAnd/res/layout/download_build_list_item.xml b/OsmAnd/res/layout/download_build_list_item.xml index c1d1d8f783..75171d28c9 100644 --- a/OsmAnd/res/layout/download_build_list_item.xml +++ b/OsmAnd/res/layout/download_build_list_item.xml @@ -13,6 +13,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" + android:textColor="?android:textColorPrimary" android:textSize="@dimen/default_list_text_size"/> diff --git a/OsmAnd/res/layout/fragment_data_storage_place_dialog.xml b/OsmAnd/res/layout/fragment_data_storage_place_dialog.xml index d0d9d30d29..c62ee0a14a 100644 --- a/OsmAnd/res/layout/fragment_data_storage_place_dialog.xml +++ b/OsmAnd/res/layout/fragment_data_storage_place_dialog.xml @@ -64,6 +64,7 @@ android:layout_gravity="fill_horizontal" android:layout_marginBottom="24dp" android:layout_marginTop="4dp" + android:textColor="?android:textColorSecondary" android:text="@string/application_dir_description" android:textSize="16sp"/> diff --git a/OsmAnd/res/layout/map_marker_item.xml b/OsmAnd/res/layout/map_marker_item.xml index 0ad46644e0..1bb0b74cb4 100644 --- a/OsmAnd/res/layout/map_marker_item.xml +++ b/OsmAnd/res/layout/map_marker_item.xml @@ -74,7 +74,7 @@ android:layout_marginLeft="6dp" android:drawablePadding="2dp" android:maxLines="1" - android:textColor="@color/text_color_secondary_dark" + android:textColor="?android:textColorSecondary" android:textSize="@dimen/default_sub_text_size"/> Build.VERSION_CODES.LOLLIPOP) { diff --git a/OsmAnd/src/net/osmand/plus/UiUtilities.java b/OsmAnd/src/net/osmand/plus/UiUtilities.java index 8ac7996f92..a8c08752ba 100644 --- a/OsmAnd/src/net/osmand/plus/UiUtilities.java +++ b/OsmAnd/src/net/osmand/plus/UiUtilities.java @@ -15,6 +15,7 @@ import android.support.annotation.ColorInt; import android.support.annotation.ColorRes; import android.support.annotation.DrawableRes; import android.support.annotation.StringRes; +import android.support.design.widget.Snackbar; import android.support.v4.content.ContextCompat; import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v4.text.TextUtilsCompat; @@ -343,6 +344,40 @@ public class UiUtilities { return screenOrientation; } + public static void setupSnackbar(Snackbar snackbar, boolean nightMode) { + setupSnackbar(snackbar, nightMode, null, null, null, null); + } + + public static void setupSnackbar(Snackbar snackbar, boolean nightMode, Integer maxLines) { + setupSnackbar(snackbar, nightMode, null, null, null, maxLines); + } + + public static void setupSnackbar(Snackbar snackbar, boolean nightMode, @ColorRes Integer backgroundColor, + @ColorRes Integer messageColor, @ColorRes Integer actionColor, Integer maxLines) { + if (snackbar == null) { + return; + } + View view = snackbar.getView(); + Context ctx = view.getContext(); + TextView tvMessage = (TextView) view.findViewById(android.support.design.R.id.snackbar_text); + TextView tvAction = (TextView) view.findViewById(android.support.design.R.id.snackbar_action); + if (messageColor == null) { + messageColor = nightMode ? R.color.text_color_primary_dark : R.color.text_color_primary_light; + } + tvMessage.setTextColor(ContextCompat.getColor(ctx, messageColor)); + if (actionColor == null) { + actionColor = nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light; + } + tvAction.setTextColor(ContextCompat.getColor(ctx, actionColor)); + if (maxLines != null) { + tvMessage.setMaxLines(maxLines); + } + if (backgroundColor == null) { + backgroundColor = nightMode ? R.color.list_background_color_dark : R.color.list_background_color_light; + } + view.setBackgroundColor(ContextCompat.getColor(ctx, backgroundColor)); + } + public static void setupLayoutDirection(View layout) { Context ctx = layout.getContext(); Locale currentLocale = ctx.getResources().getConfiguration().locale; diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java index acaceda8a7..3ed13c1ffd 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java @@ -65,6 +65,7 @@ import net.osmand.plus.OsmAndLocationProvider.OsmAndLocationListener; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.R; +import net.osmand.plus.UiUtilities; import net.osmand.plus.Version; import net.osmand.plus.activities.SavingTrackHelper; import net.osmand.plus.activities.TrackActivity; @@ -1092,7 +1093,7 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm startActivity(intent); } }); - AndroidUtils.setSnackbarTextColor(snackbar, R.color.active_color_primary_dark); + UiUtilities.setupSnackbar(snackbar, !lightTheme); snackbar.show(); } }; @@ -1119,7 +1120,7 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm adapter.notifyDataSetChanged(); } }); - AndroidUtils.setSnackbarTextColor(snackbar, R.color.active_color_primary_dark); + UiUtilities.setupSnackbar(snackbar, !lightTheme); snackbar.show(); } diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDialogFragment.java index ff628d377e..0caa56c355 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDialogFragment.java @@ -33,6 +33,7 @@ import net.osmand.plus.MapMarkersHelper.OnGroupSyncedListener; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.R; +import net.osmand.plus.UiUtilities; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.TrackActivity; import net.osmand.plus.mapmarkers.CoordinateInputDialogFragment.OnPointsSavedListener; @@ -449,7 +450,7 @@ public class MapMarkersDialogFragment extends android.support.v4.app.DialogFragm } } }); - AndroidUtils.setSnackbarTextColor(snackbar, R.color.active_color_primary_dark); + UiUtilities.setupSnackbar(snackbar, !lightTheme); snackbar.show(); } } @@ -494,7 +495,7 @@ public class MapMarkersDialogFragment extends android.support.v4.app.DialogFragm startActivity(intent); } }); - AndroidUtils.setSnackbarTextColor(snackbar, R.color.active_color_primary_dark); + UiUtilities.setupSnackbar(snackbar, !lightTheme); snackbar.show(); } }; diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersGroupsFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersGroupsFragment.java index 1ed6666726..f176c016c2 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersGroupsFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersGroupsFragment.java @@ -207,7 +207,7 @@ public class MapMarkersGroupsFragment extends Fragment implements OsmAndCompassL updateAdapter(); } }); - AndroidUtils.setSnackbarTextColor(snackbar, R.color.active_color_primary_dark); + UiUtilities.setupSnackbar(snackbar, night); snackbar.show(); } } diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersHistoryFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersHistoryFragment.java index 260efd704d..5729e38bbf 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersHistoryFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersHistoryFragment.java @@ -171,8 +171,7 @@ public class MapMarkersHistoryFragment extends Fragment implements MapMarkersHel } } }); - AndroidUtils.setSnackbarTextColor(snackbar, night ? R.color.active_color_primary_dark : R.color.active_color_primary_light); - snackbar.getView().setBackgroundColor(ContextCompat.getColor(app, night ? R.color.list_background_color_dark : R.color.list_background_color_light)); + UiUtilities.setupSnackbar(snackbar, night); snackbar.show(); } } diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/SelectWptCategoriesBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/SelectWptCategoriesBottomSheetDialogFragment.java index df26ab2561..83f23ac7e9 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/SelectWptCategoriesBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/SelectWptCategoriesBottomSheetDialogFragment.java @@ -48,6 +48,7 @@ public class SelectWptCategoriesBottomSheetDialogFragment extends MenuBottomShee if (gpxFile == null) { return; } + int activeColorResId = nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light; isUpdateMode = getArguments().getBoolean(UPDATE_CATEGORIES_KEY); List categories = getArguments().getStringArrayList(ACTIVE_CATEGORIES_KEY); @@ -58,6 +59,7 @@ public class SelectWptCategoriesBottomSheetDialogFragment extends MenuBottomShee final BottomSheetItemWithCompoundButton[] selectAllItem = new BottomSheetItemWithCompoundButton[1]; selectAllItem[0] = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder() .setChecked(!isUpdateMode || categories!=null&&categories.size() == gpxFile.getPointsByCategories().size()) + .setCompoundButtonColorId(activeColorResId) .setDescription(getString(R.string.shared_string_total) + ": " + gpxFile.getPoints().size()) .setIcon(getContentIcon(R.drawable.ic_action_group_select_all)) .setTitle(getString(R.string.shared_string_select_all)) @@ -93,6 +95,7 @@ public class SelectWptCategoriesBottomSheetDialogFragment extends MenuBottomShee } } }) + .setCompoundButtonColorId(activeColorResId) .setDescription(String.valueOf(pointsByCategories.get(category).size())) .setIcon(getContentIcon(R.drawable.ic_action_folder)) .setTitle(category.equals("") ? getString(R.string.shared_string_waypoints) : category) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersActiveAdapter.java b/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersActiveAdapter.java index 37c41b14cd..3d487e3831 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersActiveAdapter.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersActiveAdapter.java @@ -74,6 +74,7 @@ public class MapMarkersActiveAdapter extends RecyclerView.Adapter Date: Wed, 19 Feb 2020 13:34:43 +0200 Subject: [PATCH 33/62] Fix selected base profile ui --- .../SelectProfileBottomSheetDialogFragment.java | 12 +++++++++--- .../plus/settings/ProfileAppearanceFragment.java | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/profiles/SelectProfileBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/profiles/SelectProfileBottomSheetDialogFragment.java index 680486886f..c34c11e09b 100644 --- a/OsmAnd/src/net/osmand/plus/profiles/SelectProfileBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/profiles/SelectProfileBottomSheetDialogFragment.java @@ -192,9 +192,15 @@ public class SelectProfileBottomSheetDialogFragment extends BasePreferenceBottom tvTitle.setText(profile.getName()); tvDescription.setText(profile.getDescription()); - final boolean isSelected = profile.getStringKey().equals(selectedItemKey); - final Drawable drawableIcon = app.getUIUtilities().getIcon(profile.getIconRes(), - isSelected ? activeColorResId : iconDefaultColorResId); + boolean isSelected = profile.getStringKey().equals(selectedItemKey); + int iconColor; + if (type.equals(TYPE_BASE_APP_PROFILE)) { + iconColor = profile.getIconColor(nightMode); + } else { + iconColor = isSelected ? activeColorResId : iconDefaultColorResId; + } + + Drawable drawableIcon = app.getUIUtilities().getIcon(profile.getIconRes(), iconColor); ivIcon.setImageDrawable(drawableIcon); compoundButton.setChecked(isSelected); UiUtilities.setupCompoundButton(compoundButton, nightMode, UiUtilities.CompoundButtonType.GLOBAL); diff --git a/OsmAnd/src/net/osmand/plus/settings/ProfileAppearanceFragment.java b/OsmAnd/src/net/osmand/plus/settings/ProfileAppearanceFragment.java index 24229c2680..e4258f09cd 100644 --- a/OsmAnd/src/net/osmand/plus/settings/ProfileAppearanceFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/ProfileAppearanceFragment.java @@ -367,7 +367,7 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment { fragment.setUsedOnMap(false); fragment.setAppMode(getSelectedAppMode()); if (getSelectedAppMode() != null) { - bundle.putString(SELECTED_KEY, getSelectedAppMode().getRoutingProfile()); + bundle.putString(SELECTED_KEY, getSelectedAppMode().getStringKey()); } bundle.putString(DIALOG_TYPE, TYPE_BASE_APP_PROFILE); fragment.setArguments(bundle); From 32b4623d166645d287cf8628d92c26091404d50a Mon Sep 17 00:00:00 2001 From: Nazar Date: Wed, 19 Feb 2020 13:40:32 +0200 Subject: [PATCH 34/62] Fix text color of list items from "Builds" screen --- OsmAnd/res/layout/download_build_list_item.xml | 2 -- .../net/osmand/plus/activities/ContributionVersionActivity.java | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/OsmAnd/res/layout/download_build_list_item.xml b/OsmAnd/res/layout/download_build_list_item.xml index 75171d28c9..c1d1d8f783 100644 --- a/OsmAnd/res/layout/download_build_list_item.xml +++ b/OsmAnd/res/layout/download_build_list_item.xml @@ -13,7 +13,6 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" - android:textColor="?android:textColorPrimary" android:textSize="@dimen/default_list_text_size"/> diff --git a/OsmAnd/src/net/osmand/plus/activities/ContributionVersionActivity.java b/OsmAnd/src/net/osmand/plus/activities/ContributionVersionActivity.java index 6cbdf7641d..7dde1b05c7 100644 --- a/OsmAnd/src/net/osmand/plus/activities/ContributionVersionActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/ContributionVersionActivity.java @@ -264,7 +264,7 @@ public class ContributionVersionActivity extends OsmandListActivity { StringBuilder format = new StringBuilder(); format.append(AndroidUtils.formatDateTime(getMyApplication(), build.date.getTime()))/*.append(" : ").append(build.size).append(" MB")*/; description.setText(format.toString()); - int color = getResources().getColor(R.color.color_unknown); + int color = getResources().getColor(R.color.text_color_secondary_dark); if (currentInstalledDate != null) { if (currentInstalledDate.before(build.date)) { color = getResources().getColor(R.color.color_update); From b0fd81cf9f812b05c1dd648ee8550e4bdcccf107 Mon Sep 17 00:00:00 2001 From: Nazar Date: Wed, 19 Feb 2020 14:11:08 +0200 Subject: [PATCH 35/62] Fix text color of "Searching for the corresponding of wiki article" progress dialog --- .../src/net/osmand/plus/wikipedia/WikiArticleHelper.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/wikipedia/WikiArticleHelper.java b/OsmAnd/src/net/osmand/plus/wikipedia/WikiArticleHelper.java index ef96f89671..2857330a82 100644 --- a/OsmAnd/src/net/osmand/plus/wikipedia/WikiArticleHelper.java +++ b/OsmAnd/src/net/osmand/plus/wikipedia/WikiArticleHelper.java @@ -11,6 +11,7 @@ import android.support.annotation.Nullable; import android.support.v4.app.FragmentActivity; import android.text.Html; import android.util.Log; +import android.view.ContextThemeWrapper; import net.osmand.IndexConstants; import net.osmand.ResultMatcher; @@ -86,7 +87,7 @@ public class WikiArticleHelper { activityRef = new WeakReference<>(activity); this.isNightMode = nightMode; this.url = url; - dialog = createProgressDialog(activity); + dialog = createProgressDialog(activity, isNightMode); } @Override @@ -215,9 +216,9 @@ public class WikiArticleHelper { return ""; } - private static ProgressDialog createProgressDialog(@NonNull FragmentActivity activity) { + private static ProgressDialog createProgressDialog(@NonNull FragmentActivity activity, boolean nightMode) { if (activity != null) { - ProgressDialog dialog = new ProgressDialog(activity); + ProgressDialog dialog = new ProgressDialog(new ContextThemeWrapper(activity, nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme)); dialog.setCancelable(false); dialog.setMessage(activity.getString(R.string.wiki_article_search_text)); return dialog; From de7e62ac2909d0b1ccd37586aa46100218a78eed Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Wed, 19 Feb 2020 14:15:44 +0200 Subject: [PATCH 36/62] Fix base app mode key --- .../net/osmand/plus/settings/ProfileAppearanceFragment.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/settings/ProfileAppearanceFragment.java b/OsmAnd/src/net/osmand/plus/settings/ProfileAppearanceFragment.java index e4258f09cd..22725d0898 100644 --- a/OsmAnd/src/net/osmand/plus/settings/ProfileAppearanceFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/ProfileAppearanceFragment.java @@ -366,8 +366,8 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment { Bundle bundle = new Bundle(); fragment.setUsedOnMap(false); fragment.setAppMode(getSelectedAppMode()); - if (getSelectedAppMode() != null) { - bundle.putString(SELECTED_KEY, getSelectedAppMode().getStringKey()); + if (changedProfile.parent != null) { + bundle.putString(SELECTED_KEY, changedProfile.parent.getStringKey()); } bundle.putString(DIALOG_TYPE, TYPE_BASE_APP_PROFILE); fragment.setArguments(bundle); From 816986be7a49ce3d6ecf4381b7e05f0ec11454dc Mon Sep 17 00:00:00 2001 From: Nazar Date: Wed, 19 Feb 2020 14:52:00 +0200 Subject: [PATCH 37/62] Fix text color of purchase dialog --- OsmAnd/res/layout/purchase_dialog_card.xml | 2 +- OsmAnd/res/layout/purchase_dialog_card_button_active_ex.xml | 4 ++-- OsmAnd/res/layout/purchase_dialog_card_button_ex.xml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/OsmAnd/res/layout/purchase_dialog_card.xml b/OsmAnd/res/layout/purchase_dialog_card.xml index 2dde98ac32..3e03867225 100644 --- a/OsmAnd/res/layout/purchase_dialog_card.xml +++ b/OsmAnd/res/layout/purchase_dialog_card.xml @@ -32,7 +32,7 @@ android:layout_marginRight="@dimen/list_content_padding_large" android:layout_marginTop="@dimen/list_header_padding" android:gravity="center" - android:textColor="?attr/card_description_text_color" + android:textColor="?attr/dialog_text_description_color" android:textSize="@dimen/default_desc_text_size" osmand:typeface="@string/font_roboto_regular" tools:text="@string/osm_live_payment_desc"/> diff --git a/OsmAnd/res/layout/purchase_dialog_card_button_active_ex.xml b/OsmAnd/res/layout/purchase_dialog_card_button_active_ex.xml index 4d1b662dc3..15ac723740 100644 --- a/OsmAnd/res/layout/purchase_dialog_card_button_active_ex.xml +++ b/OsmAnd/res/layout/purchase_dialog_card_button_active_ex.xml @@ -46,7 +46,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/osm_live_payment_contribute_descr" - android:textColor="?attr/card_description_text_color" + android:textColor="?attr/dialog_text_description_color" android:textSize="@dimen/default_desc_text_size" android:visibility="gone" osmand:typeface="@string/font_roboto_regular" @@ -56,7 +56,7 @@ android:id="@+id/description" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textColor="?attr/card_description_text_color" + android:textColor="?attr/dialog_text_description_color" android:textSize="@dimen/default_desc_text_size" osmand:typeface="@string/font_roboto_regular" tools:text="Monthly payment" /> diff --git a/OsmAnd/res/layout/purchase_dialog_card_button_ex.xml b/OsmAnd/res/layout/purchase_dialog_card_button_ex.xml index 05465c67db..4af46efd8b 100644 --- a/OsmAnd/res/layout/purchase_dialog_card_button_ex.xml +++ b/OsmAnd/res/layout/purchase_dialog_card_button_ex.xml @@ -38,7 +38,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/osm_live_payment_contribute_descr" - android:textColor="?attr/card_description_text_color" + android:textColor="?attr/dialog_text_description_color" android:textSize="@dimen/default_desc_text_size" android:visibility="gone" osmand:typeface="@string/font_roboto_regular" @@ -48,7 +48,7 @@ android:id="@+id/description" android:layout_width="match_parent" android:layout_height="wrap_content" - android:textColor="?attr/card_description_text_color" + android:textColor="?attr/dialog_text_description_color" android:textSize="@dimen/default_desc_text_size" osmand:typeface="@string/font_roboto_regular" tools:text="$0.62 / month • Save 68%" /> From a6b57c176fccaa5f11080a9e9ad58b6a800745ee Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Wed, 19 Feb 2020 15:50:31 +0200 Subject: [PATCH 38/62] Change title for new profile screen --- .../net/osmand/plus/settings/ProfileAppearanceFragment.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/settings/ProfileAppearanceFragment.java b/OsmAnd/src/net/osmand/plus/settings/ProfileAppearanceFragment.java index 22725d0898..61f2f99de1 100644 --- a/OsmAnd/src/net/osmand/plus/settings/ProfileAppearanceFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/ProfileAppearanceFragment.java @@ -156,9 +156,13 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment { protected void createToolbar(LayoutInflater inflater, View view) { super.createToolbar(inflater, view); if (isNewProfile) { + TextView toolbarTitle = (TextView) view.findViewById(R.id.toolbar_title); + if (toolbarTitle != null) { + toolbarTitle.setText(getString(R.string.new_profile)); + } TextView toolbarSubtitle = (TextView) view.findViewById(R.id.toolbar_subtitle); if (toolbarSubtitle != null) { - toolbarSubtitle.setText(getString(R.string.new_profile)); + toolbarSubtitle.setVisibility(View.GONE); } } } From c3881671375b0bc83d6ec135325022735e5c4723 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Wed, 19 Feb 2020 17:03:34 +0100 Subject: [PATCH 39/62] Delete wal/shm files --- .../osmand/plus/download/ui/LocalIndexesFragment.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java b/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java index b2a1d87f4c..ea566933f7 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java @@ -541,6 +541,7 @@ public class LocalIndexesFragment extends OsmandExpandableListFragment implement if (operation == DELETE_OPERATION) { File f = new File(info.getPathToData()); successfull = Algorithms.removeAllFiles(f); + if (InAppPurchaseHelper.isSubscribedToLiveUpdates(getMyApplication())) { String fileNameWithoutExtension = Algorithms.getFileNameWithoutExtension(f); @@ -550,6 +551,14 @@ public class LocalIndexesFragment extends OsmandExpandableListFragment implement } if (successfull) { getMyApplication().getResourceManager().closeFile(info.getFileName()); + File tShm = new File(f.getParentFile(), f.getName() + "-shm"); + File tWal = new File(f.getParentFile(), f.getName() + "-wal"); + if(tShm.exists()) { + Algorithms.removeAllFiles(tShm); + } + if(tWal.exists()) { + Algorithms.removeAllFiles(tWal); + } } } else if (operation == RESTORE_OPERATION) { successfull = move(new File(info.getPathToData()), getFileToRestore(info)); From 04bd7988801ed2c4ba50e52ec5ff65662855c859 Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Wed, 19 Feb 2020 18:47:17 +0200 Subject: [PATCH 40/62] Change profile description --- OsmAnd/res/values/strings.xml | 1 + OsmAnd/src/net/osmand/plus/settings/BaseSettingsFragment.java | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index f6f47417c9..8cf5e1e254 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -11,6 +11,7 @@ Thx - Hardy --> + Custom profile Angle: %s° Angle Extra straight segment between my location and calculated route will be displayed until the route is recalculated diff --git a/OsmAnd/src/net/osmand/plus/settings/BaseSettingsFragment.java b/OsmAnd/src/net/osmand/plus/settings/BaseSettingsFragment.java index 646f1288c9..08b5250849 100644 --- a/OsmAnd/src/net/osmand/plus/settings/BaseSettingsFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/BaseSettingsFragment.java @@ -813,8 +813,7 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat impl public static String getAppModeDescription(Context ctx, ApplicationMode mode) { String description; if (mode.isCustomProfile()) { - description = String.format(ctx.getString(R.string.profile_type_descr_string), - Algorithms.capitalizeFirstLetterAndLowercase(mode.getParent().toHumanString())); + description = ctx.getString(R.string.profile_type_custom_string); } else { description = ctx.getString(R.string.profile_type_base_string); } From 364db28479b2186161f2e3aa390f3af7dc51416a Mon Sep 17 00:00:00 2001 From: Verdulo Date: Tue, 18 Feb 2020 21:14:48 +0000 Subject: [PATCH 41/62] Translated using Weblate (Esperanto) Currently translated at 100.0% (3190 of 3190 strings) --- OsmAnd/res/values-eo/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd/res/values-eo/strings.xml b/OsmAnd/res/values-eo/strings.xml index 338bb33882..b269857563 100644 --- a/OsmAnd/res/values-eo/strings.xml +++ b/OsmAnd/res/values-eo/strings.xml @@ -3523,4 +3523,8 @@ Indikas lokon: %1$s x %2$s" Antarkto Montri sisteman sciigon dum navigi montrantan instrukciojn turno-post-turno. Sciigo dum navigado + Implicita valoro (%s) + Malaktivigi rekalkulon + Minimuma distanco por rekalkuli kurson + Kurso estos rekalkulita se la distanco estos pli granda ol tiu ĉi valoro \ No newline at end of file From 92612c2e3f4f646b05723de22dd466a6645b3b0a Mon Sep 17 00:00:00 2001 From: Tymofij Lytvynenko Date: Tue, 18 Feb 2020 16:11:47 +0000 Subject: [PATCH 42/62] Translated using Weblate (Ukrainian) Currently translated at 100.0% (3190 of 3190 strings) --- OsmAnd/res/values-uk/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd/res/values-uk/strings.xml b/OsmAnd/res/values-uk/strings.xml index 632fd625d1..a8a6ea2248 100644 --- a/OsmAnd/res/values-uk/strings.xml +++ b/OsmAnd/res/values-uk/strings.xml @@ -3532,4 +3532,8 @@ Антарктида Показувати системне сповіщення з навігаційними вказівками під час навігації. Навігаційне сповіщення + Усталений застосунок (%s) + Вимкнути перерахунок + Найменша відстань для перерахунку маршруту + Маршрут буде перераховано, якщо відстань до нього перевищує вказане \ No newline at end of file From 1a70899d9ffcd5a8bbfa1dd54573edd3beeed8ef Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Tue, 18 Feb 2020 19:28:24 +0000 Subject: [PATCH 43/62] Translated using Weblate (Hebrew) Currently translated at 94.3% (3009 of 3190 strings) --- OsmAnd/res/values-he/strings.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/OsmAnd/res/values-he/strings.xml b/OsmAnd/res/values-he/strings.xml index 624c8699c8..e496fee8cd 100644 --- a/OsmAnd/res/values-he/strings.xml +++ b/OsmAnd/res/values-he/strings.xml @@ -3453,4 +3453,13 @@ נא לבחור שם לפרופיל פתיחת ההגדרות התוסף מושבת + מחיקת הנתונים שהוקלטו + העתקת נקודות ציון + תוסף זה הוא יישומון נפרד, יהיה עליך להסיר אותו בנפרד אם אין לך כוונה להשתמש בו עוד. +\n +\nהתוסף יישאר על המכשיר גם לאחר הסרת OsmAnd. + תפריט + השבתת חישוב מחדש + מרחק מזערי לחישוב המסלול מחדש + המסלול יחושב מחדש אם המרחק למסלול הוא ארוך מהמשתנה שצוין \ No newline at end of file From 1789a1e48970734a6a869286b7a50ad9e5d85a00 Mon Sep 17 00:00:00 2001 From: WaldiS Date: Tue, 18 Feb 2020 15:24:39 +0000 Subject: [PATCH 44/62] Translated using Weblate (Polish) Currently translated at 98.8% (3152 of 3190 strings) --- OsmAnd/res/values-pl/strings.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/OsmAnd/res/values-pl/strings.xml b/OsmAnd/res/values-pl/strings.xml index 7e1317eeb4..8bb083565c 100644 --- a/OsmAnd/res/values-pl/strings.xml +++ b/OsmAnd/res/values-pl/strings.xml @@ -3517,4 +3517,11 @@ Reprezentuje obszar: %1$s x %2$s Uwzględnij dodatkowe dane Zaimportowany profil zawiera dodatkowe dane. Kliknij przycisk Importuj, aby zaimportować tylko dane profilu lub wybierz dodatkowe dane do zaimportowania. Możesz wybrać dodatkowe dane do wyeksportowania wraz z profilem. + Bezpośrednio do punktu + Pokaż powiadomienia systemowe podczas nawigacji z instrukcjami nawigacji. + Powiadomienie nawigacyjne + Aplikacja domyślna (%s) + Wyłącz ponowne obliczanie + Minimalna odległość do ponownego obliczenia trasy + Trasa zostanie ponownie obliczona, jeśli odległość trasy jest dłuższa niż określony parametr \ No newline at end of file From c80320ac254b91a2d4c3363578f520b0b4b21635 Mon Sep 17 00:00:00 2001 From: Yunkers Date: Tue, 18 Feb 2020 20:41:26 +0000 Subject: [PATCH 45/62] Translated using Weblate (Polish) Currently translated at 98.8% (3152 of 3190 strings) --- OsmAnd/res/values-pl/strings.xml | 116 +++++++++++++++++-------------- 1 file changed, 62 insertions(+), 54 deletions(-) diff --git a/OsmAnd/res/values-pl/strings.xml b/OsmAnd/res/values-pl/strings.xml index 8bb083565c..3b163a15b6 100644 --- a/OsmAnd/res/values-pl/strings.xml +++ b/OsmAnd/res/values-pl/strings.xml @@ -375,7 +375,7 @@ Wyszukiwanie offline Wyszukiwanie online Maks. zoom online - Nie przeglądaj kafelków mapy online powyżej tego poziomu przybliżenia. + Nie przeglądaj map online powyżej tego poziomu przybliżenia. Całkowita odległość %1$s, czas podróży %2$d h %3$d min. Usługa nawigacji online lub offline. Usługa nawigacyjna @@ -443,7 +443,7 @@ Automatyczne rejestrowanie śladu podczas nawigacji Uaktualnij mapę Wczytaj ponownie kafelki - Wprowadza dane uwierzytelniające wymagane do wysyłania zmian na openstreetmap.org. + Potrzebny do zgłaszania do openstreetmap.org. Nazwa użytkownika OSM Cel Dodaj do ulubionych @@ -460,7 +460,7 @@ Widok 3D mapy Wyświetl ostatnio wybrane użyteczne miejsca. Wyświetlanie użytecznych miejsc - Proszę wybrać zasób map kafelkowych online lub offline + Wybierz zasób map kafelkowych online lub offline. Zasób mapy kafelkowej Zasób mapy Używanie połączenia internetowego @@ -485,7 +485,7 @@ Pieszo Centralnie Na dole - Proszę wprowadzić szerokość i długość geograficzną w wybranym formacie (D - stopnie, M - minuty, S - sekundy) + Wprowadź szerokość i długość geograficzną w wybranym formacie (D - stopnie, M - minuty, S - sekundy) Szerokość Długość DDD.DDDDD @@ -640,7 +640,7 @@ Usuń edycję Asynchroniczna edycja OSM: Użyteczne miejsca/uwagi OSM zapisane na urządzeniu - Wyświetla i zarządza użytecznymi miejscami i uwagami OSM zapisanymi w bazie danych urządzenia. + Wyświetla i zarządza użytecznymi miejscami i uwagami OSM w bazie danych urządzenia. Określ interwał monitorowania online. Częstość wysyłania danych Określa adres usługi internetowej przy użyciu następujących parametrów: szerokość={0}, długość={1}, znacznik czasu={2}, hdop={3}, wysokość={4}, prędkość={5}, kierunek={6}. @@ -777,26 +777,26 @@ Wyświetlanie ostrzeżeń… Konfiguruje ostrzeżenia ruchu drogowego (ograniczenia prędkości, znaki \"stop\", progi zwalniające, tunele), ostrzeżenia o fotoradarach i informacje o pasach ruchu. Mapy dla całego świata i nawigacja działająca w oparciu o stacjonarne jak i sieciowe mapy OSM - OsmAnd (OSM Automatyczne Nawigowanie Do celu) + OsmAnd (OSM Automatyczne Nawigowanie Do celu) \n -\nOsmAnd jest otwarto-źródłowym programem do nawigacji z dostępem do szerokiej gamy globalnych map OpenStreetMap (OSM). Wszystkie dane map (wektorowe lub kafelkowe) mogą być przechowywane na karcie pamięci telefonu do użytku offline. OsmAnd oferuje również nawigację w trybie offline i online zawierającą zapowiedzi głosowe. +\nOsmAnd jest otwarto-źródłowym programem do nawigacji z dostępem do szerokiej gamy globalnych map (OSM). Wszystkie dane map (wektorowe lub kafelkowe) mogą być przechowywane na karcie pamięci telefonu do użytku offline. OsmAnd oferuje również nawigację w trybie offline i online zawierającą zapowiedzi głosowe. \n -\n Niektóre z podstawowych funkcji: -\n - Funkcjonowanie w trybie offline (przechowuje pobrane mapy wektorowe lub kafelkowe w pamięci urządzenia) -\n - Dostępne kompaktowe mapy w trybie offline dla całego świata -\n - Pobieranie map kraju lub regionu bezpośrednio z aplikacji -\n - Możliwość nakładania kilku warstw map, takich jak GPX lub tras nawigacji, ciekawych miejsc, ulubionych, poziomic, przystanków komunikacji miejskiej, dodatkowych map z konfigurowalną przejrzystością -\n - Wyszukiwanie offline adresów i Użytecznych Miejsc (UM) -\n - Wyznaczanie w trybie offline tras na średnich dystansach -\n - Tryby samochodowy, rowerowy i pieszy z opcjonalnym: -\n - automatycznym przełączaniem widoku dzień/noc -\n - skalowaniem map w zależności od prędkości -\n - obracaniem map według kompasu lub kierunku ruchu -\n - wyświetlaniem wskazywania pasów, ograniczeń prędkości, głosami nagranymi i syntetyzowanymi (TTS) +\n Niektóre z podstawowych funkcji: +\n - Funkcjonowanie w trybie offline (przechowuje pobrane mapy wektorowe lub kafelkowe w pamięci urządzenia) +\n - Dostępne kompaktowe mapy w trybie offline dla całego świata +\n - Pobieranie map kraju lub regionu bezpośrednio z aplikacji +\n - Możliwość nakładania kilku warstw map, takich jak GPX lub tras nawigacji, ciekawych miejsc, ulubionych, poziomic, przystanków komunikacji miejskiej, dodatkowych map z konfigurowalną przejrzystością +\n - Wyszukiwanie offline adresów i Użytecznych Miejsc (UM) +\n - Wyznaczanie w trybie offline tras na średnich dystansach +\n - Tryby samochodowy, rowerowy i pieszy z opcjonalnym: +\n - automatycznym przełączaniem widoku dzień/noc +\n - skalowaniem map w zależności od prędkości +\n - obracaniem map według kompasu lub kierunku ruchu +\n - wyświetlaniem wskazywania pasów, ograniczeń prędkości, głosami nagranymi i syntetyzowanymi (TTS) \n -\n Ograniczenia w tej bezpłatnej wersji OsmAnd: -\n - Limitowana liczba pobrań mapy -\n - Brak dostępu do Użytecznych Miejsc z Wikipedii w trybie offline +\n Ograniczenia w tej bezpłatnej wersji OsmAnd: +\n - Limitowana liczba pobrań mapy +\n - Brak dostępu do Użytecznych Miejsc z Wikipedii w trybie offline \n \nOsmAnd jest aktywnie rozwijany i dalszy rozwój jest uzależniony od wkładu pieniężnego na finansowanie rozwoju i testowania nowych funkcjonalności. Proszę rozważyć zakup OsmAnd+, lub finansowanie konkretnych nowych funkcji lub dokonania ogólnej darowizny na https://osmand.net. OsmAnd to aplikacja open source do nawigacji obsługująca mapy offline i online @@ -835,7 +835,7 @@ Zwiedzanie OsmAnd+ (OSM Automated Navigation Directions) \n -\nOsmAnd+ jest otwarto-źródłowym programem do nawigacji z dostępem do szerokiej gamy globalnych map OpenStreetMap (OSM). Wszystkie dane map (wektorowe lub kafelkowe) mogą być przechowywane na karcie pamięci telefonu do użycia bez połączenia z siecią. OsmAnd umożliwia również wyznaczanie tras oraz nawigowanie zarówno w trybie stacjonarnym jak i sieciowym z komunikatami głosowymi. +\nOsmAnd+ jest otwarto-źródłowym programem do nawigacji z dostępem do szerokiej gamy globalnych map OSM. Wszystkie dane map (wektorowe lub kafelkowe) mogą być przechowywane na karcie pamięci telefonu do użycia bez połączenia z siecią. OsmAnd umożliwia również wyznaczanie tras oraz nawigowanie zarówno w trybie stacjonarnym jak i sieciowym z komunikatami głosowymi. \n \nOsmAnd + to płatna wersja aplikacji, kupując ją wspierasz projekt, finansujesz rozwój nowych funkcji i otrzymujesz najnowsze aktualizacje. \n @@ -925,14 +925,14 @@ Notatki audio/video Wtyczka OsmAnd do rysowania poziomic offline Pomiar odległości - Wtyczka Dropbox umożliwia synchronizację ścieżek i notatek audio/wideo z kontem Dropbox. + Synchronizacja ścieżek i notatek audio/wideo z kontem Dropbox. Wtyczka Dropbox Zmień kolejność Rozważ zakup wtyczki dodającej poziomice, aby wspomóc dalszy rozwój. Wtyczka poziomic Nagraj notatkę audio Nagraj notatkę wideo - Dostarcza warstwy poziomic i cieniowania rzeźby terenu wyświetlanych na standardowych mapach OsmAnd. Funkcja przydatna dla sportowców, turystów i osób zainteresowanych strukturą reliefową krajobrazu. + Dostarcza warstwy poziomic i cieniowania rzeźby terenu wyświetlanych na standardowych mapach OsmAnd. Funkcja przydatna dla sportowców, turystów i osób zainteresowanych strukturą reliefową krajobrazu. \n \nŚwiatowe dane (między 70° szerokości północnej a 70° szerokości południowej) opierają się na pomiarach SRTM (Shuttle Radar Topography Mission) i ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), przyrządu na pokładzie Terra, flagowego satelity Systemu Obserwacji Ziemi NASA. ASTER jest wspólnym przedsięwzięciem NASA, japońskiego Ministerstwa Gospodarki, Handlu i Przemysłu (METI) i Japońskich Systemów Kosmicznych (J-spacesystems). Wyświetlanie @@ -1042,7 +1042,7 @@ Ostrzeżenia o ruchu Hasło OSM (opcjonalne) Zapowiadanie… - Konfiguruje zapowiadanie nazw ulic, ostrzeżeń o ruchu (przymusowe przystanki, progi zwalniające), fotoradarów, ograniczeń prędkości. + Konfiguruje zapowiadanie nazw ulic, ostrzeżeń o ruchu (przymusowe przystanki, progi zwalniające), fotoradarów i ograniczeń prędkości. Nazwy ulic (syntezowane) Japonia Stany Zjednoczone @@ -1317,7 +1317,7 @@ Rejestrowanie śladu GPX Ogólne rejestrowanie pozycji do pliku GPX można włączyć lub wyłączyć za pomocą widgetu rejestrowania GPX na mapie. Częstość rejestrowania - Aktywuje funkcje rejestrowania i zapisywania śladów za pomocą widżetu rejestrowania śladów GPX na mapie lub automatyczne rejestruje przebiegi wszystkich tras do plików GPX. + Aktywuje funkcje rejestrowania i zapisywania śladów za pomocą widżetu rejestrowania śladów GPX na mapie lub automatyczne rejestruje przebiegi wszystkich tras do plików GPX. \n \nZarejestrowane ślady można udostępnić znajomym lub wykorzystać na rzecz rozwoju mapy OpenStreetMap. Sportowcy mogą korzystać ze śladów do monitorowania treningów. W tym celu OsmAnd udostępnia podstawowe informacje takie jak czasy okrążeń, średnia prędkość itp. Ślady mogą być później analizowane w specjalnych narzędziach do analizy przygotowanych przez innych dostawców oprogramowania. Ponawianie pytania @@ -1421,7 +1421,7 @@ Położenie: Szer. %1$s Dł. %2$s - Notatki OSM + Notatki A/V Mapa online Tylko drogi Wolne %1$s @@ -2036,7 +2036,7 @@ Długość %2$s Wyczyść wszystkie kafelki Opłata za subskrypcję na miesiąc. Anuluj ją w Google Play w dowolnym momencie. Darowizna na rzecz społeczności OSM - Część z dotacji jest przekazywana użytkownikom OSM, którzy wprowadzają zmiany na mapie OpenStreetMap. Koszt subskrypcji pozostaje taki sam. + Część z dotacji jest przekazywana darczyńcom OSM. Koszt subskrypcji pozostaje taki sam. Subskrypcje pozwalają na cogodzinne, codzienne i cotygodniowe uaktualnienia i nieograniczone liczbą pobieranie map całego świata. Australia Kabylski @@ -2416,11 +2416,11 @@ Reprezentuje obszar: %1$s x %2$s Wyświetlanie na mapie Zakończyć bez zapisywania? Wyłączenie animacji - Wyłącza animacje w aplikacji. + Wyłącza animacje mapy. Przenieś wszystkie do historii Wskaźnik odległości Kolejność sortowania - Proszę wybrać w jaki sposób wskazywać odległość i kierunek do znaczników mapy na ekranie: + Wybierz w jaki sposób wskazywać odległość i kierunek do znaczników mapy: Próg zmiany orientacji mapy Wybiera prędkość, poniżej której orientacja mapy zmieni się z „względem kierunku ruchu” na „względem kompasu”. Wszystkie znaczniki mapy przeniesiono do historii @@ -2543,7 +2543,7 @@ Reprezentuje obszar: %1$s x %2$s Wyświetl zamknięte uwagi Pokaż/ukryj uwagi OSM na mapie. GPX - odpowiedni do eksportowania danych do JOSM i innych edytorów OSM. - OSC - odpowiedni do eksportowania danych do OpenStreetMap. + OSC - odpowiedni do eksportowania danych do OSM. Plik GPX Plik OSC Wybierz typ pliku @@ -2587,7 +2587,7 @@ Reprezentuje obszar: %1$s x %2$s Najpierw najdalsze Najpierw najbliższe zamknięte - Wybierz rodzaj eksportu: uwagi OSM, POI lub oba. + Eksportuj jako uwagi OSM, POI lub oba. Twórz lub modyfikuj OSM POI, otwórz lub skomentuj notatki OSM, oraz udostępniaj nagrane pliki GPX. Importuj ulubione grupy lub punkty trasy jako znaczniki. Sporty spływowe @@ -2772,7 +2772,7 @@ Reprezentuje obszar: %1$s x %2$s Brak wyników wyszukiwania\? \nPrześlij opinię Zatwierdzanie drogi… - OsmAnd+ (Automatyczna nawigacja OSM) to aplikacja do map i nawigacji z dostępem do darmowych, światowych i wysokiej jakości danych OpenStreetMap (OSM). + OsmAnd+ (Automatyczna nawigacja OSM) to aplikacja do map i nawigacji z dostępem do darmowych, światowych i wysokiej jakości danych OSM. \nCiesz się nawigacją głosową i optyczną, przeglądaniem POI (punktów użyteczności publicznej), tworzeniem ścieżek GPX i zarządzaniem nimi, z wykorzystaniem wizualizacji linii konturu i wysokości, wyboru między trybem jazdy samochodem, jazdy na rowerze, poruszania się pieszo, edycji OSM i wielu innych. \n \nOsmAnd+ to płatna wersja aplikacji. Kupując ją, wspierasz projekt, finansujesz rozwój nowych funkcji i otrzymujesz najnowsze aktualizacje. @@ -2861,7 +2861,7 @@ Reprezentuje obszar: %1$s x %2$s Odnawia się co roku %1$.2f %2$s Termin płatności: - Darowizny pomagają finansować kartografię OpenStreetMap. + Darowizny pomagają finansować kartografię OSM. Obsługiwane przez OsmAnd Subskrypcje Wyświetlaj tylko obrazy 360° @@ -3087,7 +3087,7 @@ Reprezentuje obszar: %1$s x %2$s Samochód, ciężarówka, motocykl Rower górski, motorower, koń Spacer, wędrówka piesza, bieganie - Wszystkie rodzaje transportu publicznego + Rodzaje transportu publicznego Statek, wioślarstwo, żeglarstwo Samolot, szybownictwo Geokodowanie @@ -3288,8 +3288,8 @@ Reprezentuje obszar: %1$s x %2$s Wprowadza ścieżkę do katalogu z danymi OsmAnd Zmienić katalog danych OsmAnd\? Przenieś do nowej lokalizacji - Wewnętrzna pamięć, ukryta przed użytkownikiem i innymi aplikacjami, do której dostęp ma tylko OsmAnd - Wybór katalogu przechowywania danych + Wewnętrzna pamięć dla OsmAnd (ukryta przed użytkownikami i innymi aplikacjami). + Wybór katalogu przechowywania Park terenowy Sanie Sanki @@ -3355,7 +3355,7 @@ Reprezentuje obszar: %1$s x %2$s \n • Inne poprawki błędów \n \n - Można wprowadzić tę zmianę we wszystkich profilach lub tylko w obecnie wybranym. + Można wprowadzić tę zmianę tylko w obecnie wybranym profilu. Preferowanie nieutwardzonych dróg Preferuje drogi nieutwardzone. Zmiany OSM @@ -3367,21 +3367,21 @@ Reprezentuje obszar: %1$s x %2$s Ukryj cieniowanie terenu Przełącz widoczność cieniowania terenu Przełącza wyświetlanie cieniowania terenu na mapie. - Nie można uruchomić mechanizmu zamiany tekstu na mowę + Nie można uruchomić mechanizmu zamiany tekstu na mowę. Wspólne Symuluje położenie używając zarejestrowanego śladu GPX. Eksportuj profil Profil OsmAnd: %1$s - Profil „%1$s” już istnieje. Zastąpić go\? + „%1$s” już istnieje. Zastąpić go\? Nie udało się wyeksportować profilu. Import profilu - Aby zaimportować profil, proszę otworzyć plik na urządzeniu za pomocą OsmAnd. + Dodaj profil otwierając jego plik w OsmAnd. Błąd importowania %1$s: %2$s Zaimportowano %1$s. Biały Zamień %1$s i %2$s Początek trasy - Służy do szacowania czasu przyjazdu dla nieznanego rodzaju dróg i ograniczenia prędkości na wszystkich drogach (może zmienić trasę) + Szacuje czas przyjazdu dla nieznanego rodzaju dróg i ograniczenia prędkości na wszystkich drogach (może zmienić trasę) Odwróć początek i cel Zapisano ślad Nazwa pliku jest pusta @@ -3393,11 +3393,11 @@ Reprezentuje obszar: %1$s x %2$s Sugerowane mapy Te mapy są wymagane do użycia z wtyczką Dodano profile - Wtyczka dodaje nowy profil do programu + Profile dodane przez wtyczkę Wyłącz Dodano nową wtyczkę - Kontroluj wyskakujące okienka, okna dialogowe i powiadomienia, które OsmAnd pokazuje podczas użytkowania. - Dołącz segmenty + Kontroluj wyskakujące okienka, okna dialogowe i powiadomienia. + Połącz segmenty Sieci węzłów Dodać nowy profil \'%1$s\'\? Dołącz kierunek @@ -3406,24 +3406,24 @@ Reprezentuje obszar: %1$s x %2$s %1$s, %2$s Osobiste Pobieranie %s - Dla pustyń i innych słabo zaludnionych obszarów. - Pokaż trasy cyklu sieci węzłów + Dla pustyń i innych słabo zaludnionych obszarów. Bardziej szczegółowa. + Pokaż punkt sieci tras rowerowych Gruby - Wybierz ikonę nawigacji + Ikona położenia podczas ruchu Wybierz ikonę mapy Po dotknięciu Zastosuj usunięte profile zostaną całkowicie utracone. Główny profil Wybierz kolor - Nie możesz usunąć domyślnych profili OsmAnd, ale możesz je wyłączyć na poprzednim ekranie lub przenieść na dół. + Nie można usunąć domyślnych profili OsmAnd, ale można je wyłączyć (na poprzednim ekranie) lub przenieść na dół. Edytuj profile - Typ nawigacji wpływa na zasady obliczania trasy. + \"Typ nawigacji\" określa jak obliczane są trasy. Wygląd profilu - Wybierz ikonę, kolor i nazwę + Ikona, kolor i nazwa Edytuj listę profili - Wybierz profil + Wybrany profil Stuknięcie %1$s spowoduje utratę wszystkich zmian. Wszystkie ustawienia profilu zostaną przywrócone do stanu po instalacji. - Czy zresetować wszystkie ustawienia profilu do wartości domyślnych\? + Zresetować wszystkie ustawienia profilu\? %1$s: %2$s Oceń %1$s %2$s @@ -3524,4 +3524,12 @@ Reprezentuje obszar: %1$s x %2$s Wyłącz ponowne obliczanie Minimalna odległość do ponownego obliczenia trasy Trasa zostanie ponownie obliczona, jeśli odległość trasy jest dłuższa niż określony parametr + Twoje nagrane ślady są w %1$s lub w folderze OsmAnd. + Domyślnie wyłączone, jeśli OsmAnd jest włączony na pierwszym planie, ekran nie będzie się wygaszał. +\n +\nJeśli włączone, OsmAnd będzie używał systemowych ustawień wygaszania. + Sortuj wg kategorii + Menu + Wyznaczanie trasy + Antarktyda \ No newline at end of file From ac53c60bb08f772712e31469f1ff5c620d6f4460 Mon Sep 17 00:00:00 2001 From: Ahmad Alfrhood Date: Wed, 19 Feb 2020 10:47:17 +0000 Subject: [PATCH 46/62] Translated using Weblate (Arabic) Currently translated at 100.0% (3190 of 3190 strings) --- OsmAnd/res/values-ar/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index a6a7adc819..d1752a60ad 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -3446,4 +3446,8 @@ يحتوي ملف التعريف المستوردة على بيانات إضافية. انقر فوق \"استيراد\" لاستيراد بيانات ملف التعريف فقط أو حدد بيانات إضافية لاستيرادها. عرض إشعارات النظام أثناء التنقل بالتوجيهات . إشعار الملاحة + التطبيق الافتراضي (%s) + تعطيل إعادة الحساب + الحد الأدنى من المسافة لإعادة حساب المسار + سيتم إعادة حساب المسار إذا كانت المسافة إلى المسار أطول من المعلمة المحددة \ No newline at end of file From 2c68a58c1a89102a1f5e0a9564090455484ad218 Mon Sep 17 00:00:00 2001 From: iman Date: Wed, 19 Feb 2020 12:15:22 +0000 Subject: [PATCH 47/62] Translated using Weblate (Persian) Currently translated at 99.8% (3184 of 3190 strings) --- OsmAnd/res/values-fa/strings.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-fa/strings.xml b/OsmAnd/res/values-fa/strings.xml index ae74255508..c8deb00336 100644 --- a/OsmAnd/res/values-fa/strings.xml +++ b/OsmAnd/res/values-fa/strings.xml @@ -2794,7 +2794,7 @@ اشتراک OsmAnd Live خود را لغو کردید اشتراکتان را تجدید کنید تا از همهٔ قابلیت‌ها بهره‌مند شوید: دانلود همه - بازکردن آنلاین لینک ویکی‌پدیا + ویکی‌پدیا آنلاین پیوند در یک مرورگر باز می‌شود. نمایش توضیح کوتاه نمایش توضیح کامل @@ -3569,4 +3569,8 @@ اعلام هنگام ناوبری راهنمای ناوبری را در اعلان‌ها نمایش می‌دهد. اعلان ناوبری + پیشفرض برنامه + غیرفعال‌سازی محاسبهٔ مجدد + مسافت کمینی برای مسیریابی مجدد + اگر مسافت تا مسیر بیش از پارامتر تعیین‌شده باشد، مسیر دوباره محاسبه می‌شود \ No newline at end of file From 5a903e73709645175c40cc0a948c2f3921234c85 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Wed, 19 Feb 2020 02:45:38 +0000 Subject: [PATCH 48/62] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (3190 of 3190 strings) --- OsmAnd/res/values-zh-rTW/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml index 2392376b37..60870e8cda 100644 --- a/OsmAnd/res/values-zh-rTW/strings.xml +++ b/OsmAnd/res/values-zh-rTW/strings.xml @@ -3532,4 +3532,8 @@ 南極洲 使用導航說明時喜訕系統通知。 導航通知 + 應用程式預設值 (%s) + 停用重新計算 + 重新計算路線的最小距離 + 如果到路線的距離大於指定的參數,則路線將會重新計算 \ No newline at end of file From f999f67bdb0cbc958c1dbe61fffa25fb33fbbe5a Mon Sep 17 00:00:00 2001 From: Tymofij Lytvynenko Date: Tue, 18 Feb 2020 16:13:55 +0000 Subject: [PATCH 49/62] Translated using Weblate (Ukrainian) Currently translated at 100.0% (3772 of 3772 strings) --- OsmAnd/res/values-uk/phrases.xml | 427 ++++++++++++++++--------------- 1 file changed, 214 insertions(+), 213 deletions(-) diff --git a/OsmAnd/res/values-uk/phrases.xml b/OsmAnd/res/values-uk/phrases.xml index 3530a173f9..fefbaa8d09 100644 --- a/OsmAnd/res/values-uk/phrases.xml +++ b/OsmAnd/res/values-uk/phrases.xml @@ -18,18 +18,18 @@ Молочний магазин Торговий автомат Книжковий магазин - Магазин велосипедів - Магазин аніме + Крамниця велосипедів + Крамниця аніме Антикваріат Витвори мистецтва Товари для дітей Сумки, валізи Все для ванної кімнати - Магазин постільної білизни + Крамниця постільної білизни Бутік - Магазин килимових покриттів + Крамниця килимових покриттів Аптека - Магазин одягу + Крамниця одягу Дитячий одяг Взуття Комп’ютерний магазин @@ -46,7 +46,7 @@ Меблі Сад та город Зріджений газ - Магазин + Крамниця Подарунки та сувеніри Вікна, скло Будівельний магазин @@ -109,7 +109,7 @@ Шлагбаум Збирання плати за проїзд Прикордонний контроль - Магазин (невизначеного типу) + Крамниця (невизначеного типу) Аварійні служби Транспортування Споруди @@ -155,18 +155,18 @@ Штучна дорожня нерівність Штучна дорожня нерівність «лежачий поліцейський» Шикана - Магазин шкіри, галантарея + Крамниця шкіри, галантарея Музичний магазин - Магазин для плавання з масками - Магазин автомобільних шин - Магазин годинників - Магазин речей для басейну + Крамниця для плавання з масками + Крамниця автомобільних шин + Крамниця годинників + Крамниця речей для басейну Ігри Іграшкові моделі Нагороди, призи Комп’ютерні ігри Піротехніка - Магазин зброї + Крамниця зброї Штучна дорожня нерівність «берлінська подушка» Шумові полоси Підвищений пішохідний перехід @@ -217,17 +217,17 @@ Залізничний вокзал Залізнична платформа Транспортна будівля - Магазин сирів - Магазин шоколаду - Магазин кави - Магазин пасти + Крамниця сирів + Крамниця шоколаду + Крамниця кави + Крамниця пасти Кондитерський магазин Камери та лінзи - Магазин свічок + Крамниця свічок Модний одяг - Магазин для стрибків з парашутом + Крамниця для стрибків з парашутом Магазин обігрівачів - Магазин садових меблів + Крамниця садових меблів Біогаз Залізнична зупинка Вхід в метро @@ -256,7 +256,7 @@ Енергетичний магазин Паливо 1:50 Двері - Магазин парфумерії + Крамниця парфумерії Маяк Туристичні маршрути Контроль ПДР @@ -518,50 +518,50 @@ Швидке харчування Пекарня Вид палива - Тип авіаційного палива - Тип оплати + Вид авіаційного палива + Вид оплати Паливні картки - Тип доступу в Інтернет + Вид доступу в Інтернет У продажу Велосипедні послуги - Тип одягу - Тип взуття - Тип + Вид одягу + Вид взуття + Вид Розміщення Джерело води - Тип оплати + Вид оплати Звуковий сигнал - Тип + Вид Тактильне покриття Послуги Безконтактна Самообслуговування Автоматизація - Тип + Вид Укриття Станція метро Вантаж, що перевозиться - Тип + Вид Провезення велосипедів Обігрів Насос Призначення - Тип - Тип + Вид + Вид Вид Столиця Продаж ліків за рецептами Спеціалізація - Тип + Вид Число зірок Релігія Релігійне спрямування - Тип + Вид Зміст Додатково Табір скаутів Місце для табору на природі без зручностей - Тип + Вид Складність траси Обслуговування траси Жанр @@ -575,9 +575,9 @@ Коктейлі Власна пивоварня Послуги - Тип + Вид Приймаємі відходи - Тип + Вид Місце для розведення вогню Сезонність Характеристика води @@ -593,8 +593,8 @@ Медична система Виїзд на будинок Страви - Тип оплати (транспорт) - Тип + Вид оплати (транспорт) + Вид Цільова соціальна група Підкачка шин Порохотяг @@ -994,7 +994,7 @@ Річка Струмок, потік Пороги - Окремостоячий камінь + Осібний камінь Мис Пляж Затока, бухта @@ -1534,13 +1534,13 @@ Історичний період: темні століття (Греція) (1100 - 800 до н.е.) Могул Історичний період: Римська Греція (146 р. до н.е. - 330 р. н.е.) - Тип саду: житловий + Вид саду: житловий Історичний період: Римське царство (753 - 509 до н.е.) - Тип саду: громадський + Вид саду: громадський Історичний період: домінантний - Тип саду: приватний + Вид саду: приватний Історичний період: землеробський (період I і II, 1580 р. до н.е. - 133 р. н.е.) - Тип саду: ботанічний + Вид саду: ботанічний Історичний період: міський (період III, 133 - 374 р. н.е.) Історичний період: класичний (період IV, 374 - 900 р. н.е.) Стиль саду: кухня @@ -1556,9 +1556,9 @@ Місткість Історичний камінь Так - Тип: хрест примирення + Вид: хрест примирення Без спеціальних місць для людей з обмеженими можливостями - Тип: герб + Вид: герб Спеціальні місця для людей з обмеженими можливостями Матеріал: деревина Спеціальні місця для жінок @@ -1582,21 +1582,21 @@ Петрогліф Середній час подорожі (в хвилинах) Земляне укріплення - Тип мегаліту: менгір + Вид мегаліту: менгір Скління - Тип мегаліту: дольмен + Вид мегаліту: дольмен Немає скління - Тип мегаліту: нураги + Вид мегаліту: нураги Так - Тип мегаліту: кам\'яне коло - Тип мегаліту: коридорна могила + Вид мегаліту: кам\'яне коло + Вид мегаліту: коридорна могила Без обігріву - Тип зміцнення: городище + Вид зміцнення: городище Дозволено - Тип зміцнення: лімес (укріплений кордон) - Тип зміцнення: шанець + Вид зміцнення: лімес (укріплений кордон) + Вид зміцнення: шанець Провезення велосипедів заборонене - Тип зміцнення: рондела (кільцева канава) + Вид зміцнення: рондела (кільцева канава) Лише влітку Па (укріплене поселення маорі) Лише вхід @@ -1616,28 +1616,28 @@ 1S (покращений туристичний клас) Скульптор 2 (стандартний клас) - Тип будівлі: церква + Вид будівлі: церква 2S (покращений стандартний клас) - Тип будівлі: каплиця + Вид будівлі: каплиця 3 (комфортний клас) - Тип будівлі: мечеть + Вид будівлі: мечеть 3S (покращений комфортний клас) - Тип будівлі: храм + Вид будівлі: храм 4 (перший клас) 4S (покращений перший клас) - Тип будівлі: собор + Вид будівлі: собор Солярій 5 (категорія люкс) - Тип будівлі: монастир + Вид будівлі: монастир Асенізаційна зливна станція 5S (категорія люкс+) - Тип будівлі: базиліка + Вид будівлі: базиліка Західна Кількість номерів - Тип будівлі: синагога + Вид будівлі: синагога Традиційна китайська Любовний готель - Тип будівлі: святиня + Вид будівлі: святиня Аюрведа Монети Хрест @@ -1649,19 +1649,19 @@ Колишній тюремний табір Традиційна тибетська Монети по 50c, 1€ й 2€ - Тип: концентраційний табір + Вид: концентраційний табір Традиційна тамільська Телефонні карти - Тип: для військовополонених + Вид: для військовополонених Традиційна греко-ісламська Телефонні картки не приймаються - Тип: виправно-трудовий + Вид: виправно-трудовий Медичні послуги: догляд: є Кредитні картки - Тип: нацистський + Вид: нацистський Медичні послуги: догляд: немає Кредитні картки не приймаються - Тип: гулаг + Вид: гулаг Медичні послуги: консультація: є Банкноти Температура @@ -1708,29 +1708,29 @@ Творчий простір (хакерспейс) Платіжні картки Ремонт електроніки - Тип медустанови: польовий госпіталь + Вид медустанови: польовий госпіталь Платіжні картки не приймаються - Магазин феєрверків - Тип медустанови: центр психологічного консультування + Крамниця феєрверків + Вид медустанови: центр психологічного консультування Картки Maestro Протяжність - Тип медустанови: медична лабораторія + Вид медустанови: медична лабораторія Картки Maestro не приймаються Сімейна медицина - Тип медустанови: терапія + Вид медустанови: терапія American Express (AMEX) Офтальмологія - Тип медустанови: відділення + Вид медустанови: відділення Гінекологія - Тип медустанови: видача лікарських засобів + Вид медустанови: видача лікарських засобів Картки American Express (AMEX) не приймаються Внутрішні хвороби - Тип медустанови: станція першої допомоги + Вид медустанови: станція першої допомоги Diners Club Ортопедія - Тип медустанови: будинок престарілих (хоспіс) + Вид медустанови: будинок престарілих (хоспіс) Отоларингологія (ЛОР) - Тип медустанови: зустрічі груп підтримки + Вид медустанови: зустрічі груп підтримки Картки Diners Club не приймаються Педіатрія Точка забору води @@ -1868,10 +1868,10 @@ Максимальне число наметів Підземний Quick - Тип укриття: намет + Вид укриття: намет Максимальне число автопричепів Дизайн гідранта: wsh - Тип укриття: занедбане + Вид укриття: занедбане Вхід з собаками дозволений Основний Карти Quick не приймаються @@ -1889,101 +1889,101 @@ Групове проживання Цистерна E‑ZPass - Тип доступу в Інтернет: службовий + Вид доступу в Інтернет: службовий Пандус: немає Використовується: так Немає доступу в Інтернет Пандус для інвалідних візків: так - Тип шафи: електрична + Вид шафи: електрична E-ZPass не приймаються З доступом в Інтернет Пандус для інвалідних візків: немає - Тип шафи: телекомунікації + Вид шафи: телекомунікації Euroshell Максимальна ширина Пандус (подвійний): є - Тип шафи: кабельне ТБ + Вид шафи: кабельне ТБ Код IATA Пандус (подвійний): відсутній - Тип шафи: газ + Вид шафи: газ Паливні картки Euroshell не приймаються Код ICAO Пандус для велосипедів: так - Тип шафи: поштова служба + Вид шафи: поштова служба KITCard Код FAA - Тип шафи: сміття + Вид шафи: сміття Пандус для велосипедів: немає - Тип: скульптура - Тип шафи: управління водними ресурсами + Вид: скульптура + Вид шафи: управління водними ресурсами Пандус для багажу: є KITCard не приймаються - Тип: статуя - Тип шафи: вуличне освітлення + Вид: статуя + Вид шафи: вуличне освітлення Пандус для багажу: відсутній Westfalen - Тип: фреска + Вид: фреска Кількість сходинок Військовий контрольно-пропускний пункт - Тип: архітектура + Вид: архітектура Стан сходинок: хороший Шафки, що замикаються Картки Westfalen не приймаються - Тип: живопис + Вид: живопис Стан сходинок: середній Велопарковка у формі дерева V PAY - Тип: камінь + Вид творіння: камінь Стан сходинок: поганий Відкритий відсік Картки V PAY не приймаються - Тип: бюст + Вид: бюст Піраміда з каменів Глибина Dogecoin - Тип: інсталяція + Вид: інсталяція Дефібрилятор Сіль - Тип: мозаїка + Вид: мозаїка Дефібрилятор: є Сіль: немає Dogecoin не приймаються - Тип: барельєф - Тип: братська могила + Вид: барельєф + Вид: братська могила Лише для інвалідних візків Cibus - Тип: графіті - Тип: курган + Вид: графіті + Вид: курган Відвал породи - Тип: стела - Тип: вирізана в камені + Вид: стела + Вид: вирізана в камені Дитячий літній табір Картки Cibus не приймаються - Тип: водограй - Тип: гіпогей + Вид: водограй + Вид: гіпогей Оздоровчий центр, база відпочинку Грошові перекази Ширина - Тип: усипальниця, гробниця, могильний склеп + Вид: усипальниця, гробниця, могильний склеп Управління переїздом: автоматичне Грошові перекази не приймаються Архітектор - Тип: колумбарій + Вид: колумбарій Управління переїздом: місцеве Картки Cash (Geldkarte) Архітектурний стиль: модернізм - Тип: мавзолей + Вид: мавзолей Управління переїздом: дистанційне Картки Cash (Geldkarte) не приймаються Архітектурний стиль: сталінський неокласицизм - Тип: саркофаг + Вид: саркофаг Бар\'єр на переїзді: немає Proton Архітектурний стиль: еклектика - Тип: крипта + Вид: крипта Бар\'єр на переїзді Архітектурний стиль: нова речовинність - Тип: піраміда + Вид: піраміда Бар\'єр на переїзді: повний Картки Proton не приймаються Архітектурний стиль: сучасний @@ -2097,15 +2097,15 @@ Конструкція моста: арочний Променева діагностика Відображення дати - Тип насоса: верстат-качалка + Вид насоса: верстат-качалка Відображення дати: немає Конструкція моста: ферма Гастроентерологія - Тип насосу: India Mk II або III + Вид насосу: India Mk II або III Опора: стовп Будівництво моста: понтон Стоматологія - Тип насоса: гравітаційний + Вид насоса: гравітаційний Опора: стіна Картки Roadrunner не приймаються Конструкція моста: горбатий @@ -2273,7 +2273,7 @@ Без підкачки шин Призначення: дослідження Заморожений йогурт - Тип + Вид Жетони Презервативи Конструкція мосту: акведук @@ -2294,7 +2294,7 @@ Пачинко Подарункові картки Велосипедні камери - Тип моста: розвідний + Вид моста: розвідний Єврейська Болгарська Туалет: громадський @@ -2371,7 +2371,7 @@ ПРО100 Пакети для екскрементів тварин Заболочений луг - Тип: нафтова промисловість + Вид: нафтова промисловість Спортивна Місце для розведення вогню Консультація сімейна: так @@ -2379,7 +2379,7 @@ Чай з кульками Картки ПРО100 не приймаються Торф\'яне болото - Тип: буровий майданчик + Вид: буровий майданчик Чоловіча Розподільна шафа Консультація сімейна: немає @@ -2444,7 +2444,7 @@ Іспанська В\'єтнамська Для вегетаріанців - Камінь спотикання + Камінь перепони Підкачка шин Так Пилосос @@ -2487,12 +2487,12 @@ Пожежний оператор Філіппінська Історичний кар\'єр - Тип: фабрика + Вид: фабрика Так Посадка Веганська Заповнювачі бетону - Тип: газова промисловість + Вид: газова промисловість Пральна машина: немає Посадка на вершині Пожежний резервуар з водою @@ -2500,70 +2500,70 @@ Веганське харчування не пропонується Безглютенове харчування Сурма - Тип: лісоматеріали + Вид: лісоматеріали Так Буксирування - Тип туалету: змивається водою + Вид туалету: змивається водою Грузинська Лише безглютенова Азбест - Тип: очисний завод + Вид: очисний завод Душ Тренування Вигрібна яма Польська Безглютенова Барит - Тип: склад + Вид: склад Нейропсихіатрія Офіційне місце для вільного польоту Утилізація відходів: хімічна Бразильська Безглютенове харчування не пропонується Базальт - Тип: утилізація машин + Вид: утилізація машин Ендокринологія Офіційне місце: немає Утилізація відходів: контейнер Арабська Кошерне харчування Боксити - Тип: сільськогосподарська промисловість + Вид: сільськогосподарська промисловість Ядерна медицина Парапланеризм Довжина Датська Лише кошерна Берил - Тип: пивоварня + Вид: пивоварня Патологічна анатомія Парапланеризм: немає Вікіпедія Кошерна Кошерне харчування не пропонується Вісмут - Тип: цегельний завод + Вид: цегельний завод Онкологія Дельтапланеризм Різдво Індонезійська Халяль Хроміти, хромова руда - Тип: інтермодальний вантажний термінал + Вид: інтермодальний вантажний термінал Соціальна педіатрія Дельтапланеризм: немає Різдвяна подія Африканська Лише халяль Глина - Тип: пилорама + Вид: пилорама Спеціалізація: соціальна педіатрія: відсутня Дельтаплан з жорстким крилом Різдв\'яна ярмарка Карибська Халяль Вугілля - Тип: очищення води + Вид: очищення води Акушерство (кесарів розтин) Дельтаплан з жорстким крилом: ні Різдвяна піраміда @@ -2578,7 +2578,7 @@ Лише безлактозна Отримання посилок Пальза болото - Тип притулку: для собак + Вид притулку: для собак Жіноча Справедлива торгівля (Fairtrade): є Консультація для іммігрантів: немає @@ -2588,7 +2588,7 @@ Безлактозна Відправлення посилок Бруд - Тип притулку: для кішок + Вид притулку: для кішок Нижня білизна Справедлива торгівля (Fairtrade): немає Консультування (шлюб): так @@ -2598,7 +2598,7 @@ Безлактозні продукти не пропонуються Молоко Пісок - Тип притулку: для собак і кішок + Вид притулку: для собак і кішок Чоловіча Лише товари з маркуванням Справедливої торгівлі (Fairtrade) Консультування (шлюб): немає @@ -2607,8 +2607,8 @@ Ефіопська Пескетаріанська Подовжені монети (сувеніри) - Тип розвідного моста: підіймальний - Тип притулку: для коней + Вид розвідного моста: підіймальний + Вид притулку: для коней Весільні сукні Хокей з м\'ячем Консультація з питань харчування: так @@ -2617,7 +2617,7 @@ Угорська Так Хліб - Тип розвідного моста: поворотний + Вид розвідного моста: поворотний Історичний літак Природоохоронна природна/історична територія Спортивна @@ -2627,17 +2627,17 @@ Лаоська Придбати продукти не покидаючи авто на парковці (drive-in): ні Жувальна гумка - Тип розвідного моста: вертикально-підйомний + Вид розвідного моста: вертикально-підйомний З ліфтом Ортопедична - Тип об\'єкту, що охороняється + Вид об\'єкту, що охороняється Консультація реабілітаційна: так Телескоп Бушеншанк (вишукані австрійські вина) Європейська Так "Паркувальні талони; квитки на громадський транспорт" - Тип розвідного моста: підйомний + Вид розвідного моста: підйомний Без ліфта Історична садиба Об\'єкт охорони: історичний @@ -2647,9 +2647,9 @@ Узбецька Придбати продукти не покидаючи авто у віконці (drive-through): ні Кава - Тип розвідного моста: затоплюваний + Вид розвідного моста: затоплюваний Технічний пам\'ятник - Тип замка: величний + Вид замка: величний Об\'єкт охорони: природа Консультація сексуальна: так Бейгл (єврейський бублик) @@ -2657,9 +2657,9 @@ Радіотелескоп Назва пивоварні Оплата за проїзд - Тип розвідного моста: літаючий паром + Вид розвідного моста: літаючий паром Офіс лісництва - Тип замка: оборонний + Вид замка: оборонний Об\'єкт охорони: середовище проживання Консультація сексуальна: немає Гамма @@ -2667,9 +2667,9 @@ Кубинська Так Квитки - Тип розвідного моста: висувається + Вид розвідного моста: висувний Офіс транспортно-логістичної компанії - Тип замку: фортеця + Вид замку: фортеця Об\'єкт охорони: вода Консультація для жертв сексуального домагання: так Діаметр @@ -2679,7 +2679,7 @@ Продаж води Об\'єкт освітлений: так Офіс парафії - Тип замку: палац + Вид замку: палац Країна, яка спричинила вибух Консультація для жертв сексуального домагання: немає Гравітаційна @@ -2693,7 +2693,7 @@ Корм для тварин Поверхня: без покриття Паливо 91UL - Тип замку: кремль + Вид замку: кремль Назва місця вибуху Консультація для жертв насильства: так Парникове садівництво @@ -2703,8 +2703,8 @@ Плани громадського транспорту Поверхня: з покриттям Паливо 100LL - Тип замку: захисний, величний - Тип вибуху: підземний, шахта + Вид замку: захисний, величний + Вид вибуху: підземний, шахта Консультація для жертв насильства: немає Напруга Макаронні вироби @@ -2713,8 +2713,8 @@ Напої та солодощі Поверхня: асфальт Автогаз - Тип замку: римський форт - Тип вибуху: підземний, тунель + Вид замку: римський форт + Вид вибуху: підземний, тунель Консультація з питань (домашнього) насильства: так Вихідна потужність Соки @@ -2723,8 +2723,8 @@ Ваучери Поверхня: бетон Паливо Jet A-1 - Тип замку: сіро (японський замок) - Тип вибуху: атмосферний + Вид замку: сіро (японський замок) + Вид вибуху: атмосферний Консультація з питань (домашнього) насильства: немає Виробляє електрику Соба (локшина з гречаного борошна) @@ -2734,7 +2734,7 @@ Поверхня: бруківка Паливо AdBlue Тайський - Тип вибуху: атмосферний, скидання з літака + Вид вибуху: атмосферний, скидання з літака Послуги надаються немовлятам: так Вихідна потужність гарячої води Вишукані страви @@ -2744,7 +2744,7 @@ Поверхня: покладений булижник Паливо: дрова Еротичний - Тип вибуху: атмосферний, на поверхні (вежа) + Вид вибуху: атмосферний, на поверхні (вежа) Послуги надаються немовлятам: ні Виробляє гарячу воду Чай @@ -2755,7 +2755,7 @@ Поверхня: тротуарна плитка Паливо: деревне вугілля Китайський - Тип вибуху: атмосферний, на повітряній кулі + Вид вибуху: атмосферний, на повітряній кулі Послуги надаються немовлятам: так Різдвяний магазин Зупи @@ -2765,9 +2765,9 @@ Поверхня: галька Паливо: кам\'яне вугілля Спеціалізація: акушерство (кесарів розтин): відсутнє - Тип вибуху: атмосферний (на поверхні) + Вид вибуху: атмосферний (на поверхні) Послуги надаються немовлятам: ні - Магазин ялинок + Крамниця ялинок Пироги Швейцарська Немає місць на відкритому повітрі @@ -2776,7 +2776,7 @@ Поверхня: метал Вуличний ліхтар Наркологія - Тип вибуху: атмосферний (поверхня води, баржа) + Вид вибуху: атмосферний (поверхня води, баржа) Послуги надаються дітям: так Різдвяна ялинка Сидр @@ -2786,7 +2786,7 @@ Поверхня: дерево Смуга аварійного гальмування Оптометрія - Тип вибуху: підземний + Вид вибуху: підземний Послуги надаються дітям: ні Різдво: початок і закінчення події М\'ясо @@ -2795,7 +2795,7 @@ Мідь Поверхня: гравій Вирощується культура: рис - Тип вибуху: неглибокого закладення + Вид вибуху: неглибокого закладення Послуги надаються дорослим: так Різдво: нотатка Крильця @@ -2805,17 +2805,17 @@ Поверхня: багатошаровий гравій Вирощується культура: трава Клінічна патологія - Тип вибуху: атмосферний (ракета) + Вид вибуху: атмосферний (ракета) Послуги надаються дорослим: ні Різдво: години роботи Вафлі Гральні автомати Місця на відкритому повітрі: в саду Будівельний камінь - Поверхня: утрамбований грунт і каміння + Поверхня: утрамбований ґрунт і каміння Вирощується культура: кукурудза Логопед - Тип вибуху: космічний (висота понад 80км) + Вид вибуху: космічний (висота понад 80км) Послуги надаються жінкам: так Різдво: місце проведення Шоколад @@ -2825,7 +2825,7 @@ Поверхня: пісок Вирощується культура: зернова Мануальна терапія - Тип вибуху: підводний + Вид вибуху: підводний Послуги надаються жінкам: ні Різдво: вебсайт Вино @@ -2842,11 +2842,11 @@ Електронні сигарети Вживані товари Золото - Поверхня: нещільне мощення камінням + Поверхня: нещільна кам\'яна бруківка Вирощується культура: пшениця Подологія Послуги надаються людям похилого віку: немає - Тип: телефонна будка + Вид: телефонна будка Другий сніданок (бранч) Локомотив Немає вживаних товарів @@ -2856,7 +2856,7 @@ Психіатрія для дорослих Кодове ім\'я (англ) Послуги надаються дівчаткам: так - Тип: шафа з книгами + Вид: шафа з книгами Сендвіч в формі підводного човна Харчові добавки Лише вживані товари @@ -2867,7 +2867,7 @@ Акупунктура (голковколювання) Серія Послуги надаються дівчаткам: ні - Тип: дерев\'яна шафа + Вид: дерев\'яна шафа Піта (м\'які коржі) Фотостудія Запчастини @@ -2877,7 +2877,7 @@ Гомеопатія Мета вибуху: випробування ядерної зброї Послуги надаються чоловікам: так - Тип: металева шафа + Вид: металева шафа Фондю (сирне блюдо) Скеля (прямовисна) Дилер @@ -2887,7 +2887,7 @@ Традиційна китайська медицина Мета вибуху: ефект зброї Послуги надаються чоловікам: ні - Тип: шафа для одягу (в будівлі) + Вид: шафа для одягу (в будівлі) Французький багет Місце утримання тварин Свинець @@ -2925,7 +2925,7 @@ Обслуговування в стаціонарі: так Бургер Теріякі (солодке м\'ясо з соєю) - Тип: загін + Вид: загін Ремонт мотоциклів Ртуть Тролейбус @@ -2962,7 +2962,7 @@ Нікель Легкорейковий транспорт Вирощується культура: тютюн - Тип будівлі: піраміда + Вид будівлі: піраміда Мета вибуху: промислове застосування, зрушення земляних пластів Психологічна консультація: немає Донер кебаб (шаурма) @@ -3007,7 +3007,7 @@ Громадська лазня Солеварня Вирощується культура: журавлина - Тип: порт + Вид: порт Мікрохвильова піч: відсутня Орієнтація майданчика для вільного польоту: північ (N) Виїзд на дім: ні @@ -3016,7 +3016,7 @@ Так Продукти харчування Ватти (прибережна мілина) - Тип: депо + Вид: депо Вирощується культура: спаржа Водонагрівач: присутній Орієнтація майданчика для вільного польоту: північний схід (NE) @@ -3035,7 +3035,7 @@ Локшина Вино: продаж (в пляшках) Орієнтація майданчика для вільного польоту: південний-схід (SE) - Тип: на поверхні + Вид: на поверхні Мангрові зарості Водопій Відеоспостереження: всередині @@ -3073,7 +3073,7 @@ Музична школа Школа іноземних мов Рятувальний круг - Тип + Вид Контактний зоопарк Парк дикої природи Сафарі-парк @@ -3084,7 +3084,7 @@ Клітки Спортивна трибуна Послуги - Тип мотоциклів + Вид мотоциклів Продаж Продаж: немає Продаж: є, також б/у @@ -3185,7 +3185,7 @@ Габаритна ширина УКХ-канал Робочий стан - Тип водопостачання + Вид водопостачання Очищення води Доступ до водопостачання Ущелина @@ -3310,10 +3310,10 @@ Оплата за парковку Сила струму Потужність зарядної станції - Тип мапи: топографічна - Тип мапи: мапа вулиць - Тип мапи: схематична - Тип мапи: панорама + Вид мапи: топографічна + Вид мапи: мапа вулиць + Вид мапи: схематична + Вид мапи: панорама Охоплення мапи: місце Охоплення мапи: місто Охоплення мапи: регіон @@ -3335,10 +3335,10 @@ Льодяний: ні Змішаний: так Змішаний: ні - Тип каменю: вапняк - Тип каменю: граніт - Тип каменю: піщаник - Тип каменю: кварцит + Вид каменю: вапняк + Вид каменю: граніт + Вид каменю: піщаник + Вид каменю: кварцит Стиль скелелазіння Роз\'єм Боулдерінг: так @@ -3352,8 +3352,8 @@ Довжина сходження Мінімальна довжина сходження Максимальна довжина сходження - Камінь сходження: гнейс - Камінь сходження: порфір + Скелелазне каміння: гнейс + Кселелазне каміння: порфір Якість сходження: твердо Якість сходження: крихко Фіксовані зачепи: так @@ -3371,25 +3371,25 @@ Маршрути сходження Обхват стовбура Діаметр крони - Тип: сільськогосподарський - Тип: природний - Тип: заростаючий - Тип: пасовище + Вид: сільськогосподарський + Вид: природний + Вид: заростаючий + Вид: пасовище Заморожені продукти Сільськогосподарський магазин - Магазин камінів - "Магазин човнів " - Магазин канабісу + Крамниця груб + "Крамниця човнів " + Крамниця конопель CEE блакитний CEE червоний 16A CEE червоний 32A CEE червоний 64A CEE червоний 125A - Тип 1 - Тип 1 комбінований - Тип 2 - Тип 2 комбінований - Тип 3 + Вид 1 + Вид 1 комбінований + Вид 2 + Вид 2 комбінований + Вид 3 "CHAdeMO " "Стандарт Тесла " Тесла Supercharger @@ -3402,9 +3402,9 @@ "BS 1363 " "AS/NZS 3112 " CHAdeMO, потужність - Тип 2, потужність - Тип 2, комбінований, потужність - Тип 3, потужність + Вид 2, потужність + Вид 2, комбінований, потужність + Вид 3, потужність CEE блакитний, потужність Щуко, потужність Висока @@ -3429,8 +3429,8 @@ Гончарство Назва річкових порогів Автопослуги - Тип льодовика - Тип контрольного пункту + Вид льодовика + Вид контрольного пункту Пункт видачі замовлень Мангал: є Офіс водопостачання @@ -3488,7 +3488,7 @@ Пункт штампування Голкова машина Скеля - Магазин побутової техніки + Крамниця побутової техніки Оголення порід Радіаційна небезпека Ерозійна небезпека @@ -3503,7 +3503,7 @@ Банкомат Ремонт взуття Масове придбання - Тип + Вид Так Виключно Трубопровідна підстанція @@ -3779,4 +3779,5 @@ Осередок бовлінгу Довідковий номер траси Мисливська база + Осередок підводного плавання \ No newline at end of file From 8132342e1cacc4250e6633bc136c7039478ad1fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sveinn=20=C3=AD=20Felli?= Date: Wed, 19 Feb 2020 13:04:37 +0000 Subject: [PATCH 50/62] Translated using Weblate (Icelandic) Currently translated at 99.8% (3767 of 3772 strings) --- OsmAnd/res/values-is/phrases.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-is/phrases.xml b/OsmAnd/res/values-is/phrases.xml index e14a286225..e18e4587a3 100644 --- a/OsmAnd/res/values-is/phrases.xml +++ b/OsmAnd/res/values-is/phrases.xml @@ -3771,4 +3771,5 @@ Viðmiðunarnúmer leiðar Grunnbúðir veiðimanna Öryggisvöruverslun + Köfunarmiðstöð \ No newline at end of file From 274ea7afd04eb470a09601534a9697cd6c12509a Mon Sep 17 00:00:00 2001 From: Yunkers Date: Tue, 18 Feb 2020 21:11:55 +0000 Subject: [PATCH 51/62] Translated using Weblate (Polish) Currently translated at 99.9% (3770 of 3772 strings) --- OsmAnd/res/values-pl/phrases.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-pl/phrases.xml b/OsmAnd/res/values-pl/phrases.xml index 819bce2415..0c73a7392d 100644 --- a/OsmAnd/res/values-pl/phrases.xml +++ b/OsmAnd/res/values-pl/phrases.xml @@ -64,7 +64,7 @@ Instrumenty muzyczne Kiosk gazetowy Optyk - Żywność ekologiczna + Produkty ekologiczne Artykuły wyposażenia zewnętrznego Farby Sklep zoologiczny @@ -3784,4 +3784,10 @@ Duch roweru Wulkan błotny Paintball + Błotny + Sklep BHP + Kręgielnia + Numer referencyjny stoku + Ambona łowiecka + Centrum nurkowania \ No newline at end of file From d1a6d368253eab700e61d146df880142d38b783f Mon Sep 17 00:00:00 2001 From: Ajeje Brazorf Date: Tue, 18 Feb 2020 18:41:33 +0000 Subject: [PATCH 52/62] Translated using Weblate (Sardinian) Currently translated at 99.5% (3756 of 3772 strings) --- OsmAnd/res/values-sc/phrases.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-sc/phrases.xml b/OsmAnd/res/values-sc/phrases.xml index 7cda235800..4e3c1007e0 100644 --- a/OsmAnd/res/values-sc/phrases.xml +++ b/OsmAnd/res/values-sc/phrases.xml @@ -787,7 +787,7 @@ Fràigu de mèdios de trasportu Tzilleri (cafè) Ghennas - Artìculos pro immersiones + Artìculos pro imbèrghidas in s\'abba Cummèrtziu de energia Butega de profumos Ponte de perdas @@ -3789,4 +3789,5 @@ Tzentru pro su bowling Nùmeru de referèntzia de sa pista Base pro sa cassa + Tzentru pro sas imbèrghidas in s\'abba \ No newline at end of file From 8bad2e4360436d77a8f228f84d618739bbedf681 Mon Sep 17 00:00:00 2001 From: Franco Date: Tue, 18 Feb 2020 17:55:34 +0000 Subject: [PATCH 53/62] Translated using Weblate (Spanish (Argentina)) Currently translated at 100.0% (3772 of 3772 strings) --- OsmAnd/res/values-es-rAR/phrases.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-es-rAR/phrases.xml b/OsmAnd/res/values-es-rAR/phrases.xml index 2b69d120a1..dcff6f8767 100644 --- a/OsmAnd/res/values-es-rAR/phrases.xml +++ b/OsmAnd/res/values-es-rAR/phrases.xml @@ -3798,4 +3798,5 @@ Galería de bolos;Bolera Número de referencia de la pista Base de caza + Centro de buceo \ No newline at end of file From d3ea534402b36038be01ca2b232956cd96f93e70 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Wed, 19 Feb 2020 02:47:44 +0000 Subject: [PATCH 54/62] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (3772 of 3772 strings) --- OsmAnd/res/values-zh-rTW/phrases.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-zh-rTW/phrases.xml b/OsmAnd/res/values-zh-rTW/phrases.xml index e25d6b395d..69fdcb4cff 100644 --- a/OsmAnd/res/values-zh-rTW/phrases.xml +++ b/OsmAnd/res/values-zh-rTW/phrases.xml @@ -3790,4 +3790,5 @@ 保齡球館 滑雪道參考編號 狩獵基地 + 水肺潛水中心 \ No newline at end of file From 5738e34d8fd8ac91cd844e6ca0bf4ec3829e7e59 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Wed, 19 Feb 2020 19:13:05 +0100 Subject: [PATCH 55/62] Fix #8502 --- .../net/osmand/plus/base/MapViewTrackingUtilities.java | 7 ++++++- .../osmand/plus/download/ui/SearchDialogFragment.java | 7 ++++++- .../net/osmand/plus/views/DownloadedRegionsLayer.java | 9 +++++---- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/base/MapViewTrackingUtilities.java b/OsmAnd/src/net/osmand/plus/base/MapViewTrackingUtilities.java index d9985350e9..d02b3ffb74 100644 --- a/OsmAnd/src/net/osmand/plus/base/MapViewTrackingUtilities.java +++ b/OsmAnd/src/net/osmand/plus/base/MapViewTrackingUtilities.java @@ -7,6 +7,7 @@ import android.view.WindowManager; import net.osmand.Location; import net.osmand.StateChangedListener; +import net.osmand.binary.BinaryMapDataObject; import net.osmand.data.LatLon; import net.osmand.data.RotatedTileBox; import net.osmand.map.IMapLocationListener; @@ -30,6 +31,7 @@ import net.osmand.util.MapUtils; import java.io.IOException; import java.text.SimpleDateFormat; +import java.util.Map; public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLocationListener, OsmAndCompassListener, MapMarkerChangedListener { @@ -456,7 +458,10 @@ public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLoc protected WorldRegion doInBackground(LatLon... latLons) { try { if (latLons != null && latLons.length > 0) { - return app.getRegions().getSmallestBinaryMapDataObjectAt(latLons[0]).getKey(); + Map.Entry reg = app.getRegions().getSmallestBinaryMapDataObjectAt(latLons[0]); + if(reg != null) { + return reg.getKey(); + } } } catch (IOException e) { // ignore diff --git a/OsmAnd/src/net/osmand/plus/download/ui/SearchDialogFragment.java b/OsmAnd/src/net/osmand/plus/download/ui/SearchDialogFragment.java index 0d9834a351..7da8f572be 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/SearchDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/SearchDialogFragment.java @@ -31,6 +31,7 @@ import net.osmand.Collator; import net.osmand.CollatorStringMatcher; import net.osmand.OsmAndCollator; import net.osmand.ResultMatcher; +import net.osmand.binary.BinaryMapDataObject; import net.osmand.binary.BinaryMapIndexReader; import net.osmand.binary.BinaryMapIndexReader.SearchRequest; import net.osmand.data.Amenity; @@ -61,6 +62,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; +import java.util.Map; public class SearchDialogFragment extends DialogFragment implements DownloadEvents, OnItemClickListener { @@ -416,7 +418,10 @@ public class SearchDialogFragment extends DialogFragment implements DownloadEven Amenity amenity = cityItem.getAmenity(); WorldRegion downloadRegion = null; try { - downloadRegion = osmandRegions.getSmallestBinaryMapDataObjectAt(amenity.getLocation()).getKey(); + Map.Entry res = osmandRegions.getSmallestBinaryMapDataObjectAt(amenity.getLocation()); + if(res != null) { + downloadRegion = res.getKey(); + } } catch (IOException e) { // ignore } diff --git a/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java b/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java index b87c36a30e..f9a23bc7d3 100644 --- a/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java @@ -251,12 +251,12 @@ public class DownloadedRegionsLayer extends OsmandMapLayer implements IContextMe if (app.getSettings().SHOW_DOWNLOAD_MAP_DIALOG.get() && zoom >= ZOOM_MIN_TO_SHOW_DOWNLOAD_DIALOG && zoom <= ZOOM_MAX_TO_SHOW_DOWNLOAD_DIALOG && currentObjects != null) { - WorldRegion regionData; + Map selectedObjects = new LinkedHashMap<>(); for (int i = 0; i < currentObjects.size(); i++) { final BinaryMapDataObject o = currentObjects.get(i); String fullName = osmandRegions.getFullName(o); - regionData = osmandRegions.getRegionData(fullName); + WorldRegion regionData = osmandRegions.getRegionData(fullName); if (regionData != null && regionData.isRegionMapDownload()) { String regionDownloadName = regionData.getRegionDownloadName(); if (regionDownloadName != null) { @@ -272,8 +272,9 @@ public class DownloadedRegionsLayer extends OsmandMapLayer implements IContextMe IndexItem indexItem = null; String name = null; - regionData = app.getRegions().getSmallestBinaryMapDataObjectAt(selectedObjects).getKey(); - if (regionData != null) { + Map.Entry res = app.getRegions().getSmallestBinaryMapDataObjectAt(selectedObjects); + if (res != null && res.getKey() != null) { + WorldRegion regionData = res.getKey(); DownloadIndexesThread downloadThread = app.getDownloadThread(); List indexItems = downloadThread.getIndexes().getIndexItems(regionData); if (indexItems.size() == 0) { From 0e084f2fd10e8f5194a4fa22fecb505a3fe7efe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Wed, 19 Feb 2020 19:36:00 +0000 Subject: [PATCH 56/62] Translated using Weblate (Turkish) Currently translated at 100.0% (3195 of 3195 strings) --- OsmAnd/res/values-tr/strings.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/OsmAnd/res/values-tr/strings.xml b/OsmAnd/res/values-tr/strings.xml index 847f129483..1ce8224d2d 100644 --- a/OsmAnd/res/values-tr/strings.xml +++ b/OsmAnd/res/values-tr/strings.xml @@ -3501,4 +3501,9 @@ Yeniden hesaplamayı devre dışı bırak Rotayı yeniden hesaplamak için minimum mesafe Rotaya olan mesafe belirtilen parametreden daha uzunsa rota yeniden hesaplanacak + Özel profil + Açı: %s° + Açı + Konumum ve hesaplanan rota arasındaki ekstra düz segment, rota yeniden hesaplanıncaya kadar görüntülenecek + Konumum ve rota arasındaki minimum açı \ No newline at end of file From 8bf01caaa758c4e320c719c673917d94046831d4 Mon Sep 17 00:00:00 2001 From: Hakuchi Date: Wed, 19 Feb 2020 22:15:14 +0000 Subject: [PATCH 57/62] Translated using Weblate (German) Currently translated at 100.0% (3195 of 3195 strings) --- OsmAnd/res/values-de/strings.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml index cafb1faf65..694b175b14 100644 --- a/OsmAnd/res/values-de/strings.xml +++ b/OsmAnd/res/values-de/strings.xml @@ -3547,4 +3547,13 @@ Lon %2$s Geo-Intent \'%s\' konnte nicht analysiert werden. Systembenachrichtigung während der Navigation mit Navigationsanweisungen anzeigen. Navigations-Benachrichtigung + App-Standard (%s) + Neuberechnung deaktivieren + Minimale Entfernung zum Neuberechnen der Route + Die Route wird neu berechnet, wenn der Abstand zur Route länger ist als der angegebene Parameter + Benutzerdefiniertes Profil + Winkel: %s° + Winkel + Zusätzliches gerades Segment zwischen meinem Standort und berechneter Route wird angezeigt, bis die Route neu berechnet wird + Minimaler Winkel zwischen meinem Standort und der Route \ No newline at end of file From 1f88ef43a42cd91774c8f7031ae2805f12e32f68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sveinn=20=C3=AD=20Felli?= Date: Wed, 19 Feb 2020 18:27:16 +0000 Subject: [PATCH 58/62] Translated using Weblate (Icelandic) Currently translated at 100.0% (3195 of 3195 strings) --- OsmAnd/res/values-is/strings.xml | 44 ++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/OsmAnd/res/values-is/strings.xml b/OsmAnd/res/values-is/strings.xml index c2d6c0805a..fbb65b5c09 100644 --- a/OsmAnd/res/values-is/strings.xml +++ b/OsmAnd/res/values-is/strings.xml @@ -3516,4 +3516,48 @@ Stendur fyrir svæði: %1$s x %2$s Sérsniðinn myndgerðaðrstíll Taka með viðbótargögn Suðurskautslandið + Þetta er sjálfgefið óvirkt, ef OsmAnd keyrir í forgrunni rennur skjárinn ekki út á tíma. +\n +\nEf þetta er virkt mun OsmAnd nota tímamörk kerfisins. + • Notandasnið: núna geturðu breytt röðun, stillt táknmyndir fyrir kort, breytt öllum stillingum grunnsniða og fært þær aftur á upphaflegar stillingar +\n +\n • Bætt við númerum afreina í leiðsögn +\n +\n • Endurhönnun á stillingum viðbótar +\n +\n • Endurhönnun á stillingaskjánum fyrir flýtiaðgengi að öllum sniðum +\n +\n • Bætt við valkosti til að afrita stillingar úr öðrum sniðum +\n +\n • Nú er hægt að breyta röðun eða fela flokka merkisstaða í leit +\n +\n • Rétt hliðjöfnun táknmynda merkisstaða á kortinu +\n +\n • Gögnum fyrir sólarupprás/sólsetur bætt við kortastillingar +\n +\n • Táknmyndum fyrir Heima/Vinna bætt við kortið +\n +\n • Bætt við stuðningi við margar línur á lýsingum stillinga +\n +\n • Bætt við réttum umritunum á kort af Japan +\n +\n • Bætt við korti fyrir Suðurskautslandið +\n +\n + Þessi viðbót er sérstakt forrit, þú þarft að fjarlægja það sérstaklega ef þú ætlar þér ekki að nota það. +\n +\nViðbótin helst áfram uppsett á tækinu þó þú fjarlægir OsmAnd. + Innflutta sniðið inniheldur viðbótargögn. Smelltu á að flytja inn til að sækja aðeins gögn sniðsins eða veldu þau viðbótargögn sem ætti að flytja inn. + Hægt er að velja viðbótargögn til útflutnings með sniðinu. + Birta kerfistilkynningu með leiðbeiningum á meðan leiðsögn stendur. + Tilkynning við leiðsögn + Sjálfgefið fyrir forrit (%s) + Gera endurútreikning óvirkan + Lágmarksvegalengd til að leið sé endurreiknuð + Leiðin verður endurreiknuð ef vegalengd að leiðinni er lengri en uppgefið viðfang + Sérsniðið notandasnið + Horn: %s° + Horn + Aukalegur beinn bútur á milli staðsetningar minnar og reiknaðrar leiðar verður sýndur þar til leiðin hefur verið endurreiknuð + Lágmarkshorn milli staðsetningar og leiðar \ No newline at end of file From a6531397445cde9fbf729a33cb867d56093b3937 Mon Sep 17 00:00:00 2001 From: Ldm Public Date: Wed, 19 Feb 2020 19:05:10 +0000 Subject: [PATCH 59/62] Translated using Weblate (French) Currently translated at 100.0% (3195 of 3195 strings) --- OsmAnd/res/values-fr/strings.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index 52b4da66d7..a5b9aea3c4 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -3169,7 +3169,7 @@ représentant la zone : %1$s x %2$s Clavier WunderLINQ Parrot - Basez votre profil personnalisé sur l\'un des profils par défaut pour définir les unités de vitesse, de distance ou la visibilité des widgets. Voici les profils par défaut de l\'application ainsi que des exemples de profils personnalisés : + Basez votre profil personnel sur l\'un des profils par défaut pour définir les unités de vitesse, de distance ou la visibilité des widgets. Voici les profils par défaut de l\'application ainsi que des exemples de profils personnalisés : Prendre en compte les limitations temporaires Par défaut Relier les trous @@ -3516,4 +3516,9 @@ représentant la zone : %1$s x %2$s Désactiver le re-calcul Distance à partir de laquelle recalculer l’itinéraire L’itinéraire sera recalculé si votre éloignement de l\'itinéraire est supérieur à ce paramètre + Profil personnel + Angle : %s° + Angle + Un segment supplémentaire sera affiché entre ma position et l\'itinéraire initial jusqu\'à ce que l\'itinéraire soit recalculé + Angle minimum entre ma position et mon itinéraire \ No newline at end of file From c4d6c874ab8d1de1f3655e28c4ffbe95ed111927 Mon Sep 17 00:00:00 2001 From: iman Date: Wed, 19 Feb 2020 17:54:35 +0000 Subject: [PATCH 60/62] Translated using Weblate (Persian) Currently translated at 99.8% (3189 of 3195 strings) --- OsmAnd/res/values-fa/strings.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/OsmAnd/res/values-fa/strings.xml b/OsmAnd/res/values-fa/strings.xml index c8deb00336..f4cc95516f 100644 --- a/OsmAnd/res/values-fa/strings.xml +++ b/OsmAnd/res/values-fa/strings.xml @@ -3573,4 +3573,9 @@ غیرفعال‌سازی محاسبهٔ مجدد مسافت کمینی برای مسیریابی مجدد اگر مسافت تا مسیر بیش از پارامتر تعیین‌شده باشد، مسیر دوباره محاسبه می‌شود + پروفایل سفارشی + زاویه: ‎%s° + زاویه + تا مسیریابی مجدد انجام شود میان موقعیت من و مسیر محاسبه‌شده یک پاره‌خط مستقیم اضافه می‌شود + کمترین زاویه میان موقعیت من و مسیر \ No newline at end of file From 00e5550044a53aa0521f42116369ced1710ba5c9 Mon Sep 17 00:00:00 2001 From: Hakuchi Date: Wed, 19 Feb 2020 22:24:29 +0000 Subject: [PATCH 61/62] Translated using Weblate (German) Currently translated at 100.0% (3772 of 3772 strings) --- OsmAnd/res/values-de/phrases.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-de/phrases.xml b/OsmAnd/res/values-de/phrases.xml index 9102d5ed09..afcde22646 100644 --- a/OsmAnd/res/values-de/phrases.xml +++ b/OsmAnd/res/values-de/phrases.xml @@ -3794,4 +3794,5 @@ Bow­ling­cen­ter Pistenreferenznummer Jagdbasis + Tauchzentrum \ No newline at end of file From 8f5eee8d9391b137db93915419be5c7f9c7d994b Mon Sep 17 00:00:00 2001 From: Tymofij Lytvynenko Date: Wed, 19 Feb 2020 22:52:43 +0000 Subject: [PATCH 62/62] Translated using Weblate (Ukrainian) Currently translated at 100.0% (3195 of 3195 strings) --- OsmAnd/res/values-uk/strings.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/OsmAnd/res/values-uk/strings.xml b/OsmAnd/res/values-uk/strings.xml index a8a6ea2248..9fb7ed9cb7 100644 --- a/OsmAnd/res/values-uk/strings.xml +++ b/OsmAnd/res/values-uk/strings.xml @@ -3536,4 +3536,9 @@ Вимкнути перерахунок Найменша відстань для перерахунку маршруту Маршрут буде перераховано, якщо відстань до нього перевищує вказане + Користувацький профіль + Кут: %s° + Кут + Додатковий прямий відрізок між моїм розташуванням та розрахунковим маршрутом відображатиметься, поки маршрут не буде перераховано + Найменший кут між моїм розташуванням та маршрутом \ No newline at end of file