aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/net/cbaines/suma/BuildingNumOverlay.java70
-rw-r--r--src/net/cbaines/suma/Bus.java10
-rw-r--r--src/net/cbaines/suma/BusActivity.java343
-rw-r--r--src/net/cbaines/suma/BusRoute.java361
-rw-r--r--src/net/cbaines/suma/BusRoutesView.java140
-rw-r--r--src/net/cbaines/suma/BusSpecificStopView.java187
-rw-r--r--src/net/cbaines/suma/BusSpecificTimetableAdapter.java98
-rw-r--r--src/net/cbaines/suma/BusStop.java6
-rw-r--r--src/net/cbaines/suma/BusStopActivity.java107
-rw-r--r--src/net/cbaines/suma/BusStopOverlay.java173
-rw-r--r--src/net/cbaines/suma/DataHandler.java12
-rw-r--r--src/net/cbaines/suma/DataManager.java640
-rw-r--r--src/net/cbaines/suma/DatabaseHelper.java2
-rw-r--r--src/net/cbaines/suma/FavouriteDialog.java133
-rw-r--r--src/net/cbaines/suma/MapActivity.java (renamed from src/net/cbaines/suma/SouthamptonUniversityMapActivity.java)838
-rw-r--r--src/net/cbaines/suma/POI.java12
-rw-r--r--src/net/cbaines/suma/POIDialog.java92
-rw-r--r--src/net/cbaines/suma/POIView.java12
-rw-r--r--src/net/cbaines/suma/Preferences.java13
-rw-r--r--src/net/cbaines/suma/PreferencesActivity.java29
-rw-r--r--src/net/cbaines/suma/RouteStops.java8
-rw-r--r--src/net/cbaines/suma/Stop.java46
-rw-r--r--src/net/cbaines/suma/StopView.java86
-rw-r--r--src/net/cbaines/suma/Timetable.java12
-rw-r--r--src/net/cbaines/suma/TimetableAdapter.java5
-rw-r--r--src/net/cbaines/suma/ViewDialog.java274
26 files changed, 2747 insertions, 962 deletions
diff --git a/src/net/cbaines/suma/BuildingNumOverlay.java b/src/net/cbaines/suma/BuildingNumOverlay.java
index 4bd5f3a..32616a7 100644
--- a/src/net/cbaines/suma/BuildingNumOverlay.java
+++ b/src/net/cbaines/suma/BuildingNumOverlay.java
@@ -25,12 +25,10 @@ import java.util.Collections;
import java.util.Iterator;
import java.util.List;
-
import org.osmdroid.views.MapView;
import org.osmdroid.views.MapView.Projection;
import org.osmdroid.views.overlay.Overlay;
-import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
@@ -62,13 +60,13 @@ public class BuildingNumOverlay extends Overlay {
private static final String TAG = "BuildingNumOverlay";
- private final Context context;
+ private final MapActivity context;
private Dao<Building, String> buildingDao;
private float userScale = 1f;
- public BuildingNumOverlay(Context context, List<Building> buildings) throws SQLException {
+ public BuildingNumOverlay(MapActivity context, List<Building> buildings) throws SQLException {
super(context);
this.context = context;
@@ -93,25 +91,29 @@ public class BuildingNumOverlay extends Overlay {
/**
* Draw a marker on each of our items. populate() must have been called first.<br/>
* <br/>
- * The marker will be drawn twice for each Item in the Overlay--once in the shadow phase, skewed and darkened, then again in the non-shadow phase. The
- * bottom-center of the marker will be aligned with the geographical coordinates of the Item.<br/>
+ * The marker will be drawn twice for each Item in the Overlay--once in the shadow phase, skewed and darkened, then
+ * again in the non-shadow phase. The bottom-center of the marker will be aligned with the geographical coordinates
+ * of the Item.<br/>
* <br/>
- * The order of drawing may be changed by overriding the getIndexToDraw(int) method. An item may provide an alternate marker via its
- * OverlayItem.getMarker(int) method. If that method returns null, the default marker is used.<br/>
+ * The order of drawing may be changed by overriding the getIndexToDraw(int) method. An item may provide an
+ * alternate marker via its OverlayItem.getMarker(int) method. If that method returns null, the default marker is
+ * used.<br/>
* <br/>
* The focused item is always drawn last, which puts it visually on top of the other items.<br/>
*
* @param canvas
- * the Canvas upon which to draw. Note that this may already have a transformation applied, so be sure to leave it the way you found it
+ * the Canvas upon which to draw. Note that this may already have a transformation applied, so be sure to
+ * leave it the way you found it
* @param mapView
- * the MapView that requested the draw. Use MapView.getProjection() to convert between on-screen pixels and latitude/longitude pairs
+ * the MapView that requested the draw. Use MapView.getProjection() to convert between on-screen pixels
+ * and latitude/longitude pairs
* @param shadow
* if true, draw the shadow layer. If false, draw the overlay contents.
*/
@Override
public void draw(final Canvas canvas, final MapView mapView, final boolean shadow) {
- if (shadow) {
+ if (shadow || !isEnabled()) {
return;
}
@@ -180,43 +182,72 @@ public class BuildingNumOverlay extends Overlay {
}
@Override
- public boolean onSingleTapUp(final MotionEvent event, final MapView mapView) {
+ public boolean onSingleTapConfirmed(final MotionEvent event, final MapView mapView) {
+
if (!this.isEnabled())
return false;
final Building building = getSelectedItem(event, mapView);
if (building == null) {
- Log.i(TAG, "No building pressed");
+ // Log.v(TAG, "No building pressed");
return false;
} else {
- Log.i(TAG, "building Pressed " + building.id);
+ Log.v(TAG, "building Pressed " + building.id);
+
+ if (context.activityToast == null) {
+ context.activityToast = Toast.makeText(context, building.name + " (" + building.id + ")",
+ Toast.LENGTH_SHORT);
+ } else {
+ context.activityToast.setDuration(Toast.LENGTH_SHORT);
+ context.activityToast.setText(building.name + " (" + building.id + ")");
+ }
+ context.activityToast.show();
- Toast.makeText(context, building.name + " (" + building.id + ")", Toast.LENGTH_SHORT).show();
return true;
}
}
+ public boolean onDoubleTap(final MotionEvent e, final MapView mapView) {
+ return false;
+ }
+
@Override
public boolean onLongPress(final MotionEvent event, final MapView mapView) {
+
if (!this.isEnabled())
return false;
final Building building = getSelectedItem(event, mapView);
if (building == null) {
- Log.i(TAG, "No building pressed");
+ // Log.v(TAG, "No building pressed");
return false;
} else {
- Log.i(TAG, "building Pressed " + building.id);
+ Log.v(TAG, "building Pressed " + building.id);
if (building.favourite) {
building.favourite = false;
- Toast.makeText(context, building.id + " removed from favourites", Toast.LENGTH_SHORT).show();
+ if (context.activityToast == null) {
+ context.activityToast = Toast.makeText(context, building.id + " removed from favourites",
+ Toast.LENGTH_SHORT);
+ } else {
+ context.activityToast.setDuration(Toast.LENGTH_SHORT);
+ context.activityToast.setText(building.id + " removed from favourites");
+ }
+ context.activityToast.show();
+
} else {
- Toast.makeText(context, building.id + " made a favourite", Toast.LENGTH_SHORT).show();
+ if (context.activityToast == null) {
+ context.activityToast = Toast.makeText(context, building.id + " made a favourite",
+ Toast.LENGTH_SHORT);
+ } else {
+ context.activityToast.setDuration(Toast.LENGTH_SHORT);
+ context.activityToast.setText(building.id + " made a favourite");
+ }
+ context.activityToast.show();
building.favourite = true;
}
@@ -224,7 +255,6 @@ public class BuildingNumOverlay extends Overlay {
try {
buildingDao.update(building);
} catch (SQLException e) {
- // TODO Auto-generated catch block
e.printStackTrace();
}
diff --git a/src/net/cbaines/suma/Bus.java b/src/net/cbaines/suma/Bus.java
index d8d96f3..b36dd89 100644
--- a/src/net/cbaines/suma/Bus.java
+++ b/src/net/cbaines/suma/Bus.java
@@ -53,13 +53,13 @@ public class Bus {
/**
* The direction which the bus is travelling.
*/
- @DatabaseField(canBeNull = false)
+ @DatabaseField(canBeNull = true)
String direction;
/**
* The destination the bus is travelling towards.
*/
- @DatabaseField(canBeNull = false, foreign = true)
+ @DatabaseField(canBeNull = true, foreign = true)
BusStop destination;
Bus() {
@@ -98,7 +98,11 @@ public class Bus {
}
String getName() {
- return route.code + direction;
+ if (direction != null) {
+ return route.code + direction;
+ } else {
+ return route.code;
+ }
}
@Override
diff --git a/src/net/cbaines/suma/BusActivity.java b/src/net/cbaines/suma/BusActivity.java
new file mode 100644
index 0000000..b802cfb
--- /dev/null
+++ b/src/net/cbaines/suma/BusActivity.java
@@ -0,0 +1,343 @@
+package net.cbaines.suma;
+
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.List;
+
+import org.apache.http.client.ClientProtocolException;
+import org.json.JSONException;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.Handler;
+import android.preference.PreferenceManager;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.j256.ormlite.android.apptools.OrmLiteBaseActivity;
+
+public class BusActivity extends OrmLiteBaseActivity<DatabaseHelper> implements Preferences {
+ final static String TAG = "BusActivity";
+
+ private TextView U1RouteTextView;
+ private TextView U1NRouteTextView;
+ private TextView U2RouteTextView;
+ private TextView U6RouteTextView;
+ private TextView U9RouteTextView;
+
+ private TextView busIDTextView;
+
+ private TextView busContentMessage;
+ private LinearLayout busActivityContentLayout;
+
+ Toast activityToast;
+
+ /**
+ * The bus this activity is focused on
+ */
+ private Bus bus;
+ /**
+ * The bus stop this activity is working from
+ */
+ private BusStop busStop;
+
+ Runnable refreshData;
+
+ protected Timetable timetable;
+ private Timetable visibleTimetable;
+
+ private ListView timetableView;
+
+ private Context instance;
+
+ // BusStops and if they are being updated by the handler
+ List<BusStop> busStops;
+
+ private HashMap<BusStop, GetTimetableStopTask> tasks = new HashMap<BusStop, GetTimetableStopTask>();
+
+ Handler handler;
+
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.bus_activity);
+ instance = this;
+
+ String busID = getIntent().getExtras().getString("busID");
+ String busStopID = getIntent().getExtras().getString("busStopID");
+ final DatabaseHelper helper = getHelper();
+
+ try {
+ List<Bus> buses = helper.getBusDao().queryForEq(Bus.ID_FIELD_NAME, busID);
+ bus = null;
+ if (buses.size() == 0) {
+ Log.e(TAG, "Bus " + busID + " not found!");
+ } else if (buses.size() == 1) {
+ bus = buses.get(0);
+ } else if (buses.size() > 1) {
+ Log.e(TAG, "Found more than one bus? " + busID);
+ }
+
+ helper.getBusRouteDao().refresh(bus.route);
+
+ busStop = null;
+ if (busStopID != null) {
+ List<BusStop> busStops = helper.getBusStopDao().queryForEq(BusStop.ID_FIELD_NAME, busStopID);
+ if (busStops.size() == 0) {
+ Log.e(TAG, "BusStop " + busStopID + " not found!");
+ } else if (busStops.size() == 1) {
+ busStop = busStops.get(0);
+ } else if (busStops.size() > 1) {
+ Log.e(TAG, "Found more than one busStop? " + busStopID);
+ }
+ }
+
+ U1RouteTextView = (TextView) findViewById(R.id.busActivityU1);
+ U1NRouteTextView = (TextView) findViewById(R.id.busActivityU1N);
+ U2RouteTextView = (TextView) findViewById(R.id.busActivityU2);
+ U6RouteTextView = (TextView) findViewById(R.id.busActivityU6);
+ U9RouteTextView = (TextView) findViewById(R.id.busActivityU9);
+
+ busIDTextView = (TextView) findViewById(R.id.busActivityBusID);
+
+ busContentMessage = (TextView) findViewById(R.id.busActivityMessage);
+ busActivityContentLayout = (LinearLayout) findViewById(R.id.busActivityContentLayout);
+ timetableView = (ListView) findViewById(R.id.busActivityTimes);
+
+ if (bus.id != null) {
+ Log.i(TAG, "Bus id is not null (" + bus.id + ") setting busIDTextView");
+ busIDTextView.setText(bus.id + " " + bus.getName());
+ } else {
+ Log.w(TAG, "Bus id is null?");
+ // Might not ever happen
+ busIDTextView.setText("Unidentified");
+ }
+
+ U1RouteTextView.setVisibility(View.GONE);
+ U1NRouteTextView.setVisibility(View.GONE);
+ U2RouteTextView.setVisibility(View.GONE);
+ U6RouteTextView.setVisibility(View.GONE);
+ U9RouteTextView.setVisibility(View.GONE);
+
+ // if (bus.route.uniLink) {
+ Log.i(TAG, "Bus is uniLink");
+ if (bus.route.code.equals("U1")) {
+ U1RouteTextView.setVisibility(View.VISIBLE);
+ } else if (bus.route.code.equals("U1N")) {
+ U1NRouteTextView.setVisibility(View.VISIBLE);
+ } else if (bus.route.code.equals("U2")) {
+ U2RouteTextView.setVisibility(View.VISIBLE);
+ } else if (bus.route.code.equals("U6")) {
+ U6RouteTextView.setVisibility(View.VISIBLE);
+ } else if (bus.route.code.equals("U9")) {
+ U9RouteTextView.setVisibility(View.VISIBLE);
+ } else {
+ Log.e(TAG, "Route not found " + bus.route.code);
+ }
+ // } else {
+ // Log.i(TAG, "Bus is not uniLink");
+ // }
+
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+
+ busStops = bus.route.getRouteSection(instance, bus.direction);
+ Log.i(TAG, "Got " + busStops.size() + " bus stops for this bus");
+
+ if (bus.destination != null) {
+ Log.i(TAG, "Bus destination is " + bus.destination);
+ } else {
+ Log.i(TAG, "Bus destination is null");
+ }
+
+ /*
+ * for (int i = 0;; i++) { BusStop nextStop = bus.route.moveInRoute(instance, busStops.get(i), bus.direction,
+ * 1);
+ *
+ * if (nextStop.equals(busStop) || (bus.destination != null && bus.destination.equals(nextStop))) { break; }
+ *
+ * busStops.add(nextStop); busStopsActive.add(false);
+ *
+ * if (busStops.size() > 50) { Log.e(TAG, "Got more than 50 bus stops"); break; } }
+ */
+
+ refreshData = new Runnable() {
+ @Override
+ public void run() {
+ for (int num = timetableView.getFirstVisiblePosition(); num < timetableView.getLastVisiblePosition(); num++) {
+ Stop stop = timetable.get(num);
+
+ GetTimetableStopTask task = tasks.get(busStops.get(num));
+
+ if (stop.timeOfFetch == null || (stop.timeOfFetch.getTime() - System.currentTimeMillis()) > 20000) {
+ if (task != null) {
+ if (task.getStatus() == AsyncTask.Status.FINISHED) {
+ task = null;
+ }
+ }
+
+ if (task == null) {
+ task = new GetTimetableStopTask();
+ BusStop[] str = { stop.busStop };
+ task.execute(str);
+ tasks.put(stop.busStop, task);
+ }
+ }
+
+ }
+ handler.postDelayed(refreshData, 50000);
+ }
+ };
+
+ }
+
+ public void onResume() {
+ super.onResume();
+
+ SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
+ if (sharedPrefs.getBoolean(UNI_LINK_BUS_TIMES, UNI_LINK_BUS_TIMES_ENABLED_BY_DEFAULT)
+ || sharedPrefs.getBoolean(NON_UNI_LINK_BUS_TIMES, NON_UNI_LINK_BUS_TIMES_ENABLED_BY_DEFAULT)) {
+ Log.i(TAG, "Live Times enabled");
+ timetable = (Timetable) getLastNonConfigurationInstance();
+
+ handler = new Handler();
+
+ if (timetable == null) {
+ Log.i(TAG, "No Previous timetable");
+ timetable = new Timetable();
+ for (int i = 0; i < busStops.size(); i++) {
+ timetable.add(new Stop(bus, busStops.get(i), null, null, false));
+ }
+ Log.v(TAG, "Finished adding placeholder stops");
+ } else {
+ Log.i(TAG, "Displaying previous timetable");
+
+ }
+ displayTimetable(timetable);
+ handler.postDelayed(refreshData, 500);
+
+ } else {
+ Log.i(TAG, "Live Times Disabled");
+ busContentMessage.setText("Live bus times disabled");
+ busContentMessage.setVisibility(View.VISIBLE);
+ }
+
+ }
+
+ public void onPause() {
+ if (handler != null) { // BusTimes are enabled
+ handler.removeCallbacks(refreshData);
+ for (GetTimetableStopTask task : tasks.values()) {
+ if (task != null) {
+ task.cancel(true);
+ }
+ }
+
+ Log.i(TAG, "Stoping refreshing timetable data");
+ }
+
+ super.onPause();
+ }
+
+ private class GetTimetableStopTask extends AsyncTask<BusStop, Integer, Stop> {
+ private String errorMessage;
+
+ private BusStop busStop;
+
+ private int position;
+
+ protected void onPreExecute() {
+ // progBar.setVisibility(View.VISIBLE);
+ }
+
+ protected Stop doInBackground(BusStop... busStopArray) {
+ busStop = busStopArray[0];
+ position = busStops.indexOf(busStop);
+ Stop stop = null;
+
+ try {
+ Log.i(TAG, "Fetching stop for busStop " + position);
+ stop = DataManager.getStop(instance, bus, busStop);
+ if (stop == null) {
+ stop = new Stop(bus, busStop, null, null, false);
+ }
+ Log.i(TAG, "Finished fetching stop for busStop " + position);
+ } catch (SQLException e) {
+ errorMessage = "Error message regarding SQL?";
+ e.printStackTrace();
+ } catch (ClientProtocolException e) {
+ errorMessage = "ClientProtocolException!?!";
+ e.printStackTrace();
+ } catch (IOException e) {
+ errorMessage = "Error fetching bus times from server, are you connected to the internet?";
+ e.printStackTrace();
+ } catch (JSONException e) {
+ errorMessage = "Error parsing bus times";
+ e.printStackTrace();
+ }
+ return stop;
+ }
+
+ protected void onPostExecute(Stop stop) {
+ // Log.i(TAG, "Got timetable");
+ if (stop == null) {
+ Log.i(TAG, "Its null");
+
+ busContentMessage.setText(errorMessage);
+ busContentMessage.setVisibility(View.VISIBLE);
+ } else {
+ synchronized (timetable) {
+ timetable.set(position, stop);
+ displayTimetable(timetable);
+ }
+ }
+ }
+
+ }
+
+ private void displayTimetable(Timetable timetable) {
+ visibleTimetable = (Timetable) timetable.clone();
+
+ // Log.i(TAG, "Displaying timetable, it contains " + visibleTimetable.size() + " stops");
+
+ if (timetable.size() == 0) {
+ busContentMessage.setText("No Busses");
+ busContentMessage.setVisibility(View.VISIBLE);
+ busActivityContentLayout.setGravity(Gravity.CENTER);
+ } else {
+ if (visibleTimetable.size() == 0) {
+ busActivityContentLayout.setGravity(Gravity.CENTER);
+ busContentMessage.setText("No Busses (With the current enabled routes)");
+ busContentMessage.setVisibility(View.VISIBLE);
+ timetableView.setVisibility(View.GONE);
+ } else {
+ timetableView.setVisibility(View.VISIBLE);
+ busContentMessage.setVisibility(View.GONE);
+ BusSpecificTimetableAdapter adapter;
+ if ((adapter = (BusSpecificTimetableAdapter) timetableView.getAdapter()) != null) {
+ adapter.updateTimetable(visibleTimetable);
+ } else {
+ adapter = new BusSpecificTimetableAdapter(this, visibleTimetable);
+ timetableView.setAdapter(adapter);
+ if (busStop != null) {
+ Log.i(TAG,
+ "Moving to position of " + busStop.description + " which is "
+ + busStops.indexOf(busStop));
+ timetableView.setSelection(busStops.indexOf(busStop));
+ }
+ }
+ busActivityContentLayout.setGravity(Gravity.TOP);
+ }
+ }
+ }
+}
diff --git a/src/net/cbaines/suma/BusRoute.java b/src/net/cbaines/suma/BusRoute.java
index 5af89e7..4152605 100644
--- a/src/net/cbaines/suma/BusRoute.java
+++ b/src/net/cbaines/suma/BusRoute.java
@@ -20,7 +20,11 @@
package net.cbaines.suma;
import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import android.content.Context;
import android.util.Log;
@@ -41,6 +45,8 @@ import com.j256.ormlite.table.DatabaseTable;
@DatabaseTable(tableName = "busroutes")
public class BusRoute {
+ private static final String TAG = "BusRoute";
+
final static String ID_FIELD_NAME = "id";
final static String CODE_FIELD_NAME = "code";
final static String LABEL_FIELD_NAME = "label";
@@ -57,25 +63,46 @@ public class BusRoute {
@DatabaseField(canBeNull = false)
String label;
+ /**
+ * The direction the bus is travelling if it is moving through the route and sequence is increasing.
+ * <ul>
+ * <li>U1 = A</li>
+ * <li>U2 = B</li>
+ * <li>U6 = H</li>
+ * </ul>
+ */
@DatabaseField(canBeNull = true)
String forwardDirection;
+ /**
+ * The direction the bus is travelling if it is moving through the route and sequence is decreasing.
+ * <ul>
+ * <li>U1 = C</li>
+ * <li>U2 = C</li>
+ * <li>U6 = C</li>
+ * </ul>
+ */
@DatabaseField(canBeNull = true)
String reverseDirection;
+ @DatabaseField(canBeNull = false)
+ boolean uniLink;
+
BusRoute() {
}
- public BusRoute(Integer id, String code, String label, String forwardDirection, String reverseDirection) {
+ public BusRoute(Integer id, String code, String label, String forwardDirection, String reverseDirection,
+ boolean uniLink) {
this.id = id.intValue();
this.code = code;
this.label = label;
this.forwardDirection = forwardDirection;
this.reverseDirection = reverseDirection;
+ this.uniLink = uniLink;
}
- public BusRoute(Integer id, String code, String label) {
- this(id, code, label, null, null);
+ public BusRoute(Integer id, String code, String label, boolean uniLink) {
+ this(id, code, label, null, null, uniLink);
}
public String toString() {
@@ -108,33 +135,107 @@ public class BusRoute {
* Untested?
*
* @param context
- * @param stop
+ * @param busStop
* @param moveAmount
* @return
*/
- BusStop moveInRoute(Context context, BusStop stop, String direction, int moveAmount) {
+ Set<BusStop> moveInRoute(final Context context, final BusStop busStop, final int moveAmount) {
+
+ Set<BusStop> busStops = new HashSet<BusStop>();
+
if (moveAmount == 0) {
- return stop;
+ busStops.add(busStop);
+ return busStops;
}
DatabaseHelper helper = OpenHelperManager.getHelper(context, DatabaseHelper.class);
- if (forwardDirection != null) {
+ try {
+ Dao<RouteStops, Integer> routeStopsDao = helper.getRouteStopsDao();
+ Dao<BusStop, String> busStopDao = helper.getBusStopDao();
+
+ QueryBuilder<RouteStops, Integer> routeStopsQueryBuilder = routeStopsDao.queryBuilder();
+ routeStopsQueryBuilder.where().eq(RouteStops.ROUTE_ID_FIELD_NAME, this.id);
+ PreparedQuery<RouteStops> routeStopsPreparedQuery = routeStopsQueryBuilder.prepare();
+
+ List<RouteStops> routeStopsFound = routeStopsDao.query(routeStopsPreparedQuery);
- if (direction == null) {
- return null;
+ ArrayList<Integer> stopIndexs = new ArrayList<Integer>();
+
+ for (RouteStops routeStop : routeStopsFound) {
+ if (routeStop.busStop.id.equals(busStop.id)) {
+ stopIndexs.add(routeStop.sequence - 1);
+ }
}
- if (forwardDirection.equals(direction)) {
+ for (int stopIndex : stopIndexs) {
+
+ if (moveAmount > 0) {
+ Log.v(TAG, "Moving forward " + moveAmount + " stops from " + busStop + " (" + stopIndex + "/"
+ + routeStopsFound.size() + ")");
+ int stopWanted = stopIndex + moveAmount;
+ if ((stopWanted + 1) > routeStopsFound.size()) {
+ Log.v(TAG, "Off the end of the route");
+ stopWanted = stopWanted % (routeStopsFound.size() - 1);
+ }
+ Log.v(TAG, " Stop wanted " + stopWanted);
+ BusStop busStopWanted = routeStopsFound.get(stopWanted).busStop;
+
+ busStopDao.refresh(busStopWanted);
+
+ Log.v(TAG, " Moving to " + busStopWanted + " (" + stopWanted + ") in route " + this);
+
+ busStops.add(busStopWanted);
+ } else {
+ Log.v(TAG, "stopIndex " + stopIndex);
+ int stopWanted = stopIndex + moveAmount;
+ if (stopWanted < 0) {
+ stopWanted = routeStopsFound.size() - (Math.abs(stopWanted) % routeStopsFound.size());
+ }
+ Log.v(TAG, "stopWanted " + stopWanted);
+ busStopDao.refresh(routeStopsFound.get(stopWanted).busStop);
+
+ Log.v(TAG,
+ "Moving backwards " + moveAmount + " stops from " + busStop + " to "
+ + routeStopsFound.get(stopWanted).busStop + " in route " + this);
+
+ busStops.add(routeStopsFound.get(stopWanted).busStop);
+ }
+ }
- } else if (reverseDirection.equals(direction)) {
- moveAmount = -moveAmount;
+ return busStops;
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ Log.e(TAG, "Error moving in route");
+ return null;
+ }
+
+ /**
+ * Untested?
+ *
+ * @param context
+ * @param busStop
+ * @param moveAmount
+ * @return
+ */
+ BusStop moveInRoute(final Context context, final BusStop busStop, String direction, final int moveAmount) {
+
+ if (moveAmount == 0) {
+ return busStop;
+ }
+
+ DatabaseHelper helper = OpenHelperManager.getHelper(context, DatabaseHelper.class);
+
+ if (forwardDirection != null) {
+
+ if (direction != null) {
+
+ if (direction.equals("E"))
+ direction = "A"; // Quick hack for U1E
} else {
- Log.e("BusRoute", "Direction (" + direction + ") doesnt match either the forward direction (" + forwardDirection + ") or reverse direction ("
- + reverseDirection + ")");
- return null;
+ throw new NullPointerException("direction is null");
}
-
}
try {
@@ -146,48 +247,232 @@ public class BusRoute {
PreparedQuery<RouteStops> routeStopsPreparedQuery = routeStopsQueryBuilder.prepare();
List<RouteStops> routeStopsFound = routeStopsDao.query(routeStopsPreparedQuery);
- Log.v("BusRoute", "Found " + routeStopsFound.size() + " stops");
-
- int stopIndex = 0;
-
+
+ int stopIndex = -1;
+
for (RouteStops routeStop : routeStopsFound) {
- if (routeStop.stop.id.equals(stop.id)) {
- stopIndex = routeStop.sequence -1;
+ if (routeStop.busStop.id.equals(busStop.id)) {
+ if (stopIndex == -1) {
+ stopIndex = routeStop.sequence - 1;
+ } else { // ARGH, weird route
+ if (busStop.id.equals("HAA13651") && id == 327) { // U6 by Wessex Lane
+ if (direction.equals(forwardDirection)) {
+ stopIndex = 23;
+ } else {
+ stopIndex = 68;
+ }
+ } else if (busStop.id.equals("SN120134") && id == 327) { // U6 opposite the Stile
+ if (direction.equals(forwardDirection)) {
+ stopIndex = 30;
+ } else {
+ stopIndex = 59;
+ }
+ } else if (busStop.id.equals("SN120163") && id == 327) { // U6 just up past wessex lane
+ if (direction.equals(forwardDirection)) {
+ stopIndex = 22;
+ } else {
+ stopIndex = 67;
+ }
+ } else if (busStop.id.equals("SNA19482") && id == 327) { // U6 General Hosp West Door
+ if (moveAmount > 0) {
+ stopIndex = 44;
+ } else {
+ stopIndex = 43;
+ }
+ } else if (busStop.id.equals("SN120134") && id == 329) { // U2 opposite the Stile
+ if (direction.equals(forwardDirection)) {
+ stopIndex = 13;
+ } else {
+ stopIndex = 30;
+ }
+ } else if (busStop.id.equals("SN120527") && id == 329) { // U2 Civic Centre Rd os stop AO Civic
+ // Ctr E
+ if (moveAmount > 0) {
+ stopIndex = 0;
+ } else {
+ stopIndex = 42;
+ }
+ } else if (busStop.id.equals("SNA09298") && id == 329) { // U2 Bassett Green Rd nr Bassett Green
+ // Cl SE
+ if (moveAmount > 0) {
+ stopIndex = 22;
+ } else {
+ stopIndex = 21;
+ }
+ } else if (busStop.id.equals("SN120520") && id == 326) { // U1 By the station
+ if (direction.equals(forwardDirection)) {
+ stopIndex = 7;
+ } else {
+ stopIndex = 80;
+ }
+ } else if (busStop.id.equals("HA030183") && id == 326) { // U1 Up past Wessex Lane
+ if (direction.equals(forwardDirection)) {
+ stopIndex = 35;
+ } else {
+ stopIndex = 50;
+ }
+ } else if (busStop.id.equals("HA030212") && id == 326) { // U1 At Eastleigh
+ if (moveAmount > 0) {
+ stopIndex = 43;
+ } else {
+ stopIndex = 42;
+ }
+ } else if (busStop.id.equals("SN120171") && id == 354) { // U9
+ if (moveAmount > 0) {
+ stopIndex = 0;
+ } else {
+ stopIndex = 73;
+ }
+ } else {
+ Log.e(TAG, "Error, unknown bus stop " + busStop.id + " (" + busStop.description
+ + ") that appears mutiple times in " + toString());
+ throw new RuntimeException("Error, unknown bus stop " + busStop.id
+ + " that appears mutiple times in " + toString());
+ }
+ Log.v(TAG, "Selecting " + stopIndex + " for " + busStop.id + " as direction == " + direction);
+ }
}
}
if (moveAmount > 0) {
- Log.v("BusStop", "stopIndex " + stopIndex);
- int stopWanted = (stopIndex + moveAmount) % (routeStopsFound.size() + 1);
- Log.v("BusStop", "stopWanted " + stopWanted);
- busStopDao.refresh(routeStopsFound.get(stopWanted).stop);
+ Log.v(TAG, "Moving forward " + moveAmount + " stops from " + busStop + " (" + stopIndex + "/"
+ + routeStopsFound.size() + ")");
+ int stopWanted = stopIndex + moveAmount;
+ if ((stopWanted + 1) > routeStopsFound.size()) {
+ Log.v(TAG, "Off the end of the route");
+ stopWanted = stopWanted % (routeStopsFound.size() - 1);
+ }
+ Log.v(TAG, " Stop wanted " + stopWanted);
+ BusStop busStopWanted = routeStopsFound.get(stopWanted).busStop;
+
+ busStopDao.refresh(busStopWanted);
- Log.v("BusRoute",
- "Moving forward in direction " + direction + " " + moveAmount + " stops from " + stop + " to " + routeStopsFound.get(stopWanted).stop
- + " in route " + this);
+ Log.v(TAG, " Moving to " + busStopWanted + " (" + stopWanted + ") in route " + this);
- return routeStopsFound.get(stopWanted).stop;
+ return busStopWanted;
} else {
- Log.v("BusStop", "stopIndex " + stopIndex);
+ Log.v(TAG, "stopIndex " + stopIndex);
int stopWanted = stopIndex + moveAmount;
if (stopWanted < 0) {
stopWanted = routeStopsFound.size() - (Math.abs(stopWanted) % routeStopsFound.size());
}
- Log.v("BusStop", "stopWanted " + stopWanted);
- busStopDao.refresh(routeStopsFound.get(stopWanted).stop);
+ Log.v(TAG, "stopWanted " + stopWanted);
+ busStopDao.refresh(routeStopsFound.get(stopWanted).busStop);
+
+ Log.v(TAG,
+ "Moving backwards " + moveAmount + " stops from " + busStop + " to "
+ + routeStopsFound.get(stopWanted).busStop + " in route " + this);
+
+ return routeStopsFound.get(stopWanted).busStop;
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ Log.e(TAG, "Error moving in route");
+ return null;
+ }
+
+ /**
+ * Untested?
+ *
+ * @param context
+ * @param busStop
+ * @param moveAmount
+ * @return
+ */
+ List<BusStop> getRouteSection(final Context context, String direction) {
+
+ DatabaseHelper helper = OpenHelperManager.getHelper(context, DatabaseHelper.class);
+
+ if (forwardDirection != null) {
+
+ if (direction != null) {
+
+ if (direction.equals("E"))
+ direction = "A"; // Quick hack for U1E
+ } else {
+ throw new NullPointerException("direction is null");
+ }
+ }
- Log.v("BusRoute",
- "Moving backwards in direction " + direction + " " + moveAmount + " stops from " + stop + " to " + routeStopsFound.get(stopWanted).stop
- + " in route " + this);
+ List<BusStop> busStops = new ArrayList<BusStop>();
- return routeStopsFound.get(stopWanted).stop;
+ try {
+
+ Dao<RouteStops, Integer> routeStopsDao = helper.getRouteStopsDao();
+ Dao<BusStop, String> busStopDao = helper.getBusStopDao();
+
+ QueryBuilder<RouteStops, Integer> routeStopsQueryBuilder = routeStopsDao.queryBuilder();
+ routeStopsQueryBuilder.where().eq(RouteStops.ROUTE_ID_FIELD_NAME, this.id);
+ PreparedQuery<RouteStops> routeStopsPreparedQuery = routeStopsQueryBuilder.prepare();
+
+ List<RouteStops> routeStopsFound = routeStopsDao.query(routeStopsPreparedQuery);
+
+ int startStopSeq = -1;
+ int endStopSeq = -1;
+
+ if (id == 326) { // U1
+ if (direction.equals(forwardDirection)) {
+ startStopSeq = 1;
+ endStopSeq = 43;
+ } else if (direction.equals(reverseDirection)) {
+ startStopSeq = 44;
+ endStopSeq = 88;
+ } else {
+ Log.e(TAG, "Error, unrecognised direction " + direction);
+ }
+ } else if (id == 468) { // U1N
+ startStopSeq = 1;
+ endStopSeq = 29;
+ } else if (id == 329) { // U2
+ if (direction.equals(forwardDirection)) {
+ startStopSeq = 1;
+ endStopSeq = 22;
+ } else if (direction.equals(reverseDirection)) {
+ startStopSeq = 23;
+ endStopSeq = 43;
+ } else {
+ Log.e(TAG, "Error, unrecognised direction " + direction);
+ }
+ } else if (id == 327) { // U6
+ if (direction.equals(forwardDirection)) {
+ startStopSeq = 1;
+ endStopSeq = 44;
+ } else if (direction.equals(reverseDirection)) {
+ startStopSeq = 45;
+ endStopSeq = 93;
+ } else {
+ Log.e(TAG, "Error, unrecognised direction " + direction);
+ }
+ } else if (id == 354) { // U9
+ Calendar rightNow = Calendar.getInstance();
+ if (rightNow.get(Calendar.HOUR_OF_DAY) < 12) {
+ startStopSeq = 1;
+ endStopSeq = 40; // TODO: Guess, and untested
+ } else {
+ startStopSeq = 41; // TODO: Guess, and untested
+ endStopSeq = 74;
+ }
+ } else {
+ Log.e(TAG, "Error, unrecognised route " + id);
}
+ for (RouteStops routeStop : routeStopsFound) {
+ if (routeStop.sequence >= startStopSeq && routeStop.sequence <= endStopSeq) {
+ busStopDao.refresh(routeStop.busStop);
+ busStops.add(routeStop.busStop);
+ }
+ }
+
+ return busStops;
+
} catch (SQLException e) {
e.printStackTrace();
}
- Log.e("BusRoute", "Error moving in route");
+ Log.e(TAG, "Error moving in route");
return null;
+
}
@Override
diff --git a/src/net/cbaines/suma/BusRoutesView.java b/src/net/cbaines/suma/BusRoutesView.java
new file mode 100644
index 0000000..32226b0
--- /dev/null
+++ b/src/net/cbaines/suma/BusRoutesView.java
@@ -0,0 +1,140 @@
+/*
+ * Southampton University Map App
+ * Copyright (C) 2011 Christopher Baines
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package net.cbaines.suma;
+
+import android.content.Context;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+public class BusRoutesView extends LinearLayout {
+
+ private TextView u1;
+ private TextView u1n;
+ private TextView u2;
+ private TextView u6;
+ private TextView u9;
+
+ private LinearLayout bottomRow;
+ private LinearLayout topRow;
+
+ public BusRoutesView(Context context, final byte routes) {
+ super(context);
+
+ u1 = new TextView(context);
+ u1.setText(R.string.U1);
+ u1.setBackgroundResource(R.drawable.u1_back_selected);
+ u1.setPadding(5, 1, 5, 1);
+
+ u1n = new TextView(context);
+ u1n.setText(R.string.U1N);
+ u1n.setBackgroundResource(R.drawable.u1n_back_selected);
+ u1n.setPadding(5, 1, 5, 1);
+
+ u2 = new TextView(context);
+ u2.setText(R.string.U2);
+ u2.setBackgroundResource(R.drawable.u2_back_selected);
+ u2.setPadding(5, 1, 5, 1);
+
+ u6 = new TextView(context);
+ u6.setText(R.string.U6);
+ u6.setBackgroundResource(R.drawable.u6_back_selected);
+ u6.setPadding(5, 1, 5, 1);
+
+ u9 = new TextView(context);
+ u9.setText(R.string.U9);
+ u9.setBackgroundResource(R.drawable.u9_back_selected);
+ u9.setPadding(5, 1, 5, 1);
+
+ this.setOrientation(LinearLayout.VERTICAL);
+
+ topRow = new LinearLayout(context);
+ bottomRow = new LinearLayout(context);
+
+ addView(topRow);
+ addView(bottomRow);
+
+ }
+
+ void setRoutes(byte routes) {
+
+ topRow.removeView(u1);
+ topRow.removeView(u1n);
+ topRow.removeView(u2);
+ topRow.removeView(u6);
+ topRow.removeView(u9);
+
+ bottomRow.removeView(u1);
+ bottomRow.removeView(u1n);
+ bottomRow.removeView(u2);
+ bottomRow.removeView(u6);
+ bottomRow.removeView(u9);
+
+ boolean top = true;
+
+ LayoutParams busRouteLayoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+
+ if ((routes & (1 << 0)) != 0) {
+ if (top) {
+ topRow.addView(u1, busRouteLayoutParams);
+ } else {
+ bottomRow.addView(u1, busRouteLayoutParams);
+ }
+ u1.setVisibility(View.VISIBLE);
+ top = !top;
+ }
+ if ((routes & (1 << 1)) != 0) {
+ if (top) {
+ topRow.addView(u1n, busRouteLayoutParams);
+ } else {
+ bottomRow.addView(u1n, busRouteLayoutParams);
+ }
+ u1n.setVisibility(View.VISIBLE);
+ top = !top;
+ }
+ if ((routes & (1 << 2)) != 0) {
+ if (top) {
+ topRow.addView(u2, busRouteLayoutParams);
+ } else {
+ bottomRow.addView(u2, busRouteLayoutParams);
+ }
+ u2.setVisibility(View.VISIBLE);
+ top = !top;
+ }
+ if ((routes & (1 << 3)) != 0) {
+ if (top) {
+ topRow.addView(u6, busRouteLayoutParams);
+ } else {
+ bottomRow.addView(u6, busRouteLayoutParams);
+ }
+ u6.setVisibility(View.VISIBLE);
+ top = !top;
+ }
+ if ((routes & (1 << 4)) != 0) {
+ if (top) {
+ topRow.addView(u9, busRouteLayoutParams);
+ } else {
+ bottomRow.addView(u9, busRouteLayoutParams);
+ }
+ u9.setVisibility(View.VISIBLE);
+ top = !top;
+ }
+ }
+}
diff --git a/src/net/cbaines/suma/BusSpecificStopView.java b/src/net/cbaines/suma/BusSpecificStopView.java
new file mode 100644
index 0000000..77601ff
--- /dev/null
+++ b/src/net/cbaines/suma/BusSpecificStopView.java
@@ -0,0 +1,187 @@
+/*
+ * Southampton University Map App
+ * Copyright (C) 2011 Christopher Baines
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package net.cbaines.suma;
+
+import java.sql.SQLException;
+import java.text.DateFormat;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.View.OnLongClickListener;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.j256.ormlite.android.apptools.OpenHelperManager;
+import com.j256.ormlite.dao.Dao;
+
+public class BusSpecificStopView extends LinearLayout implements OnClickListener, OnLongClickListener {
+
+ private static final String TAG = "BusSpecificStopView";
+
+ // private static final String TAG = "StopView";
+
+ private final TextView location;
+ private final TextView time;
+ private String onClickMessage = "";
+ private final BusActivity context;
+
+ private Stop stop;
+
+ public BusSpecificStopView(BusActivity context, Stop stop) {
+ super(context);
+
+ this.context = context;
+
+ this.setOrientation(HORIZONTAL);
+
+ location = new TextView(context);
+ location.setTextSize(22f);
+
+ time = new TextView(context);
+ time.setTextSize(22f);
+ time.setGravity(Gravity.RIGHT);
+
+ setStop(stop);
+
+ addView(location, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
+ addView(time, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
+
+ }
+
+ public void setStop(Stop stop) {
+
+ // Log.i(TAG, "Time of arival " + stop.arivalTime);
+
+ this.stop = stop;
+
+ if (stop == null) {
+ Log.e(TAG, "stop == null");
+ }
+ if (stop.busStop == null) {
+ Log.e(TAG, "stop.busStop == null");
+ }
+ if (stop.busStop.description == null) {
+ Log.e(TAG, "stop.busStop.description == null");
+ }
+
+ if (stop.busStop.description.length() > 20) {
+ location.setText(stop.busStop.description.substring(0, 20)); // TODO
+ } else {
+ location.setText(stop.busStop.description); // TODO
+ }
+ if (stop.arivalTime != null) {
+ time.setText(stop.getShortTimeToArival());
+ } else {
+ time.setText("");
+ }
+
+ DatabaseHelper helper = OpenHelperManager.getHelper(context, DatabaseHelper.class);
+
+ try {
+ Dao<Bus, Integer> busDao = helper.getBusDao();
+
+ busDao.refresh(stop.bus);
+
+ if (stop.arivalTime != null) {
+
+ if (stop.bus.id != null) {
+ if (stop.live) {
+ onClickMessage = "Bus " + stop.bus.toString() + " at " + DateFormat.getTimeInstance(DateFormat.SHORT).format(stop.arivalTime);
+ } else {
+ onClickMessage = "Timetabled bus " + stop.bus.toString() + " at "
+ + DateFormat.getTimeInstance(DateFormat.SHORT).format(stop.arivalTime);
+ }
+ } else {
+ if (stop.live) {
+ onClickMessage = "Unidentified bus (" + stop.bus.getName() + ") at "
+ + DateFormat.getTimeInstance(DateFormat.SHORT).format(stop.arivalTime);
+ } else {
+ onClickMessage = "Timetabled bus (" + stop.bus.getName() + ") at "
+ + DateFormat.getTimeInstance(DateFormat.SHORT).format(stop.arivalTime);
+ }
+ }
+ } else {
+ if (stop.bus.id != null) {
+ if (stop.live) {
+ onClickMessage = "Bus " + stop.bus.toString();
+ } else {
+ onClickMessage = "Timetabled bus " + stop.bus.toString();
+ }
+ } else {
+ if (stop.live) {
+ onClickMessage = "Unidentified bus (" + stop.bus.getName() + ")";
+ } else {
+ onClickMessage = "Timetabled bus (" + stop.bus.getName() + ")";
+ }
+ }
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+
+ this.setOnClickListener(this);
+ this.setOnLongClickListener(this);
+ }
+
+ public void onClick(View v) {
+ if (context.activityToast == null) {
+ context.activityToast = Toast.makeText(context, onClickMessage, Toast.LENGTH_SHORT);
+ } else {
+ context.activityToast.setText(onClickMessage);
+ context.activityToast.setDuration(Toast.LENGTH_SHORT);
+ }
+ context.activityToast.show();
+ }
+
+ @Override
+ public boolean onLongClick(View v) { // TODO
+ DatabaseHelper helper = OpenHelperManager.getHelper(context, DatabaseHelper.class);
+
+ try {
+ Dao<Bus, Integer> busDao = helper.getBusDao();
+
+ busDao.refresh(stop.bus);
+
+ if (stop.bus.id != null) {
+ Intent i = new Intent(context, MapActivity.class);
+ i.putExtra("poiPoint", stop.busStop.point.toDoubleString());
+ ((Activity) context).startActivityForResult(i, 0);
+ } else {
+ if (context.activityToast == null) {
+ context.activityToast = Toast.makeText(context, "Arival prediction not avalible for timetabled buses", Toast.LENGTH_SHORT);
+ } else {
+ context.activityToast.setText("Arival prediction not avalible for timetabled buses");
+ context.activityToast.setDuration(Toast.LENGTH_SHORT);
+ }
+ context.activityToast.show();
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return false;
+ }
+
+}
diff --git a/src/net/cbaines/suma/BusSpecificTimetableAdapter.java b/src/net/cbaines/suma/BusSpecificTimetableAdapter.java
new file mode 100644
index 0000000..c115fea
--- /dev/null
+++ b/src/net/cbaines/suma/BusSpecificTimetableAdapter.java
@@ -0,0 +1,98 @@
+/*
+ * Southampton University Map App
+ * Copyright (C) 2011 Christopher Baines
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package net.cbaines.suma;
+
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.widget.BaseAdapter;
+
+public class BusSpecificTimetableAdapter extends BaseAdapter {
+
+ private final BusActivity context;
+ private Timetable timetable;
+ private final Animation a;
+ private boolean[] changed;
+
+ private long timeOfLastForcedUpdate = System.currentTimeMillis();
+
+ // private static final String TAG = "BusSpecificTimetableAdapter";
+
+ public BusSpecificTimetableAdapter(BusActivity context, Timetable timetable) {
+ this.context = context;
+ this.timetable = timetable;
+ this.a = AnimationUtils.loadAnimation(context, R.anim.updated_stop_view);
+ }
+
+ public View getView(int position, View convertView, ViewGroup parent) {
+ // Log.i(TAG, "Returning stop " + position + " " + timetable.get(position));
+
+ if (timeOfLastForcedUpdate + 1000 < System.currentTimeMillis()) {
+ context.handler.post(context.refreshData);
+ timeOfLastForcedUpdate = System.currentTimeMillis();
+ }
+
+ BusSpecificStopView stopView;
+ if (convertView == null) {
+ stopView = new BusSpecificStopView(context, timetable.get(position));
+ } else {
+ stopView = (BusSpecificStopView) convertView;
+ stopView.setStop(timetable.get(position));
+ }
+
+ if (changed == null || changed[position]) {
+ a.reset();
+ stopView.startAnimation(a);
+ // Log.i(TAG, "Animating it");
+ }
+
+ return stopView;
+ }
+
+ public int getCount() {
+ return timetable.size();
+ }
+
+ public Object getItem(int position) {
+ return position;
+ }
+
+ public long getItemId(int position) {
+ return position;
+ }
+
+ public void updateTimetable(Timetable newTimetable) {
+ // Log.v(TAG, "Old timetable " + timetable);
+ // Log.v(TAG, "Adaptor loading new timetable");
+ changed = new boolean[newTimetable.size()];
+ for (int i = 0; i < newTimetable.size(); i++) {
+ if (newTimetable.get(i).arivalTime != null && !timetable.contains(newTimetable.get(i), true)) {
+ changed[i] = true;
+ // Log.i(TAG, "Old timetable does not contain: " + newTimetable.get(i));
+ } else {
+ // Log.i(TAG, "Old timetable contains: " + newTimetable.get(i));
+ changed[i] = false;
+ }
+ }
+ timetable = newTimetable;
+ this.notifyDataSetChanged();
+ }
+}
diff --git a/src/net/cbaines/suma/BusStop.java b/src/net/cbaines/suma/BusStop.java
index c19e682..1e9faaa 100644
--- a/src/net/cbaines/suma/BusStop.java
+++ b/src/net/cbaines/suma/BusStop.java
@@ -35,6 +35,7 @@ public class BusStop extends POI {
public static final String DESCRIPTION_FIELD_NAME = "description";
public static final String BAY_FIELD_NAME = "bay";
public static final String ROUTES_FIELD_NAME = "bay";
+ public static final String UNI_LINK_FIELD_NAME = "uniLink";
/**
* Description e.g. "Bournemouth Rd os Asda S"
@@ -52,7 +53,10 @@ public class BusStop extends POI {
* Used to speed up accessing the relevent uni link routes for a bus stop, this is not a uni link stop
*/
@DatabaseField(canBeNull = false)
- public byte routes;
+ byte routes;
+
+ @DatabaseField(canBeNull = false)
+ boolean uniLink;
public BusStop(String location, String description, String bay, GeoPoint point) {
this.id = location;
diff --git a/src/net/cbaines/suma/BusStopActivity.java b/src/net/cbaines/suma/BusStopActivity.java
index 93f4ae6..03dcbca 100644
--- a/src/net/cbaines/suma/BusStopActivity.java
+++ b/src/net/cbaines/suma/BusStopActivity.java
@@ -21,12 +21,15 @@ package net.cbaines.suma;
import java.io.IOException;
import java.sql.SQLException;
+import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.Set;
import org.apache.http.client.ClientProtocolException;
import org.json.JSONException;
+import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
@@ -40,6 +43,8 @@ import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
@@ -47,13 +52,14 @@ import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
+import android.widget.Toast;
import com.j256.ormlite.android.apptools.OrmLiteBaseActivity;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.stmt.PreparedQuery;
import com.j256.ormlite.stmt.QueryBuilder;
-public class BusStopActivity extends OrmLiteBaseActivity<DatabaseHelper> implements OnCheckedChangeListener {
+public class BusStopActivity extends OrmLiteBaseActivity<DatabaseHelper> implements OnCheckedChangeListener, Preferences, OnItemClickListener {
final static String TAG = "BusTimeActivity";
@@ -90,8 +96,13 @@ public class BusStopActivity extends OrmLiteBaseActivity<DatabaseHelper> impleme
private CheckBox U6RouteRadioButton;
private CheckBox U9RouteRadioButton;
+ private static final int POI_DIALOG_ID = 0;
+ private POIDialog busDialog;
+
private HashSet<BusRoute> routes = new HashSet<BusRoute>();
+ Toast activityToast;
+
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.bustimes);
@@ -163,10 +174,7 @@ public class BusStopActivity extends OrmLiteBaseActivity<DatabaseHelper> impleme
} else {
U9RouteRadioButton.setVisibility(View.GONE);
}
- } else {
- Log.e(TAG, "Error unknown route " + route.code);
}
-
}
busStopDao = helper.getBusStopDao();
@@ -199,7 +207,8 @@ public class BusStopActivity extends OrmLiteBaseActivity<DatabaseHelper> impleme
super.onResume();
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
- if (sharedPrefs.getBoolean("liveBusTimesEnabled", false)) {
+ if (sharedPrefs.getBoolean(UNI_LINK_BUS_TIMES, UNI_LINK_BUS_TIMES_ENABLED_BY_DEFAULT)
+ || sharedPrefs.getBoolean(NON_UNI_LINK_BUS_TIMES, NON_UNI_LINK_BUS_TIMES_ENABLED_BY_DEFAULT)) {
Log.i(TAG, "Live Times enabled");
timetable = (Timetable) getLastNonConfigurationInstance();
@@ -237,7 +246,8 @@ public class BusStopActivity extends OrmLiteBaseActivity<DatabaseHelper> impleme
public void onPause() {
if (mHandler != null) { // BusTimes are enabled
mHandler.removeCallbacks(refreshData);
- timetableTask.cancel(true);
+ if (timetableTask != null) // Could happen if the handler has not created the timetableTask yet
+ timetableTask.cancel(true);
Log.i(TAG, "Stoping refreshing timetable data");
}
@@ -264,11 +274,10 @@ public class BusStopActivity extends OrmLiteBaseActivity<DatabaseHelper> impleme
e.printStackTrace();
}
} else {
-
Log.i(TAG, "Route radio button made " + checked);
-
- displayTimetable(timetable);
-
+ if (timetable != null) { // If there is a timetable to display
+ displayTimetable(timetable);
+ }
}
}
@@ -287,12 +296,16 @@ public class BusStopActivity extends OrmLiteBaseActivity<DatabaseHelper> impleme
protected Timetable doInBackground(String... activity) {
Timetable newTimetable = null;
try {
- newTimetable = DataManager.getTimetable(instance, busStopID, true);
+ final SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(instance);
+
+ newTimetable = DataManager.getTimetable(instance, busStopID, sharedPrefs.getBoolean(MapActivity.UNI_LINK_BUS_TIMES,
+ MapActivity.UNI_LINK_BUS_TIMES_ENABLED_BY_DEFAULT), sharedPrefs.getBoolean(
+ MapActivity.NON_UNI_LINK_BUS_TIMES, MapActivity.NON_UNI_LINK_BUS_TIMES_ENABLED_BY_DEFAULT));
} catch (SQLException e) {
errorMessage = "Error message regarding SQL?";
e.printStackTrace();
} catch (ClientProtocolException e) {
- errorMessage = "Insert error message here!";
+ errorMessage = "ClientProtocolException!?!";
e.printStackTrace();
} catch (IOException e) {
errorMessage = "Error fetching bus times from server, are you connected to the internet?";
@@ -300,7 +313,10 @@ public class BusStopActivity extends OrmLiteBaseActivity<DatabaseHelper> impleme
} catch (JSONException e) {
errorMessage = "Error parsing bus times";
e.printStackTrace();
+ } catch (Exception e) {
+ Log.e(TAG, e.getMessage(), e.getCause());
}
+
return newTimetable;
}
@@ -330,19 +346,25 @@ public class BusStopActivity extends OrmLiteBaseActivity<DatabaseHelper> impleme
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
- if (false) { // (item.getItemId() == R.id.menu_previous_stop || item.getItemId() == R.id.menu_next_stop) {
+ if (item.getItemId() == R.id.menu_previous_stop || item.getItemId() == R.id.menu_next_stop) {
Log.v(TAG, "Got a request for the stop movement");
Log.v(TAG, routes.size() + " routes avalible from this stop");
- HashSet<BusStop> busStops = new HashSet<BusStop>();
+ ArrayList<POI> busStops = new ArrayList<POI>();
for (BusRoute route : routes) {
try {
- if (false) { // (item.getItemId() == R.id.menu_next_stop) {
- busStops.add(route.moveInRoute(this, getHelper().getBusStopDao().queryForId(busStopID), null, 1));
+ Set<BusStop> tmpStops;
+ if (item.getItemId() == R.id.menu_next_stop) {
+ tmpStops = route.moveInRoute(this, getHelper().getBusStopDao().queryForId(busStopID), 1);
} else {
- busStops.add(route.moveInRoute(this, getHelper().getBusStopDao().queryForId(busStopID), null, -1));
+ tmpStops = route.moveInRoute(this, getHelper().getBusStopDao().queryForId(busStopID), -1);
+ }
+ for (BusStop busStop : tmpStops) {
+ if (!busStops.contains(busStop)) {
+ busStops.add(busStop);
+ }
}
} catch (SQLException e) {
e.printStackTrace();
@@ -353,7 +375,7 @@ public class BusStopActivity extends OrmLiteBaseActivity<DatabaseHelper> impleme
if (busStops.size() == 1) {
Intent i = new Intent(this, BusStopActivity.class);
- BusStop stop = busStops.iterator().next();
+ BusStop stop = (BusStop) busStops.iterator().next();
if (stop == null) {
Log.e(TAG, "stop == null");
}
@@ -364,7 +386,16 @@ public class BusStopActivity extends OrmLiteBaseActivity<DatabaseHelper> impleme
i.putExtra("busStopName", stop.description);
startActivity(i);
} else {
- // Show dialog
+ showDialog(POI_DIALOG_ID);
+ if (busDialog == null) {
+ Log.e(TAG, "Very wierd, just tried to launch the favourite's dialog, but its null?");
+ return false;
+ }
+
+ busDialog.setMessage("");
+ busDialog.setItems(busStops);
+ busDialog.setTitle("Choose Bus Stop");
+
Log.i(TAG, "Showing dialog");
}
@@ -441,4 +472,42 @@ public class BusStopActivity extends OrmLiteBaseActivity<DatabaseHelper> impleme
}
}
}
+
+ @Override
+ protected Dialog onCreateDialog(int id) {
+ switch (id) {
+ case POI_DIALOG_ID:
+ busDialog = new POIDialog(instance);
+ busDialog.setOnItemClickListener(this);
+ return busDialog;
+ }
+ return null;
+ }
+
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ Log.i(TAG, "OnItemClick pos " + position + " id " + id);
+
+ String poiId = busDialog.adapter.getItemStringId(position);
+
+ Log.i(TAG, "POI " + poiId + " selected");
+
+ Intent i = new Intent(this, BusStopActivity.class);
+ try {
+ busStop = busStopDao.queryForId(poiId);
+
+ if (busStop == null) {
+ Log.e(TAG, "stop == null");
+ }
+ if (busStop.id == null) {
+ Log.e(TAG, "stop.id == null");
+ }
+ i.putExtra("busStopID", busStop.id);
+ i.putExtra("busStopName", busStop.description);
+ startActivity(i);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+
+ }
}
diff --git a/src/net/cbaines/suma/BusStopOverlay.java b/src/net/cbaines/suma/BusStopOverlay.java
index 639f851..06a1729 100644
--- a/src/net/cbaines/suma/BusStopOverlay.java
+++ b/src/net/cbaines/suma/BusStopOverlay.java
@@ -28,7 +28,6 @@ import org.osmdroid.views.MapView.Projection;
import org.osmdroid.views.overlay.Overlay;
import android.app.Activity;
-import android.content.Context;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Paint;
@@ -45,7 +44,7 @@ import com.j256.ormlite.dao.Dao;
public class BusStopOverlay extends Overlay implements RouteColorConstants {
- private List<BusStop> busStops;
+ List<BusStop> busStops;
private final Point mCurScreenCoords = new Point();
private final Point mTouchScreenPoint = new Point();
@@ -60,7 +59,7 @@ public class BusStopOverlay extends Overlay implements RouteColorConstants {
private static final String TAG = "BusStopOverlay";
- private final Context context;
+ private final MapActivity context;
private Dao<BusStop, String> busStopDao;
@@ -68,9 +67,8 @@ public class BusStopOverlay extends Overlay implements RouteColorConstants {
private boolean[] routes = new boolean[5];
- public BusStopOverlay(Context context) throws SQLException {
+ public BusStopOverlay(MapActivity context, List<BusStop> busStops) throws SQLException {
super(context);
- final long startTime = System.currentTimeMillis();
this.context = context;
@@ -84,9 +82,7 @@ public class BusStopOverlay extends Overlay implements RouteColorConstants {
paint.setStyle(Style.FILL);
paint.setStrokeWidth(6);
- Log.i(TAG, "Begining to load bus stops in to overlay " + (System.currentTimeMillis() - startTime));
- busStops = busStopDao.queryForAll();
- Log.i(TAG, "Finished loading bus stops in to overlay " + (System.currentTimeMillis() - startTime));
+ this.busStops = busStops;
}
void setRoutes(int route, boolean visible) {
@@ -122,20 +118,21 @@ public class BusStopOverlay extends Overlay implements RouteColorConstants {
boolean drawing = false;
- for (int i = 0; i < 5; i++) {
- if ((stopRoutes & (1 << i)) != 0) {
- routeNum++;
- if (routes[i]) {
- drawing = true;
+ if (stop.uniLink) {
+
+ for (int i = 0; i < 5; i++) {
+ if ((stopRoutes & (1 << i)) != 0) {
+ routeNum++;
+ if (routes[i]) {
+ drawing = true;
+ }
}
}
- }
- if (!drawing)
- continue;
+ if (!drawing)
+ continue;
- int yOfsetPerMarker = (int) (10 * scale);
- int markerYSize = (int) (8 * scale);
+ }
pj.toMapPixels(stop.point, mCurScreenCoords);
@@ -144,60 +141,86 @@ public class BusStopOverlay extends Overlay implements RouteColorConstants {
} else {
Overlay.drawAt(canvas, marker, mCurScreenCoords.x, mCurScreenCoords.y, false);
}
- // Log.i(TAG, "Got " + routes.size() + " routes " + routes);
- int makersPlaced = 0;
+ if (stop.uniLink) {
- float rectLeft = mCurScreenCoords.x + (8.8f * scale);
- float rectRight = rectLeft + markerYSize;
+ int makersPlaced = 0;
+ int yOfsetPerMarker = (int) (10 * scale);
+ int markerYSize = (int) (8 * scale);
- if (routeNum == 5) {
- markerYSize = (int) (5 * scale);
- yOfsetPerMarker = (int) (7 * scale);
- } else if (routeNum == 4) {
- markerYSize = (int) (6.5f * scale);
- yOfsetPerMarker = (int) (8 * scale);
- }
+ float rectLeft = mCurScreenCoords.x + (8.8f * scale);
+ float rectRight = rectLeft + markerYSize;
- for (int i = 0; i < 5; i++) {
- if ((stopRoutes & (1 << i)) != 0) {
-
- // Log.i(TAG, "Route " + route + " is " + routes.get(route));
-
- // Log.i(TAG, "Index is " + busRoutes.indexOf(route) + " busRoutes " + busRoutes);
-
- if (i == 0) {
- paint.setColor(U1);
- } else if (i == 1) {
- paint.setColor(U1N);
- } else if (i == 2) {
- paint.setColor(U2);
- } else if (i == 3) {
- paint.setColor(U6);
- } else if (i == 4) {
- paint.setColor(U9);
- } else {
- Log.e(TAG, "Unknown route code");
- }
+ if (routeNum == 5) {
+ markerYSize = (int) (5 * scale);
+ yOfsetPerMarker = (int) (7 * scale);
+ } else if (routeNum == 4) {
+ markerYSize = (int) (6.5f * scale);
+ yOfsetPerMarker = (int) (8 * scale);
+ }
+
+ for (int i = 0; i < 5; i++) {
+ if ((stopRoutes & (1 << i)) != 0) {
+
+ // Log.i(TAG, "Route " + route + " is " + routes.get(route));
+
+ // Log.i(TAG, "Index is " + busRoutes.indexOf(route) + " busRoutes " + busRoutes);
+
+ if (i == 0) {
+ paint.setColor(U1);
+ } else if (i == 1) {
+ paint.setColor(U1N);
+ } else if (i == 2) {
+ paint.setColor(U2);
+ } else if (i == 3) {
+ paint.setColor(U6);
+ } else if (i == 4) {
+ paint.setColor(U9);
+ } else {
+ Log.e(TAG, "Unknown route code");
+ }
- canvas.drawRect(rectLeft, mCurScreenCoords.y + ((yOfsetPerMarker * makersPlaced) - (45 * scale)), rectRight, mCurScreenCoords.y
- + (yOfsetPerMarker * makersPlaced) - ((45 * scale) - markerYSize), paint);
+ canvas.drawRect(rectLeft, mCurScreenCoords.y
+ + ((yOfsetPerMarker * makersPlaced) - (45 * scale)), rectRight, mCurScreenCoords.y
+ + (yOfsetPerMarker * makersPlaced) - ((45 * scale) - markerYSize), paint);
- makersPlaced++;
+ makersPlaced++;
+ }
}
}
}
-
}
@Override
- public boolean onSingleTapUp(final MotionEvent event, final MapView mapView) {
+ public boolean onSingleTapConfirmed(final MotionEvent event, final MapView mapView) {
BusStop busStop = getSelectedItem(event, mapView);
if (busStop == null) {
- Log.i(TAG, "No busStop pressed");
+ // Log.v(TAG, "No busStop pressed");
+ return false;
+ } else {
+ Log.i(TAG, "busStop Pressed " + busStop.id);
+
+ if (context.activityToast == null) {
+ context.activityToast = Toast.makeText(context, busStop.description + " (" + busStop.id + ")",
+ Toast.LENGTH_SHORT);
+ } else {
+ context.activityToast.setDuration(Toast.LENGTH_SHORT);
+ context.activityToast.setText(busStop.description + " (" + busStop.id + ")");
+ }
+ context.activityToast.show();
+
+ return true;
+ }
+ }
+ public boolean onDoubleTap(final MotionEvent event, final MapView mapView) {
+
+ BusStop busStop = getSelectedItem(event, mapView);
+
+ if (busStop == null) {
+ // Log.v(TAG, "No busStop pressed");
return false;
} else {
Log.i(TAG, "Pressed " + busStop.id);
@@ -214,10 +237,11 @@ public class BusStopOverlay extends Overlay implements RouteColorConstants {
@Override
public boolean onLongPress(final MotionEvent event, final MapView mapView) {
+
BusStop busStop = getSelectedItem(event, mapView);
if (busStop == null) {
- Log.i(TAG, "No busStop pressed");
+ // Log.v(TAG, "No busStop pressed");
return false;
} else {
Log.i(TAG, "Pressed " + busStop.id);
@@ -225,9 +249,23 @@ public class BusStopOverlay extends Overlay implements RouteColorConstants {
if (busStop.favourite) {
busStop.favourite = false;
- Toast.makeText(context, busStop.id + " removed from favourites", Toast.LENGTH_SHORT).show();
+ if (context.activityToast == null) {
+ context.activityToast = Toast.makeText(context, busStop.id + " removed from favourites",
+ Toast.LENGTH_SHORT);
+ } else {
+ context.activityToast.setDuration(Toast.LENGTH_SHORT);
+ context.activityToast.setText(busStop.id + " removed from favourites");
+ }
+ context.activityToast.show();
} else {
- Toast.makeText(context, busStop.id + " made a favourite", Toast.LENGTH_SHORT).show();
+ if (context.activityToast == null) {
+ context.activityToast = Toast.makeText(context, busStop.id + " made a favourite",
+ Toast.LENGTH_SHORT);
+ } else {
+ context.activityToast.setDuration(Toast.LENGTH_SHORT);
+ context.activityToast.setText(busStop.id + " made a favourite");
+ }
+ context.activityToast.show();
busStop.favourite = true;
}
@@ -244,7 +282,6 @@ public class BusStopOverlay extends Overlay implements RouteColorConstants {
return true;
}
-
}
public void refresh() {
@@ -291,17 +328,19 @@ public class BusStopOverlay extends Overlay implements RouteColorConstants {
pj.toPixels(busStop.point, mItemPoint);
if (marker.getBounds().contains(mTouchScreenPoint.x - mItemPoint.x, mTouchScreenPoint.y - mItemPoint.y)) {
- boolean drawing = false;
- for (int route = 0; route < 5; route++) {
- if ((busStop.routes & (1 << route)) != 0) {
- if (routes[route]) {
- drawing = true;
- break;
+ if (busStop.uniLink) {
+ boolean drawing = false;
+ for (int route = 0; route < 5; route++) {
+ if ((busStop.routes & (1 << route)) != 0) {
+ if (routes[route]) {
+ drawing = true;
+ break;
+ }
}
}
+ if (!drawing)
+ continue;
}
- if (!drawing)
- continue;
return busStop;
}
diff --git a/src/net/cbaines/suma/DataHandler.java b/src/net/cbaines/suma/DataHandler.java
index f564d19..25f66ff 100644
--- a/src/net/cbaines/suma/DataHandler.java
+++ b/src/net/cbaines/suma/DataHandler.java
@@ -25,8 +25,6 @@ import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
-import android.util.Log;
-
public class DataHandler extends DefaultHandler {
// this holds the data
@@ -70,7 +68,8 @@ public class DataHandler extends DefaultHandler {
}
/**
- * This gets called at the start of an element. Here we're also setting the booleans to true if it's at that specific tag. (so we know where we are)
+ * This gets called at the start of an element. Here we're also setting the booleans to true if it's at that
+ * specific tag. (so we know where we are)
*
* @param namespaceURI
* @param localName
@@ -81,7 +80,8 @@ public class DataHandler extends DefaultHandler {
@Override
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
if (localName.equals("trkpt")) {
- // Log.v("DataHandler", "Adding point to route overlay " + atts.getValue("lat") + " " + atts.getValue("lon"));
+ // Log.v("DataHandler", "Adding point to route overlay " + atts.getValue("lat") + " " +
+ // atts.getValue("lon"));
_data.addPoint(Util.csLatLongToGeoPoint(atts.getValue("lat"), atts.getValue("lon")));
}
}
@@ -100,8 +100,8 @@ public class DataHandler extends DefaultHandler {
}
/**
- * Calling when we're within an element. Here we're checking to see if there is any content in the tags that we're interested in and populating it in the
- * Config object.
+ * Calling when we're within an element. Here we're checking to see if there is any content in the tags that we're
+ * interested in and populating it in the Config object.
*
* @param ch
* @param start
diff --git a/src/net/cbaines/suma/DataManager.java b/src/net/cbaines/suma/DataManager.java
index 9fd08c1..c6a3a36 100644
--- a/src/net/cbaines/suma/DataManager.java
+++ b/src/net/cbaines/suma/DataManager.java
@@ -24,11 +24,15 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.SQLException;
+import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
@@ -62,12 +66,12 @@ import com.j256.ormlite.table.TableUtils;
public class DataManager {
- final static String TAG = "DataManager";
+ private final static String TAG = "DataManager";
- final static String busStopUrl = "http://data.southampton.ac.uk/bus-stop/";
+ private final static String busStopUrl = "http://data.southampton.ac.uk/bus-stop/";
private static DatabaseHelper helper;
- private static Dao<BusRoute, Integer> busRoutes;
+ private static Dao<BusRoute, Integer> busRouteDao;
private static Dao<Bus, Integer> busDao;
private static Dao<BusStop, String> busStopDao;
@@ -77,7 +81,7 @@ public class DataManager {
TableUtils.clearTable(helper.getConnectionSource(), Building.class);
- Log.i(TAG, "Loading buildings from csv");
+ Log.i(TAG, "Begining loading buildings from csv");
HashMap<String, GeoPoint> buildingPoints = new HashMap<String, GeoPoint>();
@@ -92,32 +96,17 @@ public class DataManager {
// Log.i(TAG, "Data: " + strLine);
String[] dataBits = strLine.split(",");
GeoPoint point = Util.csLatLongToGeoPoint(dataBits[2], dataBits[1]);
- // Log.i(TAG, "Creating building with id " + dataBits[0] + " and " + point.getLatitudeE6() + " " + point.getLongitudeE6());
+ // Log.i(TAG, "Creating building with id " + dataBits[0] + " and " + point.getLatitudeE6() + " " +
+ // point.getLongitudeE6());
buildingPoints.put(dataBits[0], point);
}
bufferedReader.close();
} catch (IOException e) {
- // TODO Auto-generated catch block
e.printStackTrace();
}
- Log.i(TAG, "Number of building points " + buildingPoints.size());
-
- /*
- * inputStream = context.getResources().openRawResource(R.raw.buildings_shapes); bufferedReader = new BufferedReader(new
- * InputStreamReader(inputStream));
- *
- * try { String def = bufferedReader.readLine(); // Log.i(TAG, "Reading the definition " + def);
- *
- * while ((strLine = bufferedReader.readLine()) != null) { // Log.i(TAG, "Data: " + strLine); String[] dataBits = strLine.split(","); Polygon poly =
- * Util.csPolygonToPolygon(strLine.split("\"")[1]); // Log.i(TAG, "Creating building with id " + dataBits[0] + " and " + poly);
- * buildingPolys.put(dataBits[0], poly); }
- *
- * bufferedReader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
- *
- * Log.i(TAG, "Number of polys points " + buildingPolys.size());
- */
+ // Log.i(TAG, "Number of building points " + buildingPoints.size());
inputStream = context.getAssets().open("building_estates.csv");
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
@@ -139,16 +128,19 @@ public class DataManager {
continue;
}
- Building bdg = new Building(dataBits[1], buildingPoints.get(dataBits[1]), dataBits[3].equals("R"), quoteBits[0]);
+ Building bdg = new Building(dataBits[1], buildingPoints.get(dataBits[1]), dataBits[3].equals("R"),
+ quoteBits[0]);
/*
* Polygon poly = buildingPolys.get(dataBits[1]);
*
- * if (poly != null) { bdg.outline = poly; // Log.i(TAG, "Adding building " + key + " " + bdg.point.getLatitudeE6() + " " +
- * bdg.point.getLongitudeE6() + " " + poly); } else { // Log.i(TAG, "Adding building " + key + " " + bdg.point.getLatitudeE6() + " " +
+ * if (poly != null) { bdg.outline = poly; // Log.i(TAG, "Adding building " + key + " " +
+ * bdg.point.getLatitudeE6() + " " + bdg.point.getLongitudeE6() + " " + poly); } else { //
+ * Log.i(TAG, "Adding building " + key + " " + bdg.point.getLatitudeE6() + " " +
* bdg.point.getLongitudeE6()); }
*/
- // Log.i(TAG, "Creating building " + bdg.id + " " + bdg.name + " " + bdg.point + " " + bdg.residential + " " + bdg.outline);
+ // Log.i(TAG, "Creating building " + bdg.id + " " + bdg.name + " " + bdg.point + " " +
+ // bdg.residential + " " + bdg.outline);
buildingDao.create(bdg);
@@ -161,16 +153,19 @@ public class DataManager {
continue;
}
- Building bdg = new Building(dataBits[1], buildingPoints.get(dataBits[1]), dataBits[3].equals("R"), dataBits[0]);
+ Building bdg = new Building(dataBits[1], buildingPoints.get(dataBits[1]), dataBits[3].equals("R"),
+ dataBits[0]);
/*
* Polygon poly = buildingPolys.get(dataBits[1]);
*
- * if (poly != null) { bdg.outline = poly; // Log.i(TAG, "Adding building " + key + " " + bdg.point.getLatitudeE6() + " " +
- * bdg.point.getLongitudeE6() + " " + poly); } else { // Log.i(TAG, "Adding building " + key + " " + bdg.point.getLatitudeE6() + " " +
+ * if (poly != null) { bdg.outline = poly; // Log.i(TAG, "Adding building " + key + " " +
+ * bdg.point.getLatitudeE6() + " " + bdg.point.getLongitudeE6() + " " + poly); } else { //
+ * Log.i(TAG, "Adding building " + key + " " + bdg.point.getLatitudeE6() + " " +
* bdg.point.getLongitudeE6()); }
*/
- // Log.i(TAG, "Creating building " + bdg.id + " " + bdg.name + " " + bdg.point + " " + bdg.residential + " " + bdg.outline);
+ // Log.i(TAG, "Creating building " + bdg.id + " " + bdg.name + " " + bdg.point + " " +
+ // bdg.residential + " " + bdg.outline);
buildingDao.create(bdg);
@@ -188,8 +183,9 @@ public class DataManager {
*
* Building bdg = new Building(key, buildingPoints.get(key), false); Polygon poly = buildingPolys.get(key);
*
- * if (poly != null) { bdg.outline = poly; // Log.i(TAG, "Adding building " + key + " " + bdg.point.getLatitudeE6() + " " + bdg.point.getLongitudeE6() +
- * " " + poly); } else { // Log.i(TAG, "Adding building " + key + " " + bdg.point.getLatitudeE6() + " " + bdg.point.getLongitudeE6()); }
+ * if (poly != null) { bdg.outline = poly; // Log.i(TAG, "Adding building " + key + " " +
+ * bdg.point.getLatitudeE6() + " " + bdg.point.getLongitudeE6() + " " + poly); } else { // Log.i(TAG,
+ * "Adding building " + key + " " + bdg.point.getLatitudeE6() + " " + bdg.point.getLongitudeE6()); }
*
* buildingDao.create(bdg); }
*/
@@ -225,19 +221,21 @@ public class DataManager {
String[] quBitsLng = dataBits[4].substring(1, dataBits[4].length() - 1).split(" ");
// Log.i(TAG, "Whole " + dataBits[3] + " First bit " + quBitsLat[0] + " last bit " + quBitsLat[1]);
- double lat = Double.valueOf(quBitsLat[0]) + Double.valueOf(quBitsLat[1].substring(0, quBitsLat[1].length() - 1)) / 60d; // TODO Much hackage
+ double lat = Double.valueOf(quBitsLat[0])
+ + Double.valueOf(quBitsLat[1].substring(0, quBitsLat[1].length() - 1)) / 60d;
// Log.i(TAG, "Whole " + dataBits[4] + " First bit " + quBitsLng[0] + " last bit " + quBitsLng[1]);
- double lng = Double.valueOf(quBitsLng[0]) + Double.valueOf(quBitsLng[1].substring(0, quBitsLng[1].length() - 1)) / 60d; // TODO Much hackage
+ double lng = Double.valueOf(quBitsLng[0])
+ + Double.valueOf(quBitsLng[1].substring(0, quBitsLng[1].length() - 1)) / 60d;
GeoPoint point = new GeoPoint((int) (lat * 1e6), (int) (lng * -1e6));
// Log.i(TAG, "Lat " + point.getLatitudeE6() + " lng " + point.getLongitudeE6());
- busStopDao.create(new BusStop(dataBits[0].replace("\"", ""), dataBits[1].replace("\"", ""), dataBits[2].replace("\"", ""), point));
+ busStopDao.create(new BusStop(dataBits[0].replace("\"", ""), dataBits[1].replace("\"", ""), dataBits[2]
+ .replace("\"", ""), point));
}
bufferedReader.close();
} catch (IOException e) {
- // TODO Auto-generated catch block
Log.e(TAG, "Line: " + strLine);
e.printStackTrace();
}
@@ -256,11 +254,28 @@ public class DataManager {
String[] dataBits = strLine.split(",");
BusRoute route;
- if (dataBits.length > 3) {
- route = new BusRoute(Integer.parseInt(dataBits[0]), dataBits[1], dataBits[2].replace("\"", ""), dataBits[3], dataBits[4]);
+
+ boolean uniLink;
+ int id = Integer.parseInt(dataBits[0]);
+ if (id == 326 || id == 468 || id == 327 || id == 329 || id == 354) {
+ uniLink = true;
} else {
- route = new BusRoute(Integer.parseInt(dataBits[0]), dataBits[1], dataBits[2].replace("\"", ""));
+ uniLink = false;
}
+
+ route = new BusRoute(id, dataBits[1], dataBits[2].replace("\"", ""), uniLink);
+
+ if (id == 326) { // U1
+ route.forwardDirection = "A";
+ route.reverseDirection = "C";
+ } else if (id == 329) { // U2
+ route.forwardDirection = "B";
+ route.reverseDirection = "C";
+ } else if (id == 327) { // U6
+ route.forwardDirection = "H";
+ route.reverseDirection = "C";
+ }
+
// Log.i(TAG, "Loaded route " + route.id + " " + route.code + " " + route.label);
busRouteDao.create(route);
@@ -268,7 +283,6 @@ public class DataManager {
bufferedReader.close();
} catch (IOException e) {
- // TODO Auto-generated catch block
Log.e(TAG, "Line: " + strLine);
e.printStackTrace();
}
@@ -286,16 +300,16 @@ public class DataManager {
// Log.i(TAG, "Data: " + strLine);
String[] dataBits = strLine.split(",");
- BusStop stop = busStopDao.queryForId(dataBits[2]);
- if (stop != null) {
+ BusStop busStop = busStopDao.queryForId(dataBits[2]);
+ if (busStop != null) {
// Log.i(TAG, "Found stop " + stop.id);
} else {
Log.w(TAG, "No stop found for " + dataBits[2]);
continue;
}
- BusRoute route = busRouteDao.queryForId(Integer.parseInt(dataBits[0]));
- if (route != null) {
+ BusRoute busRoute = busRouteDao.queryForId(Integer.parseInt(dataBits[0]));
+ if (busRoute != null) {
// Log.i(TAG, "Found route " + route.id);
} else {
Log.w(TAG, "No route found for " + dataBits[0]);
@@ -303,70 +317,64 @@ public class DataManager {
}
int sequence = Integer.parseInt(dataBits[1]);
- Log.i(TAG, "Creating RouteStop " + stop.id + " " + route.code + " " + sequence);
-
- routeStopsDao.create(new RouteStops(stop, route, sequence));
-
- if (route.id == 326) { // U1
- stop.routes = (byte) (stop.routes | 1);
- } else if (route.id == 468) { // U1N
- stop.routes = (byte) (stop.routes | (1 << 1));
- } else if (route.id == 329) { // U2
- stop.routes = (byte) (stop.routes | (1 << 2));
- } else if (route.id == 327) { // U6
- stop.routes = (byte) (stop.routes | (1 << 3));
- } else if (route.id == 354) { // U9
- stop.routes = (byte) (stop.routes | (1 << 4));
+ Log.i(TAG, "Creating RouteStop " + busStop.id + " " + busRoute.code + " " + sequence);
+
+ routeStopsDao.create(new RouteStops(busStop, busRoute, sequence));
+
+ if (busRoute.id == 326) { // U1
+ busStop.routes = (byte) (busStop.routes | 1);
+ busStop.uniLink = true;
+ } else if (busRoute.id == 468) { // U1N
+ busStop.routes = (byte) (busStop.routes | (1 << 1));
+ busStop.uniLink = true;
+ } else if (busRoute.id == 329) { // U2
+ busStop.routes = (byte) (busStop.routes | (1 << 2));
+ busStop.uniLink = true;
+ } else if (busRoute.id == 327) { // U6
+ busStop.routes = (byte) (busStop.routes | (1 << 3));
+ busStop.uniLink = true;
+ } else if (busRoute.id == 354) { // U9
+ busStop.routes = (byte) (busStop.routes | (1 << 4));
+ busStop.uniLink = true;
+ } else {
+ busStop.routes = 0;
}
- Log.v(TAG, "Stop routes " + stop.routes);
- busStopDao.update(stop);
+ // Log.v(TAG, "Stop routes " + busStop.routes);
+ busStopDao.update(busStop);
}
bufferedReader.close();
} catch (IOException e) {
- // TODO Auto-generated catch block
Log.e(TAG, "Line: " + strLine);
e.printStackTrace();
}
- // TODO: Seperate non unilink stuff in to a different table
- if (onlyUniLink) {
-
- long sizeBeforeRemoval = busStopDao.countOf();
-
- // Removing busstops not used by unilink busses
- for (Iterator<BusStop> busStopIter = busStopDao.iterator(); busStopIter.hasNext();) {
- BusStop stop = busStopIter.next();
- // Log.i(TAG, "Looking at stop " + stop.id);
-
- /*
- * QueryBuilder<RouteStops, Integer> routeStopsQueryBuilder = routeStopsDao.queryBuilder(); routeStopsQueryBuilder.where().eq(columnName, value)
- *
- * DeleteBuilder<BusStop, String> deleteBuilder = busStopDao.deleteBuilder(); // only delete the rows where password is null
- * deleteBuilder.where().in(RouteStops.STOP_ID_FIELD_NAME, objects) accountDao.delete(deleteBuilder.prepare());
- */
-
- QueryBuilder<RouteStops, Integer> routeStopsQueryBuilder = routeStopsDao.queryBuilder();
- routeStopsQueryBuilder.setCountOf(true);
- routeStopsQueryBuilder.where().eq(RouteStops.STOP_ID_FIELD_NAME, stop);
-
- PreparedQuery<RouteStops> routeStopsPreparedQuery = routeStopsQueryBuilder.prepare();
- long num = routeStopsDao.countOf(routeStopsPreparedQuery);
- // long num = routeStopsDao.query(routeStopsPreparedQuery).size();
- // Log.i(TAG, "Number is " + num);
- if (num == 0) {
- // Log.i(TAG, "Removing " + stop.id);
- busStopIter.remove();
- }
- }
-
- long sizeAfterRemoval = busStopDao.countOf();
-
- Log.i(TAG, "Removed " + (sizeBeforeRemoval - sizeAfterRemoval) + " stops (from " + sizeBeforeRemoval + ") now have " + sizeAfterRemoval);
-
- }
+ /*
+ * for (Iterator<BusStop> busStopIter = busStopDao.iterator(); busStopIter.hasNext();) { BusStop stop =
+ * busStopIter.next(); // Log.i(TAG, "Looking at stop " + stop.id);
+ *
+ *
+ * QueryBuilder<RouteStops, Integer> routeStopsQueryBuilder = routeStopsDao.queryBuilder();
+ * routeStopsQueryBuilder.where().eq(columnName, value)
+ *
+ * DeleteBuilder<BusStop, String> deleteBuilder = busStopDao.deleteBuilder(); // only delete the rows where
+ * password is null deleteBuilder.where().in(RouteStops.STOP_ID_FIELD_NAME, objects)
+ * accountDao.delete(deleteBuilder.prepare());
+ *
+ *
+ * QueryBuilder<RouteStops, Integer> routeStopsQueryBuilder = routeStopsDao.queryBuilder();
+ * routeStopsQueryBuilder.setCountOf(true); routeStopsQueryBuilder.where().eq(RouteStops.STOP_ID_FIELD_NAME,
+ * stop);
+ *
+ * PreparedQuery<RouteStops> routeStopsPreparedQuery = routeStopsQueryBuilder.prepare(); List<RouteStops>
+ * routeStops = routeStopsDao.query(routeStopsPreparedQuery); // long num =
+ * routeStopsDao.query(routeStopsPreparedQuery).size(); // Log.i(TAG, "Number is " + num);
+ *
+ * stop.uniLink = false; for (RouteStops routeStop : routeStops) { if (routeStop.busRoute.uniLink) {
+ * stop.uniLink = true; } } busStopDao.update(stop); }
+ */
Log.i(TAG, "Finished loading bus data");
}
@@ -415,144 +423,180 @@ public class DataManager {
Log.i(TAG, "Loaded sites from csv");
}
- private static Stop getStop(Context context, JSONObject stopObj, BusStop busStop) throws SQLException {
+ private static Stop getStop(Context context, JSONObject stopObj, Set<BusRoute> routes, BusStop busStop)
+ throws SQLException, JSONException {
if (helper == null)
helper = OpenHelperManager.getHelper(context, DatabaseHelper.class);
- if (busRoutes == null)
- busRoutes = helper.getBusRouteDao();
+ if (busRouteDao == null)
+ busRouteDao = helper.getBusRouteDao();
+ Dao<RouteStops, Integer> routeStopsDao = null;
+ if (routeStopsDao == null)
+ routeStopsDao = helper.getRouteStopsDao();
if (busDao == null)
busDao = helper.getBusDao();
if (busStopDao == null)
busStopDao = helper.getBusStopDao();
- try {
- String time = stopObj.getString("time");
-
- GregorianCalendar calender = new GregorianCalendar();
- if (!time.equals("Due")) {
+ String time = stopObj.getString("time");
- Log.v(TAG, "Time: " + time + " current time " + calender.getTime());
+ GregorianCalendar calender = new GregorianCalendar();
+ boolean live = true;
+ if (!time.equals("Due")) {
- if (time.contains(":")) {
- String[] minAndHour = time.split(":");
- calender.set(Calendar.HOUR_OF_DAY, Integer.parseInt(minAndHour[0]));
- calender.set(Calendar.MINUTE, Integer.parseInt(minAndHour[1]));
- } else {
- // Log.i(TAG, "Parsing " + time.substring(0, time.length() - 1) + " for min");
- calender.add(Calendar.MINUTE, Integer.parseInt(time.substring(0, time.length() - 1)));
- }
+ // Log.v(TAG, "Time: " + time + " current time " + calender.getTime());
- Log.v(TAG, "Date: " + calender.getTime());
+ if (time.contains(":")) {
+ String[] minAndHour = time.split(":");
+ calender.set(Calendar.HOUR_OF_DAY, Integer.parseInt(minAndHour[0]));
+ calender.set(Calendar.MINUTE, Integer.parseInt(minAndHour[1]));
+ live = false;
+ } else {
+ // Log.i(TAG, "Parsing " + time.substring(0, time.length() - 1) + " for min");
+ calender.add(Calendar.MINUTE, Integer.parseInt(time.substring(0, time.length() - 1)));
}
- String name = stopObj.getString("name");
+ // Log.v(TAG, "Date: " + calender.getTime());
+ }
- BusRoute route;
- String dir = null;
+ String name = stopObj.getString("name");
- if (name.equals("U1N")) {
- route = busRoutes.queryForId(468);
- } else if (name.startsWith("U9")) {
- route = busRoutes.queryForId(354);
- } else {
- if (name.startsWith("U1")) {
- route = busRoutes.queryForId(326);
- } else if (name.startsWith("U2")) {
- route = busRoutes.queryForId(329);
- } else if (name.startsWith("U6")) {
- route = busRoutes.queryForId(327);
- } else {
- Log.e(TAG, "Error detecting route " + name);
- return null;
- }
+ BusRoute route = null;
+ String dir = "";
- if (route.forwardDirection.equals(name.substring(2))) {
- dir = route.forwardDirection;
- } else if (route.reverseDirection.equals(name.substring(2))) {
- dir = route.reverseDirection;
+ for (BusRoute tempRoute : routes) {
+ if (name.contains("U")) {
+ if (name.equals("U1N")) {
+ if (tempRoute.code.equals(name)) {
+ route = tempRoute;
+ dir = null;
+ }
} else {
- Log.e(TAG, "Error detecting direction for " + name);
- return null;
+ if (tempRoute == null) {
+ Log.e(TAG, "tempRoute == null");
+ }
+ if (tempRoute.code == null) {
+ Log.e(TAG, "tempRoute.code == null");
+ }
+ if (tempRoute.code.equals(name.substring(0, 2))) {
+ route = tempRoute;
+ if (route.forwardDirection.equals(name.substring(2))) {
+ dir = route.forwardDirection;
+ } else if (route.reverseDirection.equals(name.substring(2))) {
+ dir = route.reverseDirection;
+ } else {
+ Log.e(TAG, "Error detecting direction for " + name);
+ dir = null;
+ return null;
+ }
+ }
}
- }
-
- String destString = stopObj.getString("dest");
- BusStop destStop;
-
- if (destString.equals("Central Station")) {
- destStop = busStopDao.queryForId("SNA19709");
- } else if (destString.equals("Civic Centre")) {
- destStop = busStopDao.queryForId("SN120527");
- } else if (destString.equals("City DG4")) {
- destStop = busStopDao.queryForId("HAA13579");
- } else if (destString.equals("Central Station")) {
- destStop = busStopDao.queryForId("SN120520");
- } else if (destString.equals("Airport")) {
- destStop = busStopDao.queryForId("HA030184");
- } else if (destString.equals("City, Town Quay")) {
- destStop = busStopDao.queryForId("SNA13766");
- } else if (destString.equals("Dock Gate 4")) {
- destStop = busStopDao.queryForId("MG1031");
- } else if (destString.equals("Eastleigh")) {
- destStop = busStopDao.queryForId("HA030212");
- } else if (destString.equals("Crematorium")) {
- destStop = busStopDao.queryForId("SN121009");
- } else if (destString.equals("General Hosp")) {
- destStop = busStopDao.queryForId("SNA19482");
} else {
- Log.e(TAG, "Unknown end dest " + destString + " for route " + route.code);
- return null;
+ if (tempRoute.code.equals(name)) {
+ route = tempRoute;
+ dir = null;
+ }
}
+ }
- Date now = new Date(System.currentTimeMillis());
+ if (route == null) {
+ Log.e(TAG, "Route not found (route == null) " + name);
+ return null;
+ }
- String busID = null;
- Stop stop;
- Bus bus;
- if (stopObj.has("vehicle")) {
- busID = stopObj.getString("vehicle");
+ if (dir != null && dir.equals("")) {
+ Log.e(TAG, "Error detecting direction for " + name);
+ return null;
+ }
- QueryBuilder<Bus, Integer> busQueryBuilder = busDao.queryBuilder();
- busQueryBuilder.where().eq(Bus.ID_FIELD_NAME, busID);
- PreparedQuery<Bus> busPreparedQuery = busQueryBuilder.prepare();
+ String destString = stopObj.getString("dest");
+ BusStop destStop = null;
+
+ if (destString.equals("Central Station")) {
+ destStop = busStopDao.queryForId("SN120520");
+ } else if (destString.equals("Civic Centre")) {
+ destStop = busStopDao.queryForId("SN120527");
+ } else if (destString.equals("City DG4")) {
+ destStop = busStopDao.queryForId("HAA13579");
+ } else if (destString.equals("Airport")) {
+ destStop = busStopDao.queryForId("HA030184");
+ } else if (destString.equals("City, Town Quay")) {
+ destStop = busStopDao.queryForId("SNA13766");
+ } else if (destString.equals("City Centre")) {
+ destStop = busStopDao.queryForId("SNA13766");
+ } else if (destString.equals("Dock Gate 4")) {
+ destStop = busStopDao.queryForId("MG1031");
+ } else if (destString.equals("Eastleigh")) {
+ destStop = busStopDao.queryForId("HA030212");
+ } else if (destString.equals("Crematorium")) {
+ destStop = busStopDao.queryForId("SN121009");
+ } else if (destString.equals("General Hosp")) {
+ destStop = busStopDao.queryForId("SNA19482");
+ } else if (destString.equals("Wessex Lane")) {
+ destStop = busStopDao.queryForId("SNA19780");
+ } else {
+ Log.e(TAG, "Unknown end dest " + destString + " for route " + route.code);
+ }
- bus = busDao.queryForFirst(busPreparedQuery);
+ if (destStop != null) {
- if (bus == null) {
- bus = new Bus(busID, route, dir);
- bus.destination = destStop;
- } else {
- bus.destination = destStop;
- bus.route = route;
- bus.direction = dir;
- }
+ QueryBuilder<RouteStops, Integer> routeStopsQueryBuilder = routeStopsDao.queryBuilder();
+ routeStopsQueryBuilder.where().eq(RouteStops.ROUTE_ID_FIELD_NAME, route.id).and()
+ .eq(RouteStops.STOP_ID_FIELD_NAME, destStop.id);
+ PreparedQuery<RouteStops> routeStopsPreparedQuery = routeStopsQueryBuilder.prepare();
+ List<RouteStops> routeStops = routeStopsDao.query(routeStopsPreparedQuery);
+ if (routeStops.size() > 0) {
+ Log.i(TAG, "Found " + routeStops.size() + " stops matching the destStop " + destStop + " on route "
+ + route.code);
} else {
- bus = new Bus(null, route, dir);
+ Log.w(TAG, "Found " + routeStops.size() + " stops matching the destStop " + destStop + " on route "
+ + route.code);
}
+ }
- busDao.update(bus);
+ Date now = new Date(System.currentTimeMillis());
- stop = new Stop(bus, busStop, calender.getTime(), now);
+ String busID = null;
+ Stop stop;
+ Bus bus;
+ if (stopObj.has("vehicle")) {
+ busID = stopObj.getString("vehicle");
- return stop;
+ QueryBuilder<Bus, Integer> busQueryBuilder = busDao.queryBuilder();
+ busQueryBuilder.where().eq(Bus.ID_FIELD_NAME, busID);
+ PreparedQuery<Bus> busPreparedQuery = busQueryBuilder.prepare();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- Log.e(TAG, "Error parsing stop " + stopObj, e);
- return null;
+ bus = busDao.queryForFirst(busPreparedQuery);
+
+ if (bus == null) {
+ bus = new Bus(busID, route, dir);
+ bus.destination = destStop;
+ busDao.create(bus);
+ } else {
+ bus.destination = destStop;
+ bus.route = route;
+ bus.direction = dir;
+ busDao.update(bus);
+ }
+
+ } else {
+ bus = new Bus(null, route, dir);
+ busDao.create(bus);
}
+ stop = new Stop(bus, busStop, calender.getTime(), now, live);
+
+ return stop;
}
- public static Timetable getTimetable(Context context, String busStop, boolean onlyUniLink) throws SQLException, ClientProtocolException, IOException,
- JSONException {
+ public static Timetable getTimetable(Context context, String busStop, boolean keepUniLink, boolean keepNonUniLink)
+ throws SQLException, ClientProtocolException, IOException, JSONException {
if (helper == null)
helper = OpenHelperManager.getHelper(context, DatabaseHelper.class);
- if (busRoutes == null)
- busRoutes = helper.getBusRouteDao();
+ if (busRouteDao == null)
+ busRouteDao = helper.getBusRouteDao();
if (busStopDao == null)
busStopDao = helper.getBusStopDao();
@@ -561,8 +605,24 @@ public class DataManager {
String file = getFileFromServer(busStopUrl + busStop + ".json");
JSONObject data = new JSONObject(file);
-
JSONArray stopsArray = data.getJSONArray("stops");
+ JSONObject routesObject = data.getJSONObject("routes");
+
+ HashSet<BusRoute> busRoutes = new HashSet<BusRoute>();
+ for (Iterator<String> keyIter = routesObject.keys(); keyIter.hasNext();) {
+ String key = keyIter.next();
+
+ Log.v(TAG, "Route Key: " + key);
+
+ BusRoute route = busRouteDao.queryForId(Integer.parseInt(key.substring(key.length() - 3, key.length())));
+
+ if (route != null) {
+ busRoutes.add(route);
+ } else {
+ throw new RuntimeException("Route not found " + key.substring(key.length() - 3, key.length()) + " "
+ + key);
+ }
+ }
Log.i(TAG, "Number of entries " + data.length());
@@ -571,7 +631,13 @@ public class DataManager {
for (int stopNum = 0; stopNum < stopsArray.length(); stopNum++) {
JSONObject stopObj = stopsArray.getJSONObject(stopNum);
- if (onlyUniLink && !stopObj.getString("name").startsWith("U")) {
+ if (!keepNonUniLink && !stopObj.getString("name").startsWith("U")) {
+ Log.v(TAG, "Skipping non uni-link stop " + stopObj.getString("name"));
+ continue;
+ }
+
+ if (!keepUniLink && stopObj.getString("name").startsWith("U")) {
+ Log.v(TAG, "Skipping uni-link stop " + stopObj.getString("name"));
continue;
}
@@ -580,14 +646,15 @@ public class DataManager {
Log.e(TAG, "BusStopObj == null");
}
- Stop stop = getStop(context, stopObj, busStopObj);
+ Stop stop = getStop(context, stopObj, busRoutes, busStopObj);
if (stop == null) {
Log.w(TAG, "Null stop, skiping");
continue;
}
- Log.i(TAG, "Found stop for a unidentified " + stop.bus.toString() + " at " + stop.busStop.id + " at " + stop.arivalTime);
+ Log.v(TAG, "Found stop for a unidentified " + stop.bus.toString() + " at " + stop.busStop.id + " at "
+ + stop.arivalTime);
timetable.add(stop);
}
@@ -596,6 +663,115 @@ public class DataManager {
return timetable;
}
+ public static Timetable getTimetable(Context context, Bus bus, BusStop startStop, int num) throws SQLException,
+ ClientProtocolException, IOException, JSONException {
+
+ if (helper == null)
+ helper = OpenHelperManager.getHelper(context, DatabaseHelper.class);
+ if (busRouteDao == null)
+ busRouteDao = helper.getBusRouteDao();
+ if (busStopDao == null)
+ busStopDao = helper.getBusStopDao();
+
+ Timetable timetable = new Timetable();
+
+ List<BusStop> busStops = new ArrayList<BusStop>(num);
+ busStops.add(startStop);
+
+ BusRoute route = bus.route;
+
+ for (int i = 0; i < num; i++) {
+ BusStop nextStop = route.moveInRoute(context, busStops.get(i), bus.direction, 1);
+
+ if (nextStop != null) {
+ busStops.add(nextStop);
+ } else {
+ Log.e(TAG, "nextStop is null");
+ }
+ }
+
+ for (BusStop busStop : busStops) {
+
+ String file = getFileFromServer(busStopUrl + busStop.id + ".json");
+
+ JSONObject data = new JSONObject(file);
+ JSONArray stopsArray = data.getJSONArray("stops");
+
+ HashSet<BusRoute> busRoutes = new HashSet<BusRoute>();
+ busRoutes.add(bus.route);
+
+ Log.v(TAG, "Number of entries " + data.length());
+
+ Log.v(TAG, "Stops: " + data.getJSONArray("stops"));
+
+ for (int stopNum = 0; stopNum < stopsArray.length(); stopNum++) {
+ JSONObject stopObj = stopsArray.getJSONObject(stopNum);
+
+ if (stopObj.getString("vehicle").equals(bus.id)) {
+
+ Stop stop = getStop(context, stopObj, busRoutes, busStop);
+
+ if (stop == null) {
+ Log.w(TAG, "Null stop, skiping");
+ continue;
+ }
+
+ Log.v(TAG, "Found stop for a unidentified " + stop.bus.toString() + " at " + stop.busStop.id
+ + " at " + stop.arivalTime);
+
+ timetable.add(stop);
+
+ }
+ }
+ }
+
+ timetable.fetchTime = new Date(System.currentTimeMillis());
+
+ return timetable;
+ }
+
+ public static Stop getStop(Context context, Bus bus, BusStop busStop) throws SQLException, ClientProtocolException,
+ IOException, JSONException {
+
+ if (helper == null)
+ helper = OpenHelperManager.getHelper(context, DatabaseHelper.class);
+ if (busRouteDao == null)
+ busRouteDao = helper.getBusRouteDao();
+ if (busStopDao == null)
+ busStopDao = helper.getBusStopDao();
+
+ String file = getFileFromServer(busStopUrl + busStop.id + ".json");
+
+ JSONObject data = new JSONObject(file);
+ JSONArray stopsArray = data.getJSONArray("stops");
+
+ HashSet<BusRoute> busRoutes = new HashSet<BusRoute>();
+ busRouteDao.refresh(bus.route);
+ busRoutes.add(bus.route);
+
+ Stop stop = null;
+
+ // Log.v(TAG, "Number of entries " + data.length());
+
+ // Log.v(TAG, "Stops: " + data.getJSONArray("stops"));
+
+ for (int stopNum = 0; stopNum < stopsArray.length(); stopNum++) {
+ JSONObject stopObj = stopsArray.getJSONObject(stopNum);
+
+ // Log.v(TAG, "stopObj: " + stopObj);
+ if (stopObj.has("vehicle") && stopObj.getString("vehicle").equals(bus.id)) {
+
+ stop = getStop(context, stopObj, busRoutes, busStop);
+ break;
+
+ // Log.v(TAG, "Found stop for a unidentified " + stop.bus.toString() + " at " + stop.busStop.id + " at "
+ // + stop.arivalTime);
+ }
+ }
+
+ return stop;
+ }
+
static PathOverlay getRoutePath(InputStream routeResource, int colour, ResourceProxy resProxy) {
PathOverlay data = null;
@@ -628,7 +804,7 @@ public class DataManager {
StringBuilder builder = new StringBuilder();
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(request);
- Log.i("Util.getFileFromServer", "Request used: " + request);
+ Log.v("Util.getFileFromServer", "Request used: " + request);
HttpResponse response = client.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
@@ -647,4 +823,66 @@ public class DataManager {
return builder.toString();
}
+
+ public static void routeMovementTest(Context context) throws SQLException {
+
+ Dao<RouteStops, Integer> routeStopsDao = null;
+
+ if (helper == null)
+ helper = OpenHelperManager.getHelper(context, DatabaseHelper.class);
+ if (routeStopsDao == null)
+ routeStopsDao = helper.getRouteStopsDao();
+ if (busRouteDao == null)
+ busRouteDao = helper.getBusRouteDao();
+ if (busStopDao == null)
+ busStopDao = helper.getBusStopDao();
+
+ for (BusRoute busRoute : busRouteDao) {
+ if (!busRoute.code.startsWith("U") || busRoute.code.equals("U9")) {
+ continue;
+ }
+ List<RouteStops> routeStops = routeStopsDao.queryForEq(RouteStops.ROUTE_ID_FIELD_NAME, busRoute.id);
+
+ ArrayList<String> directions = new ArrayList<String>();
+ if (busRoute.forwardDirection != null) {
+ directions.add(busRoute.forwardDirection);
+ }
+ if (busRoute.reverseDirection != null) {
+ directions.add(busRoute.reverseDirection);
+ }
+ if (directions.size() == 0) {
+ directions.add(null);
+ }
+
+ BusStop startBusStop = null;
+
+ for (int moveAmount = 1; moveAmount >= -1; moveAmount = moveAmount - 2) {
+ for (String direction : directions) {
+ for (int busStop = 0; busStop < routeStops.size() && busStop >= 0; busStop = busStop + moveAmount) {
+ // if (routeStops.get(busStop).stop.equals(startBusStop))
+ // continue;
+ startBusStop = routeStops.get(busStop).busStop;
+ busStopDao.refresh(startBusStop);
+
+ BusStop predictedNextStop = busRoute.moveInRoute(context, startBusStop, direction, moveAmount);
+
+ BusStop nextStop;
+ if (busStop == routeStops.size() - 1) {
+ nextStop = routeStops.get(0).busStop;
+ } else {
+ nextStop = routeStops.get(busStop + 1).busStop;
+ }
+ busStopDao.refresh(nextStop);
+
+ if (!nextStop.equals(predictedNextStop) && !startBusStop.equals(nextStop)) {
+ Log.e(TAG, "predicted: " + predictedNextStop + " next: " + nextStop);
+ Log.e(TAG, startBusStop.id + " " + nextStop.id);
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ }
}
diff --git a/src/net/cbaines/suma/DatabaseHelper.java b/src/net/cbaines/suma/DatabaseHelper.java
index a72faca..2d8f9d2 100644
--- a/src/net/cbaines/suma/DatabaseHelper.java
+++ b/src/net/cbaines/suma/DatabaseHelper.java
@@ -40,7 +40,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
private static final String DATABASE_PATH = "/data/data/net.cbaines.suma/databases/";
private static final String DATABASE_NAME = "data.db";
- private static final int DATABASE_VERSION = 38;
+ private static final int DATABASE_VERSION = 39;
private static final String TAG = "DatabaseHelper";
diff --git a/src/net/cbaines/suma/FavouriteDialog.java b/src/net/cbaines/suma/FavouriteDialog.java
deleted file mode 100644
index ca39574..0000000
--- a/src/net/cbaines/suma/FavouriteDialog.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Southampton University Map App
- * Copyright (C) 2011 Christopher Baines
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-package net.cbaines.suma;
-
-import java.sql.SQLException;
-import java.util.ArrayList;
-
-
-import android.app.Dialog;
-import android.content.Context;
-import android.util.Log;
-import android.view.View;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.AdapterView.OnItemLongClickListener;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import com.j256.ormlite.android.apptools.OpenHelperManager;
-import com.j256.ormlite.dao.Dao;
-
-public class FavouriteDialog extends Dialog {
-
- private static final String TAG = "FavouriteDialog";
- private ListView listItems;
-
- private final Context context;
-
- private final TextView message;
-
- protected POIArrayAdapter adapter;
-
- private ArrayList<POI> favouriteItems;
-
- public FavouriteDialog(Context context) {
- super(context);
-
- this.context = context;
-
- setContentView(R.layout.favourite_dialog);
- setTitle("Favourite Items");
-
- message = (TextView) findViewById(R.id.favouriteDialogMessage);
-
- favouriteItems = new ArrayList<POI>();
-
- listItems = (ListView) findViewById(R.id.favouriteListItems);
-
- refresh();
- }
-
- public void refresh() {
-
- DatabaseHelper helper = OpenHelperManager.getHelper(context, DatabaseHelper.class);
-
- try {
-
- Dao<Building, String> buildingDao = helper.getBuildingDao();
- Dao<BusStop, String> busStopDao = helper.getBusStopDao();
-
- final ArrayList<POI> newFavouriteItems = new ArrayList<POI>();
-
- newFavouriteItems.addAll(buildingDao.queryForEq(POI.FAVOURITE_FIELD_NAME, true));
- newFavouriteItems.addAll(busStopDao.queryForEq(POI.FAVOURITE_FIELD_NAME, true));
-
- Log.i(TAG, "There are " + newFavouriteItems.size() + " favourites");
- if (newFavouriteItems.size() == 0) {
- Log.i(TAG, "Favourite dialog has no favourites, displaying message");
- message.post(new Runnable() {
- public void run() {
- message.setText(R.string.favourites_dialog_message);
- message.setVisibility(View.VISIBLE);
- }
- });
- listItems.post(new Runnable() {
- public void run() {
- listItems.setVisibility(View.GONE);
- adapter = null;
- favouriteItems.clear();
- }
- });
-
- } else {
- message.post(new Runnable() {
- public void run() {
- message.setVisibility(View.GONE);
- }
- });
-
- listItems.post(new Runnable() {
- public void run() {
- favouriteItems = newFavouriteItems;
- adapter = new POIArrayAdapter(context, favouriteItems);
-
- listItems.setVisibility(View.VISIBLE);
- listItems.setAdapter(adapter);
-
- }
- });
-
- }
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
-
- void setOnItemClickListener(OnItemClickListener item) {
- listItems.setOnItemClickListener(item);
-
- }
-
- void setOnItemLongClickListener(OnItemLongClickListener item) {
- listItems.setOnItemLongClickListener(item);
- }
-
-}
diff --git a/src/net/cbaines/suma/SouthamptonUniversityMapActivity.java b/src/net/cbaines/suma/MapActivity.java
index 927f41e..cad7567 100644
--- a/src/net/cbaines/suma/SouthamptonUniversityMapActivity.java
+++ b/src/net/cbaines/suma/MapActivity.java
@@ -26,6 +26,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
+import java.util.List;
import org.osmdroid.DefaultResourceProxyImpl;
import org.osmdroid.ResourceProxy;
@@ -41,7 +42,6 @@ import org.osmdroid.views.util.constants.MapViewConstants;
import android.app.AlertDialog;
import android.app.Dialog;
-import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
@@ -53,28 +53,31 @@ import android.graphics.Paint;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
-import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
-import android.widget.BaseExpandableListAdapter;
-import android.widget.CheckBox;
-import android.widget.ExpandableListView;
-import android.widget.ExpandableListView.OnChildClickListener;
-import android.widget.TextView;
+import android.widget.Toast;
import com.j256.ormlite.android.apptools.OrmLiteBaseActivity;
import com.j256.ormlite.dao.Dao;
-public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<DatabaseHelper> implements MapViewConstants, Runnable, RouteColorConstants,
- OnChildClickListener, OnItemClickListener, OnItemLongClickListener, OnSharedPreferenceChangeListener {
+/**
+ *
+ * @author Christopher Baines <cbaines8@gmail.com>
+ *
+ */
+public class MapActivity extends OrmLiteBaseActivity<DatabaseHelper> implements MapViewConstants, Runnable,
+ RouteColorConstants, OnItemClickListener, OnItemLongClickListener, OnSharedPreferenceChangeListener,
+ Preferences {
+ /**
+ * Enable to use the database in the assets folder, if its not enabled, the database is built from the csv files in
+ * the assets folder
+ */
private boolean useBundledDatabase = true;
private MapView mapView;
@@ -85,33 +88,99 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
static final int VIEW_DIALOG_ID = 0;
static final int FAVOURITE_DIALOG_ID = 1;
+ private POIDialog favDialog;
private HashMap<String, Overlay> overlays = new HashMap<String, Overlay>();
private HashMap<String, Overlay> pastOverlays;
- private ScaleBarOverlay scaleBarOverlay;
- private final boolean SCALE_BAR_OVERLAY_ENABLED_BY_DEFAULT = true;
- private MyLocationOverlay myLocationOverlay;
+ // Overlays
+
+ // -- Building Overlays
+ static final String BUILDING_OVERLAYS = "buildingOverlays:";
+
+ // ---- Residential Building Overlay
+ private static final String RESIDENTIAL_BUILDING_OVERLAY = "residentialBuildingOverlay";
private BuildingNumOverlay residentialBuildingOverlay;
- private final boolean NON_RESIDENTIAL_BUILDING_OVERLAY_ENABLED_BY_DEFAULT = true;
+ static final boolean RESIDENTIAL_BUILDING_OVERLAY_ENABLED_BY_DEFAULT = true;
+ private static final int RESIDENTIAL_BUILDING_OVERLAY_RANK = 6;
+
+ // ---- Non-Residential Building Overlay
+ private static final String NON_RESIDENTIAL_BUILDING_OVERLAY = "nonResidentialBuildingOverlay";
private BuildingNumOverlay nonResidentialBuildingOverlay;
- private final boolean RESIDENTIAL_BUILDING_OVERLAY_ENABLED_BY_DEFAULT = true;
- private BusStopOverlay busStopOverlay;
- private final boolean BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT = true;
+ static final boolean NON_RESIDENTIAL_BUILDING_OVERLAY_ENABLED_BY_DEFAULT = true;
+ private static final int NON_RESIDENTIAL_BUILDING_OVERLAY_RANK = 5;
+
+ static final String[] BUILDING_TYPES = { RESIDENTIAL_BUILDING_OVERLAY, NON_RESIDENTIAL_BUILDING_OVERLAY };
+
+ // -- Bus Stop Overlays
+ static final String BUS_STOP_OVERLAYS = "busStopOverlays:";
+
+ // ---- Uni-Link Bus Stop Overlay
+ private static final String UNI_LINK_BUS_STOP_OVERLAY = "uniLinkBusStopOverlay";
+ private BusStopOverlay uniLinkBusStopOverlay;
+ static final boolean UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT = true;
+ private static final int UNI_LINK_BUS_STOP_OVERLAY_RANK = 3;
+
+ // ---- Non Uni-Link Bus Stop Overlay
+ private BusStopOverlay nonUniLinkBusStopOverlay;
+ private static final int NON_UNI_LINK_BUS_STOP_OVERLAY_RANK = 4;
+
+ // -- Site Overlays
+ static final String[] SITE_NAMES = { "Highfield Campus", "Boldrewood Campus", "Avenue Campus",
+ "Winchester School of Art", "The University of Southampton Science Park",
+ "National Oceanography Centre Campus", "Boat House", "Southampton General Hospital",
+ "Royal South Hants Hospital", "Belgrave Industrial Site", "Highfield Hall", "Glen Eyre Hall",
+ "South Hill Hall", "Chamberlain Hall", "Hartley Grove", "Bencraft Hall", "Connaught Hall",
+ "Montefiore Hall", "Stoneham Hall", "Erasmus Park" };
+
+ private static final String SITE_OVERLAYS = "siteOverlays:";
private HashMap<Site, PathOverlay> siteOverlays = new HashMap<Site, PathOverlay>(21);
- private final boolean SITE_OVERLAY_ENABLED_BY_DEFAULT = false;
- private HashMap<BusRoute, PathOverlay> routeOverlays = new HashMap<BusRoute, PathOverlay>(5);
- private final boolean ROUTE_OVERLAY_ENABLED_BY_DEFAULT = true;
+ static final boolean SITE_OVERLAYS_ENABLED_BY_DEFAULT = false;
+ private static final int SITE_OVERLAYS_RANK = 8;
+
+ // -- Route Overlays
+ private static final String BUS_ROUTE_OVERLAYS = "routeOverlays:";
+ private HashMap<BusRoute, PathOverlay> busRouteOverlays = new HashMap<BusRoute, PathOverlay>(5);
+ static final boolean BUS_ROUTE_OVERLAYS_ENABLED_BY_DEFAULT = true;
+ private static final int BUS_ROUTE_OVERLAYS_RANK = 7;
+
+ // -- Other
+ static final String OTHER_OVERLAYS = "otherOverlay:";
+
+ // ---- Scale Bar Overlay
+ private static final String SCALE_BAR_OVERLAY = "scaleBarOverlay";
+ private ScaleBarOverlay scaleBarOverlay;
+ static final boolean SCALE_BAR_OVERLAY_ENABLED_BY_DEFAULT = true;
+ private static final int SCALE_BAR_OVERLAY_RANK = 1;
+
+ // ---- My Location Overlay
+ private static final String MY_LOCATION_OVERLAY = "myLocationOverlay";
+ private static final String MY_LOCATION_OVERLAY_COMPASS = "myLocationOverlayCompass";
+ private MyLocationOverlay myLocationOverlay;
+ static final boolean MY_LOCATION_OVERLAY_ENABLED_BY_DEFAULT = true;
+ static final boolean MY_LOCATION_OVERLAY_COMPASS_ENABLED_BY_DEFAULT = true;
+ private static final int MY_LOCATION_OVERLAY_RANK = 2;
+
+ static final String[] OTHER_OVERLAY_NAMES = { SCALE_BAR_OVERLAY, MY_LOCATION_OVERLAY, MY_LOCATION_OVERLAY_COMPASS };
- private String[] busRoutes;
- private String[] buildingTypes;
- private String[] other;
- private String[] groupHeadings;
- private String[] siteNames;
+ // Other bits
- private FavouriteDialog favDialog;
+ // Uni-Link routes
+ static final String[] UNI_LINK_ROUTES = { "U1", "U1N", "U2", "U6", "U9" };
- private SouthamptonUniversityMapActivity instance;
+ static final String[] PREFERENCES_GROUPS = { BUS_STOP_OVERLAYS, BUS_ROUTE_OVERLAYS, BUILDING_OVERLAYS,
+ SITE_OVERLAYS, OTHER_OVERLAYS };
+
+ static final String[][] PREFERENCES_CHILDREN = { UNI_LINK_ROUTES, UNI_LINK_ROUTES, BUILDING_TYPES, SITE_NAMES,
+ OTHER_OVERLAY_NAMES };
+
+ /**
+ * The toast for this activity, storing the toast centrally allows it to be changed quickly, instead of a queue
+ * building up
+ */
+ Toast activityToast;
+
+ private MapActivity instance;
private static final String TAG = "SUM";
@@ -137,9 +206,13 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
pastOverlays = (HashMap<String, Overlay>) getLastNonConfigurationInstance();
- // SensorManager mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); This code in the following constructor causes problems in
- // some emulators, disable there sensors to fix.
+ /*
+ * SensorManager mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); This code in the
+ * following constructor causes problems in some emulators, disable sensors to fix.
+ */
+ Log.i(TAG, "Starting creating myLocationOverlay");
myLocationOverlay = new MyLocationOverlay(instance, mapView);
+ Log.i(TAG, "Finished creating myLocationOverlay");
while (databaseThread.isAlive()) {
Thread.yield();
@@ -161,12 +234,26 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
mapController = mapView.getController();
mResourceProxy = new DefaultResourceProxyImpl(getApplicationContext());
- GeoPoint userLocation = myLocationOverlay.getMyLocation();
- if (userLocation == null) {
- userLocation = new GeoPoint(50935551, -1393488); // ECS
+ GeoPoint userLocation = null;
+
+ Bundle extras = getIntent().getExtras();
+ if (extras != null && extras.containsKey("poiPoint")) {
+ String poiPoint = getIntent().getExtras().getString("poiPoint");
+ Log.i(TAG, "poiPoint " + poiPoint);
+
+ String[] bits = poiPoint.split(",");
+
+ userLocation = new GeoPoint(Double.valueOf(bits[0]), Double.valueOf(bits[1]));
+ mapController.setZoom(20);
+
+ } else {
+ userLocation = myLocationOverlay.getMyLocation();
+ if (userLocation == null) {
+ userLocation = new GeoPoint(50935551, -1393488); // ECS
+ }
+ mapController.setZoom(15);
}
- mapController.setZoom(15);
mapController.setCenter(userLocation);
Log.i(TAG, "Finished onCreate " + (System.currentTimeMillis() - startTime));
@@ -179,26 +266,19 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
final SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
final SharedPreferences activityPrefs = getPreferences(0);
- if (activityPrefs.getBoolean("Other:Compass", false)) {
+ if (activityPrefs.getBoolean(OTHER_OVERLAYS + MY_LOCATION_OVERLAY_COMPASS, false)) {
myLocationOverlay.enableCompass();
} else {
myLocationOverlay.disableCompass();
}
- if (activityPrefs.getBoolean("Other:My Location", false) && sharedPrefs.getBoolean("GPSEnabled", false)) {
+ if (activityPrefs.getBoolean(OTHER_OVERLAYS + MY_LOCATION_OVERLAY, false)
+ && sharedPrefs.getBoolean(GPS_ENABLED, false)) {
myLocationOverlay.enableMyLocation();
} else {
myLocationOverlay.disableMyLocation();
}
- if (!sharedPrefs.contains("GPSEnabled")) {
- sharedPrefs.edit().putBoolean("GPSEnabled", true).commit();
- }
-
- if (!sharedPrefs.contains("liveBusTimesEnabled")) {
- sharedPrefs.edit().putBoolean("liveBusTimesEnabled", true).commit();
- }
-
sharedPrefs.registerOnSharedPreferenceChangeListener(this);
activityPrefs.registerOnSharedPreferenceChangeListener(this);
}
@@ -241,7 +321,7 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
// of your application so we are gonna be able to overwrite that database with our database.
Log.i(TAG, "GetReadableDatabase");
helper.getWritableDatabase().close();
-
+
helper.copyDataBase();
Log.i(TAG, "Out of copy database");
} catch (IOException ioe) {
@@ -327,7 +407,8 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
}
while (true) {
- if ((buildingThread == null || !buildingThread.isAlive()) && (busStopThread == null || !busStopThread.isAlive())
+ if ((buildingThread == null || !buildingThread.isAlive())
+ && (busStopThread == null || !busStopThread.isAlive())
&& (siteThread == null || !siteThread.isAlive()))
break;
@@ -345,30 +426,6 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
Log.i(TAG, "Begining setting up the static values " + (System.currentTimeMillis() - startTime));
- int size;
- try {
- size = (int) getHelper().getSiteDao().countOf();
-
- ArrayList<Site> sites = new ArrayList<Site>(size);
-
- try {
- sites.addAll(getHelper().getSiteDao().queryForAll());
- } catch (SQLException e) {
- e.printStackTrace();
- }
- siteNames = new String[size];
- for (int i = 0; i < size; i++) {
- siteNames[i] = sites.get(i).name;
- }
- } catch (SQLException e1) {
- e1.printStackTrace();
- }
-
- busRoutes = getResources().getStringArray(R.array.uniLinkBusRoutes);
- buildingTypes = getResources().getStringArray(R.array.buildingTypes);
- other = getResources().getStringArray(R.array.utilityOverlays);
- groupHeadings = getResources().getStringArray(R.array.preferencesHeadings);
-
Log.i(TAG, "Finished the database thread " + (System.currentTimeMillis() - startTime));
}
@@ -385,23 +442,25 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
showUtilityOverlays();
- for (int i = 0; i < busRoutes.length; i++) {
- if (activityPrefs.getBoolean(groupHeadings[1] + ":" + busRoutes[i], true)) {
- showBusStopOverlay();
- break;
- }
- }
+ showUniLinkBusStopOverlay();
- if (activityPrefs.getBoolean("Buildings:Residential", true) || activityPrefs.getBoolean("Buildings:Non-Residential", true)) {
- // The argument currently dosent matter for this method.
- showBuildingOverlay(true);
+ showNonUniLinkBusStopOverlay();
+ if (activityPrefs.getBoolean(BUILDING_OVERLAYS + RESIDENTIAL_BUILDING_OVERLAY,
+ RESIDENTIAL_BUILDING_OVERLAY_ENABLED_BY_DEFAULT)
+ || activityPrefs.getBoolean(BUILDING_OVERLAYS + NON_RESIDENTIAL_BUILDING_OVERLAY,
+ NON_RESIDENTIAL_BUILDING_OVERLAY_ENABLED_BY_DEFAULT)) {
+ showBuildingOverlays();
}
Log.i(TAG, "Begining to show the route overlays at " + (System.currentTimeMillis() - startTime));
for (BusRoute busRoute : getHelper().getBusRouteDao()) {
+ if (!busRoute.uniLink) {
+ Log.v(TAG, "Bus route " + busRoute.code + "(" + busRoute.id + ") is not unilink");
+ continue;
+ }
Log.v(TAG, "Looking at showing " + busRoute.code + " route overlay");
- if (activityPrefs.getBoolean("Bus Routes:" + busRoute.code, ROUTE_OVERLAY_ENABLED_BY_DEFAULT)) {
+ if (activityPrefs.getBoolean(BUS_ROUTE_OVERLAYS + busRoute.code, BUS_ROUTE_OVERLAYS_ENABLED_BY_DEFAULT)) {
showRouteOverlay(busRoute);
}
}
@@ -411,7 +470,7 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
try {
for (Site site : getHelper().getSiteDao()) {
Log.v(TAG, "Looking at showing " + site.name + " site overlay");
- if (activityPrefs.getBoolean("Sites:" + site.name, SITE_OVERLAY_ENABLED_BY_DEFAULT)) {
+ if (activityPrefs.getBoolean(SITE_OVERLAYS + site.name, SITE_OVERLAYS_ENABLED_BY_DEFAULT)) {
showSiteOverlay(site);
}
}
@@ -434,13 +493,14 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
if (scaleBarOverlay != null) {
Log.v(TAG, "ScaleBarOverlay is already created");
} else {
- if (pastOverlays != null && (scaleBarOverlay = (ScaleBarOverlay) pastOverlays.get("Other:Scale Bar")) != null) {
+ if (pastOverlays != null
+ && (scaleBarOverlay = (ScaleBarOverlay) pastOverlays.get(SCALE_BAR_OVERLAY)) != null) {
Log.i(TAG, "Finished restoring utility overlays " + (System.currentTimeMillis() - startTime));
} else {
scaleBarOverlay = new ScaleBarOverlay(instance);
}
- overlays.put("Other:Scale Bar", scaleBarOverlay);
+ overlays.put(SCALE_BAR_OVERLAY, scaleBarOverlay);
synchronized (mapView.getOverlays()) {
mapView.getOverlays().add(scaleBarOverlay);
@@ -450,7 +510,8 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
}
- scaleBarOverlay.setEnabled(activityPrefs.getBoolean("Other:Scale Bar", SCALE_BAR_OVERLAY_ENABLED_BY_DEFAULT));
+ scaleBarOverlay.setEnabled(activityPrefs.getBoolean(OTHER_OVERLAYS + SCALE_BAR_OVERLAY,
+ SCALE_BAR_OVERLAY_ENABLED_BY_DEFAULT));
mapView.postInvalidate();
@@ -462,20 +523,22 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
private void showRouteOverlay(final BusRoute route) {
new Thread(new Runnable() {
public void run() {
- Log.i(TAG, "Begining showing route " + route.code + " overlay at " + (System.currentTimeMillis() - startTime));
+ Log.i(TAG, "Begining showing route " + route.code + " overlay at "
+ + (System.currentTimeMillis() - startTime));
final SharedPreferences activityPrefs = getPreferences(0);
final OverlayRankComparator comparator = new OverlayRankComparator(getPreferences(0));
PathOverlay routeOverlay;
- if ((routeOverlay = routeOverlays.get(route)) != null) {
+ if ((routeOverlay = busRouteOverlays.get(route)) != null) {
Log.v(TAG, route.code + " route overlay already existed");
} else {
- if (pastOverlays != null && (routeOverlay = (PathOverlay) pastOverlays.get("Bus Routes:" + route.code)) != null) {
+ if (pastOverlays != null
+ && (routeOverlay = (PathOverlay) pastOverlays.get(BUS_ROUTE_OVERLAYS + route.code)) != null) {
Log.v(TAG, "Restored " + route.code + " route overlay");
if (route.code.equals("U1")) {
- PathOverlay routeOverlayU1E = (PathOverlay) pastOverlays.get("Bus Routes:U1E");
- overlays.put("Bus Routes:U1E", routeOverlayU1E);
+ PathOverlay routeOverlayU1E = (PathOverlay) pastOverlays.get(BUS_ROUTE_OVERLAYS + "U1E");
+ overlays.put(BUS_ROUTE_OVERLAYS + "U1E", routeOverlayU1E);
}
} else {
InputStream resource = null;
@@ -485,15 +548,16 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
colour = U1;
// TODO Is this a route like U1N or, something else, this hack works somewhat for now?
- PathOverlay routeOverlayU1E = DataManager.getRoutePath(getResources().openRawResource(R.raw.u1e), colour, mResourceProxy);
+ PathOverlay routeOverlayU1E = DataManager.getRoutePath(
+ getResources().openRawResource(R.raw.u1e), colour, mResourceProxy);
routeOverlayU1E.getPaint().setAntiAlias(true);
routeOverlayU1E.getPaint().setAlpha(145);
routeOverlayU1E.getPaint().setStrokeWidth(12);
routeOverlayU1E.getPaint().setPathEffect(new DashPathEffect(new float[] { 20, 16 }, 0));
routeOverlayU1E.setEnabled(activityPrefs.getBoolean("Bus Routes:" + route.code, true));
- routeOverlays.put(new BusRoute(1000, "U1E", "U1e Route Label"), routeOverlayU1E);
- overlays.put("Bus Routes:" + route.code + "E", routeOverlayU1E);
+ busRouteOverlays.put(new BusRoute(1000, "U1E", "U1E Route Label", true), routeOverlayU1E);
+ overlays.put(BUS_ROUTE_OVERLAYS + route.code + "E", routeOverlayU1E);
} else if (route.code.equals("U1N")) {
resource = getResources().openRawResource(R.raw.u1n);
colour = U1N;
@@ -519,8 +583,8 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
routeOverlay.getPaint().setStrokeWidth(12);
}
- routeOverlays.put(route, routeOverlay);
- overlays.put("Bus Routes:" + route.code, routeOverlay);
+ busRouteOverlays.put(route, routeOverlay);
+ overlays.put(BUS_ROUTE_OVERLAYS + route.code, routeOverlay);
synchronized (mapView.getOverlays()) {
mapView.getOverlays().add(routeOverlay);
@@ -529,14 +593,17 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
}
- routeOverlay.setEnabled(activityPrefs.getBoolean("Bus Routes:" + route.code, ROUTE_OVERLAY_ENABLED_BY_DEFAULT));
+ routeOverlay.setEnabled(activityPrefs.getBoolean(BUS_ROUTE_OVERLAYS + route.code,
+ BUS_ROUTE_OVERLAYS_ENABLED_BY_DEFAULT));
if (route.code.equals("U1")) {
- overlays.get("Bus Routes:U1E").setEnabled(activityPrefs.getBoolean("Bus Routes:U1", ROUTE_OVERLAY_ENABLED_BY_DEFAULT));
+ overlays.get(BUS_ROUTE_OVERLAYS + "U1E").setEnabled(
+ activityPrefs.getBoolean(BUS_ROUTE_OVERLAYS + "U1", BUS_ROUTE_OVERLAYS_ENABLED_BY_DEFAULT));
}
mapView.postInvalidate();
- Log.i(TAG, "Finished showing route " + route.code + " overlay at " + (System.currentTimeMillis() - startTime));
+ Log.i(TAG, "Finished showing route " + route.code + " overlay at "
+ + (System.currentTimeMillis() - startTime));
}
}).start();
}
@@ -545,7 +612,8 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
new Thread(new Runnable() {
public void run() {
- Log.i(TAG, "Begining showing site " + site.name + " overlay at " + (System.currentTimeMillis() - startTime));
+ Log.i(TAG, "Begining showing site " + site.name + " overlay at "
+ + (System.currentTimeMillis() - startTime));
final SharedPreferences activityPrefs = getPreferences(0);
final OverlayRankComparator comparator = new OverlayRankComparator(getPreferences(0));
@@ -554,7 +622,8 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
if ((siteOverlay = siteOverlays.get(site)) != null) {
} else {
- if (pastOverlays != null && (siteOverlay = (PathOverlay) pastOverlays.get("Site Outlines:" + site.name)) != null) {
+ if (pastOverlays != null
+ && (siteOverlay = (PathOverlay) pastOverlays.get(SITE_OVERLAYS + site.name)) != null) {
Log.i(TAG, "Restored " + site.name + " site overlay");
} else {
@@ -570,7 +639,7 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
}
siteOverlays.put(site, siteOverlay);
- overlays.put("Site Outlines:" + site.name, siteOverlay);
+ overlays.put(SITE_OVERLAYS + site.name, siteOverlay);
Log.v(TAG, "Applyed the site overlay, now sorting them");
@@ -580,16 +649,18 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
}
}
- siteOverlay.setEnabled(activityPrefs.getBoolean("Site Outlines:" + site.name, SITE_OVERLAY_ENABLED_BY_DEFAULT));
+ siteOverlay.setEnabled(activityPrefs.getBoolean(SITE_OVERLAYS + site.name,
+ SITE_OVERLAYS_ENABLED_BY_DEFAULT));
mapView.postInvalidate();
- Log.i(TAG, "Finished showing site " + site.name + " overlay at " + (System.currentTimeMillis() - startTime));
+ Log.i(TAG, "Finished showing site " + site.name + " overlay at "
+ + (System.currentTimeMillis() - startTime));
}
}).start();
}
- private void showBuildingOverlay(boolean residential) {
+ private void showBuildingOverlays() {
new Thread(new Runnable() {
public void run() {
Log.i(TAG, "Begining showing building overlays at " + (System.currentTimeMillis() - startTime));
@@ -600,8 +671,11 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
if (residentialBuildingOverlay != null) {
} else {
- if (pastOverlays != null && (residentialBuildingOverlay = (BuildingNumOverlay) pastOverlays.get("Buildings:Residential")) != null) {
- nonResidentialBuildingOverlay = (BuildingNumOverlay) pastOverlays.get("Buildings:Non-Residential");
+ if (pastOverlays != null
+ && (residentialBuildingOverlay = (BuildingNumOverlay) pastOverlays
+ .get(RESIDENTIAL_BUILDING_OVERLAY)) != null) {
+ nonResidentialBuildingOverlay = (BuildingNumOverlay) pastOverlays
+ .get(NON_RESIDENTIAL_BUILDING_OVERLAY);
Log.i(TAG, "Restored building overlays");
} else {
@@ -617,22 +691,16 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
buildingDao = getHelper().getBuildingDao();
for (Building building : buildingDao) {
- // Log.v(TAG, "Looking at building " + building.id);
if (building.residential == true) {
- // Log.v(TAG, "Its residential");
if (building.favourite) {
- // Log.v(TAG, "Its residential and a favourite");
residentialBuildings.add(building);
} else {
- // Log.v(TAG, "Its residential and not a favourite");
residentialBuildings.add(0, building);
}
} else {
if (building.favourite) {
- // Log.v(TAG, "Its not residential and a favourite");
nonResidentialBuildings.add(building);
} else {
- // Log.v(TAG, "Its not residential and not a favourite");
nonResidentialBuildings.add(0, building);
}
}
@@ -648,8 +716,8 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
}
}
- overlays.put("Buildings:Residential", residentialBuildingOverlay);
- overlays.put("Buildings:Non-Residential", nonResidentialBuildingOverlay);
+ overlays.put(RESIDENTIAL_BUILDING_OVERLAY, residentialBuildingOverlay);
+ overlays.put(NON_RESIDENTIAL_BUILDING_OVERLAY, nonResidentialBuildingOverlay);
synchronized (mapView.getOverlays()) {
mapView.getOverlays().add(residentialBuildingOverlay);
@@ -658,9 +726,10 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
}
}
- residentialBuildingOverlay.setEnabled(activityPrefs.getBoolean("Buildings:Residential", RESIDENTIAL_BUILDING_OVERLAY_ENABLED_BY_DEFAULT));
- nonResidentialBuildingOverlay.setEnabled(activityPrefs.getBoolean("Buildings:Non-Residential",
- NON_RESIDENTIAL_BUILDING_OVERLAY_ENABLED_BY_DEFAULT));
+ residentialBuildingOverlay.setEnabled(activityPrefs.getBoolean(BUILDING_OVERLAYS
+ + RESIDENTIAL_BUILDING_OVERLAY, RESIDENTIAL_BUILDING_OVERLAY_ENABLED_BY_DEFAULT));
+ nonResidentialBuildingOverlay.setEnabled(activityPrefs.getBoolean(BUILDING_OVERLAYS
+ + NON_RESIDENTIAL_BUILDING_OVERLAY, NON_RESIDENTIAL_BUILDING_OVERLAY_ENABLED_BY_DEFAULT));
mapView.postInvalidate();
@@ -669,7 +738,7 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
}).start();
}
- private void showBusStopOverlay() {
+ private void showUniLinkBusStopOverlay() {
new Thread(new Runnable() {
public void run() {
Log.i(TAG, "Begining showing bus stop overlays at " + (System.currentTimeMillis() - startTime));
@@ -677,38 +746,158 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
final SharedPreferences activityPrefs = getPreferences(0);
final OverlayRankComparator comparator = new OverlayRankComparator(getPreferences(0));
- if (busStopOverlay != null) {
+ if (uniLinkBusStopOverlay != null) {
+ if (!activityPrefs.getBoolean(BUS_STOP_OVERLAYS + "U1",
+ UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT)
+ && !activityPrefs.getBoolean(BUS_STOP_OVERLAYS + "U1N",
+ UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT)
+ && !activityPrefs.getBoolean(BUS_STOP_OVERLAYS + "U2",
+ UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT)
+ && !activityPrefs.getBoolean(BUS_STOP_OVERLAYS + "U6",
+ UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT)
+ && !activityPrefs.getBoolean(BUS_STOP_OVERLAYS + "U9",
+ UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT)) {
+ Log.i(TAG, "Uni-Link bus stop overlay not needed");
+ overlays.remove(UNI_LINK_BUS_STOP_OVERLAY);
+
+ synchronized (mapView.getOverlays()) {
+ mapView.getOverlays().remove(uniLinkBusStopOverlay);
+ Collections.sort(mapView.getOverlays(), comparator);
+ }
+ uniLinkBusStopOverlay = null;
+ } else {
+ uniLinkBusStopOverlay.setRoutes(0, activityPrefs.getBoolean(BUS_STOP_OVERLAYS + "U1",
+ UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT));
+ uniLinkBusStopOverlay.setRoutes(1, activityPrefs.getBoolean(BUS_STOP_OVERLAYS + "U1N",
+ UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT));
+ uniLinkBusStopOverlay.setRoutes(2, activityPrefs.getBoolean(BUS_STOP_OVERLAYS + "U2",
+ UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT));
+ uniLinkBusStopOverlay.setRoutes(3, activityPrefs.getBoolean(BUS_STOP_OVERLAYS + "U6",
+ UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT));
+ uniLinkBusStopOverlay.setRoutes(4, activityPrefs.getBoolean(BUS_STOP_OVERLAYS + "U9",
+ UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT));
+ }
} else {
- if (pastOverlays != null && (busStopOverlay = (BusStopOverlay) pastOverlays.get("BusStops")) != null) {
- Log.i(TAG, "Restored bus stop overlays");
+ if (activityPrefs
+ .getBoolean(BUS_STOP_OVERLAYS + "U1", UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT)
+ || activityPrefs.getBoolean(BUS_STOP_OVERLAYS + "U1N",
+ UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT)
+ || activityPrefs.getBoolean(BUS_STOP_OVERLAYS + "U2",
+ UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT)
+ || activityPrefs.getBoolean(BUS_STOP_OVERLAYS + "U6",
+ UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT)
+ || activityPrefs.getBoolean(BUS_STOP_OVERLAYS + "U9",
+ UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT)) {
+ if (pastOverlays != null
+ && (uniLinkBusStopOverlay = (BusStopOverlay) pastOverlays
+ .get(UNI_LINK_BUS_STOP_OVERLAY)) != null) {
+ Log.i(TAG, "Restored Uni-Link bus stop overlay");
+ } else {
+
+ try {
+ List<BusStop> busStops;
+ Log.v(TAG, "Begin fetching BusStops at " + (System.currentTimeMillis() - startTime));
+
+ busStops = getHelper().getBusStopDao().queryForEq(BusStop.UNI_LINK_FIELD_NAME, true);
+
+ Log.v(TAG, "Finished fetching BusStops at " + (System.currentTimeMillis() - startTime));
+
+ uniLinkBusStopOverlay = new BusStopOverlay(instance, busStops);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ uniLinkBusStopOverlay.setRoutes(0, activityPrefs.getBoolean(BUS_STOP_OVERLAYS + "U1",
+ UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT));
+ uniLinkBusStopOverlay.setRoutes(1, activityPrefs.getBoolean(BUS_STOP_OVERLAYS + "U1N",
+ UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT));
+ uniLinkBusStopOverlay.setRoutes(2, activityPrefs.getBoolean(BUS_STOP_OVERLAYS + "U2",
+ UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT));
+ uniLinkBusStopOverlay.setRoutes(3, activityPrefs.getBoolean(BUS_STOP_OVERLAYS + "U6",
+ UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT));
+ uniLinkBusStopOverlay.setRoutes(4, activityPrefs.getBoolean(BUS_STOP_OVERLAYS + "U9",
+ UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT));
+
+ overlays.put(UNI_LINK_BUS_STOP_OVERLAY, uniLinkBusStopOverlay);
+
+ Log.v(TAG, "Applyed the site overlay, now sorting them");
+
+ synchronized (mapView.getOverlays()) {
+ mapView.getOverlays().add(uniLinkBusStopOverlay);
+ Collections.sort(mapView.getOverlays(), comparator);
+ }
+ }
+ }
+
+ mapView.postInvalidate();
+
+ Log.i(TAG, "Finished showing bus stop overlays at " + (System.currentTimeMillis() - startTime));
+ }
+ }).start();
+ }
+
+ private void showNonUniLinkBusStopOverlay() {
+ new Thread(new Runnable() {
+ public void run() {
+ Log.i(TAG, "Begining showing non uni link bus stop overlays at "
+ + (System.currentTimeMillis() - startTime));
+
+ // final SharedPreferences activityPrefs = getPreferences(0);
+ final SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(instance);
+ final OverlayRankComparator comparator = new OverlayRankComparator(getPreferences(0));
+
+ if (nonUniLinkBusStopOverlay != null) {
+ nonUniLinkBusStopOverlay.setEnabled(sharedPrefs.getBoolean(NON_UNI_LINK_BUS_STOPS_OVERLAY,
+ NON_UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT));
+
+ Log.i(TAG,
+ "nonUniLinkBusStopOverlay enabled ? "
+ + sharedPrefs.getBoolean(NON_UNI_LINK_BUS_STOPS_OVERLAY,
+ NON_UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT));
+ } else if (sharedPrefs.getBoolean(NON_UNI_LINK_BUS_STOPS_OVERLAY,
+ NON_UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT)) {
+ if (pastOverlays != null
+ && (nonUniLinkBusStopOverlay = (BusStopOverlay) pastOverlays
+ .get(NON_UNI_LINK_BUS_STOPS_OVERLAY)) != null) {
+ Log.i(TAG, "Restored non Uni-Link bus stop overlays");
} else {
try {
- busStopOverlay = new BusStopOverlay(instance);
+ List<BusStop> busStops;
+ Log.v(TAG, "Begin fetching non Uni-Link BusStops at "
+ + (System.currentTimeMillis() - startTime));
+
+ busStops = getHelper().getBusStopDao().queryForEq(BusStop.UNI_LINK_FIELD_NAME, false);
+
+ Log.v(TAG,
+ "Finished fetching " + busStops.size() + " non Uni-Link BusStops at "
+ + (System.currentTimeMillis() - startTime));
+
+ nonUniLinkBusStopOverlay = new BusStopOverlay(instance, busStops);
} catch (SQLException e) {
e.printStackTrace();
}
}
- overlays.put("BusStops", busStopOverlay);
+ overlays.put(NON_UNI_LINK_BUS_STOPS_OVERLAY, nonUniLinkBusStopOverlay);
Log.v(TAG, "Applyed the site overlay, now sorting them");
synchronized (mapView.getOverlays()) {
- mapView.getOverlays().add(busStopOverlay);
+ mapView.getOverlays().add(nonUniLinkBusStopOverlay);
Collections.sort(mapView.getOverlays(), comparator);
}
}
- busStopOverlay.setRoutes(0, activityPrefs.getBoolean("Bus Stops:U1", BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT));
- busStopOverlay.setRoutes(1, activityPrefs.getBoolean("Bus Stops:U1N", BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT));
- busStopOverlay.setRoutes(2, activityPrefs.getBoolean("Bus Stops:U2", BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT));
- busStopOverlay.setRoutes(3, activityPrefs.getBoolean("Bus Stops:U6", BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT));
- busStopOverlay.setRoutes(4, activityPrefs.getBoolean("Bus Stops:U9", BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT));
+ if (nonUniLinkBusStopOverlay != null) {
+
+ }
mapView.postInvalidate();
- Log.i(TAG, "Finished showing bus stop overlays at " + (System.currentTimeMillis() - startTime));
+ Log.i(TAG, "Finished showing non Uni-Link bus stop overlays at "
+ + (System.currentTimeMillis() - startTime));
}
}).start();
}
@@ -725,7 +914,7 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
// Handle item selection
switch (item.getItemId()) {
case R.id.menu_find:
- Intent i = new Intent(SouthamptonUniversityMapActivity.this, FindActivity.class);
+ Intent i = new Intent(MapActivity.this, FindActivity.class);
startActivityForResult(i, 0);
return true;
case R.id.menu_preferences:
@@ -759,8 +948,9 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
};
AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setMessage("GPS is not enabled, do you wish to enable it?").setPositiveButton("Yes", dialogClickListener)
- .setNegativeButton("No", dialogClickListener).show();
+ builder.setMessage("GPS is not enabled, do you wish to enable it?")
+ .setPositiveButton("Yes", dialogClickListener).setNegativeButton("No", dialogClickListener)
+ .show();
}
return true;
@@ -770,17 +960,18 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
return false;
case R.id.menu_favourites:
Log.i(TAG, "Showing favourite dialog");
- boolean refreshNeeded = favDialog != null;
+
showDialog(FAVOURITE_DIALOG_ID);
- if (favDialog != null) {
- if (refreshNeeded)
- favDialog.refresh();
- } else {
+ if (favDialog == null) {
Log.e(TAG, "Very wierd, just tried to launch the favourite's dialog, but its null?");
+ return false;
}
+
+ refreshFavouriteDialog();
+
return false;
case R.id.menu_about:
- Intent aboutIntent = new Intent(SouthamptonUniversityMapActivity.this, AboutActivity.class);
+ Intent aboutIntent = new Intent(MapActivity.this, AboutActivity.class);
startActivityForResult(aboutIntent, 0);
return true;
default:
@@ -789,9 +980,33 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
}
}
+ private void refreshFavouriteDialog() {
+ ArrayList<POI> newFavouriteItems = new ArrayList<POI>();
+
+ try {
+ Dao<Building, String> buildingDao = getHelper().getBuildingDao();
+ Dao<BusStop, String> busStopDao = getHelper().getBusStopDao();
+
+ newFavouriteItems.addAll(buildingDao.queryForEq(POI.FAVOURITE_FIELD_NAME, true));
+ newFavouriteItems.addAll(busStopDao.queryForEq(POI.FAVOURITE_FIELD_NAME, true));
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+
+ Log.i(TAG, "There are " + newFavouriteItems.size() + " favourites");
+ if (newFavouriteItems.size() == 0) {
+ Log.i(TAG, "Favourite dialog has no favourites, displaying message");
+ favDialog.setMessage(getResources().getString(R.string.favourites_dialog_message));
+ favDialog.setItems(null);
+ } else {
+ favDialog.setMessage("");
+ favDialog.setItems(newFavouriteItems);
+ }
+ }
+
@Override
public boolean onSearchRequested() {
- Intent i = new Intent(SouthamptonUniversityMapActivity.this, FindActivity.class);
+ Intent i = new Intent(MapActivity.this, FindActivity.class);
startActivityForResult(i, 0);
return false;
}
@@ -842,44 +1057,47 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
Log.v(TAG, "Got a busStop id back from the BusTimeActivity " + busStopID);
BusStop busStop = getHelper().getBusStopDao().queryForId(busStopID);
- busStopOverlay.refresh(busStop); // This does not invalidate the map, but it seems to make the changes appear
+ if (busStop.uniLink) {
+ uniLinkBusStopOverlay.refresh(busStop); // This does not invalidate the map, but it seems to
+ // make the changes appear
+ } else {
+ nonUniLinkBusStopOverlay.refresh(busStop); // This does not invalidate the map, but it seems
+ // to
+ // make the changes appear
+ }
}
} catch (SQLException e) {
e.printStackTrace();
}
if (favDialog != null) {
- favDialog.refresh();
+ refreshFavouriteDialog();
}
}
}
}
- public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
-
- mapView.post(new Runnable() {
- public void run() {
- // updateEnabledOverlays(); TODO Fix whatever this did?
- mapView.invalidate();
- }
- });
-
- return true;
- }
+ /*
+ * public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
+ *
+ * mapView.post(new Runnable() { public void run() { // updateEnabledOverlays(); TODO Fix whatever this did?
+ * mapView.invalidate(); } });
+ *
+ * return true; }
+ */
protected Dialog onCreateDialog(int id) {
switch (id) {
case VIEW_DIALOG_ID:
ViewDialog viewDialog = new ViewDialog(instance);
- viewDialog.setOnItemClickListener(this);
return viewDialog;
case FAVOURITE_DIALOG_ID:
- favDialog = new FavouriteDialog(instance);
+ favDialog = new POIDialog(instance);
favDialog.setOnItemClickListener(this);
favDialog.setOnItemLongClickListener(this);
+ favDialog.setTitle(R.string.favourites_dialog_title);
return favDialog;
-
}
return null;
}
@@ -985,32 +1203,35 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
}
private class OverlayRankComparator implements Comparator<Overlay> {
- private final SharedPreferences prefs;
+ // private final SharedPreferences prefs;
OverlayRankComparator(SharedPreferences prefs) {
- this.prefs = prefs;
+ // this.prefs = prefs;
}
public int compare(Overlay arg0, Overlay arg1) {
return getRank(arg1) - getRank(arg0);
}
- private final int getRank(Overlay arg0) { // TODO: Dont hardcode the rank values
- if (arg0 == scaleBarOverlay) {
- return prefs.getInt("mScaleBarOverlay", 1);
- } else if (arg0 == myLocationOverlay) {
- return prefs.getInt("myLocationOverlay", 0);
- } else if (arg0 == busStopOverlay) {
- return prefs.getInt("busStopOverlay", 2);
- } else if (arg0 == residentialBuildingOverlay) {
- return prefs.getInt("residentialBuildingOverlay", 4);
- } else if (arg0 == nonResidentialBuildingOverlay) {
- return prefs.getInt("nonResidentialBuildingOverlay", 3);
- } else if (siteOverlays != null && siteOverlays.values().contains(arg0)) {
- return prefs.getInt("siteOverlays", 6);
- } else if (routeOverlays != null && routeOverlays.values().contains(arg0)) {
- return prefs.getInt("routeOverlays", 5);
+ private final int getRank(Overlay overlay) { // TODO: Dont hardcode the rank values
+ if (overlay == scaleBarOverlay) {
+ return SCALE_BAR_OVERLAY_RANK;
+ } else if (overlay == myLocationOverlay) {
+ return MY_LOCATION_OVERLAY_RANK;
+ } else if (overlay == uniLinkBusStopOverlay) {
+ return UNI_LINK_BUS_STOP_OVERLAY_RANK;
+ } else if (overlay == nonUniLinkBusStopOverlay) {
+ return NON_UNI_LINK_BUS_STOP_OVERLAY_RANK;
+ } else if (overlay.equals(residentialBuildingOverlay)) {
+ return RESIDENTIAL_BUILDING_OVERLAY_RANK;
+ } else if (overlay.equals(nonResidentialBuildingOverlay)) {
+ return NON_RESIDENTIAL_BUILDING_OVERLAY_RANK;
+ } else if (siteOverlays != null && siteOverlays.values().contains(overlay)) {
+ return SITE_OVERLAYS_RANK;
+ } else if (busRouteOverlays != null && busRouteOverlays.values().contains(overlay)) {
+ return BUS_ROUTE_OVERLAYS_RANK;
} else {
+ Log.e(TAG, "Trying to rank unknown overlay " + overlay);
return -1;
}
}
@@ -1022,7 +1243,8 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
Log.v(TAG, "Got shared prefs changed event for key " + key);
- if (key.equals("GPSEnabled")) {
+ // Shared Preferences
+ if (key.equals(GPS_ENABLED)) {
final SharedPreferences activityPrefs = getPreferences(0);
if (activityPrefs.getBoolean("Other:Compass", false) && prefs.getBoolean("GPSEnabled", false)) {
@@ -1030,52 +1252,53 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
} else {
myLocationOverlay.disableMyLocation();
}
- } else if (key.equals("liveBusTimesEnabled")) {
+ } else if (key.equals(NON_UNI_LINK_BUS_TIMES)) {
+ // Noting to do here atm
+ } else if (key.equals(UNI_LINK_BUS_TIMES)) {
// Noting to do here atm
- } else if (key.contains("Bus Stops")) {
- showBusStopOverlay();
- } else if (key.contains("Bus Routes")) {
+ } else if (key.startsWith(BUS_STOP_OVERLAYS)) {
+ showUniLinkBusStopOverlay();
+ } else if (key.equals(NON_UNI_LINK_BUS_STOPS_OVERLAY)) {
+ showNonUniLinkBusStopOverlay();
+ } else if (key.startsWith(BUS_ROUTE_OVERLAYS)) {
try {
+ String routeName = key.substring(BUS_ROUTE_OVERLAYS.length(), key.length());
for (BusRoute route : getHelper().getBusRouteDao()) {
- Log.v(TAG, route.code + " " + key.split(":")[1]);
- if (route.code.equals(key.split(":")[1])) {
+ Log.v(TAG, route.code + " " + routeName);
+ if (route.code.equals(routeName)) {
showRouteOverlay(route);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
- } else if (key.contains("Buildings")) {
- if (key.equals("Buildings:Non-Residential")) {
- showBuildingOverlay(false);
- } else if (key.equals("Buildings:Residential")) {
- showBuildingOverlay(true);
- } else {
- Log.e(TAG, "Wierd building preferences key " + key);
- }
- } else if (key.contains("Site Outlines")) {
+ } else if (key.startsWith(BUILDING_OVERLAYS)) {
+ showBuildingOverlays();
+ } else if (key.startsWith(SITE_OVERLAYS)) {
+ String siteName = key.substring(SITE_OVERLAYS.length(), key.length());
try {
for (Site site : getHelper().getSiteDao()) {
- if (site.name.equals(key.split(":")[1])) {
+ if (site.name.equals(siteName)) {
showSiteOverlay(site);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
- } else if (key.contains("Other")) {
- if (key.contains("Scale Bar")) {
+ } else if (key.startsWith(OTHER_OVERLAYS)) {
+ if (key.substring(OTHER_OVERLAYS.length(), key.length()).equals(SCALE_BAR_OVERLAY)) {
showUtilityOverlays();
- } else if (key.contains("Compass")) {
- if (prefs.getBoolean("Other:Compass", false)) {
+ } else if (key.substring(OTHER_OVERLAYS.length(), key.length()).equals(MY_LOCATION_OVERLAY_COMPASS)) {
+ if (prefs.getBoolean(key, MY_LOCATION_OVERLAY_COMPASS_ENABLED_BY_DEFAULT)) {
myLocationOverlay.enableCompass();
} else {
myLocationOverlay.disableCompass();
}
- } else if (key.contains("Other:My Location")) {
+ } else if (key.substring(OTHER_OVERLAYS.length(), key.length()).equals(MY_LOCATION_OVERLAY)) {
final SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
- if (prefs.getBoolean("Other:Compass", false) && sharedPrefs.getBoolean("GPSEnabled", false)) {
+ if (prefs.getBoolean(key, MY_LOCATION_OVERLAY_ENABLED_BY_DEFAULT)
+ && sharedPrefs.getBoolean(GPS_ENABLED, GPS_ENABLED_BY_DEFAULT)) {
myLocationOverlay.enableMyLocation();
} else {
myLocationOverlay.disableMyLocation();
@@ -1087,229 +1310,4 @@ public class SouthamptonUniversityMapActivity extends OrmLiteBaseActivity<Databa
Log.e(TAG, "Unhandled preference key " + key);
}
}
-
- class ViewDialog extends Dialog implements OnChildClickListener {
-
- private final ExpandableListView epView;
-
- private static final String TAG = "ViewDialog";
-
- private final MyExpandableListAdapter mAdapter;
-
- private OnChildClickListener listener;
-
- public ViewDialog(Context context) {
- super(context);
-
- setContentView(R.layout.view_dialog);
- setTitle("Select the map elements to display");
-
- WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
- lp.copyFrom(this.getWindow().getAttributes());
- lp.width = WindowManager.LayoutParams.FILL_PARENT;
- lp.height = WindowManager.LayoutParams.FILL_PARENT;
-
- this.getWindow().setAttributes(lp);
-
- epView = (ExpandableListView) findViewById(R.id.view_list);
- mAdapter = new MyExpandableListAdapter(context);
- epView.setAdapter(mAdapter);
- epView.setOnChildClickListener(this);
-
- }
-
- public void setOnItemClickListener(OnChildClickListener onChildClickListener) {
- Log.i(TAG, "Listener set for dialog");
- listener = onChildClickListener;
- }
-
- class MyExpandableListAdapter extends BaseExpandableListAdapter {
-
- private LayoutInflater inflater;
-
- private static final String TAG = "MyExpandableListAdapter";
-
- // Bus Stops
- // |_ U1
- // |_ U1N
- // |_ U2
- // |_ U6
- // |_ U9
- // Bus Routes
- // |_ U1
- // |_ U1N
- // |_ U2
- // |_ U6
- // |_ U9
- // Buildings
- // |_ Residential
- // |_ Non-Residential
- // Site Outlines
- // |_ Highfield Campus
- // |_ Boldrewood Campus
- // |_ Avenue Campus
- // |_ Winchester School of Art
- // |_ The University of Southampton Science Park
- // |_ National Oceanography Centre Campus
- // |_ Boat House
- // |_ Southampton General Hospital
- // |_ Royal South Hants Hospital
- // |_ Belgrave Industrial Site
- // |_ Highfield Hall
- // |_ Glen Eyre Hall
- // |_ South Hill Hall
- // |_ Chamberlain Hall
- // |_ Hartley Grove
- // |_ Bencraft Hall
- // |_ Connaught Hall
- // |_ Montefiore Hall
- // |_ Stoneham Hall
- // |_ Erasmus Park
- // Other
- // |_ Scale Bar
- // |_ Compass
- // |_ My Location
-
- MyExpandableListAdapter(Context context) {
- inflater = LayoutInflater.from(context);
- }
-
- public Object getChild(int groupPosition, int childPosition) {
- if (groupPosition == 0 || groupPosition == 1) {
- return busRoutes[childPosition];
- } else if (groupPosition == 2) {
- return buildingTypes[childPosition];
- } else if (groupPosition == 3) {
- return siteNames[childPosition];
- } else if (groupPosition == 4) {
- return other[childPosition];
- } else {
- Log.e(TAG, "Unrecognised groupPosition " + groupPosition);
- return null;
- }
- }
-
- public long getChildId(int groupPosition, int childPosition) {
- return groupPosition * 50 + childPosition;
- }
-
- public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
- View v = null;
- if (convertView != null)
- v = convertView;
- else
- v = inflater.inflate(R.layout.view_child_row, parent, false);
- String c = (String) getChild(groupPosition, childPosition);
- TextView childName = (TextView) v.findViewById(R.id.childname);
- if (childName != null)
- childName.setText(c);
- CheckBox cb = (CheckBox) v.findViewById(R.id.check1);
- cb.setClickable(false);
- cb.setFocusable(false);
- SharedPreferences activityPrefs = getPreferences(0);
- if (groupPosition == 0) {
- cb.setChecked(activityPrefs.getBoolean(groupHeadings[groupPosition] + ":" + busRoutes[childPosition], BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT));
- } else if (groupPosition == 1) {
- cb.setChecked(activityPrefs.getBoolean(groupHeadings[groupPosition] + ":" + busRoutes[childPosition], ROUTE_OVERLAY_ENABLED_BY_DEFAULT));
- } else if (groupPosition == 2) {
- if (childPosition == 0) {
- cb.setChecked(activityPrefs.getBoolean(groupHeadings[groupPosition] + ":" + buildingTypes[childPosition],
- RESIDENTIAL_BUILDING_OVERLAY_ENABLED_BY_DEFAULT));
- } else {
- cb.setChecked(activityPrefs.getBoolean(groupHeadings[groupPosition] + ":" + buildingTypes[childPosition],
- NON_RESIDENTIAL_BUILDING_OVERLAY_ENABLED_BY_DEFAULT));
- }
- } else if (groupPosition == 3) {
- cb.setChecked(activityPrefs.getBoolean(groupHeadings[groupPosition] + ":" + siteNames[childPosition], SITE_OVERLAY_ENABLED_BY_DEFAULT));
- } else if (groupPosition == 4) {
- // TODO Default value below is not right
- cb.setChecked(activityPrefs.getBoolean(groupHeadings[groupPosition] + ":" + other[childPosition], SCALE_BAR_OVERLAY_ENABLED_BY_DEFAULT)); // right
- }
- return v;
- }
-
- public int getChildrenCount(int groupPosition) {
- if (groupPosition == 0 || groupPosition == 1) {
- return busRoutes.length;
- } else if (groupPosition == 2) {
- return buildingTypes.length;
- } else if (groupPosition == 3) {
- return siteNames.length;
- } else if (groupPosition == 4) {
- return other.length;
- }
- return 0;
- }
-
- public Object getGroup(int groupPosition) {
- return groupHeadings[groupPosition];
- }
-
- public int getGroupCount() {
- return groupHeadings.length;
- }
-
- public long getGroupId(int groupPosition) {
- return groupPosition * 5;
- }
-
- public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
- View v = null;
- if (convertView != null)
- v = convertView;
- else
- v = inflater.inflate(R.layout.view_group_row, parent, false);
- String gt = (String) getGroup(groupPosition);
- TextView colorGroup = (TextView) v.findViewById(R.id.childname);
- if (gt != null)
- colorGroup.setText(gt);
- return v;
- }
-
- public boolean hasStableIds() {
- return true;
- }
-
- public boolean isChildSelectable(int groupPosition, int childPosition) {
- return true;
- }
-
- }
-
- public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
- Log.i(TAG, "Got view dialog click at " + groupPosition + ":" + childPosition);
-
- SharedPreferences activityPrefs = getPreferences(0);
-
- Editor editor = activityPrefs.edit();
-
- CheckBox cb = (CheckBox) v.findViewById(R.id.check1);
-
- if (groupPosition == 0 || groupPosition == 1) {
- Log.i(TAG, "Setting value of " + groupHeadings[groupPosition] + ":" + busRoutes[childPosition] + " to " + !cb.isChecked());
- editor.putBoolean(groupHeadings[groupPosition] + ":" + busRoutes[childPosition], !cb.isChecked());
-
- } else if (groupPosition == 2) {
- Log.i(TAG, "Setting value of " + groupHeadings[groupPosition] + ":" + buildingTypes[childPosition] + " to " + !cb.isChecked());
- editor.putBoolean(groupHeadings[groupPosition] + ":" + buildingTypes[childPosition], !cb.isChecked());
-
- } else if (groupPosition == 3) {
- Log.i(TAG, "Setting value of " + groupHeadings[groupPosition] + ":" + siteNames[childPosition] + " to " + !cb.isChecked());
- editor.putBoolean(groupHeadings[groupPosition] + ":" + siteNames[childPosition], !cb.isChecked());
-
- } else if (groupPosition == 4) {
- Log.i(TAG, "Setting value of " + groupHeadings[groupPosition] + ":" + other[childPosition] + " to " + !cb.isChecked());
- editor.putBoolean(groupHeadings[groupPosition] + ":" + other[childPosition], !cb.isChecked());
- }
-
- editor.commit();
-
- mAdapter.notifyDataSetInvalidated();
-
- listener.onChildClick(parent, v, groupPosition, childPosition, id);
-
- return true;
- }
-
- }
}
diff --git a/src/net/cbaines/suma/POI.java b/src/net/cbaines/suma/POI.java
index dba7924..244198d 100644
--- a/src/net/cbaines/suma/POI.java
+++ b/src/net/cbaines/suma/POI.java
@@ -60,8 +60,6 @@ public abstract class POI {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
- result = prime * result + ((point == null) ? 0 : point.hashCode());
- result = prime * result + ((type == null) ? 0 : type.hashCode());
return result;
}
@@ -79,16 +77,6 @@ public abstract class POI {
return false;
} else if (!id.equals(other.id))
return false;
- if (point == null) {
- if (other.point != null)
- return false;
- } else if (!point.equals(other.point))
- return false;
- if (type == null) {
- if (other.type != null)
- return false;
- } else if (!type.equals(other.type))
- return false;
return true;
}
}
diff --git a/src/net/cbaines/suma/POIDialog.java b/src/net/cbaines/suma/POIDialog.java
new file mode 100644
index 0000000..20304bb
--- /dev/null
+++ b/src/net/cbaines/suma/POIDialog.java
@@ -0,0 +1,92 @@
+/*
+ * Southampton University Map App
+ * Copyright (C) 2011 Christopher Baines
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package net.cbaines.suma;
+
+import java.util.List;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.view.View;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.AdapterView.OnItemLongClickListener;
+import android.widget.ListView;
+import android.widget.TextView;
+
+public class POIDialog extends Dialog {
+
+ // private static final String TAG = "POIDialog";
+ private ListView listItems;
+
+ private final Context context;
+
+ private final TextView message;
+
+ protected POIArrayAdapter adapter;
+
+ public POIDialog(Context context) {
+ super(context);
+
+ this.context = context;
+
+ setContentView(R.layout.poi_dialog);
+
+ message = (TextView) findViewById(R.id.favouriteDialogMessage);
+ listItems = (ListView) findViewById(R.id.favouriteListItems);
+
+ }
+
+ void setMessage(final String text) {
+ message.post(new Runnable() {
+ public void run() {
+ if (text == null || text.length() == 0) {
+ message.setVisibility(View.GONE);
+ } else {
+ message.setText(text);
+ message.setVisibility(View.VISIBLE);
+ }
+ }
+ });
+ }
+
+ void setItems(final List<POI> items) {
+ listItems.post(new Runnable() {
+ public void run() {
+ if (items != null) {
+ adapter = new POIArrayAdapter(context, items);
+
+ listItems.setVisibility(View.VISIBLE);
+ listItems.setAdapter(adapter);
+ } else {
+ listItems.setVisibility(View.GONE);
+ }
+ }
+ });
+ }
+
+ void setOnItemClickListener(OnItemClickListener item) {
+ listItems.setOnItemClickListener(item);
+
+ }
+
+ void setOnItemLongClickListener(OnItemLongClickListener item) {
+ listItems.setOnItemLongClickListener(item);
+ }
+
+}
diff --git a/src/net/cbaines/suma/POIView.java b/src/net/cbaines/suma/POIView.java
index 733cd0f..fb8a6c6 100644
--- a/src/net/cbaines/suma/POIView.java
+++ b/src/net/cbaines/suma/POIView.java
@@ -33,6 +33,7 @@ public class POIView extends LinearLayout {
private final TextView name;
private final TextView dist;
+ private final BusRoutesView routes;
private LayoutParams textLayoutParams;
@@ -52,18 +53,22 @@ public class POIView extends LinearLayout {
this.setOrientation(HORIZONTAL);
name = new TextView(context);
- name.setTextSize(22f);
+ name.setTextSize(16f);
name.setGravity(Gravity.LEFT);
dist = new TextView(context);
- dist.setTextSize(22f);
+ dist.setTextSize(16f);
dist.setGravity(Gravity.RIGHT);
+ routes = new BusRoutesView(context, (byte) 0);
+
textLayoutParams = new LayoutParams(width - (width / 4), LayoutParams.WRAP_CONTENT);
LayoutParams distLayoutParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
+ LayoutParams busRouteLayoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
setPOIAndDist(poi, distInM);
+ addView(routes, busRouteLayoutParams);
addView(name, textLayoutParams);
addView(dist, distLayoutParams);
}
@@ -87,6 +92,9 @@ public class POIView extends LinearLayout {
// Log.i(TAG, "Its a bus stop of description " + busStop.description);
name.setText(busStop.description + " (" + busStop.id + ")");
+
+ routes.setRoutes(busStop.routes);
+
} else if (poi.type == POI.SITE) {
Site site = (Site) poi;
diff --git a/src/net/cbaines/suma/Preferences.java b/src/net/cbaines/suma/Preferences.java
new file mode 100644
index 0000000..a978dd9
--- /dev/null
+++ b/src/net/cbaines/suma/Preferences.java
@@ -0,0 +1,13 @@
+package net.cbaines.suma;
+
+public interface Preferences {
+ // Preferences
+ static final String GPS_ENABLED = "GPSEnabled";
+ static final boolean GPS_ENABLED_BY_DEFAULT = true;
+ static final String UNI_LINK_BUS_TIMES = "uniLinkLiveBusTimesEnabled";
+ static final boolean UNI_LINK_BUS_TIMES_ENABLED_BY_DEFAULT = true;
+ static final String NON_UNI_LINK_BUS_TIMES = "nonUniLinkLiveBusTimesEnabled";
+ static final boolean NON_UNI_LINK_BUS_TIMES_ENABLED_BY_DEFAULT = false;
+ static final String NON_UNI_LINK_BUS_STOPS_OVERLAY = "nonUniLinkBusStops";
+ static final boolean NON_UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT = false;
+}
diff --git a/src/net/cbaines/suma/PreferencesActivity.java b/src/net/cbaines/suma/PreferencesActivity.java
index b7c1d89..d72d266 100644
--- a/src/net/cbaines/suma/PreferencesActivity.java
+++ b/src/net/cbaines/suma/PreferencesActivity.java
@@ -19,21 +19,34 @@
package net.cbaines.suma;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.preference.PreferenceActivity;
+import android.preference.PreferenceManager;
-public class PreferencesActivity extends PreferenceActivity {
- boolean CheckboxPreference;
- String ListPreference;
- String editTextPreference;
- String ringtonePreference;
- String secondEditTextPreference;
- String customPref;
+public class PreferencesActivity extends PreferenceActivity implements Preferences {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+
+ final SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
+ final Editor editor = sharedPrefs.edit();
+ if (!sharedPrefs.contains(GPS_ENABLED)) {
+ editor.putBoolean(GPS_ENABLED, GPS_ENABLED_BY_DEFAULT);
+ }
+ if (!sharedPrefs.contains(UNI_LINK_BUS_TIMES)) {
+ editor.putBoolean(UNI_LINK_BUS_TIMES, UNI_LINK_BUS_TIMES_ENABLED_BY_DEFAULT);
+ }
+ if (!sharedPrefs.contains(NON_UNI_LINK_BUS_TIMES)) {
+ editor.putBoolean(NON_UNI_LINK_BUS_TIMES, NON_UNI_LINK_BUS_TIMES_ENABLED_BY_DEFAULT);
+ }
+ if (!sharedPrefs.contains(NON_UNI_LINK_BUS_STOPS_OVERLAY)) {
+ editor.putBoolean(NON_UNI_LINK_BUS_STOPS_OVERLAY, NON_UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT);
+ }
+ editor.commit();
+
addPreferencesFromResource(R.xml.preferences);
}
-
} \ No newline at end of file
diff --git a/src/net/cbaines/suma/RouteStops.java b/src/net/cbaines/suma/RouteStops.java
index 1206153..29fb18c 100644
--- a/src/net/cbaines/suma/RouteStops.java
+++ b/src/net/cbaines/suma/RouteStops.java
@@ -40,18 +40,18 @@ public class RouteStops {
// This is a foreign object which just stores the id from the User object in this table.
@DatabaseField(foreign = true, columnName = STOP_ID_FIELD_NAME, indexName = "routestops_routestop_idx")
- BusStop stop;
+ BusStop busStop;
// This is a foreign object which just stores the id from the Post object in this table.
@DatabaseField(foreign = true, columnName = ROUTE_ID_FIELD_NAME, indexName = "routestops_routestop_idx")
- BusRoute route;
+ BusRoute busRoute;
RouteStops() {
}
public RouteStops(BusStop stop, BusRoute route, int sequence) {
- this.stop = stop;
- this.route = route;
+ this.busStop = stop;
+ this.busRoute = route;
this.sequence = sequence;
}
}
diff --git a/src/net/cbaines/suma/Stop.java b/src/net/cbaines/suma/Stop.java
index 8e2d466..94fc908 100644
--- a/src/net/cbaines/suma/Stop.java
+++ b/src/net/cbaines/suma/Stop.java
@@ -31,16 +31,10 @@ import android.text.format.DateUtils;
*/
public class Stop {
- public static final String ID_FIELD_NAME = "id";
- public static final String BUS_FIELD_NAME = "bus";
- public static final String BUS_STOP_FIELD_NAME = "busStop";
- public static final String ARIVAL_TIME_FIELD_NAME = "arivalTime";
- public static final String FETCH_TIME_FIELD_NAME = "timeOfFetch";
-
- /**
- * A generated id for the bus
- */
- int id;
+ // public static final String BUS_FIELD_NAME = "bus";
+ // public static final String BUS_STOP_FIELD_NAME = "busStop";
+ // public static final String ARIVAL_TIME_FIELD_NAME = "arivalTime";
+ // public static final String FETCH_TIME_FIELD_NAME = "timeOfFetch";
/**
* The Bus stopping at the stop
@@ -63,17 +57,28 @@ public class Stop {
Date timeOfFetch;
/**
+ * Is the time live, or just expected
+ */
+ boolean live;
+
+ /**
+ * Assumed to be the number of seconds since this data was fetched from the ROMANSE system?
+ */
+ int age;
+
+ /**
*
* @param bus
* @param busStop
* @param arivalTime
* @param timeOfFetch
*/
- public Stop(Bus bus, BusStop busStop, Date arivalTime, Date timeOfFetch) {
+ public Stop(Bus bus, BusStop busStop, Date arivalTime, Date timeOfFetch, boolean live) {
this.busStop = busStop;
this.bus = bus;
this.arivalTime = arivalTime;
this.timeOfFetch = timeOfFetch;
+ this.live = live;
}
/**
@@ -84,7 +89,21 @@ public class Stop {
if (arivalTime.getTime() - System.currentTimeMillis() <= 60000) {
return "Due";
} else {
- return (String) DateUtils.getRelativeTimeSpanString(arivalTime.getTime(), System.currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS);
+ return (String) DateUtils.getRelativeTimeSpanString(arivalTime.getTime(), System.currentTimeMillis(),
+ DateUtils.MINUTE_IN_MILLIS);
+ }
+ }
+
+ public String getShortTimeToArival() {
+ if (arivalTime.getTime() - System.currentTimeMillis() <= 60000) {
+ return "Due";
+ } else {
+ String time = (String) DateUtils.getRelativeTimeSpanString(arivalTime.getTime(),
+ System.currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS);
+ time = time.replace("in ", "");
+ time = time.replace(" minutes", "m");
+ time = time.replace(" minute", "m");
+ return time;
}
}
@@ -95,7 +114,6 @@ public class Stop {
result = prime * result + ((arivalTime == null) ? 0 : arivalTime.hashCode());
result = prime * result + ((bus == null) ? 0 : bus.hashCode());
result = prime * result + ((busStop == null) ? 0 : busStop.hashCode());
- result = prime * result + id;
return result;
}
@@ -132,8 +150,6 @@ public class Stop {
return false;
} else if (!busStop.equals(other.busStop))
return false;
- if (id != other.id)
- return false;
return true;
}
diff --git a/src/net/cbaines/suma/StopView.java b/src/net/cbaines/suma/StopView.java
index dc023aa..764072e 100644
--- a/src/net/cbaines/suma/StopView.java
+++ b/src/net/cbaines/suma/StopView.java
@@ -22,10 +22,13 @@ package net.cbaines.suma;
import java.sql.SQLException;
import java.text.DateFormat;
-import android.content.Context;
+import android.app.Activity;
+import android.content.Intent;
+import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
+import android.view.View.OnLongClickListener;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
@@ -33,7 +36,7 @@ import android.widget.Toast;
import com.j256.ormlite.android.apptools.OpenHelperManager;
import com.j256.ormlite.dao.Dao;
-public class StopView extends LinearLayout implements OnClickListener {
+public class StopView extends LinearLayout implements OnClickListener, OnLongClickListener {
// private final ImageView icon;
@@ -42,9 +45,11 @@ public class StopView extends LinearLayout implements OnClickListener {
private final TextView name;
private final TextView time;
private String onClickMessage = "";
- private final Context context;
+ private final BusStopActivity context;
- public StopView(Context context, Stop stop) {
+ private Stop stop;
+
+ public StopView(BusStopActivity context, Stop stop) {
super(context);
this.context = context;
@@ -68,6 +73,8 @@ public class StopView extends LinearLayout implements OnClickListener {
// Log.i(TAG, "Time of arival " + stop.arivalTime);
+ this.stop = stop;
+
name.setText(stop.bus.getName());
time.setText(stop.getTimeToArival());
@@ -79,20 +86,85 @@ public class StopView extends LinearLayout implements OnClickListener {
busDao.refresh(stop.bus);
if (stop.bus.id != null) {
- onClickMessage = "Bus " + stop.bus.toString() + " at " + DateFormat.getTimeInstance(DateFormat.SHORT).format(stop.arivalTime);
+ if (stop.live) {
+ onClickMessage = "Bus " + stop.bus.toString() + " at "
+ + DateFormat.getTimeInstance(DateFormat.SHORT).format(stop.arivalTime);
+ } else {
+ onClickMessage = "Timetabled bus " + stop.bus.toString() + " at "
+ + DateFormat.getTimeInstance(DateFormat.SHORT).format(stop.arivalTime);
+ }
} else {
- onClickMessage = "Unidentified bus (" + stop.bus.getName() + ") at " + DateFormat.getTimeInstance(DateFormat.SHORT).format(stop.arivalTime);
+ if (stop.live) {
+ onClickMessage = "Unidentified bus (" + stop.bus.getName() + ") at "
+ + DateFormat.getTimeInstance(DateFormat.SHORT).format(stop.arivalTime);
+ } else {
+ onClickMessage = "Timetabled bus (" + stop.bus.getName() + ") at "
+ + DateFormat.getTimeInstance(DateFormat.SHORT).format(stop.arivalTime);
+ }
}
} catch (SQLException e) {
e.printStackTrace();
}
this.setOnClickListener(this);
+ this.setOnLongClickListener(this);
}
public void onClick(View v) {
- Toast.makeText(context, onClickMessage, Toast.LENGTH_SHORT).show();
+ if (context.activityToast == null) {
+ context.activityToast = Toast.makeText(context, onClickMessage, Toast.LENGTH_SHORT);
+ } else {
+ context.activityToast.setText(onClickMessage);
+ context.activityToast.setDuration(Toast.LENGTH_SHORT);
+ }
+ context.activityToast.show();
}
+ @Override
+ public boolean onLongClick(View v) {
+ DatabaseHelper helper = OpenHelperManager.getHelper(context, DatabaseHelper.class);
+
+ try {
+ Dao<Bus, Integer> busDao = helper.getBusDao();
+ Dao<BusRoute, Integer> busRouteDao = helper.getBusRouteDao();
+
+ busDao.refresh(stop.bus);
+ busRouteDao.refresh(stop.bus.route);
+
+ Log.i("StopView", "Bus route " + stop.bus.route + " Uni-Link " + stop.bus.route.uniLink + " Bus ID "
+ + stop.bus.id);
+
+ if (stop.bus.id != null && stop.bus.route.uniLink) {
+ Intent i = new Intent(context, BusActivity.class);
+ i.putExtra("busID", stop.bus.id);
+ i.putExtra("busStopID", stop.busStop.id);
+ ((Activity) context).startActivityForResult(i, 0);
+ } else {
+ if (!stop.bus.route.uniLink) {
+ if (context.activityToast == null) {
+ context.activityToast = Toast.makeText(context,
+ "Bus schedules only avalible for Uni-Link buses", Toast.LENGTH_SHORT);
+ } else {
+ context.activityToast.setText("Bus schedules only avalible for Uni-Link buses");
+ context.activityToast.setDuration(Toast.LENGTH_SHORT);
+ }
+ context.activityToast.show();
+ } else {
+ if (context.activityToast == null) {
+ context.activityToast = Toast.makeText(context,
+ "Bus schedules not avalible for unidentified buses", Toast.LENGTH_SHORT);
+ } else {
+ context.activityToast.setText("Bus schedules not avalible for unidentified buses");
+ context.activityToast.setDuration(Toast.LENGTH_SHORT);
+ }
+ context.activityToast.show();
+ }
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return true;
+ }
}
diff --git a/src/net/cbaines/suma/Timetable.java b/src/net/cbaines/suma/Timetable.java
index 6e3db1e..93c8e8d 100644
--- a/src/net/cbaines/suma/Timetable.java
+++ b/src/net/cbaines/suma/Timetable.java
@@ -28,7 +28,7 @@ public class Timetable extends ArrayList<Stop> {
*
*/
private static final long serialVersionUID = -9021303378059511643L;
-
+
Date fetchTime;
public String toString() {
@@ -40,6 +40,8 @@ public class Timetable extends ArrayList<Stop> {
}
public boolean contains(Stop otherStop, boolean toTheMinute) {
+ if (otherStop == null)
+ return false;
if (toTheMinute) {
for (Stop stop : this) {
if (otherStop.bus != null && stop.bus != null && otherStop.bus.equals(stop.bus)) {
@@ -47,8 +49,14 @@ public class Timetable extends ArrayList<Stop> {
return true;
}
} else if (otherStop.busStop.equals(stop.busStop)) {
- if (Math.abs(otherStop.arivalTime.getTime() - stop.arivalTime.getTime()) < 60000) {
+ if (otherStop.arivalTime == null && stop.arivalTime == null) {
return true;
+ } else {
+ if (otherStop.arivalTime == null || stop.arivalTime == null) {
+ return false;
+ } else if (Math.abs(otherStop.arivalTime.getTime() - stop.arivalTime.getTime()) < 60000) {
+ return true;
+ }
}
}
}
diff --git a/src/net/cbaines/suma/TimetableAdapter.java b/src/net/cbaines/suma/TimetableAdapter.java
index b4dfab5..9ec7a72 100644
--- a/src/net/cbaines/suma/TimetableAdapter.java
+++ b/src/net/cbaines/suma/TimetableAdapter.java
@@ -19,7 +19,6 @@
package net.cbaines.suma;
-import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
@@ -29,14 +28,14 @@ import android.widget.BaseAdapter;
public class TimetableAdapter extends BaseAdapter {
- private final Context context;
+ private final BusStopActivity context;
private Timetable timetable;
private final Animation a;
private boolean[] changed;
private static final String TAG = "TimetableAdapter";
- public TimetableAdapter(Context context, Timetable timetable) {
+ public TimetableAdapter(BusStopActivity context, Timetable timetable) {
this.context = context;
this.timetable = timetable;
this.a = AnimationUtils.loadAnimation(context, R.anim.updated_stop_view);
diff --git a/src/net/cbaines/suma/ViewDialog.java b/src/net/cbaines/suma/ViewDialog.java
new file mode 100644
index 0000000..432fec1
--- /dev/null
+++ b/src/net/cbaines/suma/ViewDialog.java
@@ -0,0 +1,274 @@
+/*
+ * Southampton University Map App
+ * Copyright (C) 2011 Christopher Baines
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package net.cbaines.suma;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.BaseExpandableListAdapter;
+import android.widget.CheckBox;
+import android.widget.ExpandableListView;
+import android.widget.ExpandableListView.OnChildClickListener;
+import android.widget.TextView;
+
+class ViewDialog extends Dialog implements OnChildClickListener {
+
+ private final ExpandableListView epView;
+
+ private static final String TAG = "ViewDialog";
+
+ private final MyExpandableListAdapter mAdapter;
+
+ private OnChildClickListener listener;
+
+ private String[] busRoutes;
+ private String[] buildingTypes;
+ private String[] other;
+ private String[] groupHeadings;
+ private String[] siteNames;
+
+ protected MapActivity context;
+
+ public ViewDialog(MapActivity context) {
+ super(context);
+
+ this.context = context;
+
+ busRoutes = context.getResources().getStringArray(R.array.uniLinkBusRoutes);
+ buildingTypes = context.getResources().getStringArray(R.array.buildingTypes);
+ other = context.getResources().getStringArray(R.array.utilityOverlays);
+ groupHeadings = context.getResources().getStringArray(R.array.preferencesHeadings);
+ siteNames = MapActivity.SITE_NAMES; // TODO: Temp hack, should be included in the strings res for translation
+ // purposes?
+
+ setContentView(R.layout.view_dialog);
+ setTitle("Select the map elements to display");
+
+ WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
+ lp.copyFrom(this.getWindow().getAttributes());
+ lp.width = WindowManager.LayoutParams.FILL_PARENT;
+ lp.height = WindowManager.LayoutParams.FILL_PARENT;
+
+ this.getWindow().setAttributes(lp);
+
+ epView = (ExpandableListView) findViewById(R.id.view_list);
+ mAdapter = new MyExpandableListAdapter(context);
+ epView.setAdapter(mAdapter);
+ epView.setOnChildClickListener(this);
+
+ }
+
+ public void setOnItemClickListener(OnChildClickListener onChildClickListener) {
+ Log.i(TAG, "Listener set for dialog");
+ listener = onChildClickListener;
+ }
+
+ class MyExpandableListAdapter extends BaseExpandableListAdapter implements Preferences {
+
+ private LayoutInflater inflater;
+
+ private static final String TAG = "MyExpandableListAdapter";
+
+ // Bus Stops
+ // |_ U1
+ // |_ U1N
+ // |_ U2
+ // |_ U6
+ // |_ U9
+ // Bus Routes
+ // |_ U1
+ // |_ U1N
+ // |_ U2
+ // |_ U6
+ // |_ U9
+ // Buildings
+ // |_ Residential
+ // |_ Non-Residential
+ // Site Outlines
+ // |_ Highfield Campus
+ // |_ Boldrewood Campus
+ // |_ Avenue Campus
+ // |_ Winchester School of Art
+ // |_ The University of Southampton Science Park
+ // |_ National Oceanography Centre Campus
+ // |_ Boat House
+ // |_ Southampton General Hospital
+ // |_ Royal South Hants Hospital
+ // |_ Belgrave Industrial Site
+ // |_ Highfield Hall
+ // |_ Glen Eyre Hall
+ // |_ South Hill Hall
+ // |_ Chamberlain Hall
+ // |_ Hartley Grove
+ // |_ Bencraft Hall
+ // |_ Connaught Hall
+ // |_ Montefiore Hall
+ // |_ Stoneham Hall
+ // |_ Erasmus Park
+ // Other
+ // |_ Scale Bar
+ // |_ Compass
+ // |_ My Location
+
+ MyExpandableListAdapter(Context context) {
+ inflater = LayoutInflater.from(context);
+ }
+
+ public Object getChild(int groupPosition, int childPosition) {
+ if (groupPosition == 0 || groupPosition == 1) {
+ return busRoutes[childPosition];
+ } else if (groupPosition == 2) {
+ return buildingTypes[childPosition];
+ } else if (groupPosition == 3) {
+ return siteNames[childPosition];
+ } else if (groupPosition == 4) {
+ return other[childPosition];
+ } else {
+ Log.e(TAG, "Unrecognised groupPosition " + groupPosition);
+ return null;
+ }
+ }
+
+ public long getChildId(int groupPosition, int childPosition) {
+ return groupPosition * 50 + childPosition;
+ }
+
+ public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView,
+ ViewGroup parent) {
+ View v = null;
+ if (convertView != null)
+ v = convertView;
+ else
+ v = inflater.inflate(R.layout.view_child_row, parent, false);
+ String c = (String) getChild(groupPosition, childPosition);
+ TextView childName = (TextView) v.findViewById(R.id.childname);
+ if (childName != null)
+ childName.setText(c);
+ CheckBox cb = (CheckBox) v.findViewById(R.id.check1);
+ cb.setClickable(false);
+ cb.setFocusable(false);
+ if (context == null) {
+ Log.e(TAG, "context == null");
+ }
+ SharedPreferences activityPrefs = context.getPreferences(0);
+
+ String str = MapActivity.PREFERENCES_GROUPS[groupPosition]
+ + MapActivity.PREFERENCES_CHILDREN[groupPosition][childPosition];
+
+ if (groupPosition == 0) {
+ cb.setChecked(activityPrefs.getBoolean(str, MapActivity.UNI_LINK_BUS_STOP_OVERLAY_ENABLED_BY_DEFAULT));
+ } else if (groupPosition == 1) {
+ cb.setChecked(activityPrefs.getBoolean(str, MapActivity.BUS_ROUTE_OVERLAYS_ENABLED_BY_DEFAULT));
+ } else if (groupPosition == 2) {
+ if (childPosition == 0) {
+ cb.setChecked(activityPrefs.getBoolean(str,
+ MapActivity.RESIDENTIAL_BUILDING_OVERLAY_ENABLED_BY_DEFAULT));
+ } else {
+ cb.setChecked(activityPrefs.getBoolean(str,
+ MapActivity.NON_RESIDENTIAL_BUILDING_OVERLAY_ENABLED_BY_DEFAULT));
+ }
+ } else if (groupPosition == 3) {
+ cb.setChecked(activityPrefs.getBoolean(str, MapActivity.SITE_OVERLAYS_ENABLED_BY_DEFAULT));
+ } else if (groupPosition == 4) {
+ cb.setChecked(activityPrefs.getBoolean(str, MapActivity.SCALE_BAR_OVERLAY_ENABLED_BY_DEFAULT));
+ }
+ return v;
+ }
+
+ public int getChildrenCount(int groupPosition) {
+ if (groupPosition == 0 || groupPosition == 1) {
+ return busRoutes.length;
+ } else if (groupPosition == 2) {
+ return buildingTypes.length;
+ } else if (groupPosition == 3) {
+ return siteNames.length;
+ } else if (groupPosition == 4) {
+ return other.length;
+ }
+ return 0;
+ }
+
+ public Object getGroup(int groupPosition) {
+ return groupHeadings[groupPosition];
+ }
+
+ public int getGroupCount() {
+ return groupHeadings.length;
+ }
+
+ public long getGroupId(int groupPosition) {
+ return groupPosition * 5;
+ }
+
+ public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
+ View v = null;
+ if (convertView != null)
+ v = convertView;
+ else
+ v = inflater.inflate(R.layout.view_group_row, parent, false);
+ String gt = (String) getGroup(groupPosition);
+ TextView colorGroup = (TextView) v.findViewById(R.id.childname);
+ if (gt != null)
+ colorGroup.setText(gt);
+ return v;
+ }
+
+ public boolean hasStableIds() {
+ return true;
+ }
+
+ public boolean isChildSelectable(int groupPosition, int childPosition) {
+ return true;
+ }
+
+ }
+
+ public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
+ Log.i(TAG, "Got view dialog click at " + groupPosition + ":" + childPosition);
+
+ SharedPreferences activityPrefs = context.getPreferences(0);
+
+ Editor editor = activityPrefs.edit();
+
+ CheckBox cb = (CheckBox) v.findViewById(R.id.check1);
+
+ String str = MapActivity.PREFERENCES_GROUPS[groupPosition]
+ + MapActivity.PREFERENCES_CHILDREN[groupPosition][childPosition];
+
+ editor.putBoolean(str, !cb.isChecked());
+
+ editor.commit();
+
+ mAdapter.notifyDataSetInvalidated();
+
+ if (listener != null) {
+ listener.onChildClick(parent, v, groupPosition, childPosition, id);
+ }
+
+ return true;
+ }
+
+} \ No newline at end of file