Fixed SFIA, arrival estimate issues
--HG-- branch : estarrival
This commit is contained in:
parent
58f623b1cf
commit
64f576c36d
@ -2,6 +2,8 @@ package com.dougkeen.bart;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.graphics.drawable.GradientDrawable;
|
import android.graphics.drawable.GradientDrawable;
|
||||||
@ -20,6 +22,8 @@ import com.dougkeen.bart.model.Departure;
|
|||||||
|
|
||||||
public class DepartureArrayAdapter extends ArrayAdapter<Departure> {
|
public class DepartureArrayAdapter extends ArrayAdapter<Departure> {
|
||||||
|
|
||||||
|
public static int refreshCounter = 0;
|
||||||
|
|
||||||
public DepartureArrayAdapter(Context context, int textViewResourceId,
|
public DepartureArrayAdapter(Context context, int textViewResourceId,
|
||||||
Departure[] objects) {
|
Departure[] objects) {
|
||||||
super(context, textViewResourceId, objects);
|
super(context, textViewResourceId, objects);
|
||||||
@ -49,8 +53,6 @@ public class DepartureArrayAdapter extends ArrayAdapter<Departure> {
|
|||||||
super(context, textViewResourceId);
|
super(context, textViewResourceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String currentViewSwitcherText;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View getView(int position, View convertView, ViewGroup parent) {
|
public View getView(int position, View convertView, ViewGroup parent) {
|
||||||
View view;
|
View view;
|
||||||
@ -69,20 +71,23 @@ public class DepartureArrayAdapter extends ArrayAdapter<Departure> {
|
|||||||
.findViewById(R.id.trainLengthText);
|
.findViewById(R.id.trainLengthText);
|
||||||
initTextSwitcher(textSwitcher);
|
initTextSwitcher(textSwitcher);
|
||||||
|
|
||||||
if (System.currentTimeMillis() % 6000 > 3000) {
|
final String estimatedArrivalTimeText = departure
|
||||||
|
.getEstimatedArrivalTimeText(getContext());
|
||||||
|
String arrivalText = "Est. arrival " + estimatedArrivalTimeText;
|
||||||
|
if (StringUtils.isBlank(estimatedArrivalTimeText)) {
|
||||||
|
textSwitcher.setCurrentText(departure.getTrainLengthText());
|
||||||
|
} else if (refreshCounter % 6 < 3) {
|
||||||
String trainLengthText = departure.getTrainLengthText();
|
String trainLengthText = departure.getTrainLengthText();
|
||||||
if (currentViewSwitcherText == null
|
if (refreshCounter % 6 == 0) {
|
||||||
|| !currentViewSwitcherText.equals(trainLengthText)) {
|
|
||||||
textSwitcher.setText(trainLengthText);
|
textSwitcher.setText(trainLengthText);
|
||||||
currentViewSwitcherText = trainLengthText;
|
} else {
|
||||||
|
textSwitcher.setCurrentText(trainLengthText);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
String arrivalText = "Est. arrival "
|
if (refreshCounter % 6 == 3) {
|
||||||
+ departure.getEstimatedArrivalTimeText(getContext());
|
|
||||||
if (currentViewSwitcherText == null
|
|
||||||
|| !currentViewSwitcherText.equals(arrivalText)) {
|
|
||||||
textSwitcher.setText(arrivalText);
|
textSwitcher.setText(arrivalText);
|
||||||
currentViewSwitcherText = arrivalText;
|
} else {
|
||||||
|
textSwitcher.setCurrentText(arrivalText);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImageView colorBar = (ImageView) view
|
ImageView colorBar = (ImageView) view
|
||||||
@ -121,9 +126,7 @@ public class DepartureArrayAdapter extends ArrayAdapter<Departure> {
|
|||||||
});
|
});
|
||||||
|
|
||||||
textSwitcher.setInAnimation(AnimationUtils.loadAnimation(
|
textSwitcher.setInAnimation(AnimationUtils.loadAnimation(
|
||||||
getContext(), android.R.anim.slide_in_left));
|
getContext(), android.R.anim.fade_in));
|
||||||
textSwitcher.setOutAnimation(AnimationUtils.loadAnimation(
|
|
||||||
getContext(), android.R.anim.slide_out_right));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -430,6 +430,7 @@ public class ViewDeparturesActivity extends ListActivity {
|
|||||||
|
|
||||||
private void runAutoUpdate() {
|
private void runAutoUpdate() {
|
||||||
if (mIsAutoUpdating && mDeparturesAdapter != null) {
|
if (mIsAutoUpdating && mDeparturesAdapter != null) {
|
||||||
|
DepartureArrayAdapter.refreshCounter++;
|
||||||
mDeparturesAdapter.notifyDataSetChanged();
|
mDeparturesAdapter.notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
if (hasWindowFocus()) {
|
if (hasWindowFocus()) {
|
||||||
|
@ -9,6 +9,7 @@ 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_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() {
|
||||||
@ -32,6 +33,7 @@ public class Departure implements Parcelable, Comparable<Departure> {
|
|||||||
readFromParcel(in);
|
readFromParcel(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Station origin;
|
||||||
private Station destination;
|
private Station destination;
|
||||||
private Line line;
|
private Line line;
|
||||||
private String destinationColor;
|
private String destinationColor;
|
||||||
@ -48,6 +50,18 @@ public class Departure implements Parcelable, Comparable<Departure> {
|
|||||||
|
|
||||||
private int estimatedTripTime;
|
private int estimatedTripTime;
|
||||||
|
|
||||||
|
private boolean beganAsDeparted;
|
||||||
|
|
||||||
|
private long arrivalTimeOverride;
|
||||||
|
|
||||||
|
public Station getOrigin() {
|
||||||
|
return origin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOrigin(Station origin) {
|
||||||
|
this.origin = origin;
|
||||||
|
}
|
||||||
|
|
||||||
public Station getDestination() {
|
public Station getDestination() {
|
||||||
return destination;
|
return destination;
|
||||||
}
|
}
|
||||||
@ -134,6 +148,9 @@ public class Departure implements Parcelable, Comparable<Departure> {
|
|||||||
|
|
||||||
public void setMinutes(int minutes) {
|
public void setMinutes(int minutes) {
|
||||||
this.minutes = minutes;
|
this.minutes = minutes;
|
||||||
|
if (minutes == 0) {
|
||||||
|
beganAsDeparted = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getMinEstimate() {
|
public long getMinEstimate() {
|
||||||
@ -185,6 +202,9 @@ public class Departure implements Parcelable, Comparable<Departure> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public long getEstimatedArrivalTime() {
|
public long getEstimatedArrivalTime() {
|
||||||
|
if (arrivalTimeOverride > 0) {
|
||||||
|
return arrivalTimeOverride;
|
||||||
|
}
|
||||||
return getMeanEstimate() + getEstimatedTripTime();
|
return getMeanEstimate() + getEstimatedTripTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -208,6 +228,13 @@ public class Departure implements Parcelable, Comparable<Departure> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void mergeEstimate(Departure departure) {
|
public void mergeEstimate(Departure departure) {
|
||||||
|
if (departure.hasDeparted() && origin.longStationLinger
|
||||||
|
&& getMinEstimate() > 0 && !beganAsDeparted) {
|
||||||
|
// This is probably not a true departure, but an indication that
|
||||||
|
// the train is in the station. Don't update the estimates.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ((getMaxEstimate() - departure.getMinEstimate()) < MINIMUM_MERGE_OVERLAP_MILLIS
|
if ((getMaxEstimate() - departure.getMinEstimate()) < MINIMUM_MERGE_OVERLAP_MILLIS
|
||||||
|| departure.getMaxEstimate() - getMinEstimate() < MINIMUM_MERGE_OVERLAP_MILLIS) {
|
|| departure.getMaxEstimate() - getMinEstimate() < MINIMUM_MERGE_OVERLAP_MILLIS) {
|
||||||
// The estimate must have changed... just use the latest incoming
|
// The estimate must have changed... just use the latest incoming
|
||||||
@ -281,7 +308,7 @@ public class Departure implements Parcelable, Comparable<Departure> {
|
|||||||
return false;
|
return false;
|
||||||
if (line != other.line)
|
if (line != other.line)
|
||||||
return false;
|
return false;
|
||||||
if (Math.abs(maxEstimate - other.maxEstimate) > ESTIMATE_EQUALS_TOLERANCE_MILLIS)
|
if (Math.abs(maxEstimate - other.maxEstimate) > getEqualsTolerance())
|
||||||
return false;
|
return false;
|
||||||
if (platform == null) {
|
if (platform == null) {
|
||||||
if (other.platform != null)
|
if (other.platform != null)
|
||||||
@ -298,11 +325,23 @@ public class Departure implements Parcelable, Comparable<Departure> {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int getEqualsTolerance() {
|
||||||
|
if (origin.longStationLinger && hasDeparted()) {
|
||||||
|
return ESTIMATE_EQUALS_TOLERANCE_LONG_LINGER_MILLIS;
|
||||||
|
} else {
|
||||||
|
return ESTIMATE_EQUALS_TOLERANCE_MILLIS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public String getCountdownText() {
|
public String getCountdownText() {
|
||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
int secondsLeft = getMeanSecondsLeft();
|
int secondsLeft = getMeanSecondsLeft();
|
||||||
if (hasDeparted()) {
|
if (hasDeparted()) {
|
||||||
builder.append("Departed");
|
if (origin.longStationLinger && beganAsDeparted) {
|
||||||
|
builder.append("At station");
|
||||||
|
} else {
|
||||||
|
builder.append("Departed");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
builder.append(secondsLeft / 60);
|
builder.append(secondsLeft / 60);
|
||||||
builder.append("m, ");
|
builder.append("m, ");
|
||||||
|
@ -37,6 +37,12 @@ public enum Line {
|
|||||||
Station.COLS, Station.SANL, Station.BAYF, Station.HAYW,
|
Station.COLS, Station.SANL, Station.BAYF, Station.HAYW,
|
||||||
Station.SHAY, Station.UCTY, Station.FRMT),
|
Station.SHAY, Station.UCTY, Station.FRMT),
|
||||||
YELLOW_ORANGE_SCHEDULED_TRANSFER(YELLOW, ORANGE, Station.MLBR,
|
YELLOW_ORANGE_SCHEDULED_TRANSFER(YELLOW, ORANGE, Station.MLBR,
|
||||||
|
Station.SFIA, Station.SBRN, Station.SSAN, Station.COLM,
|
||||||
|
Station.DALY, Station.BALB, Station.GLEN, Station._24TH,
|
||||||
|
Station._16TH, Station.CIVC, Station.POWL, Station.MONT,
|
||||||
|
Station.EMBR, Station.WOAK, Station.ASHB, Station.DBRK,
|
||||||
|
Station.NBRK, Station.PLZA, Station.DELN, Station.RICH),
|
||||||
|
YELLOW_RED_SCHEDULED_TRANSFER(YELLOW, RED, Station.MLBR,
|
||||||
Station.SFIA, Station.SBRN, Station.SSAN, Station.COLM,
|
Station.SFIA, Station.SBRN, Station.SSAN, Station.COLM,
|
||||||
Station.DALY, Station.BALB, Station.GLEN, Station._24TH,
|
Station.DALY, Station.BALB, Station.GLEN, Station._24TH,
|
||||||
Station._16TH, Station.CIVC, Station.POWL, Station.MONT,
|
Station._16TH, Station.CIVC, Station.POWL, Station.MONT,
|
||||||
|
@ -6,43 +6,51 @@ import java.util.List;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
public enum Station {
|
public enum Station {
|
||||||
_12TH("12th", "12th St./Oakland City Center", false, false, "bayf"), _16TH(
|
_12TH("12th", "12th St./Oakland City Center", false, false, "bayf"),
|
||||||
"16th", "16th St. Mission", false, false), _19TH("19th",
|
_16TH("16th", "16th St. Mission", false, false),
|
||||||
"19th St./Oakland", false, false, "bayf"), _24TH("24th",
|
_19TH("19th", "19th St./Oakland", false, false, "bayf"),
|
||||||
"24th St. Mission", false, false), ASHB("ashb", "Ashby", false,
|
_24TH("24th", "24th St. Mission", false, false),
|
||||||
false, "mcar"), BALB("balb", "Balboa Park", false, false), BAYF(
|
ASHB("ashb", "Ashby", false, false, "mcar"),
|
||||||
"bayf", "Bay Fair", true, false, "mcar"), CAST("cast",
|
BALB("balb", "Balboa Park", false, false),
|
||||||
"Castro Valley", false, false, "bayf"), CIVC("civc",
|
BAYF("bayf", "Bay Fair", true, false, "mcar"),
|
||||||
"Civic Center", false, false), COLS("cols",
|
CAST("cast", "Castro Valley", false, false, "bayf"),
|
||||||
"Coliseum/Oakland Airport", true, false, "mcar"), COLM("colm",
|
CIVC("civc", "Civic Center", false, false),
|
||||||
"Colma", false, false, "balb", "balb"), CONC("conc", "Concord",
|
COLS("cols", "Coliseum/Oakland Airport", true, false, "mcar"),
|
||||||
false, false, "mcar"), DALY("daly", "Daly City", false, false), DBRK(
|
COLM("colm", "Colma", false, false, "balb", "balb"),
|
||||||
"dbrk", "Downtown Berkeley", false, false, "mcar"), DUBL("dubl",
|
CONC("conc", "Concord", false, false, "mcar"),
|
||||||
"Dublin/Pleasanton", false, true, "bayf"), DELN("deln",
|
DALY("daly", "Daly City", false, false),
|
||||||
"El Cerrito del Norte", false, false, "mcar"), PLZA("plza",
|
DBRK("dbrk", "Downtown Berkeley", false, false, "mcar"),
|
||||||
"El Cerrito Plaza", false, false, "mcar"), EMBR("embr",
|
DUBL("dubl", "Dublin/Pleasanton", false, true, "bayf"),
|
||||||
"Embarcadero", false, false), FRMT("frmt", "Fremont", true, false,
|
DELN("deln", "El Cerrito del Norte", false, false, "mcar"),
|
||||||
"bayf"), FTVL("ftvl", "Fruitvale", true, false, "mcar"), GLEN(
|
PLZA("plza", "El Cerrito Plaza", false, false, "mcar"),
|
||||||
"glen", "Glen Park", false, false), HAYW("hayw", "Hayward", true,
|
EMBR("embr", "Embarcadero", false, false),
|
||||||
false, "bayf"), LAFY("lafy", "Lafayette", false, false, "mcar"), LAKE(
|
FRMT("frmt", "Fremont", true, false, "bayf"),
|
||||||
"lake", "Lake Merritt", true, false, "mcar"), MCAR("mcar",
|
FTVL("ftvl", "Fruitvale", true, false, "mcar"),
|
||||||
"MacArthur", false, false, "bayf"), MLBR("mlbr", "Millbrae", false,
|
GLEN("glen", "Glen Park", false, false),
|
||||||
true, "balb", "balb"), MONT("mont", "Montgomery St.", false, false), NBRK(
|
HAYW("hayw", "Hayward", true, false, "bayf"),
|
||||||
"nbrk", "North Berkeley", false, false, "mcar"), NCON("ncon",
|
LAFY("lafy", "Lafayette", false, false, "mcar"),
|
||||||
"North Concord/Martinez", false, false, "mcar"), ORIN("orin",
|
LAKE("lake", "Lake Merritt", true, false, "mcar"),
|
||||||
"Orinda", false, false, "mcar"), PITT("pitt",
|
MCAR("mcar", "MacArthur", false, false, "bayf"),
|
||||||
"Pittsburg/Bay Point", false, true, "mcar"), PHIL("phil",
|
MLBR("mlbr", "Millbrae", false, true, "balb", "balb"),
|
||||||
"Pleasant Hill", false, false, "mcar"), POWL("powl", "Powell St.",
|
MONT("mont", "Montgomery St.", false, false),
|
||||||
false, false), RICH("rich", "Richmond", false, true, "mcar"), ROCK(
|
NBRK("nbrk", "North Berkeley", false, false, "mcar"),
|
||||||
"rock", "Rockridge", false, false, "mcar"), SBRN("sbrn",
|
NCON("ncon", "North Concord/Martinez", false, false, "mcar"),
|
||||||
"San Bruno", false, false, "balb", "balb"), SANL("sanl",
|
ORIN("orin", "Orinda", false, false, "mcar"),
|
||||||
"San Leandro", true, false, "mcar"), SFIA("sfia", "SFO Airport",
|
PITT("pitt", "Pittsburg/Bay Point", false, true, "mcar"),
|
||||||
false, false, "sbrn", "balb"), SHAY("shay", "South Hayward", true,
|
PHIL("phil", "Pleasant Hill", false, false, "mcar"),
|
||||||
false, "bayf"), SSAN("ssan", "South San Francisco", false, false,
|
POWL("powl", "Powell St.", false, false),
|
||||||
"balb", "balb"), UCTY("ucty", "Union City", true, false, "bayf"), WCRK(
|
RICH("rich", "Richmond", false, true, "mcar"),
|
||||||
"wcrk", "Walnut Creek", false, false, "mcar"), WDUB("wdub",
|
ROCK("rock", "Rockridge", false, false, "mcar"),
|
||||||
"West Dublin/Pleasanton", false, false, "bayf"), WOAK("woak",
|
SBRN("sbrn", "San Bruno", false, false, "balb", "balb"),
|
||||||
"West Oakland", false, false), SPCL("spcl", "Special", false, false);
|
SANL("sanl", "San Leandro", true, false, "mcar"),
|
||||||
|
SFIA("sfia", "SFO Airport", false, false, "sbrn", "balb", true),
|
||||||
|
SHAY("shay", "South Hayward", true, false, "bayf"),
|
||||||
|
SSAN("ssan", "South San Francisco", false, false, "balb", "balb"),
|
||||||
|
UCTY("ucty", "Union City", true, false, "bayf"),
|
||||||
|
WCRK("wcrk", "Walnut Creek", false, false, "mcar"),
|
||||||
|
WDUB("wdub", "West Dublin/Pleasanton", false, false, "bayf"),
|
||||||
|
WOAK("woak", "West Oakland", false, false),
|
||||||
|
SPCL("spcl", "Special", false, false);
|
||||||
|
|
||||||
public final String abbreviation;
|
public final String abbreviation;
|
||||||
public final String name;
|
public final String name;
|
||||||
@ -50,36 +58,36 @@ public enum Station {
|
|||||||
protected final String inboundTransferStation;
|
protected final String inboundTransferStation;
|
||||||
protected final String outboundTransferStation;
|
protected final String outboundTransferStation;
|
||||||
public final boolean endOfLine;
|
public final boolean endOfLine;
|
||||||
|
public final boolean longStationLinger;
|
||||||
|
|
||||||
private Station(String abbreviation, String name, boolean invertDirection,
|
private Station(String abbreviation, String name, boolean invertDirection,
|
||||||
boolean endOfLine) {
|
boolean endOfLine) {
|
||||||
this.abbreviation = abbreviation;
|
this(abbreviation, name, invertDirection, endOfLine, null, null, false);
|
||||||
this.name = name;
|
|
||||||
this.invertDirection = invertDirection;
|
|
||||||
this.inboundTransferStation = null;
|
|
||||||
this.outboundTransferStation = null;
|
|
||||||
this.endOfLine = endOfLine;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Station(String abbreviation, String name, boolean invertDirection,
|
private Station(String abbreviation, String name, boolean invertDirection,
|
||||||
boolean endOfLine, String transferStation) {
|
boolean endOfLine, String transferStation) {
|
||||||
this.abbreviation = abbreviation;
|
this(abbreviation, name, invertDirection, endOfLine, transferStation,
|
||||||
this.name = name;
|
null, false);
|
||||||
this.invertDirection = invertDirection;
|
|
||||||
this.inboundTransferStation = transferStation;
|
|
||||||
this.outboundTransferStation = null;
|
|
||||||
this.endOfLine = endOfLine;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Station(String abbreviation, String name, boolean invertDirection,
|
private Station(String abbreviation, String name, boolean invertDirection,
|
||||||
boolean endOfLine, String inboundTransferStation,
|
boolean endOfLine, String inboundTransferStation,
|
||||||
String outboundTransferStation) {
|
String outboundTransferStation) {
|
||||||
|
this(abbreviation, name, invertDirection, endOfLine,
|
||||||
|
inboundTransferStation, outboundTransferStation, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Station(String abbreviation, String name, boolean invertDirection,
|
||||||
|
boolean endOfLine, String inboundTransferStation,
|
||||||
|
String outboundTransferStation, boolean longStationLinger) {
|
||||||
this.abbreviation = abbreviation;
|
this.abbreviation = abbreviation;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.invertDirection = invertDirection;
|
this.invertDirection = invertDirection;
|
||||||
this.inboundTransferStation = inboundTransferStation;
|
this.inboundTransferStation = inboundTransferStation;
|
||||||
this.outboundTransferStation = outboundTransferStation;
|
this.outboundTransferStation = outboundTransferStation;
|
||||||
this.endOfLine = endOfLine;
|
this.endOfLine = endOfLine;
|
||||||
|
this.longStationLinger = longStationLinger;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Station getByAbbreviation(String abbr) {
|
public static Station getByAbbreviation(String abbr) {
|
||||||
|
@ -59,6 +59,7 @@ public class EtdContentHandler extends DefaultHandler {
|
|||||||
currentDeparture = new Departure();
|
currentDeparture = new Departure();
|
||||||
currentDeparture.setDestination(Station
|
currentDeparture.setDestination(Station
|
||||||
.getByAbbreviation(currentDestination));
|
.getByAbbreviation(currentDestination));
|
||||||
|
currentDeparture.setOrigin(realTimeDepartures.getOrigin());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user