diff --git a/enabler/src/de/schildbach/pte/AbstractEfaProvider.java b/enabler/src/de/schildbach/pte/AbstractEfaProvider.java index 6240c7a6..d0792f44 100644 --- a/enabler/src/de/schildbach/pte/AbstractEfaProvider.java +++ b/enabler/src/de/schildbach/pte/AbstractEfaProvider.java @@ -1938,7 +1938,7 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider if ("IT".equals(partialRouteType) || "Fussweg".equals(productName) || "Taxi".equals(productName)) { final int min = (int) (arrivalTime.getTime() - departureTime.getTime()) / 1000 / 60; - final boolean transfer = "Taxi".equals(productName); + final Trip.Individual.Type type = "Taxi".equals(productName) ? Trip.Individual.Type.TRANSFER : Trip.Individual.Type.WALK; XmlPullUtil.enter(pp, "itdMeansOfTransport"); XmlPullUtil.exit(pp, "itdMeansOfTransport"); @@ -1953,17 +1953,17 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider if (XmlPullUtil.test(pp, "itdPathCoordinates")) path = processItdPathCoordinates(pp); - if (legs.size() > 0 && legs.get(legs.size() - 1) instanceof Trip.Individual) + final Trip.Leg lastLeg = legs.size() > 0 ? legs.get(legs.size() - 1) : null; + if (lastLeg != null && lastLeg instanceof Trip.Individual && ((Trip.Individual) lastLeg).type == type) { - final Trip.Individual lastIndividualLeg = (Trip.Individual) legs.remove(legs.size() - 1); - if (path != null && lastIndividualLeg.path != null) - path.addAll(0, lastIndividualLeg.path); - legs.add(new Trip.Individual(lastIndividualLeg.min + min, distance, lastIndividualLeg.transfer || transfer, - lastIndividualLeg.departure, arrivalLocation, path)); + final Trip.Individual lastIndividual = (Trip.Individual) legs.remove(legs.size() - 1); + if (path != null && lastIndividual.path != null) + path.addAll(0, lastIndividual.path); + legs.add(new Trip.Individual(lastIndividual.min + min, distance, type, lastIndividual.departure, arrivalLocation, path)); } else { - legs.add(new Trip.Individual(min, distance, transfer, departureLocation, arrivalLocation, path)); + legs.add(new Trip.Individual(min, distance, type, departureLocation, arrivalLocation, path)); } } else if ("gesicherter Anschluss".equals(productName) || "nicht umsteigen".equals(productName)) // type97 diff --git a/enabler/src/de/schildbach/pte/AbstractHafasProvider.java b/enabler/src/de/schildbach/pte/AbstractHafasProvider.java index 9f154881..2840847d 100644 --- a/enabler/src/de/schildbach/pte/AbstractHafasProvider.java +++ b/enabler/src/de/schildbach/pte/AbstractHafasProvider.java @@ -1322,12 +1322,12 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider if (legs.size() > 0 && legs.get(legs.size() - 1) instanceof Trip.Individual) { final Trip.Individual lastIndividualLeg = (Trip.Individual) legs.remove(legs.size() - 1); - legs.add(new Trip.Individual(lastIndividualLeg.min + min, 0, false, lastIndividualLeg.departure, sectionArrivalLocation, - null)); + legs.add(new Trip.Individual(lastIndividualLeg.min + min, 0, Trip.Individual.Type.WALK, lastIndividualLeg.departure, + sectionArrivalLocation, null)); } else { - legs.add(new Trip.Individual(min, 0, false, sectionDepartureLocation, sectionArrivalLocation, null)); + legs.add(new Trip.Individual(min, 0, Trip.Individual.Type.WALK, sectionDepartureLocation, sectionArrivalLocation, null)); } } } @@ -1811,6 +1811,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider int lineClass = 0; String lineCategory = null; String lineOperator = null; + String routingType = null; while (true) { final String key = strings.read(is); @@ -1824,6 +1825,8 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider lineCategory = strings.read(is); else if (key.equals("Operator")) lineOperator = strings.read(is); + else if (key.equals("GisRoutingType")) + routingType = strings.read(is); else is.skipBytes(2); } @@ -1898,17 +1901,28 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider if (type == 1 /* Fussweg */|| type == 3 /* Uebergang */|| type == 4 /* Uebergang */) { final int min = (int) ((plannedArrivalTime - plannedDepartureTime) / 1000 / 60); - final boolean transfer = type != 1; + final Trip.Individual.Type individualType; + if (routingType == null) + individualType = type == 1 ? Trip.Individual.Type.WALK : Trip.Individual.Type.TRANSFER; + else if ("FOOT".equals(routingType)) + individualType = Trip.Individual.Type.WALK; + else if ("BIKE".equals(routingType)) + individualType = Trip.Individual.Type.BIKE; + else if ("P+R".equals(routingType)) + individualType = Trip.Individual.Type.CAR; + else + throw new IllegalStateException("unknown routingType: " + routingType); - if (legs.size() > 0 && legs.get(legs.size() - 1) instanceof Trip.Individual) + final Trip.Leg lastLeg = legs.size() > 0 ? legs.get(legs.size() - 1) : null; + if (lastLeg != null && lastLeg instanceof Trip.Individual && ((Trip.Individual) lastLeg).type == individualType) { final Trip.Individual lastIndividualLeg = (Trip.Individual) legs.remove(legs.size() - 1); - leg = new Trip.Individual(lastIndividualLeg.min + min, 0, lastIndividualLeg.transfer || transfer, - lastIndividualLeg.departure, arrivalLocation, null); + leg = new Trip.Individual(lastIndividualLeg.min + min, 0, individualType, lastIndividualLeg.departure, + arrivalLocation, null); } else { - leg = new Trip.Individual(min, 0, transfer, departureLocation, arrivalLocation, null); + leg = new Trip.Individual(min, 0, individualType, departureLocation, arrivalLocation, null); } } else if (type == 2) diff --git a/enabler/src/de/schildbach/pte/SadProvider.java b/enabler/src/de/schildbach/pte/SadProvider.java index 7499623a..1815a79a 100644 --- a/enabler/src/de/schildbach/pte/SadProvider.java +++ b/enabler/src/de/schildbach/pte/SadProvider.java @@ -416,7 +416,7 @@ public class SadProvider extends AbstractNetworkProvider { // Add footway to legs list if (isFootway) { // NOTE: path is set to null - legs.add(new Trip.Individual(Integer.parseInt(tratto.getPropertyAsString("durata").split(":")[1]), 0, false, + legs.add(new Trip.Individual(Integer.parseInt(tratto.getPropertyAsString("durata").split(":")[1]), 0, Trip.Individual.Type.WALK, soapToLocation((SoapObject) tratto.getProperty("nodo_partenza")), soapToLocation((SoapObject) tratto .getProperty("nodo_arrivo")), null)); } diff --git a/enabler/src/de/schildbach/pte/dto/Trip.java b/enabler/src/de/schildbach/pte/dto/Trip.java index fd13b597..a9afc75a 100644 --- a/enabler/src/de/schildbach/pte/dto/Trip.java +++ b/enabler/src/de/schildbach/pte/dto/Trip.java @@ -327,16 +327,20 @@ public final class Trip implements Serializable public final int min; public final int distance; - public final boolean transfer; + public final Type type; - public Individual(final int min, final int distance, final boolean transfer, final Location departure, final Location arrival, - final List path) + public enum Type + { + WALK, BIKE, CAR, TRANSFER + } + + public Individual(final int min, final int distance, final Type type, final Location departure, final Location arrival, final List path) { super(departure, arrival, path); this.min = min; this.distance = distance; - this.transfer = transfer; + this.type = type; } @Override @@ -347,7 +351,7 @@ public final class Trip implements Serializable builder.append(","); builder.append("distance=").append(distance); builder.append(","); - builder.append("transfer=").append(transfer); + builder.append("type=").append(type); builder.append(","); builder.append("departure=").append(departure.toDebugString()); builder.append(",");