diff options
Diffstat (limited to 'src/net/cbaines/suma/BusStopOverlay.java')
-rw-r--r-- | src/net/cbaines/suma/BusStopOverlay.java | 451 |
1 files changed, 210 insertions, 241 deletions
diff --git a/src/net/cbaines/suma/BusStopOverlay.java b/src/net/cbaines/suma/BusStopOverlay.java index 06a1729..4705d1d 100644 --- a/src/net/cbaines/suma/BusStopOverlay.java +++ b/src/net/cbaines/suma/BusStopOverlay.java @@ -29,6 +29,7 @@ import org.osmdroid.views.overlay.Overlay; import android.app.Activity; import android.content.Intent; +import android.content.SharedPreferences; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Paint.Style; @@ -39,313 +40,281 @@ import android.util.Log; import android.view.MotionEvent; import android.widget.Toast; -import com.j256.ormlite.android.apptools.OpenHelperManager; -import com.j256.ormlite.dao.Dao; +public class BusStopOverlay extends Overlay implements RouteColorConstants, Preferences { -public class BusStopOverlay extends Overlay implements RouteColorConstants { + List<BusStop> busStops; - List<BusStop> busStops; + private final Point mCurScreenCoords = new Point(); + private final Point mTouchScreenPoint = new Point(); + private final Point mItemPoint = new Point(); - private final Point mCurScreenCoords = new Point(); - private final Point mTouchScreenPoint = new Point(); - private final Point mItemPoint = new Point(); + private final Rect mRect = new Rect(); - private final Rect mRect = new Rect(); + private final Drawable marker; + private final Drawable favMarker; - private final Drawable marker; - private final Drawable favMarker; + private final Paint paint; - private final Paint paint; + private static final String TAG = "BusStopOverlay"; - private static final String TAG = "BusStopOverlay"; + private final MapActivity context; - private final MapActivity context; + private float userScale = 1f; - private Dao<BusStop, String> busStopDao; + private boolean[] routes = new boolean[5]; - private float userScale = 1f; + public BusStopOverlay(MapActivity context, List<BusStop> busStops) throws SQLException { + super(context); - private boolean[] routes = new boolean[5]; + this.context = context; - public BusStopOverlay(MapActivity context, List<BusStop> busStops) throws SQLException { - super(context); + marker = context.getResources().getDrawable(R.drawable.busstop); + favMarker = context.getResources().getDrawable(R.drawable.busstop_fav); - this.context = context; + paint = new Paint(); + paint.setStyle(Style.FILL); + paint.setStrokeWidth(6); - marker = context.getResources().getDrawable(R.drawable.busstop); - favMarker = context.getResources().getDrawable(R.drawable.busstop_fav); - - DatabaseHelper helper = OpenHelperManager.getHelper(context, DatabaseHelper.class); - busStopDao = helper.getBusStopDao(); - - paint = new Paint(); - paint.setStyle(Style.FILL); - paint.setStrokeWidth(6); - - this.busStops = busStops; - } - - void setRoutes(int route, boolean visible) { - routes[route] = visible; - } - - @Override - public void draw(final Canvas canvas, final MapView mapView, final boolean shadow) { + this.busStops = busStops; + } - if (shadow) { - return; + void setRoutes(int route, boolean visible) { + routes[route] = visible; } - float scale = mScale * userScale; + @Override + public void draw(final Canvas canvas, final MapView mapView, final boolean shadow) { - final Projection pj = mapView.getProjection(); + if (shadow) { + return; + } - final int markerWidth = (int) (marker.getIntrinsicWidth() * userScale); - final int markerHeight = (int) (marker.getIntrinsicHeight() * userScale); + final float scale = mScale * userScale; - mRect.set(0, 0, 0 + markerWidth, 0 + markerHeight); - mRect.offset(-markerWidth / 2, -markerHeight); - marker.setBounds(mRect); - favMarker.setBounds(mRect); + final Projection pj = mapView.getProjection(); - /* Draw in backward cycle, so the items with the least index are on the front. */ + final int markerWidth = (int) (marker.getIntrinsicWidth() * userScale); + final int markerHeight = (int) (marker.getIntrinsicHeight() * userScale); - for (int stopNum = 0; stopNum < busStops.size(); stopNum++) { - BusStop stop = busStops.get(stopNum); + mRect.set(0, 0, 0 + markerWidth, 0 + markerHeight); + mRect.offset(-markerWidth / 2, -markerHeight); + marker.setBounds(mRect); + favMarker.setBounds(mRect); - byte routeNum = 0; - final byte stopRoutes = stop.routes; + final SharedPreferences favouritesPreferences = context.getSharedPreferences(FAVOURITES_PREFERENCES, 0); - boolean drawing = false; + /* + * Draw in backward cycle, so the items with the least index are on the front. + */ - if (stop.uniLink) { + for (int stopNum = 0; stopNum < busStops.size(); stopNum++) { + BusStop stop = busStops.get(stopNum); - for (int i = 0; i < 5; i++) { - if ((stopRoutes & (1 << i)) != 0) { - routeNum++; - if (routes[i]) { - drawing = true; + pj.toMapPixels(stop.point, mCurScreenCoords); + if (!pj.getBoundingBox().increaseByScale(1.2f).contains(stop.point)) { + continue; } - } - } - if (!drawing) - continue; + byte routeNum = 0; + final byte stopRoutes = stop.routes; - } + boolean drawing = false; - pj.toMapPixels(stop.point, mCurScreenCoords); + if (stop.uniLink) { - if (stop.favourite) { - Overlay.drawAt(canvas, favMarker, mCurScreenCoords.x, mCurScreenCoords.y, false); - } else { - Overlay.drawAt(canvas, marker, mCurScreenCoords.x, mCurScreenCoords.y, false); - } + for (int i = 0; i < 5; i++) { + if ((stopRoutes & (1 << i)) != 0) { + routeNum++; + if (routes[i]) { + drawing = true; + } + } + } - if (stop.uniLink) { + if (!drawing) + continue; - int makersPlaced = 0; - int yOfsetPerMarker = (int) (10 * scale); - int markerYSize = (int) (8 * scale); + } - float rectLeft = mCurScreenCoords.x + (8.8f * scale); - float rectRight = rectLeft + markerYSize; + if (favouritesPreferences.getBoolean(stop.id, false)) { + Overlay.drawAt(canvas, favMarker, mCurScreenCoords.x, mCurScreenCoords.y, false); + } else { + Overlay.drawAt(canvas, marker, mCurScreenCoords.x, mCurScreenCoords.y, false); + } - if (routeNum == 5) { - markerYSize = (int) (5 * scale); - yOfsetPerMarker = (int) (7 * scale); - } else if (routeNum == 4) { - markerYSize = (int) (6.5f * scale); - yOfsetPerMarker = (int) (8 * scale); + if (stop.uniLink) { + + int makersPlaced = 0; + + final float rectLeft = mCurScreenCoords.x + (8.8f * scale); + final float rectRight = rectLeft + (int) (8 * scale); + + 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); + } + + for (int i = 0; i < 5; i++) { + if ((stopRoutes & (1 << i)) != 0) { + + 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); + + makersPlaced++; + } + } + } } + } - for (int i = 0; i < 5; i++) { - if ((stopRoutes & (1 << i)) != 0) { + @Override + public boolean onSingleTapConfirmed(final MotionEvent event, final MapView mapView) { - // Log.i(TAG, "Route " + route + " is " + routes.get(route)); + BusStop busStop = getSelectedItem(event, mapView); - // Log.i(TAG, "Index is " + busRoutes.indexOf(route) + " busRoutes " + busRoutes); + if (busStop == null) { + // Log.v(TAG, "No busStop pressed"); + return false; + } else { + Log.i(TAG, "busStop Pressed " + busStop.id); - 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); + if (context.activityToast == null) { + context.activityToast = Toast + .makeText(context, busStop.description + " (" + busStop.id + ")", Toast.LENGTH_SHORT); } else { - Log.e(TAG, "Unknown route code"); + context.activityToast.setDuration(Toast.LENGTH_SHORT); + context.activityToast.setText(busStop.description + " (" + busStop.id + ")"); } + context.activityToast.show(); - canvas.drawRect(rectLeft, mCurScreenCoords.y - + ((yOfsetPerMarker * makersPlaced) - (45 * scale)), rectRight, mCurScreenCoords.y - + (yOfsetPerMarker * makersPlaced) - ((45 * scale) - markerYSize), paint); - - makersPlaced++; - } + return true; } - } } - } - @Override - public boolean onSingleTapConfirmed(final MotionEvent event, final MapView mapView) { + 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, "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; - } - } + BusStop busStop = getSelectedItem(event, mapView); - 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); - if (busStop == null) { - // Log.v(TAG, "No busStop pressed"); - return false; - } else { - Log.i(TAG, "Pressed " + busStop.id); + Intent i = new Intent(context, BusStopActivity.class); + i.putExtra("busStopID", busStop.id); + i.putExtra("busStopName", busStop.description); + ((Activity) context).startActivityForResult(i, 0); - Intent i = new Intent(context, BusStopActivity.class); - i.putExtra("busStopID", busStop.id); - i.putExtra("busStopName", busStop.description); - ((Activity) context).startActivityForResult(i, 0); + return true; + } - return true; } - } - - @Override - public boolean onLongPress(final MotionEvent event, final MapView mapView) { - - BusStop busStop = getSelectedItem(event, mapView); + @Override + public boolean onLongPress(final MotionEvent event, final MapView mapView) { - if (busStop == null) { - // Log.v(TAG, "No busStop pressed"); - return false; - } else { - Log.i(TAG, "Pressed " + busStop.id); + BusStop busStop = getSelectedItem(event, mapView); - if (busStop.favourite) { - busStop.favourite = false; - - 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 { - if (context.activityToast == null) { - context.activityToast = Toast.makeText(context, busStop.id + " made a favourite", - Toast.LENGTH_SHORT); + if (busStop == null) { + // Log.v(TAG, "No busStop pressed"); + return false; } else { - context.activityToast.setDuration(Toast.LENGTH_SHORT); - context.activityToast.setText(busStop.id + " made a favourite"); - } - context.activityToast.show(); + Log.i(TAG, "Pressed " + busStop.id); - busStop.favourite = true; - } + SharedPreferences favouritesPreferences = context.getSharedPreferences(FAVOURITES_PREFERENCES, 0); - try { - busStopDao.update(busStop); - } catch (SQLException e) { - e.printStackTrace(); - } + if (favouritesPreferences.getBoolean(busStop.id, false)) { + favouritesPreferences.edit().remove(busStop.id).commit(); - Collections.sort(busStops, new POIFavouriteComparator()); + 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 { + 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(); + + favouritesPreferences.edit().putBoolean(busStop.id, true).commit(); + } - mapView.invalidate(); + Collections.sort(busStops, new POIFavouriteComparator(context.getSharedPreferences(FAVOURITES_PREFERENCES, 0))); - return true; - } - } - - public void refresh() { - try { - for (int i = 0; i < busStops.size(); i++) { - BusStop busStop = busStops.get(i); - busStopDao.refresh(busStop); - if (busStop.favourite) { - busStops.remove(i); - busStops.add(busStop); - } else { - busStops.set(i, busStop); + mapView.invalidate(); + + return true; } - } - } catch (SQLException e) { - e.printStackTrace(); } - } - - /** - * Replaces any bus stops that equal the argument in the overlay with the argument - * - * @param busStop - */ - public void refresh(BusStop busStop) { - for (int i = 0; i < busStops.size(); i++) { - if (busStop.equals(busStops.get(i))) { - busStops.set(i, busStop); - } - } - } - - private BusStop getSelectedItem(final MotionEvent event, final MapView mapView) { - final Projection pj = mapView.getProjection(); - final int eventX = (int) event.getX(); - final int eventY = (int) event.getY(); - - /* These objects are created to avoid construct new ones every cycle. */ - pj.fromMapPixels(eventX, eventY, mTouchScreenPoint); - - for (int i = busStops.size() - 1; i > 0; i--) { - BusStop busStop = busStops.get(i); - - pj.toPixels(busStop.point, mItemPoint); - - if (marker.getBounds().contains(mTouchScreenPoint.x - mItemPoint.x, mTouchScreenPoint.y - mItemPoint.y)) { - 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; - } + + private BusStop getSelectedItem(final MotionEvent event, final MapView mapView) { + Log.i(TAG, "Getting selected item"); + + final Projection pj = mapView.getProjection(); + final int eventX = (int) event.getX(); + final int eventY = (int) event.getY(); + + /* These objects are created to avoid construct new ones every cycle. */ + pj.fromMapPixels(eventX, eventY, mTouchScreenPoint); + + for (int i = busStops.size() - 1; i >= 0; i--) { + BusStop busStop = busStops.get(i); + + pj.toPixels(busStop.point, mItemPoint); + + if (marker.getBounds().contains(mTouchScreenPoint.x - mItemPoint.x, mTouchScreenPoint.y - mItemPoint.y)) { + 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; + } + + return busStop; } - } - if (!drawing) - continue; } + return null; + } + + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + Log.i(TAG, "Got a favourites change in the BuildingNumOverlay for key " + key); - return busStop; - } + Collections.sort(busStops, new POIFavouriteComparator(context.getSharedPreferences(FAVOURITES_PREFERENCES, 0))); } - return null; - } } |