2011-05-23 18:59:34 +00:00
|
|
|
|
package com.dougkeen.bart.data;
|
|
|
|
|
|
2011-05-27 21:06:58 +00:00
|
|
|
|
import android.os.Parcel;
|
|
|
|
|
import android.os.Parcelable;
|
|
|
|
|
|
2011-06-01 03:42:32 +00:00
|
|
|
|
import com.dougkeen.bart.Line;
|
2011-05-23 18:59:34 +00:00
|
|
|
|
import com.dougkeen.bart.Station;
|
|
|
|
|
|
2011-06-05 18:13:21 +00:00
|
|
|
|
public class Departure implements Parcelable, Comparable<Departure> {
|
2012-01-07 19:39:26 +00:00
|
|
|
|
private static final int ESTIMATE_EQUALS_TOLERANCE_MILLIS = 59999;
|
2011-06-05 18:13:21 +00:00
|
|
|
|
private static final int MINIMUM_MERGE_OVERLAP_MILLIS = 10000;
|
|
|
|
|
|
|
|
|
|
public Departure() {
|
2011-05-23 18:59:34 +00:00
|
|
|
|
super();
|
|
|
|
|
}
|
|
|
|
|
|
2011-06-05 18:13:21 +00:00
|
|
|
|
public Departure(String destinationAbbr, String destinationColor,
|
2011-05-23 18:59:34 +00:00
|
|
|
|
String platform, String direction, boolean bikeAllowed,
|
2011-11-21 16:57:16 +00:00
|
|
|
|
String trainLength, int minutes) {
|
2011-05-23 18:59:34 +00:00
|
|
|
|
super();
|
|
|
|
|
this.destination = Station.getByAbbreviation(destinationAbbr);
|
|
|
|
|
this.destinationColor = destinationColor;
|
|
|
|
|
this.platform = platform;
|
|
|
|
|
this.direction = direction;
|
|
|
|
|
this.bikeAllowed = bikeAllowed;
|
|
|
|
|
this.trainLength = trainLength;
|
|
|
|
|
this.minutes = minutes;
|
|
|
|
|
}
|
|
|
|
|
|
2011-06-05 18:13:21 +00:00
|
|
|
|
public Departure(Parcel in) {
|
2011-05-27 21:06:58 +00:00
|
|
|
|
readFromParcel(in);
|
|
|
|
|
}
|
|
|
|
|
|
2011-05-23 18:59:34 +00:00
|
|
|
|
private Station destination;
|
2011-06-01 03:42:32 +00:00
|
|
|
|
private Line line;
|
2011-05-23 18:59:34 +00:00
|
|
|
|
private String destinationColor;
|
|
|
|
|
private String platform;
|
|
|
|
|
private String direction;
|
|
|
|
|
private boolean bikeAllowed;
|
2011-11-21 16:57:16 +00:00
|
|
|
|
private String trainLength;
|
2011-05-23 18:59:34 +00:00
|
|
|
|
private boolean requiresTransfer;
|
|
|
|
|
|
|
|
|
|
private int minutes;
|
|
|
|
|
|
|
|
|
|
private long minEstimate;
|
|
|
|
|
private long maxEstimate;
|
|
|
|
|
|
|
|
|
|
public Station getDestination() {
|
|
|
|
|
return destination;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setDestination(Station destination) {
|
|
|
|
|
this.destination = destination;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public String getDestinationName() {
|
|
|
|
|
if (destination != null)
|
|
|
|
|
return destination.name;
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public String getDestinationAbbreviation() {
|
|
|
|
|
if (destination != null)
|
|
|
|
|
return destination.abbreviation;
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
2011-06-01 03:42:32 +00:00
|
|
|
|
public Line getLine() {
|
|
|
|
|
return line;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setLine(Line line) {
|
|
|
|
|
this.line = line;
|
|
|
|
|
}
|
|
|
|
|
|
2011-05-23 18:59:34 +00:00
|
|
|
|
public String getDestinationColor() {
|
|
|
|
|
return destinationColor;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setDestinationColor(String destinationColor) {
|
|
|
|
|
this.destinationColor = destinationColor;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public String getPlatform() {
|
|
|
|
|
return platform;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setPlatform(String platform) {
|
|
|
|
|
this.platform = platform;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public String getDirection() {
|
|
|
|
|
return direction;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setDirection(String direction) {
|
|
|
|
|
this.direction = direction;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public boolean isBikeAllowed() {
|
|
|
|
|
return bikeAllowed;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setBikeAllowed(boolean bikeAllowed) {
|
|
|
|
|
this.bikeAllowed = bikeAllowed;
|
|
|
|
|
}
|
|
|
|
|
|
2011-11-21 16:57:16 +00:00
|
|
|
|
public String getTrainLength() {
|
2011-05-23 18:59:34 +00:00
|
|
|
|
return trainLength;
|
|
|
|
|
}
|
|
|
|
|
|
2011-11-21 16:57:16 +00:00
|
|
|
|
public void setTrainLength(String trainLength) {
|
2011-05-23 18:59:34 +00:00
|
|
|
|
this.trainLength = trainLength;
|
|
|
|
|
}
|
|
|
|
|
|
2011-05-27 21:06:58 +00:00
|
|
|
|
public String getTrainLengthText() {
|
|
|
|
|
return trainLength + " car train";
|
|
|
|
|
}
|
|
|
|
|
|
2011-05-23 18:59:34 +00:00
|
|
|
|
public boolean getRequiresTransfer() {
|
|
|
|
|
return requiresTransfer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setRequiresTransfer(boolean requiresTransfer) {
|
|
|
|
|
this.requiresTransfer = requiresTransfer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int getMinutes() {
|
|
|
|
|
return minutes;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setMinutes(int minutes) {
|
|
|
|
|
this.minutes = minutes;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public long getMinEstimate() {
|
|
|
|
|
return minEstimate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setMinEstimate(long minEstimate) {
|
|
|
|
|
this.minEstimate = minEstimate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public long getMaxEstimate() {
|
|
|
|
|
return maxEstimate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setMaxEstimate(long maxEstimate) {
|
|
|
|
|
this.maxEstimate = maxEstimate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int getUncertaintySeconds() {
|
|
|
|
|
return (int) (maxEstimate - minEstimate + 1000) / 2000;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int getMinSecondsLeft() {
|
|
|
|
|
return (int) ((getMinEstimate() - System.currentTimeMillis()) / 1000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int getMaxSecondsLeft() {
|
|
|
|
|
return (int) ((getMaxEstimate() - System.currentTimeMillis()) / 1000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int getMeanSecondsLeft() {
|
|
|
|
|
return (int) (((getMinEstimate() + getMaxEstimate()) / 2 - System
|
|
|
|
|
.currentTimeMillis()) / 1000);
|
|
|
|
|
}
|
|
|
|
|
|
2011-06-05 18:13:21 +00:00
|
|
|
|
public boolean hasDeparted() {
|
2011-06-17 21:35:20 +00:00
|
|
|
|
return getMeanSecondsLeft() < 0;
|
2011-05-27 21:06:58 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-05-23 18:59:34 +00:00
|
|
|
|
public void calculateEstimates(long originalEstimateTime) {
|
2011-06-05 18:13:21 +00:00
|
|
|
|
setMinEstimate(originalEstimateTime + (getMinutes() * 60 * 1000)
|
|
|
|
|
- (30000));
|
|
|
|
|
setMaxEstimate(getMinEstimate() + 60000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void mergeEstimate(Departure departure) {
|
|
|
|
|
if ((getMaxEstimate() - departure.getMinEstimate()) < MINIMUM_MERGE_OVERLAP_MILLIS
|
|
|
|
|
|| departure.getMaxEstimate() - getMinEstimate() < MINIMUM_MERGE_OVERLAP_MILLIS) {
|
|
|
|
|
// The estimate must have changed... just use the latest incoming
|
|
|
|
|
// values
|
|
|
|
|
setMinEstimate(departure.getMinEstimate());
|
|
|
|
|
setMaxEstimate(departure.getMaxEstimate());
|
|
|
|
|
return;
|
|
|
|
|
}
|
2011-05-23 18:59:34 +00:00
|
|
|
|
|
2011-11-21 16:57:16 +00:00
|
|
|
|
final long newMin = Math.max(getMinEstimate(),
|
|
|
|
|
departure.getMinEstimate());
|
|
|
|
|
final long newMax = Math.min(getMaxEstimate(),
|
|
|
|
|
departure.getMaxEstimate());
|
2011-05-27 21:06:58 +00:00
|
|
|
|
if (newMax > newMin) { // We can never have 0 or negative uncertainty
|
|
|
|
|
setMinEstimate(newMin);
|
|
|
|
|
setMaxEstimate(newMax);
|
|
|
|
|
}
|
2011-05-23 18:59:34 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-06-05 18:13:21 +00:00
|
|
|
|
public int compareTo(Departure another) {
|
2011-11-21 16:57:16 +00:00
|
|
|
|
return (this.getMinutes() > another.getMinutes()) ? 1 : ((this
|
|
|
|
|
.getMinutes() == another.getMinutes()) ? 0 : -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int hashCode() {
|
|
|
|
|
final int prime = 31;
|
|
|
|
|
int result = 1;
|
|
|
|
|
result = prime * result + (bikeAllowed ? 1231 : 1237);
|
|
|
|
|
result = prime * result
|
|
|
|
|
+ ((destination == null) ? 0 : destination.hashCode());
|
|
|
|
|
result = prime
|
|
|
|
|
* result
|
|
|
|
|
+ ((destinationColor == null) ? 0 : destinationColor.hashCode());
|
|
|
|
|
result = prime * result
|
|
|
|
|
+ ((direction == null) ? 0 : direction.hashCode());
|
|
|
|
|
result = prime * result + ((line == null) ? 0 : line.hashCode());
|
|
|
|
|
result = prime * result + (int) (maxEstimate ^ (maxEstimate >>> 32));
|
|
|
|
|
result = prime * result + (int) (minEstimate ^ (minEstimate >>> 32));
|
|
|
|
|
result = prime * result + minutes;
|
|
|
|
|
result = prime * result
|
|
|
|
|
+ ((platform == null) ? 0 : platform.hashCode());
|
|
|
|
|
result = prime * result + (requiresTransfer ? 1231 : 1237);
|
|
|
|
|
result = prime * result
|
|
|
|
|
+ ((trainLength == null) ? 0 : trainLength.hashCode());
|
|
|
|
|
return result;
|
2011-05-23 18:59:34 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean equals(Object obj) {
|
|
|
|
|
if (this == obj)
|
|
|
|
|
return true;
|
|
|
|
|
if (obj == null)
|
|
|
|
|
return false;
|
|
|
|
|
if (getClass() != obj.getClass())
|
|
|
|
|
return false;
|
2011-06-05 18:13:21 +00:00
|
|
|
|
Departure other = (Departure) obj;
|
2011-05-23 18:59:34 +00:00
|
|
|
|
if (bikeAllowed != other.bikeAllowed)
|
|
|
|
|
return false;
|
|
|
|
|
if (destination != other.destination)
|
|
|
|
|
return false;
|
|
|
|
|
if (destinationColor == null) {
|
|
|
|
|
if (other.destinationColor != null)
|
|
|
|
|
return false;
|
|
|
|
|
} else if (!destinationColor.equals(other.destinationColor))
|
|
|
|
|
return false;
|
|
|
|
|
if (direction == null) {
|
|
|
|
|
if (other.direction != null)
|
|
|
|
|
return false;
|
|
|
|
|
} else if (!direction.equals(other.direction))
|
|
|
|
|
return false;
|
2011-11-21 16:57:16 +00:00
|
|
|
|
if (line != other.line)
|
|
|
|
|
return false;
|
2012-01-07 19:39:26 +00:00
|
|
|
|
if (Math.abs(maxEstimate - other.maxEstimate) > ESTIMATE_EQUALS_TOLERANCE_MILLIS)
|
2011-11-21 16:57:16 +00:00
|
|
|
|
return false;
|
2011-05-23 18:59:34 +00:00
|
|
|
|
if (platform == null) {
|
|
|
|
|
if (other.platform != null)
|
|
|
|
|
return false;
|
|
|
|
|
} else if (!platform.equals(other.platform))
|
|
|
|
|
return false;
|
2011-11-21 16:57:16 +00:00
|
|
|
|
if (requiresTransfer != other.requiresTransfer)
|
2011-05-23 18:59:34 +00:00
|
|
|
|
return false;
|
2011-11-21 16:57:16 +00:00
|
|
|
|
if (trainLength == null) {
|
|
|
|
|
if (other.trainLength != null)
|
|
|
|
|
return false;
|
|
|
|
|
} else if (!trainLength.equals(other.trainLength))
|
|
|
|
|
return false;
|
|
|
|
|
return true;
|
2011-05-23 18:59:34 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-05-27 21:06:58 +00:00
|
|
|
|
public String getCountdownText() {
|
2011-05-23 18:59:34 +00:00
|
|
|
|
StringBuilder builder = new StringBuilder();
|
|
|
|
|
int secondsLeft = getMeanSecondsLeft();
|
2011-06-05 18:13:21 +00:00
|
|
|
|
if (hasDeparted()) {
|
|
|
|
|
builder.append("Departed");
|
2011-05-23 18:59:34 +00:00
|
|
|
|
} else {
|
|
|
|
|
builder.append(secondsLeft / 60);
|
|
|
|
|
builder.append("m, ");
|
|
|
|
|
builder.append(secondsLeft % 60);
|
|
|
|
|
builder.append("s");
|
|
|
|
|
}
|
|
|
|
|
return builder.toString();
|
|
|
|
|
}
|
2011-05-27 21:06:58 +00:00
|
|
|
|
|
|
|
|
|
public String getUncertaintyText() {
|
2011-06-05 18:13:21 +00:00
|
|
|
|
if (hasDeparted()) {
|
2011-05-27 21:06:58 +00:00
|
|
|
|
return "";
|
|
|
|
|
} else {
|
|
|
|
|
return "(<28>" + getUncertaintySeconds() + "s)";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public String toString() {
|
|
|
|
|
StringBuilder builder = new StringBuilder();
|
|
|
|
|
builder.append(destination);
|
|
|
|
|
if (requiresTransfer) {
|
|
|
|
|
builder.append(" (w/ xfer)");
|
|
|
|
|
}
|
|
|
|
|
builder.append(", ");
|
|
|
|
|
builder.append(getCountdownText());
|
|
|
|
|
return builder.toString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int describeContents() {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void writeToParcel(Parcel dest, int flags) {
|
|
|
|
|
dest.writeString(destination.abbreviation);
|
|
|
|
|
dest.writeString(destinationColor);
|
|
|
|
|
dest.writeString(platform);
|
|
|
|
|
dest.writeString(direction);
|
|
|
|
|
dest.writeByte((byte) (bikeAllowed ? 1 : 0));
|
2011-11-21 16:57:16 +00:00
|
|
|
|
dest.writeString(trainLength);
|
2011-05-27 21:06:58 +00:00
|
|
|
|
dest.writeByte((byte) (requiresTransfer ? 1 : 0));
|
|
|
|
|
dest.writeInt(minutes);
|
|
|
|
|
dest.writeLong(minEstimate);
|
|
|
|
|
dest.writeLong(maxEstimate);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void readFromParcel(Parcel in) {
|
|
|
|
|
destination = Station.getByAbbreviation(in.readString());
|
|
|
|
|
destinationColor = in.readString();
|
|
|
|
|
platform = in.readString();
|
|
|
|
|
direction = in.readString();
|
|
|
|
|
bikeAllowed = in.readByte() != 0;
|
2011-11-21 16:57:16 +00:00
|
|
|
|
trainLength = in.readString();
|
2011-05-27 21:06:58 +00:00
|
|
|
|
requiresTransfer = in.readByte() != 0;
|
|
|
|
|
minutes = in.readInt();
|
|
|
|
|
minEstimate = in.readLong();
|
|
|
|
|
maxEstimate = in.readLong();
|
|
|
|
|
}
|
|
|
|
|
|
2011-06-05 18:13:21 +00:00
|
|
|
|
public static final Parcelable.Creator<Departure> CREATOR = new Parcelable.Creator<Departure>() {
|
|
|
|
|
public Departure createFromParcel(Parcel in) {
|
|
|
|
|
return new Departure(in);
|
2011-05-27 21:06:58 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-06-05 18:13:21 +00:00
|
|
|
|
public Departure[] newArray(int size) {
|
|
|
|
|
return new Departure[size];
|
2011-05-27 21:06:58 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|