Delete osmodroid code and add binary inspector ability to trace vrouting
This commit is contained in:
parent
be6cc1fa5b
commit
fe84bf3a6f
7 changed files with 60 additions and 786 deletions
|
@ -1,6 +1,7 @@
|
|||
package net.osmand.binary;
|
||||
|
||||
|
||||
import gnu.trove.iterator.TIntObjectIterator;
|
||||
import gnu.trove.iterator.TLongIterator;
|
||||
import gnu.trove.list.array.TIntArrayList;
|
||||
import gnu.trove.list.array.TLongArrayList;
|
||||
|
@ -34,6 +35,8 @@ import net.osmand.binary.BinaryMapIndexReader.TagValuePair;
|
|||
import net.osmand.binary.BinaryMapPoiReaderAdapter.PoiRegion;
|
||||
import net.osmand.binary.BinaryMapPoiReaderAdapter.PoiSubType;
|
||||
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion;
|
||||
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteSubregion;
|
||||
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
|
||||
import net.osmand.binary.BinaryMapTransportReaderAdapter.TransportIndex;
|
||||
import net.osmand.data.Amenity;
|
||||
import net.osmand.data.AmenityType;
|
||||
|
@ -58,11 +61,13 @@ public class BinaryInspector {
|
|||
if(args.length == 1 && "test".equals(args[0])) {
|
||||
in.inspector(new String[]{
|
||||
//"-vpoi",
|
||||
"-vmap", "-vmapobjects",
|
||||
// "-vmap", "-vmapobjects",
|
||||
// "-vrouting",
|
||||
// "-vaddress", "-vcities", "-vstreets", "-vstreetgroups","-vbuildings",
|
||||
//"-zoom=16",
|
||||
//"-bbox=4,55,7,50",
|
||||
"/home/victor/projects/osmand/osm-gen/Map.obf"
|
||||
// "/home/victor/projects/osmand/osm-gen/Netherlands_europe.obf"
|
||||
// "/home/victor/projects/osmand/osm-gen/World_basemap_2_b.obf___"
|
||||
// "/home/victor/projects/osmand/osm-gen/World_basemap_2.obf__"
|
||||
});
|
||||
|
@ -106,6 +111,7 @@ public class BinaryInspector {
|
|||
boolean vtransport;
|
||||
boolean vpoi;
|
||||
boolean vmap;
|
||||
boolean vrouting;
|
||||
boolean vmapObjects;
|
||||
boolean osm;
|
||||
FileOutputStream osmOut = null;
|
||||
|
@ -126,6 +132,11 @@ public class BinaryInspector {
|
|||
public boolean isVmap() {
|
||||
return vmap;
|
||||
}
|
||||
|
||||
public boolean isVrouting() {
|
||||
return vrouting;
|
||||
}
|
||||
|
||||
public boolean isVpoi() {
|
||||
return vpoi;
|
||||
}
|
||||
|
@ -150,6 +161,8 @@ public class BinaryInspector {
|
|||
vintersections = true;
|
||||
} else if(params[i].equals("-vmap")){
|
||||
vmap = true;
|
||||
} else if(params[i].equals("-vrouting")){
|
||||
vrouting = true;
|
||||
} else if(params[i].equals("-vmapobjects")){
|
||||
vmapObjects = true;
|
||||
} else if(params[i].equals("-vpoi")){
|
||||
|
@ -451,6 +464,9 @@ public class BinaryInspector {
|
|||
RouteRegion ri = ((RouteRegion) p);
|
||||
println("\tBounds " + formatLatBounds(ri.getLeftLongitude(), ri.getRightLongitude(),
|
||||
ri.getTopLatitude(), ri.getBottomLatitude()));
|
||||
if((vInfo != null && vInfo.isVrouting())){
|
||||
printRouteDetailInfo(index, (RouteRegion) p);
|
||||
}
|
||||
} else if(p instanceof MapIndex){
|
||||
MapIndex m = ((MapIndex) p);
|
||||
int j = 1;
|
||||
|
@ -486,6 +502,45 @@ public class BinaryInspector {
|
|||
|
||||
}
|
||||
|
||||
private void printRouteDetailInfo(BinaryMapIndexReader index, RouteRegion p) throws IOException {
|
||||
final DamnCounter mapObjectsCounter = new DamnCounter();
|
||||
final StringBuilder b = new StringBuilder();
|
||||
List<RouteSubregion> regions = index.searchRouteIndexTree(
|
||||
BinaryMapIndexReader.buildSearchRequest(MapUtils.get31TileNumberX(vInfo.lonleft),
|
||||
MapUtils.get31TileNumberX(vInfo.lonright), MapUtils.get31TileNumberY(vInfo.lattop),
|
||||
MapUtils.get31TileNumberY(vInfo.latbottom), vInfo.getZoom(), null),
|
||||
p.getSubregions());
|
||||
index.loadRouteIndexData(regions, new ResultMatcher<RouteDataObject>() {
|
||||
@Override
|
||||
public boolean publish(RouteDataObject obj) {
|
||||
mapObjectsCounter.value++;
|
||||
b.setLength(0);
|
||||
b.append("Road ");
|
||||
b.append(obj.id);
|
||||
for(int i = 0; i < obj.getTypes().length; i++) {
|
||||
RouteTypeRule rr = obj.region.quickGetEncodingRule(obj.getTypes()[i]);
|
||||
b.append(" ").append(rr.getTag()).append("='").append(rr.getValue()).append("'");
|
||||
}
|
||||
if (obj.getNames() != null) {
|
||||
TIntObjectIterator<String> it = obj.getNames().iterator();
|
||||
while (it.hasNext()) {
|
||||
it.advance();
|
||||
RouteTypeRule rr = obj.region.quickGetEncodingRule(it.key());
|
||||
b.append(" ").append(rr.getTag()).append("='").append(it.value()).append("'");
|
||||
}
|
||||
}
|
||||
println(b.toString());
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCancelled() {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
println("\tTotal map objects: " + mapObjectsCounter.value);
|
||||
}
|
||||
|
||||
private void printAddressDetailedInfo(VerboseInfo verbose, BinaryMapIndexReader index, AddressRegion region) throws IOException {
|
||||
String[] cityType_String = new String[] {
|
||||
"Cities/Towns section",
|
||||
|
|
|
@ -112,6 +112,8 @@ public class OsMoControlDevice implements OsMoReactor {
|
|||
return true;
|
||||
} else if(command.equals("TP")) {
|
||||
plugin.getDownloadGpxTask(true).execute(obj);
|
||||
} else if (command.equals("PP")) {
|
||||
service.pushCommand("PP");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -168,9 +168,9 @@ public class OsMoPositionLayer extends OsmandMapLayer implements ContextMenuLaye
|
|||
if (!pos.isEmpty()) {
|
||||
StringBuilder res = new StringBuilder();
|
||||
for (OsMoDevice d : pos) {
|
||||
res.append(getObjectDescription(d));
|
||||
res.append(getObjectDescription(d)).append("\n");
|
||||
}
|
||||
AccessibleToast.makeText(view.getContext(), res.toString(), Toast.LENGTH_LONG).show();
|
||||
AccessibleToast.makeText(view.getContext(), res.toString().trim(), Toast.LENGTH_LONG).show();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
package net.osmand.plus.osmodroid;
|
||||
|
||||
import net.osmand.plus.GPXUtilities.GPXFile;
|
||||
|
||||
public class ColoredGPX {
|
||||
int color;
|
||||
GPXFile gpxFile;
|
||||
}
|
|
@ -1,385 +0,0 @@
|
|||
package net.osmand.plus.osmodroid;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import net.osmand.access.AccessibleToast;
|
||||
import net.osmand.data.LatLon;
|
||||
import net.osmand.data.QuadRect;
|
||||
import net.osmand.data.RotatedTileBox;
|
||||
import net.osmand.plus.*;
|
||||
import net.osmand.plus.ContextMenuAdapter.OnContextMenuClick;
|
||||
import net.osmand.plus.GPXUtilities.GPXFile;
|
||||
import net.osmand.plus.GPXUtilities.WptPt;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.views.ContextMenuLayer;
|
||||
import net.osmand.plus.views.GPXLayer;
|
||||
import net.osmand.plus.views.OsmandMapLayer;
|
||||
import net.osmand.plus.views.OsmandMapTileView;
|
||||
import net.osmand.plus.views.OsmandMapLayer.DrawSettings;
|
||||
import net.osmand.render.RenderingRuleSearchRequest;
|
||||
import net.osmand.render.RenderingRulesStorage;
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Path;
|
||||
import android.graphics.PointF;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.Typeface;
|
||||
import android.graphics.Paint.Cap;
|
||||
import android.graphics.Paint.Join;
|
||||
import android.graphics.Paint.Style;
|
||||
import android.os.RemoteException;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.Toast;
|
||||
import android.content.DialogInterface;
|
||||
|
||||
/**
|
||||
* Class represents a OsMoDroidlayer which depicts the position of Esya.ru channels objects
|
||||
*
|
||||
* @author Denis Fokin
|
||||
* @see OsMoDroidPlugin
|
||||
*
|
||||
*/
|
||||
public class OsMoDroidLayer extends OsmandMapLayer implements ContextMenuLayer.IContextMenuProvider {
|
||||
/**
|
||||
* magic number so far
|
||||
*/
|
||||
private static final int radius = 10;
|
||||
OsMoDroidPoint seekOsMoDroidPoint;
|
||||
OsMoDroidPlugin myOsMoDroidPlugin;
|
||||
|
||||
private DisplayMetrics dm;
|
||||
|
||||
private final MapActivity map;
|
||||
private OsmandMapTileView view;
|
||||
|
||||
private Paint textPaint;
|
||||
|
||||
ArrayList<OsMoDroidPoint> osMoDroidPointArrayList;
|
||||
ArrayList<OsMoDroidPoint> osMoDroidFixedPointArrayList;
|
||||
ArrayList<ColoredGPX> gpxArrayList = new ArrayList<ColoredGPX>() ;
|
||||
int layerId;
|
||||
String layerName;
|
||||
String layerDescription;
|
||||
private Paint paint;
|
||||
|
||||
private Path path;
|
||||
|
||||
private OsmandSettings settings;
|
||||
|
||||
private RenderingRulesStorage cachedRrs;
|
||||
private boolean cachedNightMode;
|
||||
private int cachedColor;
|
||||
|
||||
|
||||
private void initUI() {
|
||||
paint = new Paint();
|
||||
paint.setStyle(Style.STROKE);
|
||||
paint.setStrokeWidth(14);
|
||||
paint.setAntiAlias(true);
|
||||
paint.setStrokeCap(Cap.ROUND);
|
||||
paint.setStrokeJoin(Join.ROUND);
|
||||
|
||||
path = new Path();
|
||||
}
|
||||
private Bitmap opIcon;
|
||||
|
||||
public void refresh() {
|
||||
map.refreshMap();
|
||||
}
|
||||
|
||||
public OsMoDroidLayer(MapActivity map) {
|
||||
this.map = map;
|
||||
}
|
||||
|
||||
public OsMoDroidLayer(MapActivity map, int layerId, OsMoDroidPlugin osMoDroidPlugin, String layerName, String layerDescription) {
|
||||
this.map = map;
|
||||
this.layerId = layerId;
|
||||
this.myOsMoDroidPlugin = osMoDroidPlugin;
|
||||
this.layerName = layerName;
|
||||
this.layerDescription = layerDescription;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initLayer(OsmandMapTileView view) {
|
||||
this.view = view;
|
||||
dm = new DisplayMetrics();
|
||||
WindowManager wmgr = (WindowManager) view.getContext().getSystemService(Context.WINDOW_SERVICE);
|
||||
wmgr.getDefaultDisplay().getMetrics(dm);
|
||||
textPaint = new Paint();
|
||||
textPaint.setDither(true);
|
||||
textPaint.setAntiAlias(true);
|
||||
textPaint.setFilterBitmap(true);
|
||||
|
||||
textPaint.setTextSize(22f);
|
||||
textPaint.setTypeface(Typeface.DEFAULT_BOLD);
|
||||
textPaint.setTextAlign(Paint.Align.CENTER);
|
||||
opIcon = BitmapFactory.decodeResource(view.getResources(), R.drawable.bicycle_location);
|
||||
osMoDroidPointArrayList = myOsMoDroidPlugin.getOsMoDroidPointArrayList(layerId);
|
||||
osMoDroidFixedPointArrayList = myOsMoDroidPlugin.getOsMoDroidFixedPointArrayList(layerId);
|
||||
initUI();
|
||||
}
|
||||
|
||||
public void inGPXFilelist(ArrayList<ColoredGPX> in){
|
||||
gpxArrayList=in;
|
||||
map.refreshMap();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) {
|
||||
|
||||
for (ColoredGPX cg : gpxArrayList){
|
||||
List<List<WptPt>> points = cg.gpxFile.proccessPoints();
|
||||
|
||||
paint.setColor(cg.color);
|
||||
|
||||
final QuadRect latLonBounds = tileBox.getLatLonBounds();
|
||||
for (List<WptPt> l : points) {
|
||||
path.rewind();
|
||||
int startIndex = -1;
|
||||
|
||||
for (int i = 0; i < l.size(); i++) {
|
||||
WptPt ls = l.get(i);
|
||||
if (startIndex == -1) {
|
||||
if (ls.lat >= latLonBounds.bottom - 0.1 && ls.lat <= latLonBounds.top + 0.1 && ls.lon >= latLonBounds.left - 0.1
|
||||
&& ls.lon <= latLonBounds.right + 0.1) {
|
||||
startIndex = i > 0 ? i - 1 : i;
|
||||
}
|
||||
} else if (!(latLonBounds.left <= ls.lon + 0.1 && ls.lon - 0.1 <= latLonBounds.right
|
||||
&& latLonBounds.bottom <= ls.lat + 0.1 && ls.lat - 0.1 <= latLonBounds.top)) {
|
||||
drawSegment(canvas, tileBox, l, startIndex, i);
|
||||
startIndex = -1;
|
||||
}
|
||||
}
|
||||
if (startIndex != -1) {
|
||||
drawSegment(canvas, tileBox, l, startIndex, l.size() - 1);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (OsMoDroidPoint op : osMoDroidPointArrayList) {
|
||||
if(seekOsMoDroidPoint!=null&&seekOsMoDroidPoint.equals(op)){
|
||||
map.setMapLocation(op.latlon.getLatitude(), op.latlon.getLongitude());
|
||||
}
|
||||
LatLon newLatlon;
|
||||
try {
|
||||
|
||||
newLatlon = new LatLon(myOsMoDroidPlugin.mIRemoteService.getObjectLat(layerId, op.id),
|
||||
myOsMoDroidPlugin.mIRemoteService.getObjectLon(layerId, op.id));
|
||||
|
||||
if (!op.latlon.equals(newLatlon)) {
|
||||
op.prevlatlon = op.latlon;
|
||||
}
|
||||
op.latlon = newLatlon;
|
||||
op.speed = myOsMoDroidPlugin.mIRemoteService.getObjectSpeed(layerId, op.id);
|
||||
} catch (RemoteException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
double latitude = op.latlon.getLatitude();
|
||||
double longitude = op.latlon.getLongitude();
|
||||
double prevlatitude = op.latlon.getLatitude();
|
||||
double prevlongitude = op.latlon.getLongitude();
|
||||
if (op.prevlatlon != null) {
|
||||
prevlatitude = op.prevlatlon.getLatitude();
|
||||
prevlongitude = op.prevlatlon.getLongitude();
|
||||
}
|
||||
|
||||
int locationX = (int) tileBox.getPixXFromLatLon(latitude, longitude);
|
||||
int locationY = (int) tileBox.getPixYFromLatLon(latitude, longitude);
|
||||
int prevlocationX = (int) tileBox.getPixXFromLatLon(prevlatitude, prevlongitude);
|
||||
int prevlocationY = (int) tileBox.getPixYFromLatLon(prevlatitude, prevlongitude);
|
||||
|
||||
// int y = opIcon.getHeight()/2;
|
||||
// int x = opIcon.getWidth()/2;
|
||||
textPaint.setColor(Color.parseColor("#013220"));
|
||||
canvas.drawText(op.name, locationX, locationY - radius, textPaint);
|
||||
canvas.drawText(op.speed, locationX, locationY - 2 * radius, textPaint);
|
||||
textPaint.setColor(Color.parseColor("#" + op.color));
|
||||
textPaint.setShadowLayer(radius, 0, 0, Color.GRAY);
|
||||
canvas.drawCircle(locationX, locationY, radius, textPaint);
|
||||
// canvas.drawBitmap(opIcon, locationX-x, locationY-y , textPaint);
|
||||
textPaint.setStrokeWidth(radius);
|
||||
canvas.drawLine(locationX, locationY, prevlocationX, prevlocationY, textPaint);
|
||||
// canvas.rotate(-view.getRotate(), locationX, locationY);
|
||||
// op.prevlatlon=op.latlon;
|
||||
|
||||
}
|
||||
|
||||
for (OsMoDroidPoint point : osMoDroidFixedPointArrayList ){
|
||||
double latitude = point.latlon.getLatitude();
|
||||
double longitude = point.latlon.getLongitude();
|
||||
int locationX = (int) tileBox.getPixXFromLatLon(latitude, longitude);
|
||||
int locationY = (int) tileBox.getPixYFromLatLon(latitude, longitude);
|
||||
textPaint.setColor(Color.parseColor("#013220"));
|
||||
canvas.drawText(point.name, locationX, locationY - radius, textPaint);
|
||||
textPaint.setColor(Color.parseColor("#" + point.color));
|
||||
textPaint.setShadowLayer(radius, 0, 0, Color.GRAY);
|
||||
canvas.drawRect(new Rect(locationX-radius, locationY-radius, locationX+radius, locationY+radius), textPaint);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
private void drawSegment(Canvas canvas, RotatedTileBox tb, List<WptPt> l, int startIndex, int endIndex) {
|
||||
int px = (int) tb.getPixXFromLatLon(l.get(startIndex).lat, l.get(startIndex).lon);
|
||||
int py = (int) tb.getPixYFromLatLon(l.get(startIndex).lat, l.get(startIndex).lon);
|
||||
path.moveTo(px, py);
|
||||
for (int i = startIndex + 1; i <= endIndex; i++) {
|
||||
WptPt p = l.get(i);
|
||||
int x = (int) tb.getPixXFromLatLon(p.lat,p.lon);
|
||||
int y = (int) tb.getPixYFromLatLon(p.lat,p.lon);
|
||||
path.lineTo(x, y);
|
||||
}
|
||||
canvas.drawPath(path, paint);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) {}
|
||||
|
||||
public void getOsMoDroidPointFromPoint(RotatedTileBox tb,PointF point, List<? super OsMoDroidPoint> om) {
|
||||
if (osMoDroidPointArrayList != null) {
|
||||
int ex = (int) point.x;
|
||||
int ey = (int) point.y;
|
||||
|
||||
try {
|
||||
for (int i = 0; i < osMoDroidPointArrayList.size(); i++) {
|
||||
OsMoDroidPoint n = osMoDroidPointArrayList.get(i);
|
||||
if (!om.contains(n)) {
|
||||
int x = (int) tb.getPixXFromLatLon(n.latlon.getLatitude(), n.latlon.getLongitude());
|
||||
int y = (int) tb.getPixYFromLatLon(n.latlon.getLatitude(), n.latlon.getLongitude());
|
||||
if (Math.abs(x - ex) <= opIcon.getWidth() && Math.abs(y - ey) <= opIcon.getHeight()) {
|
||||
om.add(n);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (IndexOutOfBoundsException e) {
|
||||
// that's really rare case, but is much efficient than introduce
|
||||
// synchronized block
|
||||
}
|
||||
}
|
||||
if (osMoDroidFixedPointArrayList != null) {
|
||||
int ex = (int) point.x;
|
||||
int ey = (int) point.y;
|
||||
|
||||
try {
|
||||
for (int i = 0; i <osMoDroidFixedPointArrayList.size(); i++) {
|
||||
OsMoDroidPoint n =osMoDroidFixedPointArrayList.get(i);
|
||||
if (!om.contains(n)) {
|
||||
int x = (int) tb.getPixXFromLatLon(n.latlon.getLatitude(), n.latlon.getLongitude());
|
||||
int y = (int) tb.getPixYFromLatLon(n.latlon.getLatitude(), n.latlon.getLongitude());
|
||||
if (Math.abs(x - ex) <= opIcon.getWidth() && Math.abs(y - ey) <= opIcon.getHeight()) {
|
||||
om.add(n);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (IndexOutOfBoundsException e) {
|
||||
// that's really rare case, but is much efficient than introduce
|
||||
// synchronized block
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void populateObjectContextMenu(Object o, ContextMenuAdapter adapter) {
|
||||
if (o instanceof OsMoDroidPoint && ((OsMoDroidPoint) o).layerId == layerId) {
|
||||
final OsMoDroidPoint a = (OsMoDroidPoint) o;
|
||||
OnContextMenuClick listener = new ContextMenuAdapter.OnContextMenuClick() {
|
||||
@Override
|
||||
public void onContextMenuClick(int itemId, int pos, boolean isChecked, DialogInterface dialog) {
|
||||
|
||||
map.getMyApplication().getTargetPointsHelper().navigateToPoint(a.latlon, true, -1);
|
||||
}
|
||||
};
|
||||
OnContextMenuClick seeklistener = new ContextMenuAdapter.OnContextMenuClick() {
|
||||
|
||||
@Override
|
||||
public void onContextMenuClick(int itemId, int pos, boolean isChecked, DialogInterface dialog) {
|
||||
if(seekOsMoDroidPoint!=null&&a.equals(seekOsMoDroidPoint))
|
||||
{
|
||||
seekOsMoDroidPoint=null;
|
||||
isChecked=false;
|
||||
} else
|
||||
{
|
||||
seekOsMoDroidPoint=a;
|
||||
isChecked=true;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
adapter.item(map.getString(R.string.get_directions)).listen(listener).reg();
|
||||
adapter.item(map.getString(R.string.osmodroid_seek)).listen(seeklistener).reg();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onSingleTap(PointF point, RotatedTileBox tileBox) {
|
||||
List<OsMoDroidPoint> om = new ArrayList<OsMoDroidPoint>();
|
||||
getOsMoDroidPointFromPoint(tileBox, point, om);
|
||||
if (!om.isEmpty()) {
|
||||
StringBuilder res = new StringBuilder();
|
||||
for (int i = 0; i < om.size(); i++) {
|
||||
OsMoDroidPoint n = om.get(i);
|
||||
if (i > 0) {
|
||||
res.append("\n\n");
|
||||
}
|
||||
res = res.append(n.description);
|
||||
}
|
||||
AccessibleToast.makeText(view.getContext(), res.toString(), Toast.LENGTH_SHORT).show();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroyLayer() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean drawInScreenPixels() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getObjectName(Object o) {
|
||||
if (o instanceof OsMoDroidPoint) {
|
||||
return ((OsMoDroidPoint) o).name;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void collectObjectsFromPoint(PointF point, RotatedTileBox tileBox, List<Object> o) {
|
||||
getOsMoDroidPointFromPoint(tileBox, point, o);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public LatLon getObjectLocation(Object o) {
|
||||
if (o instanceof OsMoDroidPoint) {
|
||||
return ((OsMoDroidPoint) o).latlon;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getObjectDescription(Object o) {
|
||||
if (o instanceof OsMoDroidPoint) {
|
||||
return ((OsMoDroidPoint) o).description;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,350 +0,0 @@
|
|||
package net.osmand.plus.osmodroid;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.ConcurrentModificationException;
|
||||
|
||||
import net.osmand.PlatformUtil;
|
||||
import net.osmand.data.LatLon;
|
||||
import net.osmand.plus.ContextMenuAdapter;
|
||||
import net.osmand.plus.ContextMenuAdapter.OnContextMenuClick;
|
||||
import net.osmand.plus.GPXUtilities;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.OsmandPlugin;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.TargetPointsHelper;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.base.FailSafeFuntions;
|
||||
import net.osmand.plus.views.MonitoringInfoControl;
|
||||
import net.osmand.plus.views.MonitoringInfoControl.MonitoringInfoControlServices;
|
||||
import net.osmand.plus.views.OsmandMapTileView;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.ServiceConnection;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
|
||||
import com.OsMoDroid.IRemoteOsMoDroidListener;
|
||||
import com.OsMoDroid.IRemoteOsMoDroidService;
|
||||
|
||||
public class OsMoDroidPlugin extends OsmandPlugin implements MonitoringInfoControlServices {
|
||||
IRemoteOsMoDroidListener.Stub inter = new IRemoteOsMoDroidListener.Stub() {
|
||||
|
||||
@Override
|
||||
public void channelUpdated() throws RemoteException {
|
||||
if (activity != null) {
|
||||
activity.refreshMap();
|
||||
// test
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void channelsListUpdated() throws RemoteException {
|
||||
if (activity != null && connected) {
|
||||
log.debug("update channels");
|
||||
for (OsMoDroidLayer myOsMoDroidLayer : osmoDroidLayerList) {
|
||||
activity.getMapView().removeLayer(myOsMoDroidLayer);
|
||||
}
|
||||
osmoDroidLayerList.clear();
|
||||
requestLayersFromOsMoDroid(activity);
|
||||
for (OsMoDroidLayer myOsMoDroidLayer : osmoDroidLayerList) {
|
||||
activity.getMapView().addLayer(myOsMoDroidLayer, 4.5f);
|
||||
|
||||
}
|
||||
activity.refreshMap();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void reRouteTo(LatLon loc) {
|
||||
final OsmandApplication app = activity.getMyApplication();
|
||||
final TargetPointsHelper targets = app.getTargetPointsHelper();
|
||||
// If we are in following mode then just update target point
|
||||
targets.navigateToPoint(loc, true, -1);
|
||||
if(!app.getRoutingHelper().isFollowingMode()) {
|
||||
// If we are not in following mode then request new route to calculate
|
||||
// Use default application mode
|
||||
activity.runOnUiThread(new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
FailSafeFuntions.enterRoutingMode(activity, null);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void routeTo(float Lat, float Lon) throws RemoteException {
|
||||
reRouteTo(new LatLon(Lat, Lon));
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
@Override
|
||||
public void updateLayers(OsmandMapTileView mapView, MapActivity activity) {
|
||||
registerLayers(activity);
|
||||
super.updateLayers(mapView, activity);
|
||||
MonitoringInfoControl lock = activity.getMapLayers().getMapInfoLayer().getMonitoringInfoControl();
|
||||
if(lock != null && !lock.getMonitorActions().contains(this)) {
|
||||
lock.addMonitorActions(this);
|
||||
}
|
||||
}
|
||||
|
||||
MapActivity activity;
|
||||
public static final String ID = "osmand.osmodroid";
|
||||
private static final Log log = PlatformUtil.getLog(OsMoDroidPlugin.class);
|
||||
private OsmandApplication app;
|
||||
IRemoteOsMoDroidService mIRemoteService;
|
||||
private ServiceConnection mConnection;
|
||||
private int OSMODROID_SUPPORTED_VERSION_MIN = 5;
|
||||
private OsMoDroidLayer osmoDroidLayer;
|
||||
protected boolean connected = false;
|
||||
ArrayList<OsMoDroidLayer> osmoDroidLayerList = new ArrayList<OsMoDroidLayer>();
|
||||
private AsyncTask<Void, Void, Void> task;
|
||||
|
||||
public ArrayList<OsMoDroidPoint> getOsMoDroidPointArrayList(int id) {
|
||||
ArrayList<OsMoDroidPoint> result = new ArrayList<OsMoDroidPoint>();
|
||||
try {
|
||||
for (int i = 0; i < mIRemoteService.getNumberOfObjects(id); i++) {
|
||||
result.add(new OsMoDroidPoint(mIRemoteService.getObjectLat(id, mIRemoteService.getObjectId(id, i)), mIRemoteService
|
||||
.getObjectLon(id, mIRemoteService.getObjectId(id, i)), mIRemoteService.getObjectName(id,
|
||||
mIRemoteService.getObjectId(id, i)), mIRemoteService.getObjectDescription(id, mIRemoteService.getObjectId(id, i)),
|
||||
mIRemoteService.getObjectId(id, i), id, mIRemoteService.getObjectSpeed(id, mIRemoteService.getObjectId(id, i)),
|
||||
mIRemoteService.getObjectColor(id, mIRemoteService.getObjectId(id, i))));
|
||||
}
|
||||
} catch (RemoteException e) {
|
||||
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
public ArrayList<OsMoDroidPoint> getOsMoDroidFixedPointArrayList(int id) {
|
||||
ArrayList<OsMoDroidPoint> result = new ArrayList<OsMoDroidPoint>();
|
||||
try {
|
||||
for (int i = 0; i < mIRemoteService.getNumberOfPoints(id); i++) {
|
||||
result.add(new OsMoDroidPoint(mIRemoteService.getPointLat(id, mIRemoteService.getPointId(id, i)), mIRemoteService
|
||||
.getPointLon(id, mIRemoteService.getPointId(id, i)), mIRemoteService.getPointName(id,
|
||||
mIRemoteService.getPointId(id, i)), mIRemoteService.getPointDescription(id, mIRemoteService.getPointId(id, i)),
|
||||
mIRemoteService.getPointId(id, i), id, null,
|
||||
mIRemoteService.getPointColor(id, mIRemoteService.getPointId(id, i))));
|
||||
}
|
||||
} catch (RemoteException e) {
|
||||
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getId() {
|
||||
return ID;
|
||||
}
|
||||
|
||||
public OsMoDroidPlugin(OsmandApplication app) {
|
||||
this.app = app;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return app.getString(R.string.osmodroid_plugin_description) + "\n External application.";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return app.getString(R.string.osmodroid_plugin_name) + " (external)";
|
||||
}
|
||||
|
||||
// test
|
||||
@Override
|
||||
public boolean init(final OsmandApplication app) {
|
||||
mConnection = new ServiceConnection() {
|
||||
@Override
|
||||
public void onServiceConnected(ComponentName name, IBinder service) {
|
||||
mIRemoteService = IRemoteOsMoDroidService.Stub.asInterface(service);
|
||||
try {
|
||||
System.out.println(mIRemoteService.getVersion());
|
||||
if (mIRemoteService.getVersion() < OSMODROID_SUPPORTED_VERSION_MIN) {
|
||||
app.showToastMessage(R.string.osmodroid_plugin_old_ver_not_supported);
|
||||
shutdown(app);
|
||||
} else {
|
||||
mIRemoteService.registerListener(inter);
|
||||
connected = true;
|
||||
}
|
||||
|
||||
} catch (RemoteException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceDisconnected(ComponentName name) {
|
||||
connected = false;
|
||||
mIRemoteService = null;
|
||||
}
|
||||
};
|
||||
Intent serviceIntent = (new Intent("OsMoDroid.remote"));
|
||||
app.bindService(serviceIntent, mConnection, Context.BIND_AUTO_CREATE);
|
||||
return true;
|
||||
}
|
||||
|
||||
void requestLayersFromOsMoDroid(MapActivity activity) {
|
||||
try {
|
||||
for (int i = 0; i < mIRemoteService.getNumberOfLayers(); i++) {
|
||||
osmoDroidLayerList.add(new OsMoDroidLayer(activity, mIRemoteService.getLayerId(i), this, mIRemoteService
|
||||
.getLayerName(mIRemoteService.getLayerId(i)), mIRemoteService.getLayerDescription(mIRemoteService.getLayerId(i))));
|
||||
}
|
||||
} catch (RemoteException e) {
|
||||
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
getGpxArrayList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerLayers(MapActivity activity) {
|
||||
this.activity = activity;
|
||||
if (connected) {
|
||||
|
||||
for (OsMoDroidLayer myOsMoDroidLayer : osmoDroidLayerList) {
|
||||
activity.getMapView().removeLayer(myOsMoDroidLayer);
|
||||
}
|
||||
osmoDroidLayerList.clear();
|
||||
requestLayersFromOsMoDroid(activity);
|
||||
for (OsMoDroidLayer myOsMoDroidLayer : osmoDroidLayerList) {
|
||||
activity.getMapView().addLayer(myOsMoDroidLayer, 4.5f);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerLayerContextMenuActions(OsmandMapTileView mapView, ContextMenuAdapter adapter, MapActivity mapActivity) {
|
||||
for (OsMoDroidLayer myOsMoDroidLayer : osmoDroidLayerList) {
|
||||
adapter.item(myOsMoDroidLayer.layerName).reg();
|
||||
}
|
||||
|
||||
super.registerLayerContextMenuActions(mapView, adapter, mapActivity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disable(OsmandApplication app) {
|
||||
shutdown(app);
|
||||
}
|
||||
|
||||
private void shutdown(OsmandApplication app) {
|
||||
if (mIRemoteService != null) {
|
||||
if (connected) {
|
||||
try {
|
||||
mIRemoteService.unregisterListener(inter);
|
||||
} catch (RemoteException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
app.unbindService(mConnection);
|
||||
mIRemoteService = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void addMonitorActions(final ContextMenuAdapter qa, final MonitoringInfoControl li, final OsmandMapTileView view) {
|
||||
boolean o = true;
|
||||
try {
|
||||
o = mIRemoteService.isActive();
|
||||
}
|
||||
catch(Exception e) {
|
||||
log.error(e.getMessage(), e);
|
||||
|
||||
}
|
||||
final boolean off = !o;
|
||||
qa.item(off ? R.string.osmodroid_mode_off : R.string.osmodroid_mode_on
|
||||
).icon( off ? R.drawable.monitoring_rec_inactive : R.drawable.monitoring_rec_big).listen(new OnContextMenuClick() {
|
||||
|
||||
@Override
|
||||
public void onContextMenuClick(int itemId, int pos, boolean isChecked, DialogInterface dialog) {
|
||||
try {
|
||||
if (off) {
|
||||
mIRemoteService.Activate();
|
||||
} else {
|
||||
mIRemoteService.Deactivate();
|
||||
}
|
||||
} catch(Exception e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
}).reg();
|
||||
qa.item(R.string.osmodroid_refresh).icons(R.drawable.ic_action_grefresh_dark, R.drawable.ic_action_grefresh_light).listen(new OnContextMenuClick() {
|
||||
|
||||
@Override
|
||||
public void onContextMenuClick(int itemId, int pos, boolean isChecked,
|
||||
DialogInterface dialog) {
|
||||
try {
|
||||
mIRemoteService.refreshChannels();
|
||||
} catch (RemoteException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
|
||||
}
|
||||
}).reg();
|
||||
qa.item(R.string.osmodroid_unseek).icons(R.drawable.abs__ic_commit_search_api_holo_dark, R.drawable.abs__ic_commit_search_api_holo_light).listen(new OnContextMenuClick() {
|
||||
|
||||
@Override
|
||||
public void onContextMenuClick(int itemId, int pos, boolean isChecked,
|
||||
DialogInterface dialog) {
|
||||
for (OsMoDroidLayer l: osmoDroidLayerList){
|
||||
l.seekOsMoDroidPoint=null;
|
||||
}
|
||||
|
||||
}
|
||||
}).reg();
|
||||
}
|
||||
|
||||
public void getGpxArrayList() {
|
||||
if(task!=null){
|
||||
task.cancel(true);
|
||||
}
|
||||
task = new AsyncTask<Void, Void, Void>() {
|
||||
@Override
|
||||
protected Void doInBackground(Void... params) {
|
||||
for (OsMoDroidLayer l : osmoDroidLayerList){
|
||||
ArrayList<ColoredGPX> temp = new ArrayList<ColoredGPX>();
|
||||
try {
|
||||
for (int i = 0; i < mIRemoteService.getNumberOfGpx(l.layerId); i++) {
|
||||
ColoredGPX cg = new ColoredGPX();
|
||||
cg.gpxFile = GPXUtilities.loadGPXFile(app, new File(mIRemoteService.getGpxFile(l.layerId, i)));
|
||||
cg.color = mIRemoteService.getGpxColor(l.layerId, i);
|
||||
temp.add(cg);
|
||||
}
|
||||
l.inGPXFilelist(temp);
|
||||
} catch (RemoteException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
catch (ConcurrentModificationException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
};
|
||||
task.execute();
|
||||
}
|
||||
}
|
|
@ -1,40 +0,0 @@
|
|||
package net.osmand.plus.osmodroid;
|
||||
|
||||
import net.osmand.data.LatLon;
|
||||
|
||||
public class OsMoDroidPoint {
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
|
||||
if ((o instanceof OsMoDroidPoint) && this.id == ((OsMoDroidPoint) o).id) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
LatLon latlon;
|
||||
LatLon prevlatlon;
|
||||
String name;
|
||||
String description;
|
||||
int id;
|
||||
int layerId;
|
||||
String speed = "";
|
||||
String color = "AAAAAA";
|
||||
|
||||
public OsMoDroidPoint(float objectLat, float objectLon, String objectName, String objectDescription, int objectId,
|
||||
int layerId, String speed, String color) {
|
||||
this.latlon = new LatLon(objectLat, objectLon);
|
||||
this.name = objectName;
|
||||
this.description = objectDescription;
|
||||
this.id = objectId;
|
||||
this.layerId = layerId;
|
||||
if (speed != null) {
|
||||
this.speed = speed;
|
||||
}
|
||||
if (color != null) {
|
||||
this.color = color;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue