Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
bd1372de4d
4 changed files with 132 additions and 52 deletions
|
@ -138,7 +138,7 @@ public class MapActivityLayers {
|
||||||
mFavouritesLayer = new FavouritesLayer();
|
mFavouritesLayer = new FavouritesLayer();
|
||||||
mapView.addLayer(mFavouritesLayer, 4);
|
mapView.addLayer(mFavouritesLayer, 4);
|
||||||
// 5. transport layer
|
// 5. transport layer
|
||||||
transportStopsLayer = new TransportStopsLayer();
|
transportStopsLayer = new TransportStopsLayer(activity);
|
||||||
// 5.95 all text labels
|
// 5.95 all text labels
|
||||||
// 6. point location layer
|
// 6. point location layer
|
||||||
locationLayer = new PointLocationLayer(activity.getMapViewTrackingUtilities());
|
locationLayer = new PointLocationLayer(activity.getMapViewTrackingUtilities());
|
||||||
|
|
|
@ -13,7 +13,6 @@ import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.support.annotation.RequiresPermission;
|
import android.support.annotation.RequiresPermission;
|
||||||
import android.support.v4.content.ContextCompat;
|
import android.support.v4.content.ContextCompat;
|
||||||
import android.util.Log;
|
|
||||||
import android.view.GestureDetector;
|
import android.view.GestureDetector;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
@ -21,7 +20,6 @@ import android.widget.ArrayAdapter;
|
||||||
import android.widget.FrameLayout.LayoutParams;
|
import android.widget.FrameLayout.LayoutParams;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
|
|
||||||
import net.osmand.AndroidUtils;
|
|
||||||
import net.osmand.CallbackWithObject;
|
import net.osmand.CallbackWithObject;
|
||||||
import net.osmand.NativeLibrary.RenderedObject;
|
import net.osmand.NativeLibrary.RenderedObject;
|
||||||
import net.osmand.RenderingContext;
|
import net.osmand.RenderingContext;
|
||||||
|
@ -33,7 +31,12 @@ import net.osmand.data.PointDescription;
|
||||||
import net.osmand.data.QuadRect;
|
import net.osmand.data.QuadRect;
|
||||||
import net.osmand.data.RotatedTileBox;
|
import net.osmand.data.RotatedTileBox;
|
||||||
import net.osmand.data.TransportStop;
|
import net.osmand.data.TransportStop;
|
||||||
|
import net.osmand.osm.MapPoiTypes;
|
||||||
import net.osmand.osm.PoiCategory;
|
import net.osmand.osm.PoiCategory;
|
||||||
|
import net.osmand.osm.PoiFilter;
|
||||||
|
import net.osmand.osm.PoiType;
|
||||||
|
import net.osmand.osm.edit.Node;
|
||||||
|
import net.osmand.osm.edit.OsmMapUtils;
|
||||||
import net.osmand.plus.ContextMenuAdapter;
|
import net.osmand.plus.ContextMenuAdapter;
|
||||||
import net.osmand.plus.ContextMenuItem;
|
import net.osmand.plus.ContextMenuItem;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
|
@ -42,9 +45,12 @@ import net.osmand.plus.mapcontextmenu.MapContextMenu;
|
||||||
import net.osmand.plus.mapcontextmenu.other.MapMultiSelectionMenu;
|
import net.osmand.plus.mapcontextmenu.other.MapMultiSelectionMenu;
|
||||||
import net.osmand.plus.render.MapRenderRepositories;
|
import net.osmand.plus.render.MapRenderRepositories;
|
||||||
import net.osmand.plus.render.NativeOsmandLibrary;
|
import net.osmand.plus.render.NativeOsmandLibrary;
|
||||||
|
import net.osmand.util.Algorithms;
|
||||||
import net.osmand.util.MapUtils;
|
import net.osmand.util.MapUtils;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -77,6 +83,8 @@ public class ContextMenuLayer extends OsmandMapLayer {
|
||||||
private LatLon applyingMarkerLatLon;
|
private LatLon applyingMarkerLatLon;
|
||||||
private boolean wasCollapseButtonVisible;
|
private boolean wasCollapseButtonVisible;
|
||||||
|
|
||||||
|
private List<String> publicTransportTypes;
|
||||||
|
|
||||||
public ContextMenuLayer(MapActivity activity) {
|
public ContextMenuLayer(MapActivity activity) {
|
||||||
this.activity = activity;
|
this.activity = activity;
|
||||||
menu = activity.getContextMenu();
|
menu = activity.getContextMenu();
|
||||||
|
@ -105,6 +113,19 @@ public class ContextMenuLayer extends OsmandMapLayer {
|
||||||
paint = new Paint();
|
paint = new Paint();
|
||||||
pressedBitmap = BitmapFactory.decodeResource(view.getResources(), R.drawable.map_shield_tap);
|
pressedBitmap = BitmapFactory.decodeResource(view.getResources(), R.drawable.map_shield_tap);
|
||||||
pressedBitmapSmall = BitmapFactory.decodeResource(view.getResources(), R.drawable.map_shield_tap_small);
|
pressedBitmapSmall = BitmapFactory.decodeResource(view.getResources(), R.drawable.map_shield_tap_small);
|
||||||
|
|
||||||
|
publicTransportTypes = new ArrayList<>();
|
||||||
|
List<PoiFilter> filters = activity.getMyApplication().getPoiTypes().getPoiCategoryByName("transportation").getPoiFilters();
|
||||||
|
for (PoiFilter poiFilter : filters) {
|
||||||
|
if (poiFilter.getKeyName().equals("public_transport")) {
|
||||||
|
for (PoiType poiType : poiFilter.getPoiTypes()) {
|
||||||
|
publicTransportTypes.add(poiType.getKeyName());
|
||||||
|
for (PoiType poiAdditionalType : poiType.getPoiAdditionals()) {
|
||||||
|
publicTransportTypes.add(poiAdditionalType.getKeyName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isVisible() {
|
public boolean isVisible() {
|
||||||
|
@ -537,9 +558,7 @@ public class ContextMenuLayer extends OsmandMapLayer {
|
||||||
} else {
|
} else {
|
||||||
NativeOsmandLibrary nativeLib = NativeOsmandLibrary.getLoadedLibrary();
|
NativeOsmandLibrary nativeLib = NativeOsmandLibrary.getLoadedLibrary();
|
||||||
if (nativeLib != null) {
|
if (nativeLib != null) {
|
||||||
//RenderingContext rc = new RenderingContext(activity.getMyApplication());
|
|
||||||
MapRenderRepositories maps = activity.getMyApplication().getResourceManager().getRenderer();
|
MapRenderRepositories maps = activity.getMyApplication().getResourceManager().getRenderer();
|
||||||
|
|
||||||
RenderingContext rc = maps.getVisibleRenderingContext();
|
RenderingContext rc = maps.getVisibleRenderingContext();
|
||||||
RenderedObject[] renderedObjects = null;
|
RenderedObject[] renderedObjects = null;
|
||||||
if(rc.zoom == tileBox.getZoom()) {
|
if(rc.zoom == tileBox.getZoom()) {
|
||||||
|
@ -553,13 +572,8 @@ public class ContextMenuLayer extends OsmandMapLayer {
|
||||||
Map<Object, IContextMenuProvider> selectedObjects = new HashMap<>();
|
Map<Object, IContextMenuProvider> selectedObjects = new HashMap<>();
|
||||||
IContextMenuProvider poiMenuProvider = activity.getMapLayers().getPoiMapLayer();
|
IContextMenuProvider poiMenuProvider = activity.getMapLayers().getPoiMapLayer();
|
||||||
IContextMenuProvider transportStopMenuProvider = activity.getMapLayers().getTransportStopsLayer();
|
IContextMenuProvider transportStopMenuProvider = activity.getMapLayers().getTransportStopsLayer();
|
||||||
Log.e("111", "found " + renderedObjects.length + " object(s) at x=" + point.x + " y=" + point.y);
|
|
||||||
LatLon latLon = null;
|
LatLon latLon = null;
|
||||||
for (RenderedObject renderedObject : renderedObjects) {
|
for (RenderedObject renderedObject : renderedObjects) {
|
||||||
Log.e("111", "++++ object=" + renderedObject.getName());
|
|
||||||
for (Entry<String, String> entry : renderedObject.getTags().entrySet()) {
|
|
||||||
Log.e("111", "tag=" + entry.getKey() + " value=" + entry.getValue());
|
|
||||||
}
|
|
||||||
if (renderedObject.getX() != null && renderedObject.getX().size() == 1
|
if (renderedObject.getX() != null && renderedObject.getX().size() == 1
|
||||||
&& renderedObject.getY() != null && renderedObject.getY().size() == 1) {
|
&& renderedObject.getY() != null && renderedObject.getY().size() == 1) {
|
||||||
latLon = new LatLon(MapUtils.get31LatitudeY(renderedObject.getY().get(0)),
|
latLon = new LatLon(MapUtils.get31LatitudeY(renderedObject.getY().get(0)),
|
||||||
|
@ -568,37 +582,48 @@ public class ContextMenuLayer extends OsmandMapLayer {
|
||||||
latLon = tileBox.getLatLonFromPixel(point.x, point.y);
|
latLon = tileBox.getLatLonFromPixel(point.x, point.y);
|
||||||
}
|
}
|
||||||
if (renderedObject.getId() != null) {
|
if (renderedObject.getId() != null) {
|
||||||
TransportStop transportStop = findTransportStop(renderedObject.getId() >> 6, latLon.getLatitude(), latLon.getLongitude());
|
TransportStop transportStop = findTransportStop(renderedObject.getId() >> 1, latLon.getLatitude(), latLon.getLongitude());
|
||||||
if (transportStop != null) {
|
if (transportStop != null) {
|
||||||
selectedObjects.put(transportStop, transportStopMenuProvider);
|
selectedObjects.put(transportStop, transportStopMenuProvider);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
Amenity amenity = findAmenity(renderedObject.getId() >> 6, latLon.getLatitude(), latLon.getLongitude());
|
List<String> names = new ArrayList<>();
|
||||||
|
if (!Algorithms.isEmpty(renderedObject.getName())) {
|
||||||
|
names.add(renderedObject.getName());
|
||||||
|
}
|
||||||
|
for (Entry<String, String> entry : renderedObject.getTags().entrySet()) {
|
||||||
|
if (entry.getKey().startsWith("name")) {
|
||||||
|
names.add(entry.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Amenity amenity = findAmenity(renderedObject.getId() >> 6, names,
|
||||||
|
latLon.getLatitude(), latLon.getLongitude());
|
||||||
if (amenity != null) {
|
if (amenity != null) {
|
||||||
selectedObjects.put(amenity, poiMenuProvider);
|
selectedObjects.put(amenity, poiMenuProvider);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
TransportStop nearestTransportStop = findNearestTransportStop(latLon.getLatitude(), latLon.getLongitude());
|
||||||
|
if (nearestTransportStop != null) {
|
||||||
|
selectedObjects.put(nearestTransportStop, transportStopMenuProvider);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (renderedObject.getX() != null && renderedObject.getX().size() > 1
|
if (renderedObject.getX() != null && renderedObject.getX().size() > 1
|
||||||
&& renderedObject.getY() != null && renderedObject.getY().size() > 1) {
|
&& renderedObject.getY() != null && renderedObject.getY().size() > 1) {
|
||||||
|
|
||||||
PointF[] points = new PointF[renderedObject.getX().size()];
|
List<Node> nodes = new ArrayList<>(renderedObject.getX().size());
|
||||||
for (int i = 0; i < points.length; i++) {
|
for (int i = 0; i < renderedObject.getX().size(); i++) {
|
||||||
points[i] = new PointF(renderedObject.getX().get(i), renderedObject.getY().get(i));
|
nodes.add(new Node(MapUtils.get31LatitudeY(renderedObject.getY().get(i)),
|
||||||
|
MapUtils.get31LongitudeX(renderedObject.getX().get(i)), 0));
|
||||||
}
|
}
|
||||||
PointF center = AndroidUtils.centroidForPoly(points);
|
latLon = OsmMapUtils.getMathWeightCenterForNodes(nodes);
|
||||||
latLon = new LatLon(MapUtils.get31LatitudeY((int)center.y),
|
|
||||||
MapUtils.get31LongitudeX((int)center.x));
|
|
||||||
}
|
}
|
||||||
selectedObjects.put(renderedObject, null);
|
selectedObjects.put(renderedObject, null);
|
||||||
}
|
}
|
||||||
Log.e("111", "------------------");
|
|
||||||
}
|
}
|
||||||
if (selectedObjects.size() > 0 && latLon != null) {
|
if (selectedObjects.size() > 0 && latLon != null) {
|
||||||
showContextMenu(latLon, selectedObjects);
|
showContextMenu(latLon, selectedObjects);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
Log.e("111", "objects not found at x=" + point.x + " y=" + point.y);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -609,7 +634,7 @@ public class ContextMenuLayer extends OsmandMapLayer {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Amenity findAmenity(long id, double lat, double lon) {
|
private Amenity findAmenity(long id, List<String> names, double lat, double lon) {
|
||||||
QuadRect rect = MapUtils.calculateLatLonBbox(lat, lon, 150);
|
QuadRect rect = MapUtils.calculateLatLonBbox(lat, lon, 150);
|
||||||
List<Amenity> amenities = activity.getMyApplication().getResourceManager().searchAmenities(
|
List<Amenity> amenities = activity.getMyApplication().getResourceManager().searchAmenities(
|
||||||
new BinaryMapIndexReader.SearchPoiTypeFilter() {
|
new BinaryMapIndexReader.SearchPoiTypeFilter() {
|
||||||
|
@ -624,19 +649,43 @@ public class ContextMenuLayer extends OsmandMapLayer {
|
||||||
}
|
}
|
||||||
}, rect.top, rect.left, rect.bottom, rect.right, -1, null);
|
}, rect.top, rect.left, rect.bottom, rect.right, -1, null);
|
||||||
|
|
||||||
|
Amenity res = null;
|
||||||
for (Amenity amenity : amenities) {
|
for (Amenity amenity : amenities) {
|
||||||
Long amenityId = amenity.getId();
|
Long amenityId = amenity.getId();
|
||||||
if (amenityId != null && amenityId == id) {
|
if (amenityId != null && amenityId == id) {
|
||||||
return amenity;
|
res = amenity;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (res == null && (id & 1) == 0) {
|
||||||
|
id++;
|
||||||
for (Amenity amenity : amenities) {
|
for (Amenity amenity : amenities) {
|
||||||
Long amenityId = amenity.getId();
|
Long amenityId = amenity.getId();
|
||||||
if (amenityId != null && Math.abs(amenityId - id) < 2) {
|
if (amenityId != null && amenityId == id) {
|
||||||
return amenity;
|
res = amenity;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
}
|
||||||
|
if (res == null && names != null && names.size() > 0) {
|
||||||
|
for (Amenity amenity : amenities) {
|
||||||
|
for (String name : names) {
|
||||||
|
if (name.equals(amenity.getName())) {
|
||||||
|
res = amenity;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (res != null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res != null && publicTransportTypes.contains(res.getSubType())) {
|
||||||
|
return findNearestTransportStop(lat, lon) == null ? res : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
private TransportStop findTransportStop(long id, double lat, double lon) {
|
private TransportStop findTransportStop(long id, double lat, double lon) {
|
||||||
|
@ -663,11 +712,35 @@ public class ContextMenuLayer extends OsmandMapLayer {
|
||||||
return stop;
|
return stop;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (TransportStop stop : res) {
|
return null;
|
||||||
Long stopId = stop.getId();
|
|
||||||
if (stopId != null && Math.abs(stopId - id) < 2) {
|
|
||||||
return stop;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private TransportStop findNearestTransportStop(final double lat, final double lon) {
|
||||||
|
|
||||||
|
QuadRect rect = MapUtils.calculateLatLonBbox(lat, lon, 50);
|
||||||
|
List<TransportStop> res = activity.getMyApplication().getResourceManager()
|
||||||
|
.searchTransportSync(rect.top, rect.left, rect.bottom, rect.right,
|
||||||
|
new ResultMatcher<TransportStop>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean publish(TransportStop object) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCancelled() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (res.size() > 0) {
|
||||||
|
Collections.sort(res, new Comparator<TransportStop>() {
|
||||||
|
@Override
|
||||||
|
public int compare(TransportStop stop1, TransportStop stop2) {
|
||||||
|
return Double.compare(MapUtils.getDistance(stop1.getLocation(), lat, lon), MapUtils.getDistance(stop2.getLocation(), lat, lon));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return res.get(0);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
package net.osmand.plus.views;
|
package net.osmand.plus.views;
|
||||||
|
|
||||||
import gnu.trove.list.array.TIntArrayList;
|
import android.content.Context;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
import java.util.ArrayList;
|
import android.graphics.BitmapFactory;
|
||||||
import java.util.Collections;
|
import android.graphics.Canvas;
|
||||||
import java.util.Comparator;
|
import android.graphics.Paint;
|
||||||
import java.util.List;
|
import android.graphics.Path;
|
||||||
import java.util.TreeSet;
|
import android.graphics.PointF;
|
||||||
|
import android.util.DisplayMetrics;
|
||||||
|
import android.view.WindowManager;
|
||||||
|
|
||||||
import net.osmand.ResultMatcher;
|
import net.osmand.ResultMatcher;
|
||||||
import net.osmand.data.LatLon;
|
import net.osmand.data.LatLon;
|
||||||
|
@ -19,20 +21,21 @@ import net.osmand.data.TransportStop;
|
||||||
import net.osmand.osm.edit.Node;
|
import net.osmand.osm.edit.Node;
|
||||||
import net.osmand.osm.edit.Way;
|
import net.osmand.osm.edit.Way;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import android.content.Context;
|
import net.osmand.plus.activities.MapActivity;
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.graphics.BitmapFactory;
|
import java.util.ArrayList;
|
||||||
import android.graphics.Canvas;
|
import java.util.Collections;
|
||||||
import android.graphics.Paint;
|
import java.util.Comparator;
|
||||||
import android.graphics.Path;
|
import java.util.List;
|
||||||
import android.graphics.PointF;
|
import java.util.TreeSet;
|
||||||
import android.util.DisplayMetrics;
|
|
||||||
import android.view.WindowManager;
|
import gnu.trove.list.array.TIntArrayList;
|
||||||
|
|
||||||
public class TransportStopsLayer extends OsmandMapLayer implements ContextMenuLayer.IContextMenuProvider {
|
public class TransportStopsLayer extends OsmandMapLayer implements ContextMenuLayer.IContextMenuProvider {
|
||||||
private static final int startZoom = 12;
|
private static final int startZoom = 12;
|
||||||
private static final int startZoomRoute = 10;
|
private static final int startZoomRoute = 10;
|
||||||
|
|
||||||
|
private final MapActivity mapActivity;
|
||||||
private OsmandMapTileView view;
|
private OsmandMapTileView view;
|
||||||
|
|
||||||
private Paint paintIcon;
|
private Paint paintIcon;
|
||||||
|
@ -45,6 +48,10 @@ public class TransportStopsLayer extends OsmandMapLayer implements ContextMenuLa
|
||||||
|
|
||||||
private Path path;
|
private Path path;
|
||||||
|
|
||||||
|
public TransportStopsLayer(MapActivity mapActivity) {
|
||||||
|
this.mapActivity = mapActivity;
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
@Override
|
@Override
|
||||||
public void initLayer(final OsmandMapTileView view) {
|
public void initLayer(final OsmandMapTileView view) {
|
||||||
|
@ -242,7 +249,7 @@ public class TransportStopsLayer extends OsmandMapLayer implements ContextMenuLa
|
||||||
@Override
|
@Override
|
||||||
public PointDescription getObjectName(Object o) {
|
public PointDescription getObjectName(Object o) {
|
||||||
if(o instanceof TransportStop){
|
if(o instanceof TransportStop){
|
||||||
return new PointDescription(PointDescription.POINT_TYPE_TRANSPORT_STOP, view.getContext().getString(R.string.transport_Stop),
|
return new PointDescription(PointDescription.POINT_TYPE_TRANSPORT_STOP, mapActivity.getString(R.string.transport_Stop),
|
||||||
((TransportStop)o).getName());
|
((TransportStop)o).getName());
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -3,7 +3,7 @@ buildscript {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:2.1.3'
|
classpath 'com.android.tools.build:gradle:2.2.0'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue