get next shield

This commit is contained in:
MadWasp79 2019-12-28 16:12:37 +02:00
parent 45c8df4c63
commit 0534fda25c
4 changed files with 110 additions and 66 deletions

View file

@ -5,7 +5,6 @@ import android.support.annotation.Nullable;
import net.osmand.Location;
import net.osmand.PlatformUtil;
import net.osmand.binary.BinaryMapIndexReader;
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion;
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
import net.osmand.binary.RouteDataObject;
@ -15,10 +14,7 @@ import net.osmand.data.QuadRect;
import net.osmand.plus.ApplicationMode;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.render.MapRenderRepositories;
import net.osmand.plus.routing.AlarmInfo.AlarmInfoType;
import net.osmand.render.RenderingRuleSearchRequest;
import net.osmand.render.RenderingRulesStorage;
import net.osmand.router.ExitInfo;
import net.osmand.router.RouteSegmentResult;
import net.osmand.router.RoutingContext;
@ -32,6 +28,8 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import gnu.trove.map.hash.TIntObjectHashMap;
import static net.osmand.binary.RouteDataObject.HEIGHT_UNDEFINED;
public class RouteCalculationResult {
@ -335,17 +333,50 @@ public class RouteCalculationResult {
ctx.getSettings().MAP_TRANSLITERATE_NAMES.get()));
info.setDestinationName(next.getObject().getDestinationName(ctx.getSettings().MAP_PREFERRED_LOCALE.get(),
ctx.getSettings().MAP_TRANSLITERATE_NAMES.get(), next.isForwardDirection()));
if (s.getObject().isExitPoint() && next.getObject().getHighway().equals("motorway_link")) {
ExitInfo exitInfo = new ExitInfo();
exitInfo.setRef(next.getObject().getExitRef());
exitInfo.setExitStreetName(next.getObject().getExitName());
info.setExitInfo(exitInfo);
}
if (ref != null) {
RouteDataObject nextRoad = next.getObject();
boolean isNextShieldFound = false;
int[] nextSegmentNameIds = nextRoad.nameIds;
for (int nm = 0; nm < nextSegmentNameIds.length; nm++) {
int nmId = nextSegmentNameIds[nm];
if (nextRoad.region.quickGetEncodingRule(nextSegmentNameIds[nm]).getTag().startsWith("road_ref")) {// && nextSegmentNames.get(nmId).equals(ref)) {
info.setRouteDataObject(nextRoad);
isNextShieldFound = true;
}
}
if (!isNextShieldFound) {
for (int ind = lind; ind < list.size(); ind++) {
if (list.get(ind).getTurnType() != null) {
info.setRouteDataObject(null);
break;
} else {
RouteDataObject obj = list.get(ind).getObject();
int[] nameIds = obj.nameIds;
for (int idx = 0; idx < nameIds.length; idx ++) {
if (obj.region.routeEncodingRules.get(obj.nameIds[idx]).getTag().startsWith("road_ref")) {
info.setRouteDataObject(obj);
break;
}
}
if (info.getRouteDataObject() != null) {
break;
}
}
}
}
}
}
String description = toString(turn, ctx, false) + " " + RoutingHelper.formatStreetName(info.getStreetName(),
info.getRef(), info.getDestinationName(), ctx.getString(R.string.towards));
String description = toString(turn, ctx, false) + " " + RoutingHelper.formatStreetName(info.getStreetName(),
null, info.getDestinationName(), ctx.getString(R.string.towards));
description = description.trim();
String[] pointNames = s.getObject().getPointNames(s.getStartPointIndex());
if(pointNames != null) {
@ -362,7 +393,8 @@ public class RouteCalculationResult {
prevDirectionDistance = 0;
prevDirectionTime = 0;
}
info.setRouteDataObject(s.getObject());
directions.add(info);
}
prevDirectionDistance += s.getDistance();

View file

@ -26,7 +26,7 @@ public class RouteDirectionInfo {
private String destinationName;
private RouteDataObject routeDataObject;
private RouteDataObject routeDataObject = null;
@Nullable
private ExitInfo exitInfo;

View file

@ -825,7 +825,8 @@ public class RoutingHelper {
// return false;
// }
public synchronized String getCurrentName(TurnType[] next, NextDirectionInfo n) {
public synchronized String getCurrentName(TurnType[] next){
NextDirectionInfo n = getNextRouteDirectionInfo(new NextDirectionInfo(), true);
Location l = lastFixedLocation;
float speed = 0;
if(l != null && l.hasSpeed()) {

View file

@ -37,6 +37,7 @@ import com.jwetherell.openmap.common.UTMPoint;
import net.osmand.AndroidUtils;
import net.osmand.Location;
import net.osmand.LocationConvert;
import net.osmand.PlatformUtil;
import net.osmand.binary.BinaryMapRouteReaderAdapter;
import net.osmand.binary.RouteDataObject;
import net.osmand.data.LatLon;
@ -75,6 +76,8 @@ import net.osmand.router.TurnType;
import net.osmand.util.Algorithms;
import net.osmand.util.MapUtils;
import org.apache.commons.logging.Log;
import java.util.Iterator;
import java.util.LinkedList;
@ -924,6 +927,7 @@ public class MapInfoWidgetsFactory {
private TurnDrawable turnDrawable;
private boolean showMarker;
private int shadowRad;
private static final Log LOG = PlatformUtil.getLog(TopTextView.class);
public TopTextView(OsmandApplication app, MapActivity map) {
topBar = map.findViewById(R.id.map_top_bar);
@ -974,16 +978,14 @@ public class MapInfoWidgetsFactory {
boolean showNextTurn = false;
boolean showMarker = this.showMarker;
boolean showExitInfo = false;
boolean showShield = false;
ExitInfo exitInfo = null;
RouteDataObject object = null;
if (routingHelper != null && routingHelper.isRouteCalculated() && !routingHelper.isDeviatedFromRoute()) {
if (routingHelper.isFollowingMode()) {
RouteCalculationResult.NextDirectionInfo nextDirInfo = routingHelper.getNextRouteDirectionInfo(
new RouteCalculationResult.NextDirectionInfo(), true);
if (settings.SHOW_STREET_NAME.get()) {
text = routingHelper.getCurrentName(type, nextDirInfo);
text = routingHelper.getCurrentName(type);
if (text == null) {
text = "";
} else {
@ -994,61 +996,43 @@ public class MapInfoWidgetsFactory {
}
}
if (nextDirInfo != null) {
RouteDirectionInfo directionInfo = nextDirInfo.directionInfo;
RouteCalculationResult.NextDirectionInfo nextDirInfo = routingHelper.getNextRouteDirectionInfo(
new RouteCalculationResult.NextDirectionInfo(), true);
if (directionInfo != null && directionInfo.getExitInfo() != null) {
exitInfo = directionInfo.getExitInfo();
showExitInfo = true;
} else {
showExitInfo = false;
}
if (showExitInfo) {
text = exitInfo.getExitStreetName();
}
RouteDirectionInfo directionInfo = nextDirInfo.directionInfo;
if (directionInfo != null && directionInfo.getExitInfo() != null) {
exitInfo = directionInfo.getExitInfo();
showExitInfo = true;
} else {
showExitInfo = false;
}
if (nextDirInfo != null && nextDirInfo.directionInfo.getRouteDataObject() != null) {
RouteDataObject object = nextDirInfo.directionInfo.getRouteDataObject();
String nameTag = null;
String name = null;
StringBuilder additional = new StringBuilder();
if (object != null) {
if (object.nameIds != null) {
for (int i = 0; i < object.nameIds.length; i++) {
String key = object.region.routeEncodingRules.get(object.nameIds[i]).getTag();
String val = object.names.get(object.nameIds[i]);
if (key.equals("road_ref_1")) {
nameTag = key;
name = val;
} else {
additional.append(key).append("=").append(val).append(";");
}
}
}
if (name != null && setRoadShield(shieldIcon, object, nameTag, name, additional)) {
AndroidUiHelper.updateVisibility(shieldIcon, true);
} else {
AndroidUiHelper.updateVisibility(shieldIcon, false);
}
}
if (showExitInfo) {
text = exitInfo.getExitStreetName();
}
if (nextDirInfo.directionInfo.getRouteDataObject() != null) {
object = nextDirInfo.directionInfo.getRouteDataObject();
showShield = true;
}
}
} else {
int di = MapRouteInfoMenu.getDirectionInfo();
if (di >= 0 && map.getMapRouteInfoMenu().isVisible() &&
di < routingHelper.getRouteDirections().size()) {
showNextTurn = true;
RouteDirectionInfo next = routingHelper.getRouteDirections().get(di);
type[0] = next.getTurnType();
turnDrawable.setColor(R.color.nav_arrow_distant);
text = RoutingHelper.formatStreetName(next.getStreetName(), null, next.getDestinationName(), "»");
if (text == null) {
text = "";
}
} else {
int di = MapRouteInfoMenu.getDirectionInfo();
if (di >= 0 && map.getMapRouteInfoMenu().isVisible() &&
di < routingHelper.getRouteDirections().size()) {
showNextTurn = true;
RouteDirectionInfo next = routingHelper.getRouteDirections().get(di);
type[0] = next.getTurnType();
turnDrawable.setColor(R.color.nav_arrow_distant);
text = RoutingHelper.formatStreetName(next.getStreetName(), null, next.getDestinationName(), "»");
} else {
text = null;
}
}
@ -1060,11 +1044,10 @@ public class MapInfoWidgetsFactory {
//ref = rt.getRef(settings.MAP_PREFERRED_LOCALE.get(), settings.MAP_TRANSLITERATE_NAMES.get(), rt.bearingVsRouteDirection(lastKnownLocation));
text = RoutingHelper.formatStreetName(
rt.getName(settings.MAP_PREFERRED_LOCALE.get(), settings.MAP_TRANSLITERATE_NAMES.get()),
null,
rt.getRef(settings.MAP_PREFERRED_LOCALE.get(), settings.MAP_TRANSLITERATE_NAMES.get(), rt.bearingVsRouteDirection(lastKnownLocation)),
rt.getDestinationName(settings.MAP_PREFERRED_LOCALE.get(), settings.MAP_TRANSLITERATE_NAMES.get(), rt.bearingVsRouteDirection(lastKnownLocation)),
"»");
}
if (text == null) {
text = "";
} else {
@ -1095,6 +1078,18 @@ public class MapInfoWidgetsFactory {
AndroidUiHelper.updateVisibility(addressTextShadow, shadowRad > 0);
boolean update = turnDrawable.setTurnType(type[0]) || showMarker != this.showMarker;
this.showMarker = showMarker;
if (showShield) {
if (setRoadShield(shieldIcon, object)) {
AndroidUiHelper.updateVisibility(shieldIcon, true);
} else {
AndroidUiHelper.updateVisibility(shieldIcon, false);
}
} else {
AndroidUiHelper.updateVisibility(shieldIcon, false);
}
if (showExitInfo) {
String exitRef = exitInfo.getRef();
if (!Algorithms.isEmpty(exitRef)) {
@ -1127,7 +1122,23 @@ public class MapInfoWidgetsFactory {
return false;
}
private boolean setRoadShield(ImageView view, RouteDataObject object, String nameTag, String name, StringBuilder additional) {
private boolean setRoadShield(ImageView view, RouteDataObject object) {
String nameTag = null;
String name = null;
StringBuilder additional = new StringBuilder();
for (int i = 0; i < object.nameIds.length; i++) {
String key = object.region.routeEncodingRules.get(object.nameIds[i]).getTag();
String val = object.names.get(object.nameIds[i]);
if (key.startsWith("road_ref")) {
nameTag = key;
name = val;
} else {
additional.append(key).append("=").append(val).append(";");
}
}
LOG.debug("Additionals (names): " + additional.toString() );
Context context = topBar.getContext();
int[] tps = object.getTypes();
OsmandApplication app = ((OsmandApplication) context.getApplicationContext());
@ -1138,8 +1149,8 @@ public class MapInfoWidgetsFactory {
for (int i : tps) {
BinaryMapRouteReaderAdapter.RouteTypeRule tp = object.region.quickGetEncodingRule(i);
if (tp.getTag().equals("highway")) {
rreq.setInitialTagValueZoom(tp.getTag(), tp.getValue(), 15, null);
if (tp.getTag().equals("highway") || tp.getTag().equals("route")) {
rreq.setInitialTagValueZoom(tp.getTag(), tp.getValue(), 13, null);
} else {
additional.append(tp.getTag()).append("=").append(tp.getValue()).append(";");
}