From 67e6f5347d87466146549500d6ab53478d9e62ce Mon Sep 17 00:00:00 2001 From: dkeen Date: Tue, 31 May 2011 20:42:32 -0700 Subject: [PATCH] Bug fixes --- AndroidManifest.xml | 2 +- res/values/strings.xml | 3 +- src/com/dougkeen/bart/Constants.java | 2 ++ src/com/dougkeen/bart/EtdContentHandler.java | 11 ++++++- .../bart/GetRealTimeArrivalsTask.java | 25 +++++++-------- src/com/dougkeen/bart/Line.java | 27 +++++----------- src/com/dougkeen/bart/Route.java | 21 +++++++++++++ src/com/dougkeen/bart/Station.java | 12 ++++--- .../dougkeen/bart/ViewArrivalsActivity.java | 31 ++++++++++++------- src/com/dougkeen/bart/data/Arrival.java | 10 ++++++ .../dougkeen/bart/data/RealTimeArrivals.java | 2 +- 11 files changed, 94 insertions(+), 52 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 9f860fa..6e87e34 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,6 +1,6 @@ diff --git a/res/values/strings.xml b/res/values/strings.xml index 8b9b596..363b002 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1,6 +1,6 @@ - Bart Catcher + BART Catcher Favorite Routes Press the menu button and select \"Add route\" to add a route @@ -22,4 +22,5 @@ Yes Cancel View details on BART site + Could not connect to BART services. Please try again later. diff --git a/src/com/dougkeen/bart/Constants.java b/src/com/dougkeen/bart/Constants.java index 62710d4..28a9b60 100644 --- a/src/com/dougkeen/bart/Constants.java +++ b/src/com/dougkeen/bart/Constants.java @@ -8,4 +8,6 @@ public class Constants { public static final String FAVORITE_CONTENT_ITEM_TYPE = "vnd.android.cursor.item/com.dougkeen.bart.favorite"; public static final Uri FAVORITE_CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/favorites"); + + public static final String TAG = "BartCatcher"; } diff --git a/src/com/dougkeen/bart/EtdContentHandler.java b/src/com/dougkeen/bart/EtdContentHandler.java index 67765e2..62b0502 100644 --- a/src/com/dougkeen/bart/EtdContentHandler.java +++ b/src/com/dougkeen/bart/EtdContentHandler.java @@ -8,6 +8,8 @@ import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; +import android.util.Log; + import com.dougkeen.bart.data.Arrival; import com.dougkeen.bart.data.RealTimeArrivals; @@ -20,7 +22,7 @@ public class EtdContentHandler extends DefaultHandler { private final static List TAGS = Arrays.asList("date", "time", "abbreviation", "minutes", "platform", "direction", "length", - "hexcolor", "bikeflag"); + "color", "hexcolor", "bikeflag"); private RealTimeArrivals realTimeArrivals; @@ -76,6 +78,13 @@ public class EtdContentHandler extends DefaultHandler { currentArrival.setDirection(currentValue); } else if (localName.equals("length")) { currentArrival.setTrainLength(Integer.parseInt(currentValue)); + } else if (localName.equals("color")) { + try { + currentArrival.setLine(Line.valueOf(currentValue)); + } catch (IllegalArgumentException e) { + Log.w("BartApp", "There is no line called '" + currentValue + + "'"); + } } else if (localName.equals("hexcolor")) { currentArrival.setDestinationColor("#ff" + currentValue.substring(1)); diff --git a/src/com/dougkeen/bart/GetRealTimeArrivalsTask.java b/src/com/dougkeen/bart/GetRealTimeArrivalsTask.java index d4712f1..01300e4 100644 --- a/src/com/dougkeen/bart/GetRealTimeArrivalsTask.java +++ b/src/com/dougkeen/bart/GetRealTimeArrivalsTask.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL; +import java.net.URLConnection; import java.util.List; import org.xml.sax.SAXException; @@ -16,6 +17,7 @@ import android.util.Xml; public abstract class GetRealTimeArrivalsTask extends AsyncTask { + private static final int CONNECTION_TIMEOUT_MILLIS = 10000; private final static String API_KEY = "5LD9-IAYI-TRAT-MHHW"; private final static String API_URL = "http://api.bart.gov/api/etd.aspx?cmd=etd&key=" + API_KEY + "&orig=%1$s&dir=%2$s"; @@ -32,30 +34,28 @@ public abstract class GetRealTimeArrivalsTask extends mRoutes = params.origin.getRoutesForDestination(params.destination); - URL sourceUrl; - try { - sourceUrl = new URL(String.format(API_URL, - params.origin.abbreviation, mRoutes.get(0).getDirection())); - } catch (MalformedURLException e) { - throw new RuntimeException(e); - } - if (!isCancelled()) { - return getArrivalsFromNetwork(params, sourceUrl, 0); + return getArrivalsFromNetwork(params, 0); } else { return null; } } private RealTimeArrivals getArrivalsFromNetwork(Params params, - URL sourceUrl, int attemptNumber) { + int attemptNumber) { try { + URL sourceUrl = new URL(String.format(API_URL, + params.origin.abbreviation, mRoutes.get(0).getDirection())); + EtdContentHandler handler = new EtdContentHandler(params.origin, params.destination, mRoutes); if (isCancelled()) { return null; } - Xml.parse(sourceUrl.openStream(), Xml.findEncodingByName("UTF-8"), + URLConnection connection = sourceUrl.openConnection(); + connection.setConnectTimeout(CONNECTION_TIMEOUT_MILLIS); + Xml.parse(connection.getInputStream(), + Xml.findEncodingByName("UTF-8"), handler); final RealTimeArrivals realTimeArrivals = handler .getRealTimeArrivals(); @@ -71,8 +71,7 @@ public abstract class GetRealTimeArrivalsTask extends } catch (InterruptedException interrupt) { // Ignore... just go on to next attempt } - return getArrivalsFromNetwork(params, sourceUrl, - attemptNumber++); + return getArrivalsFromNetwork(params, attemptNumber + 1); } else { mIOException = e; return null; diff --git a/src/com/dougkeen/bart/Line.java b/src/com/dougkeen/bart/Line.java index 6d1afd1..5fd79bb 100644 --- a/src/com/dougkeen/bart/Line.java +++ b/src/com/dougkeen/bart/Line.java @@ -25,7 +25,7 @@ public enum Line { Station.POWL, Station.MONT, Station.EMBR, Station.WOAK, Station._12TH, Station._19TH, Station.MCAR, Station.ROCK, Station.ORIN, Station.LAFY, Station.WCRK, Station.PHIL, - Station.CONC, Station.NCON), + Station.CONC, Station.NCON, Station.PITT), BLUE(true, Station.DALY, Station.BALB, Station.GLEN, Station._24TH, Station._16TH, Station.CIVC, Station.POWL, Station.MONT, Station.EMBR, Station.WOAK, Station.LAKE, Station.FTVL, @@ -36,13 +36,12 @@ public enum Line { Station.EMBR, Station.WOAK, Station.LAKE, Station.FTVL, Station.COLS, Station.SANL, Station.BAYF, Station.HAYW, Station.SHAY, Station.UCTY, Station.FRMT), - YELLOW_ORANGE_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._12TH, Station._19TH, - Station.MCAR, Station.ASHB, Station.DBRK, Station.NBRK, - Station.PLZA, Station.DELN, Station.RICH); + 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); public final List stations; @@ -93,16 +92,4 @@ public enum Line { return destinations; } - - public boolean trainDestinationIsApplicable(Station station) { - if (transferLine1 != null && transferLine1.stations.contains(station)) { - return true; - } else if (transferLine2 != null - && transferLine2.stations.contains(station)) { - return true; - } else { - return stations.contains(station); - } - } - } diff --git a/src/com/dougkeen/bart/Route.java b/src/com/dougkeen/bart/Route.java index 8d100f5..4e5eeb5 100644 --- a/src/com/dougkeen/bart/Route.java +++ b/src/com/dougkeen/bart/Route.java @@ -74,4 +74,25 @@ public class Route { builder.append("]"); return builder.toString(); } + + public boolean trainDestinationIsApplicable(Station lineDestination, + Line viaLine) { + Line routeLine = getLine(); + if (routeLine.transferLine1 != null + && viaLine.equals(routeLine.transferLine1)) { + return true; + } else if (routeLine.transferLine2 != null + && viaLine.equals(routeLine.transferLine2)) { + return true; + } else { + int originIndex = viaLine.stations.indexOf(origin); + int routeDestinationIndex = viaLine.stations.indexOf(destination); + int lineDestinationIndex = viaLine.stations + .indexOf(lineDestination); + return routeDestinationIndex >= 0 + && ((originIndex <= routeDestinationIndex && routeDestinationIndex <= lineDestinationIndex) + || (originIndex >= routeDestinationIndex && routeDestinationIndex >= lineDestinationIndex)); + } + } + } diff --git a/src/com/dougkeen/bart/Station.java b/src/com/dougkeen/bart/Station.java index fe5120d..ce78ffa 100644 --- a/src/com/dougkeen/bart/Station.java +++ b/src/com/dougkeen/bart/Station.java @@ -154,10 +154,14 @@ public enum Station { .addAll(getOutboundTransferStation() .getRoutesForDestination(dest, getOutboundTransferStation())); - } else { - returnList.addAll(getRoutesForDestination(dest - .getInboundTransferStation(), dest - .getInboundTransferStation())); + } else if (dest.getInboundTransferStation() != null) { + final List routesForDestination = getRoutesForDestination( + dest.getInboundTransferStation(), + dest.getInboundTransferStation()); + if (routesForDestination != null + && !routesForDestination.isEmpty()) { + returnList.addAll(routesForDestination); + } } } return returnList; diff --git a/src/com/dougkeen/bart/ViewArrivalsActivity.java b/src/com/dougkeen/bart/ViewArrivalsActivity.java index 66ec9cf..5a27a22 100644 --- a/src/com/dougkeen/bart/ViewArrivalsActivity.java +++ b/src/com/dougkeen/bart/ViewArrivalsActivity.java @@ -14,7 +14,6 @@ import android.os.Parcelable; import android.os.PowerManager; import android.text.format.DateFormat; import android.util.Log; -import android.util.TimeFormatException; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -24,13 +23,11 @@ import android.widget.Toast; import com.dougkeen.bart.GetRealTimeArrivalsTask.Params; import com.dougkeen.bart.data.Arrival; -import com.dougkeen.bart.data.RoutesColumns; import com.dougkeen.bart.data.RealTimeArrivals; +import com.dougkeen.bart.data.RoutesColumns; public class ViewArrivalsActivity extends ListActivity { - private static final String TAG = "BartCatcher"; - private static final int UNCERTAINTY_THRESHOLD = 17; private Uri mUri; @@ -143,22 +140,33 @@ public class ViewArrivalsActivity extends ListActivity { private void fetchLatestArrivals() { if (!hasWindowFocus()) return; + if (mGetArrivalsTask != null + && mGetArrivalsTask.getStatus() + .equals(AsyncTask.Status.RUNNING)) { + // Don't overlap fetches + return; + } mGetArrivalsTask = new GetRealTimeArrivalsTask() { @Override public void onResult(RealTimeArrivals result) { - Log.i(TAG, "Processing data from server"); + Log.i(Constants.TAG, "Processing data from server"); processLatestArrivals(result); - Log.i(TAG, "Done processing data from server"); + Log.i(Constants.TAG, "Done processing data from server"); } @Override public void onNetworkError(IOException e) { - Toast.makeText(ViewArrivalsActivity.this, e.getMessage(), - Toast.LENGTH_SHORT).show(); + Log.w(Constants.TAG, e.getMessage()); + Toast.makeText(ViewArrivalsActivity.this, + R.string.could_not_connect, + Toast.LENGTH_LONG).show(); + ((TextView) findViewById(android.R.id.empty)) + .setText(R.string.could_not_connect); + } }; - Log.i(TAG, "Fetching data from server"); + Log.i(Constants.TAG, "Fetching data from server"); mGetArrivalsTask.execute(new GetRealTimeArrivalsTask.Params(mOrigin, mDestination)); } @@ -225,7 +233,7 @@ public class ViewArrivalsActivity extends ListActivity { fetchLatestArrivals(); } }, 20000); - Log.i(TAG, "Scheduled another data fetch in 20s"); + Log.i(Constants.TAG, "Scheduled another data fetch in 20s"); } else { // Get more when next train arrives final int interval = firstArrival.getMinSecondsLeft() * 1000; @@ -235,7 +243,8 @@ public class ViewArrivalsActivity extends ListActivity { fetchLatestArrivals(); } }, interval); - Log.i(TAG, "Scheduled another data fetch in " + interval / 1000 + Log.i(Constants.TAG, "Scheduled another data fetch in " + + interval / 1000 + "s"); } if (!mIsAutoUpdating) { diff --git a/src/com/dougkeen/bart/data/Arrival.java b/src/com/dougkeen/bart/data/Arrival.java index 0ba3cc4..5a345b1 100644 --- a/src/com/dougkeen/bart/data/Arrival.java +++ b/src/com/dougkeen/bart/data/Arrival.java @@ -3,6 +3,7 @@ package com.dougkeen.bart.data; import android.os.Parcel; import android.os.Parcelable; +import com.dougkeen.bart.Line; import com.dougkeen.bart.Station; public class Arrival implements Parcelable, Comparable { @@ -28,6 +29,7 @@ public class Arrival implements Parcelable, Comparable { } private Station destination; + private Line line; private String destinationColor; private String platform; private String direction; @@ -60,6 +62,14 @@ public class Arrival implements Parcelable, Comparable { return null; } + public Line getLine() { + return line; + } + + public void setLine(Line line) { + this.line = line; + } + public String getDestinationColor() { return destinationColor; } diff --git a/src/com/dougkeen/bart/data/RealTimeArrivals.java b/src/com/dougkeen/bart/data/RealTimeArrivals.java index db1e2bc..7d7b838 100644 --- a/src/com/dougkeen/bart/data/RealTimeArrivals.java +++ b/src/com/dougkeen/bart/data/RealTimeArrivals.java @@ -62,7 +62,7 @@ public class RealTimeArrivals { Station destination = Station.getByAbbreviation(arrival .getDestinationAbbreviation()); for (Route route : routes) { - if (route.getLine().trainDestinationIsApplicable(destination)) { + if (route.trainDestinationIsApplicable(destination, arrival.getLine())) { arrival.setRequiresTransfer(route.hasTransfer()); getArrivals().add(arrival); arrival.calculateEstimates(time);