More fixes for end-of-line stations

This commit is contained in:
dkeen@dkeen-laptop 2012-04-28 08:44:53 -07:00
parent 742837f654
commit a12884cdcb
6 changed files with 91 additions and 34 deletions

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dougkeen.bart" package="com.dougkeen.bart"
android:versionCode="15" android:versionCode="16"
android:versionName="1.2.2" > android:versionName="1.2.3" >
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WAKE_LOCK" />

View File

@ -360,9 +360,28 @@ public class ViewDeparturesActivity extends ListActivity {
Departure departure = mDeparturesAdapter.getItem(departureIndex); Departure departure = mDeparturesAdapter.getItem(departureIndex);
for (int i = lastSearchIndex; i < tripCount; i++) { for (int i = lastSearchIndex; i < tripCount; i++) {
ScheduleItem trip = mLatestScheduleInfo.getTrips().get(i); ScheduleItem trip = mLatestScheduleInfo.getTrips().get(i);
if (!departure.getDestination().abbreviation.equals(trip
.getTrainHeadStation())) {
continue;
}
long departTimeDiff = Math.abs(trip.getDepartureTime() long departTimeDiff = Math.abs(trip.getDepartureTime()
- departure.getMeanEstimate()); - departure.getMeanEstimate());
if (departTimeDiff <= (60000 + departure final long millisUntilTripDeparture = trip.getDepartureTime()
- System.currentTimeMillis();
final int equalityTolerance = (departure.getOrigin() != null) ? departure
.getOrigin().departureEqualityTolerance
: Station.DEFAULT_DEPARTURE_EQUALITY_TOLERANCE;
if (departure.getOrigin() != null
&& departure.getOrigin().longStationLinger
&& departure.hasDeparted()
&& millisUntilTripDeparture > 0
&& millisUntilTripDeparture < equalityTolerance) {
departure.setArrivalTimeOverride(trip.getArrivalTime());
lastSearchIndex = i;
departureUpdated = true;
break;
} else if (departTimeDiff <= (equalityTolerance + departure
.getUncertaintySeconds() * 1000) .getUncertaintySeconds() * 1000)
&& departure.getEstimatedTripTime() != trip && departure.getEstimatedTripTime() != trip
.getTripLength()) { .getTripLength()) {
@ -427,11 +446,18 @@ public class ViewDeparturesActivity extends ListActivity {
} }
} }
private long mLastAutoUpdate = 0;
private void runAutoUpdate() { private void runAutoUpdate() {
long now = System.currentTimeMillis();
if (now - mLastAutoUpdate < 950) {
return;
}
if (mIsAutoUpdating && mDeparturesAdapter != null) { if (mIsAutoUpdating && mDeparturesAdapter != null) {
mDeparturesAdapter.incrementRefreshCounter(); mDeparturesAdapter.incrementRefreshCounter();
mDeparturesAdapter.notifyDataSetChanged(); mDeparturesAdapter.notifyDataSetChanged();
} }
mLastAutoUpdate = now;
if (hasWindowFocus()) { if (hasWindowFocus()) {
mListTitleView.postDelayed(AUTO_UPDATE_RUNNABLE, 1000); mListTitleView.postDelayed(AUTO_UPDATE_RUNNABLE, 1000);
} else { } else {

View File

@ -8,8 +8,6 @@ import android.os.Parcelable;
import android.text.format.DateFormat; import android.text.format.DateFormat;
public class Departure implements Parcelable, Comparable<Departure> { public class Departure implements Parcelable, Comparable<Departure> {
private static final int ESTIMATE_EQUALS_TOLERANCE_MILLIS = 59999;
private static final int ESTIMATE_EQUALS_TOLERANCE_LONG_LINGER_MILLIS = 719999;
private static final int MINIMUM_MERGE_OVERLAP_MILLIS = 10000; private static final int MINIMUM_MERGE_OVERLAP_MILLIS = 10000;
public Departure() { public Departure() {
@ -201,6 +199,14 @@ public class Departure implements Parcelable, Comparable<Departure> {
return (getMinEstimate() + getMaxEstimate()) / 2; return (getMinEstimate() + getMaxEstimate()) / 2;
} }
public long getArrivalTimeOverride() {
return arrivalTimeOverride;
}
public void setArrivalTimeOverride(long arrivalTimeOverride) {
this.arrivalTimeOverride = arrivalTimeOverride;
}
public long getEstimatedArrivalTime() { public long getEstimatedArrivalTime() {
if (arrivalTimeOverride > 0) { if (arrivalTimeOverride > 0) {
return arrivalTimeOverride; return arrivalTimeOverride;
@ -209,7 +215,7 @@ public class Departure implements Parcelable, Comparable<Departure> {
} }
public String getEstimatedArrivalTimeText(Context context) { public String getEstimatedArrivalTimeText(Context context) {
if (getEstimatedTripTime() > 0) { if (getEstimatedTripTime() > 0 || arrivalTimeOverride > 0) {
return DateFormat.getTimeFormat(context).format( return DateFormat.getTimeFormat(context).format(
new Date(getEstimatedArrivalTime())); new Date(getEstimatedArrivalTime()));
} else { } else {
@ -326,10 +332,10 @@ public class Departure implements Parcelable, Comparable<Departure> {
} }
private int getEqualsTolerance() { private int getEqualsTolerance() {
if (origin != null && origin.longStationLinger && hasDeparted()) { if (origin != null) {
return ESTIMATE_EQUALS_TOLERANCE_LONG_LINGER_MILLIS; return origin.departureEqualityTolerance;
} else { } else {
return ESTIMATE_EQUALS_TOLERANCE_MILLIS; return Station.DEFAULT_DEPARTURE_EQUALITY_TOLERANCE;
} }
} }

View File

@ -61,7 +61,10 @@ public enum Line {
Station.BALB, Station.GLEN, Station._24TH, Station._16TH, Station.BALB, Station.GLEN, Station._24TH, Station._16TH,
Station.CIVC, Station.POWL, Station.MONT, Station.EMBR, Station.CIVC, Station.POWL, Station.MONT, Station.EMBR,
Station.WOAK, Station.ASHB, Station.DBRK, Station.NBRK, Station.WOAK, Station.ASHB, Station.DBRK, Station.NBRK,
Station.PLZA, Station.DELN, Station.RICH); Station.PLZA, Station.DELN, Station.RICH),
ORANGE_BLUE_SCHEDULED_TRANSFER(true, ORANGE, BLUE, Station.FRMT,
Station.UCTY, Station.SHAY, Station.HAYW, Station.BAYF,
Station.CAST, Station.WDUB, Station.DUBL);
public final List<Station> stations; public final List<Station> stations;

View File

@ -20,30 +20,33 @@ public enum Station {
CONC("conc", "Concord", true, false, false, "mcar"), CONC("conc", "Concord", true, false, false, "mcar"),
DALY("daly", "Daly City", false, false, false), DALY("daly", "Daly City", false, false, false),
DBRK("dbrk", "Downtown Berkeley", true, false, false, "mcar"), DBRK("dbrk", "Downtown Berkeley", true, false, false, "mcar"),
DUBL("dubl", "Dublin/Pleasanton", true, false, true, "bayf"), DUBL("dubl", "Dublin/Pleasanton", true, false, true, "bayf", "bayf", true,
719999),
DELN("deln", "El Cerrito del Norte", true, false, false, "mcar"), DELN("deln", "El Cerrito del Norte", true, false, false, "mcar"),
PLZA("plza", "El Cerrito Plaza", true, false, false, "mcar"), PLZA("plza", "El Cerrito Plaza", true, false, false, "mcar"),
EMBR("embr", "Embarcadero", false, false, false), EMBR("embr", "Embarcadero", false, false, false),
FRMT("frmt", "Fremont", true, true, false, "bayf"), FRMT("frmt", "Fremont", true, true, true, "bayf", "bayf", true, 299999),
FTVL("ftvl", "Fruitvale", true, true, false, "mcar"), FTVL("ftvl", "Fruitvale", true, true, false, "mcar"),
GLEN("glen", "Glen Park", false, false, false), GLEN("glen", "Glen Park", false, false, false),
HAYW("hayw", "Hayward", true, true, false, "bayf"), HAYW("hayw", "Hayward", true, true, false, "bayf"),
LAFY("lafy", "Lafayette", true, false, false, "mcar"), LAFY("lafy", "Lafayette", true, false, false, "mcar"),
LAKE("lake", "Lake Merritt", true, true, false, "mcar"), LAKE("lake", "Lake Merritt", true, true, false, "mcar"),
MCAR("mcar", "MacArthur", true, false, false, "bayf"), MCAR("mcar", "MacArthur", true, false, false, "bayf"),
MLBR("mlbr", "Millbrae", true, false, true, "balb", "balb"), MLBR("mlbr", "Millbrae", true, false, true, "balb", "balb", true, 719999),
MONT("mont", "Montgomery St.", false, false, false), MONT("mont", "Montgomery St.", false, false, false),
NBRK("nbrk", "North Berkeley", true, false, false, "mcar"), NBRK("nbrk", "North Berkeley", true, false, false, "mcar"),
NCON("ncon", "North Concord/Martinez", true, false, false, "mcar"), NCON("ncon", "North Concord/Martinez", true, false, false, "mcar"),
ORIN("orin", "Orinda", true, false, false, "mcar"), ORIN("orin", "Orinda", true, false, false, "mcar"),
PITT("pitt", "Pittsburg/Bay Point", true, false, true, "mcar"), PITT("pitt", "Pittsburg/Bay Point", true, false, true, "mcar", "mcar",
true, 719999),
PHIL("phil", "Pleasant Hill", true, false, false, "mcar"), PHIL("phil", "Pleasant Hill", true, false, false, "mcar"),
POWL("powl", "Powell St.", false, false, false), POWL("powl", "Powell St.", false, false, false),
RICH("rich", "Richmond", true, false, true, "mcar"), RICH("rich", "Richmond", true, false, true, "mcar", "mcar", true, 299999),
ROCK("rock", "Rockridge", true, false, false, "mcar"), ROCK("rock", "Rockridge", true, false, false, "mcar"),
SBRN("sbrn", "San Bruno", true, false, false, "balb", "balb"), SBRN("sbrn", "San Bruno", true, false, false, "balb", "balb"),
SANL("sanl", "San Leandro", true, true, false, "mcar"), SANL("sanl", "San Leandro", true, true, false, "mcar"),
SFIA("sfia", "SFO Airport", true, false, false, "sbrn", "balb", true), SFIA("sfia", "SFO Airport", true, false, false, "sbrn", "balb", true,
719999),
SHAY("shay", "South Hayward", true, true, false, "bayf"), SHAY("shay", "South Hayward", true, true, false, "bayf"),
SSAN("ssan", "South San Francisco", true, false, false, "balb", "balb"), SSAN("ssan", "South San Francisco", true, false, false, "balb", "balb"),
UCTY("ucty", "Union City", true, true, false, "bayf"), UCTY("ucty", "Union City", true, true, false, "bayf"),
@ -60,30 +63,35 @@ public enum Station {
protected final String outboundTransferStation; protected final String outboundTransferStation;
public final boolean endOfLine; public final boolean endOfLine;
public final boolean longStationLinger; public final boolean longStationLinger;
public final int departureEqualityTolerance;
public final static int DEFAULT_DEPARTURE_EQUALITY_TOLERANCE = 59999;
private Station(String abbreviation, String name, boolean transferFriendly, private Station(String abbreviation, String name, boolean transferFriendly,
boolean invertDirection, boolean endOfLine) { boolean invertDirection, boolean endOfLine) {
this(abbreviation, name, transferFriendly, invertDirection, endOfLine, this(abbreviation, name, transferFriendly, invertDirection, endOfLine,
null, null, false); null, null, false, DEFAULT_DEPARTURE_EQUALITY_TOLERANCE);
} }
private Station(String abbreviation, String name, boolean transferFriendly, private Station(String abbreviation, String name, boolean transferFriendly,
boolean invertDirection, boolean endOfLine, String transferStation) { boolean invertDirection, boolean endOfLine, String transferStation) {
this(abbreviation, name, transferFriendly, invertDirection, endOfLine, this(abbreviation, name, transferFriendly, invertDirection, endOfLine,
transferStation, null, false); transferStation, null, false,
DEFAULT_DEPARTURE_EQUALITY_TOLERANCE);
} }
private Station(String abbreviation, String name, boolean transferFriendly, private Station(String abbreviation, String name, boolean transferFriendly,
boolean invertDirection, boolean endOfLine, boolean invertDirection, boolean endOfLine,
String inboundTransferStation, String outboundTransferStation) { String inboundTransferStation, String outboundTransferStation) {
this(abbreviation, name, transferFriendly, invertDirection, endOfLine, this(abbreviation, name, transferFriendly, invertDirection, endOfLine,
inboundTransferStation, outboundTransferStation, false); inboundTransferStation, outboundTransferStation, false,
DEFAULT_DEPARTURE_EQUALITY_TOLERANCE);
} }
private Station(String abbreviation, String name, boolean transferFriendly, private Station(String abbreviation, String name, boolean transferFriendly,
boolean invertDirection, boolean endOfLine, boolean invertDirection, boolean endOfLine,
String inboundTransferStation, String outboundTransferStation, String inboundTransferStation, String outboundTransferStation,
boolean longStationLinger) { boolean longStationLinger, int departureEqualityTolerance) {
this.abbreviation = abbreviation; this.abbreviation = abbreviation;
this.name = name; this.name = name;
this.invertDirection = invertDirection; this.invertDirection = invertDirection;
@ -92,6 +100,7 @@ public enum Station {
this.outboundTransferStation = outboundTransferStation; this.outboundTransferStation = outboundTransferStation;
this.endOfLine = endOfLine; this.endOfLine = endOfLine;
this.longStationLinger = longStationLinger; this.longStationLinger = longStationLinger;
this.departureEqualityTolerance = departureEqualityTolerance;
} }
public static Station getByAbbreviation(String abbr) { public static Station getByAbbreviation(String abbr) {

View File

@ -25,7 +25,7 @@ public class ScheduleContentHandler extends DefaultHandler {
} }
private final static List<String> TAGS = Arrays.asList("date", "time", private final static List<String> TAGS = Arrays.asList("date", "time",
"trip"); "trip", "leg");
private final static DateFormat TRIP_DATE_FORMAT; private final static DateFormat TRIP_DATE_FORMAT;
private final static DateFormat REQUEST_DATE_FORMAT; private final static DateFormat REQUEST_DATE_FORMAT;
@ -53,6 +53,8 @@ public class ScheduleContentHandler extends DefaultHandler {
private String requestDate; private String requestDate;
private String requestTime; private String requestTime;
private ScheduleItem currentTrip;
@Override @Override
public void characters(char[] ch, int start, int length) public void characters(char[] ch, int start, int length)
throws SAXException { throws SAXException {
@ -67,22 +69,23 @@ public class ScheduleContentHandler extends DefaultHandler {
if (TAGS.contains(localName)) { if (TAGS.contains(localName)) {
isParsingTag = true; isParsingTag = true;
} }
final int numberOfAttributes = attributes.getLength();
if (localName.equals("trip")) { if (localName.equals("trip")) {
ScheduleItem trip = new ScheduleItem(); currentTrip = new ScheduleItem();
String originDate = null; String originDate = null;
String originTime = null; String originTime = null;
String destinationDate = null; String destinationDate = null;
String destinationTime = null; String destinationTime = null;
for (int i = attributes.getLength() - 1; i >= 0; i--) { for (int i = 0; i < numberOfAttributes; i++) {
if (attributes.getLocalName(i).equalsIgnoreCase("origin")) { if (attributes.getLocalName(i).equalsIgnoreCase("origin")) {
trip.setOrigin(Station.getByAbbreviation(attributes currentTrip.setOrigin(Station.getByAbbreviation(attributes
.getValue(i))); .getValue(i)));
} else if (attributes.getLocalName(i).equalsIgnoreCase( } else if (attributes.getLocalName(i).equalsIgnoreCase(
"destination")) { "destination")) {
trip.setDestination(Station.getByAbbreviation(attributes currentTrip.setDestination(Station
.getValue(i))); .getByAbbreviation(attributes.getValue(i)));
} else if (attributes.getLocalName(i).equalsIgnoreCase("fare")) { } else if (attributes.getLocalName(i).equalsIgnoreCase("fare")) {
trip.setFare(attributes.getValue(i)); currentTrip.setFare(attributes.getValue(i));
} else if (attributes.getLocalName(i).equalsIgnoreCase( } else if (attributes.getLocalName(i).equalsIgnoreCase(
"origTimeMin")) { "origTimeMin")) {
originTime = attributes.getValue(i); originTime = attributes.getValue(i);
@ -97,24 +100,34 @@ public class ScheduleContentHandler extends DefaultHandler {
destinationDate = attributes.getValue(i); destinationDate = attributes.getValue(i);
} else if (attributes.getLocalName(i).equalsIgnoreCase( } else if (attributes.getLocalName(i).equalsIgnoreCase(
"bikeFlag")) { "bikeFlag")) {
trip.setBikesAllowed(attributes.getValue(i).equals("1")); currentTrip.setBikesAllowed(attributes.getValue(i).equals(
} else if (attributes.getLocalName(i).equalsIgnoreCase( "1"));
"trainHeadStation")) {
trip.setTrainHeadStation(attributes.getValue(i));
} }
} }
long departTime = parseDate(TRIP_DATE_FORMAT, originDate, long departTime = parseDate(TRIP_DATE_FORMAT, originDate,
originTime); originTime);
if (departTime > 0) if (departTime > 0)
trip.setDepartureTime(departTime); currentTrip.setDepartureTime(departTime);
long arriveTime = parseDate(TRIP_DATE_FORMAT, destinationDate, long arriveTime = parseDate(TRIP_DATE_FORMAT, destinationDate,
destinationTime); destinationTime);
if (arriveTime > 0) if (arriveTime > 0)
trip.setArrivalTime(arriveTime); currentTrip.setArrivalTime(arriveTime);
schedule.addTrip(trip); schedule.addTrip(currentTrip);
}
if (localName.equals("leg")) {
String legNumber = null;
for (int i = 0; i < numberOfAttributes; i++) {
if (attributes.getLocalName(i).equals("order")) {
legNumber = attributes.getValue(i);
} else if (attributes.getLocalName(i)
.equals("trainHeadStation") && "1".equals(legNumber)) {
currentTrip.setTrainHeadStation(attributes.getValue(i)
.toLowerCase());
}
}
} }
} }