diff --git a/src/de/schildbach/pte/BahnProvider.java b/src/de/schildbach/pte/BahnProvider.java
index a572d1b4..01020b85 100644
--- a/src/de/schildbach/pte/BahnProvider.java
+++ b/src/de/schildbach/pte/BahnProvider.java
@@ -429,6 +429,7 @@ public final class BahnProvider implements NetworkProvider
final StringBuilder uri = new StringBuilder();
uri.append("http://mobile.bahn.de/bin/mobil/bhftafel.exe/dox");
uri.append("?start=");
+ uri.append("&rt=1");
if (maxDepartures != 0)
uri.append("&maxJourneys=").append(maxDepartures);
uri.append("&boardType=Abfahrt");
@@ -448,7 +449,7 @@ public final class BahnProvider implements NetworkProvider
+ "(.*?).*?" // line
+ ">>\n\\s*(.+?)\\s*\n
\n" // destination
+ "(\\d{1,2}:\\d{2})" // time
- + "(?: ca. ([+-]?\\d+))?" // delay
+ + "(?: (?:(pünktl\\.)|ca. \\+(\\d+)))?" // ontime, delay
+ "(?:(?:, )?(Gl\\. " + ParserUtils.P_PLATFORM + "))?" // position
, Pattern.DOTALL);
private static final Pattern P_DEPARTURES_URI_STATION_ID = Pattern.compile("input=(\\d+)");
@@ -480,13 +481,10 @@ public final class BahnProvider implements NetworkProvider
final Matcher mDepFine = P_DEPARTURES_FINE.matcher(mDepCoarse.group(1));
if (mDepFine.matches())
{
- // line
final String line = normalizeLine(ParserUtils.resolveEntities(mDepFine.group(1)));
- // destination
final String destination = ParserUtils.resolveEntities(mDepFine.group(2));
- // time
final Calendar current = new GregorianCalendar();
current.setTime(currentTime);
final Calendar parsed = new GregorianCalendar();
@@ -496,15 +494,24 @@ public final class BahnProvider implements NetworkProvider
parsed.set(Calendar.DAY_OF_MONTH, current.get(Calendar.DAY_OF_MONTH));
if (ParserUtils.timeDiff(parsed.getTime(), currentTime) < -PARSER_DAY_ROLLOVER_THRESHOLD_MS)
parsed.add(Calendar.DAY_OF_MONTH, 1);
+ final Date plannedTime = parsed.getTime();
- // delay
- final int delay = mDepFine.group(4) != null ? Integer.parseInt(mDepFine.group(4)) : 0;
+ Date predictedTime = null;
+ if (mDepFine.group(4) != null)
+ {
+ predictedTime = plannedTime;
+ }
+ else if (mDepFine.group(5) != null)
+ {
+ final int delay = Integer.parseInt(mDepFine.group(5));
+ parsed.add(Calendar.MINUTE, delay);
+ predictedTime = parsed.getTime();
+ }
- // position
- final String position = ParserUtils.resolveEntities(mDepFine.group(5));
+ final String position = ParserUtils.resolveEntities(mDepFine.group(6));
- final Departure dep = new Departure(parsed.getTime(), line, line != null ? LINES.get(line.charAt(0)) : null, position, 0,
- destination);
+ final Departure dep = new Departure(plannedTime, predictedTime, line, line != null ? LINES.get(line.charAt(0)) : null,
+ position, 0, destination);
if (!departures.contains(dep))
departures.add(dep);
}
diff --git a/test/de/schildbach/pte/BahnProviderTest.java b/test/de/schildbach/pte/BahnProviderTest.java
index 20f65ecb..947db444 100644
--- a/test/de/schildbach/pte/BahnProviderTest.java
+++ b/test/de/schildbach/pte/BahnProviderTest.java
@@ -49,6 +49,18 @@ public class BahnProviderTest
+ "10:42Gl. 1");
}
+ @Test
+ public void departureWithOnTime()
+ {
+ assertFineDepartures("\n" //
+ + "RE 38148\n" //
+ + "\n" //
+ + ">>\n" //
+ + "Rathenow\n" //
+ + "
\n" //
+ + "21:58 pünktl., Gl. 13");
+ }
+
private void assertFineConnectionDetails(String s)
{
Matcher m = BahnProvider.P_CONNECTION_DETAILS_FINE.matcher(s);