Impassable roads layer. Context menu implemented.

This commit is contained in:
GaidamakUA 2016-01-11 17:33:05 +02:00
parent 5362feabe1
commit b8f918f34f
4 changed files with 159 additions and 10 deletions

View file

@ -28,4 +28,5 @@
<string name="hint_value">Value</string> <string name="hint_value">Value</string>
<string name="clear_updates_proposition_message">"You can remove downloaded updates and free "</string> <string name="clear_updates_proposition_message">"You can remove downloaded updates and free "</string>
<string name="add_time_span">Add time span</string> <string name="add_time_span">Add time span</string>
<string name="road_blocked">Road blocked</string>
</resources> </resources>

View file

@ -4,6 +4,7 @@ import android.graphics.drawable.Drawable;
import android.view.View; import android.view.View;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import net.osmand.binary.RouteDataObject;
import net.osmand.data.Amenity; import net.osmand.data.Amenity;
import net.osmand.data.FavouritePoint; import net.osmand.data.FavouritePoint;
import net.osmand.data.LatLon; import net.osmand.data.LatLon;
@ -21,6 +22,7 @@ import net.osmand.plus.mapcontextmenu.controllers.AmenityMenuController;
import net.osmand.plus.mapcontextmenu.controllers.FavouritePointMenuController; import net.osmand.plus.mapcontextmenu.controllers.FavouritePointMenuController;
import net.osmand.plus.mapcontextmenu.controllers.GpxItemMenuController; import net.osmand.plus.mapcontextmenu.controllers.GpxItemMenuController;
import net.osmand.plus.mapcontextmenu.controllers.HistoryMenuController; import net.osmand.plus.mapcontextmenu.controllers.HistoryMenuController;
import net.osmand.plus.mapcontextmenu.controllers.ImpassibleRoadsMenuController;
import net.osmand.plus.mapcontextmenu.controllers.MapDataMenuController; import net.osmand.plus.mapcontextmenu.controllers.MapDataMenuController;
import net.osmand.plus.mapcontextmenu.controllers.MyLocationMenuController; import net.osmand.plus.mapcontextmenu.controllers.MyLocationMenuController;
import net.osmand.plus.mapcontextmenu.controllers.PointDescriptionMenuController; import net.osmand.plus.mapcontextmenu.controllers.PointDescriptionMenuController;
@ -105,6 +107,9 @@ public abstract class MenuController extends BaseMenuController {
} else if (pointDescription.isMyLocation()) { } else if (pointDescription.isMyLocation()) {
menuController = new MyLocationMenuController(app, mapActivity, pointDescription); menuController = new MyLocationMenuController(app, mapActivity, pointDescription);
} }
} else if (object instanceof RouteDataObject) {
menuController = new ImpassibleRoadsMenuController(app, mapActivity,
pointDescription, (RouteDataObject) object);
} }
} }
if (menuController == null) { if (menuController == null) {

View file

@ -0,0 +1,52 @@
package net.osmand.plus.mapcontextmenu.controllers;
import android.graphics.drawable.Drawable;
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.mapcontextmenu.MenuBuilder;
import net.osmand.plus.mapcontextmenu.MenuController;
import net.osmand.plus.routing.RoutingHelper;
public class ImpassibleRoadsMenuController extends MenuController {
private RouteDataObject route;
public ImpassibleRoadsMenuController(final OsmandApplication app, final MapActivity mapActivity,
PointDescription pointDescription, RouteDataObject route) {
super(new MenuBuilder(app), pointDescription, mapActivity);
this.route = route;
rightTitleButtonController = new TitleButtonController() {
@Override
public void buttonPressed() {
app.getDefaultRoutingConfig().removeImpassableRoad(
ImpassibleRoadsMenuController.this.route);
RoutingHelper rh = app.getRoutingHelper();
if (rh.isRouteCalculated() || rh.isRouteBeingCalculated()) {
rh.recalculateRouteDueToSettingsChange();
}
getMapActivity().getContextMenu().close();
}
};
rightTitleButtonController.caption = getMapActivity().getString(R.string.shared_string_delete);
rightTitleButtonController.leftIconId = R.drawable.ic_action_delete_dark;
}
@Override
protected void setObject(Object object) {
route = (RouteDataObject) object;
}
@Override
public String getTypeStr() {
return getMapActivity().getString(R.string.road_blocked);
}
@Override
public Drawable getLeftIcon() {
return getMapActivity().getResources().getDrawable(R.drawable.ic_action_road_works_dark);
}
}

View file

@ -4,26 +4,32 @@ import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.PointF;
import net.osmand.Location; import net.osmand.Location;
import net.osmand.binary.RouteDataObject;
import net.osmand.data.LatLon;
import net.osmand.data.PointDescription;
import net.osmand.data.RotatedTileBox; import net.osmand.data.RotatedTileBox;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.osmedit.OpenstreetmapPoint;
import net.osmand.plus.osmedit.OsmEditingPlugin;
import net.osmand.plus.osmedit.OsmNotesPoint;
import net.osmand.plus.osmedit.OsmPoint;
import java.util.List;
import java.util.Map; import java.util.Map;
/** public class ImpassableRoadsLayer extends OsmandMapLayer implements ContextMenuLayer.IContextMenuProvider {
* Created by Denis on
* 20.03.2015.
*/
public class ImpassableRoadsLayer extends OsmandMapLayer {
private static final int startZoom = 10; private static final int startZoom = 10;
private final MapActivity activity; private final MapActivity activity;
private Bitmap roadWorkIcon; private Bitmap roadWorkIcon;
private OsmandMapTileView view; private OsmandMapTileView view;
private Paint paint; private Paint paint;
private Map<Long, Location> missingRoads; private Map<Long, Location> missingRoadLocations;
private List<RouteDataObject> missingRoads;
public ImpassableRoadsLayer(MapActivity activity) { public ImpassableRoadsLayer(MapActivity activity) {
this.activity = activity; this.activity = activity;
@ -44,8 +50,8 @@ public class ImpassableRoadsLayer extends OsmandMapLayer {
@Override @Override
public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) { public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) {
if (tileBox.getZoom() >= startZoom) { if (tileBox.getZoom() >= startZoom) {
for (long id : getMissingRoads().keySet()) { for (long id : getMissingRoadLocations().keySet()) {
Location location = getMissingRoads().get(id); Location location = getMissingRoadLocations().get(id);
float x = tileBox.getPixXFromLatLon(location.getLatitude(), location.getLongitude()); float x = tileBox.getPixXFromLatLon(location.getLatitude(), location.getLongitude());
float y = tileBox.getPixYFromLatLon(location.getLatitude(), location.getLongitude()); float y = tileBox.getPixYFromLatLon(location.getLatitude(), location.getLongitude());
float left = x - roadWorkIcon.getWidth() / 2; float left = x - roadWorkIcon.getWidth() / 2;
@ -55,9 +61,16 @@ public class ImpassableRoadsLayer extends OsmandMapLayer {
} }
} }
public Map<Long, Location> getMissingRoads() { public Map<Long, Location> getMissingRoadLocations() {
if(missingRoadLocations == null) {
missingRoadLocations = activity.getMyApplication().getDefaultRoutingConfig().getImpassableRoadLocations();
}
return missingRoadLocations;
}
public List<RouteDataObject> getMissingRoads() {
if(missingRoads == null) { if(missingRoads == null) {
missingRoads = activity.getMyApplication().getDefaultRoutingConfig().getImpassableRoadLocations(); missingRoads = activity.getMyApplication().getDefaultRoutingConfig().getImpassableRoads();
} }
return missingRoads; return missingRoads;
} }
@ -71,4 +84,82 @@ public class ImpassableRoadsLayer extends OsmandMapLayer {
public boolean drawInScreenPixels() { public boolean drawInScreenPixels() {
return true; return true;
} }
public int getRadiusPoi(RotatedTileBox tb){
int r = 0;
if(tb.getZoom() < startZoom){
r = 0;
} else {
r = 15;
}
return (int) (r * tb.getDensity());
}
private boolean calculateBelongs(int ex, int ey, int objx, int objy, int radius) {
return Math.abs(objx - ex) <= radius && (ey - objy) <= radius / 2 && (objy - ey) <= 3 * radius ;
}
@Override
public boolean disableSingleTap() {
return false;
}
@Override
public boolean disableLongPressOnMap() {
return false;
}
@Override
public void collectObjectsFromPoint(PointF point, RotatedTileBox tileBox, List<Object> o) {
int ex = (int) point.x;
int ey = (int) point.y;
int compare = getRadiusPoi(tileBox);
int radius = compare * 3 / 2;
for (RouteDataObject road : getMissingRoads()) {
Location location = getMissingRoadLocations().get(road.getId());
int x = (int) tileBox.getPixXFromLatLon(location.getLatitude(), location.getLongitude());
int y = (int) tileBox.getPixYFromLatLon(location.getLatitude(), location.getLongitude());
if (calculateBelongs(ex, ey, x, y, compare)) {
compare = radius;
o.add(road);
}
}
}
@Override
public LatLon getObjectLocation(Object o) {
if (o instanceof OsmPoint) {
return new LatLon(((OsmPoint)o).getLatitude(),((OsmPoint)o).getLongitude());
}
return null;
}
@Override
public String getObjectDescription(Object o) {
if(o instanceof OsmPoint) {
OsmPoint point = (OsmPoint) o;
return OsmEditingPlugin.getEditName(point);
}
return null;
}
@Override
public PointDescription getObjectName(Object o) {
if(o instanceof OsmPoint) {
OsmPoint point = (OsmPoint) o;
String name = "";
String type = "";
if (point.getGroup() == OsmPoint.Group.POI){
name = ((OpenstreetmapPoint) point).getName();
type = PointDescription.POINT_TYPE_OSM_NOTE;
} else if (point.getGroup() == OsmPoint.Group.BUG) {
name = ((OsmNotesPoint) point).getText();
type = PointDescription.POINT_TYPE_OSM_BUG;
}
return new PointDescription(type, name);
}
return null;
}
} }