From 09e571fcce454e799ec1b427307fbbe1f9a2775f Mon Sep 17 00:00:00 2001 From: GaidamakUA Date: Fri, 3 Jun 2016 18:30:15 +0300 Subject: [PATCH] Implementing preservation of impassable roads in progress. --- .../osmand/router/RoutingConfiguration.java | 1 - .../osmand/plus/CurrentPositionHelper.java | 3 - .../src/net/osmand/plus/OsmandSettings.java | 54 ++++++++++++ .../plus/helpers/AvoidSpecificRoads.java | 84 ++++++++++++------- .../plus/views/ImpassableRoadsLayer.java | 2 +- 5 files changed, 109 insertions(+), 35 deletions(-) diff --git a/OsmAnd-java/src/net/osmand/router/RoutingConfiguration.java b/OsmAnd-java/src/net/osmand/router/RoutingConfiguration.java index 042ece284d..0120c3b22e 100644 --- a/OsmAnd-java/src/net/osmand/router/RoutingConfiguration.java +++ b/OsmAnd-java/src/net/osmand/router/RoutingConfiguration.java @@ -141,7 +141,6 @@ public class RoutingConfiguration { public void removeImpassableRoad(RouteDataObject obj) { impassableRoadLocations.remove(obj.id); impassableRoads.remove(obj); - } } diff --git a/OsmAnd/src/net/osmand/plus/CurrentPositionHelper.java b/OsmAnd/src/net/osmand/plus/CurrentPositionHelper.java index 7efab7e032..cc180aece2 100644 --- a/OsmAnd/src/net/osmand/plus/CurrentPositionHelper.java +++ b/OsmAnd/src/net/osmand/plus/CurrentPositionHelper.java @@ -2,7 +2,6 @@ package net.osmand.plus; import java.io.IOException; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -15,10 +14,8 @@ import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion; import net.osmand.binary.GeocodingUtilities; import net.osmand.binary.GeocodingUtilities.GeocodingResult; import net.osmand.binary.RouteDataObject; -import net.osmand.plus.resources.RegionAddressRepository; import net.osmand.plus.resources.ResourceManager.BinaryMapReaderResource; import net.osmand.plus.resources.ResourceManager.BinaryMapReaderResourceType; -import net.osmand.plus.resources.ResourceManager.ResourceListener; import net.osmand.router.GeneralRouter.GeneralRouterProfile; import net.osmand.router.RoutePlannerFrontEnd; import net.osmand.router.RoutingConfiguration; diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java index d49580f820..5fd6c2d7e4 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java @@ -1609,6 +1609,10 @@ public class OsmandSettings { private MapMarkersStorage mapMarkersStorage = new MapMarkersStorage(); private MapMarkersHistoryStorage mapMarkersHistoryStorage = new MapMarkersHistoryStorage(); + private static final String IMPASSABLE_ROAD_POINTS = "impassable_road_points"; + private static final String IMPASSABLE_ROADS_DESCRIPTIONS = "impassable_roads_descriptions"; + private ImpassableRoadsStorage mImpassableRoadsStorage = new ImpassableRoadsStorage(); + public void backupPointToStart() { settingsAPI.edit(globalPreferences) .putFloat(START_POINT_LAT_BACKUP, settingsAPI.getFloat(globalPreferences, START_POINT_LAT, 0)) @@ -2041,6 +2045,13 @@ public class OsmandSettings { } } + private class ImpassableRoadsStorage extends MapPointsStorage { + public ImpassableRoadsStorage() { + pointsKey = IMPASSABLE_ROAD_POINTS; + descriptionsKey = IMPASSABLE_ROADS_DESCRIPTIONS; + } + } + private abstract class MapPointsStorage { protected String pointsKey; @@ -2119,6 +2130,19 @@ public class OsmandSettings { } } + public boolean deletePoint(LatLon latLon) { + List ps = getPoints(); + List ds = getPointDescriptions(ps.size()); + int index = ps.indexOf(latLon); + if (index != -1) { + ps.remove(index); + ds.remove(index); + return savePoints(ps, ds); + } else { + return false; + } + } + public boolean savePoints(List ps, List ds) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < ps.size(); i++) { @@ -2143,6 +2167,18 @@ public class OsmandSettings { .putString(descriptionsKey, tb.toString()) .commit(); } + + public boolean movePoint(LatLon latLonEx, LatLon latLonNew) { + List ps = getPoints(); + List ds = getPointDescriptions(ps.size()); + int i = ps.indexOf(latLonEx); + if (i != -1) { + ps.set(i, latLonNew); + return savePoints(ps, ds); + } else { + return false; + } + } } @@ -2292,6 +2328,24 @@ public class OsmandSettings { return settingsAPI.edit(globalPreferences).putInt(POINT_NAVIGATE_ROUTE, NAVIGATE).commit(); } + public List getImpassableRoadPoints() { + return mImpassableRoadsStorage.getPoints(); + } + public boolean addImpassableRoad(double latitude, double longitude) { + return mImpassableRoadsStorage.insertPoint(latitude, longitude, null, 0); + } + + public boolean deleteImpassableRoad(int index) { + return mImpassableRoadsStorage.deletePoint(index); + } + + public boolean deleteImpassableRoad(LatLon latLon) { + return mImpassableRoadsStorage.deletePoint(latLon); + } + + public boolean moveImpassableRoad(LatLon latLonEx, LatLon latLonNew) { + return mImpassableRoadsStorage.movePoint(latLonEx, latLonNew); + } /** * the location of a parked car diff --git a/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java b/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java index 31d0c80496..6e8561003f 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java +++ b/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java @@ -1,6 +1,8 @@ package net.osmand.plus.helpers; import android.content.DialogInterface; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v7.app.AlertDialog; import android.view.View; import android.view.ViewGroup; @@ -36,19 +38,23 @@ public class AvoidSpecificRoads { public AvoidSpecificRoads(OsmandApplication app) { this.app = app; + List impassibleRoads = app.getSettings().getImpassableRoadPoints(); + for (LatLon impassibleRoad : impassibleRoads) { + addImpassableRoad(null, impassibleRoad, false, null, true); + } } - + public List getMissingRoads() { - if(missingRoads == null) { + if (missingRoads == null) { missingRoads = app.getDefaultRoutingConfig().getImpassableRoads(); } return missingRoads; } - + protected net.osmand.router.RoutingConfiguration.Builder getBuilder() { return RoutingConfiguration.getDefault(); } - + public ArrayAdapter createAdapter(final MapActivity ctx) { final ArrayList points = new ArrayList(); points.addAll(getMissingRoads()); @@ -80,6 +86,7 @@ public class AvoidSpecificRoads { @Override public void onClick(View v) { + app.getSettings().deleteImpassableRoad(getLocation(obj)); remove(obj); getBuilder().removeImpassableRoad(obj); notifyDataSetChanged(); @@ -91,8 +98,6 @@ public class AvoidSpecificRoads { }); return v; } - - }; } @@ -102,13 +107,13 @@ public class AvoidSpecificRoads { obj.getRef(), obj.getDestinationName(app.getSettings().MAP_PREFERRED_LOCALE.get()), app.getString(R.string.towards)); } - public void showDialog(final MapActivity mapActivity) { + public void showDialog(@NonNull final MapActivity mapActivity) { AlertDialog.Builder bld = new AlertDialog.Builder(mapActivity); bld.setTitle(R.string.impassable_road); - if (getMissingRoads().size() == 0){ + if (getMissingRoads().size() == 0) { bld.setMessage(R.string.avoid_roads_msg); } else { - final ArrayAdapter listAdapter = createAdapter(mapActivity); + final ArrayAdapter listAdapter = createAdapter(mapActivity); bld.setAdapter(listAdapter, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { @@ -130,23 +135,26 @@ public class AvoidSpecificRoads { bld.setNegativeButton(R.string.shared_string_close, null); bld.show(); } - - + + protected void selectFromMap(final MapActivity mapActivity) { ContextMenuLayer cm = mapActivity.getMapLayers().getContextMenuLayer(); cm.setSelectOnMap(new CallbackWithObject() { @Override public boolean processResult(LatLon result) { - addImpassableRoad(mapActivity, result, true, null); + addImpassableRoad(mapActivity, result, true, null, false); return true; } }); } - public void addImpassableRoad(final MapActivity activity, final LatLon loc, - final boolean showDialog, final AvoidSpecificRoadsCallback callback) { + public void addImpassableRoad(@Nullable final MapActivity activity, + @NonNull final LatLon loc, + final boolean showDialog, + @Nullable final AvoidSpecificRoadsCallback callback, + final boolean skipWritingSettings) { final Location ll = new Location(""); ll.setLatitude(loc.getLatitude()); ll.setLongitude(loc.getLongitude()); @@ -155,7 +163,9 @@ public class AvoidSpecificRoads { @Override public boolean publish(RouteDataObject object) { if (object == null) { - Toast.makeText(activity, R.string.error_avoid_specific_road, Toast.LENGTH_LONG).show(); + if (activity != null) { + Toast.makeText(activity, R.string.error_avoid_specific_road, Toast.LENGTH_LONG).show(); + } if (callback != null) { callback.onAddImpassableRoad(false, null); } @@ -171,18 +181,22 @@ public class AvoidSpecificRoads { @Override public boolean isCancelled() { - if (callback != null) { - return callback.isCancelled(); - } - return false; + return callback != null && callback.isCancelled(); } }); + if (!skipWritingSettings) { + app.getSettings().addImpassableRoad(loc.getLatitude(), loc.getLongitude()); + } } public void replaceImpassableRoad(final MapActivity activity, final RouteDataObject currentObject, final LatLon loc, final boolean showDialog, final AvoidSpecificRoadsCallback callback) { + + LatLon latLon = getLocation(currentObject); + app.getSettings().moveImpassableRoad(latLon, loc); + final Location ll = new Location(""); ll.setLatitude(loc.getLatitude()); ll.setLongitude(loc.getLongitude()); @@ -213,28 +227,33 @@ public class AvoidSpecificRoads { } return false; } - }); } - private void addImpassableRoadInternal(RouteDataObject object, Location ll, boolean showDialog, MapActivity activity, LatLon loc) { + private void addImpassableRoadInternal(@NonNull RouteDataObject object, + @NonNull Location ll, + boolean showDialog, + @Nullable MapActivity activity, + @NonNull LatLon loc) { getBuilder().addImpassableRoad(object, ll); RoutingHelper rh = app.getRoutingHelper(); - if(rh.isRouteCalculated() || rh.isRouteBeingCalculated()) { + if (rh.isRouteCalculated() || rh.isRouteBeingCalculated()) { rh.recalculateRouteDueToSettingsChange(); } - if (showDialog) { - showDialog(activity); + if (activity != null) { + if (showDialog) { + showDialog(activity); + } + MapContextMenu menu = activity.getContextMenu(); + if (menu.isActive() && menu.getLatLon().equals(loc)) { + menu.close(); + } + activity.refreshMap(); } - MapContextMenu menu = activity.getContextMenu(); - if (menu.isActive() && menu.getLatLon().equals(loc)) { - menu.close(); - } - activity.refreshMap(); } private void showOnMap(MapActivity ctx, double lat, double lon, String name, - DialogInterface dialog) { + DialogInterface dialog) { AnimateDraggingMapThread thread = ctx.getMapView().getAnimatedDraggingThread(); int fZoom = ctx.getMapView().getZoom() < 15 ? 15 : ctx.getMapView().getZoom(); if (thread.isAnimating()) { @@ -247,6 +266,11 @@ public class AvoidSpecificRoads { dialog.dismiss(); } + private LatLon getLocation(RouteDataObject object) { + Location location = app.getDefaultRoutingConfig().getImpassableRoadLocations().get(object.getId()); + return new LatLon(location.getLatitude(), location.getLongitude()); + } + public interface AvoidSpecificRoadsCallback { void onAddImpassableRoad(boolean success, RouteDataObject newObject); diff --git a/OsmAnd/src/net/osmand/plus/views/ImpassableRoadsLayer.java b/OsmAnd/src/net/osmand/plus/views/ImpassableRoadsLayer.java index fd5ce04c53..fd8e2604bc 100644 --- a/OsmAnd/src/net/osmand/plus/views/ImpassableRoadsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/ImpassableRoadsLayer.java @@ -186,7 +186,7 @@ public class ImpassableRoadsLayer extends OsmandMapLayer implements public boolean onContextMenuClick(ArrayAdapter adapter, int itemId, int pos, boolean isChecked) { if (itemId == R.string.avoid_road) { activity.getMyApplication().getAvoidSpecificRoads().addImpassableRoad( - activity, latLon, false, null); + activity, latLon, false, null, false); } return true; }