/**
* Copyright 2010 Mark Wyszomierski
*/
package com.joelapenna.foursquared.maps;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.OverlayItem;
import com.joelapenna.foursquare.types.Venue;
import com.joelapenna.foursquared.FoursquaredSettings;
import com.joelapenna.foursquared.R;
import com.joelapenna.foursquared.util.GeoUtils;
import com.joelapenna.foursquared.util.RemoteResourceManager;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import java.io.IOException;
/**
* @date June 30, 2010
* @author Mark Wyszomierski (markww@gmail.com)
*/
public class VenueItemizedOverlayWithIcons extends BaseGroupItemizedOverlay<Venue> {
public static final String TAG = "VenueItemizedOverlay2";
public static final boolean DEBUG = FoursquaredSettings.DEBUG;
private Context mContext;
private RemoteResourceManager mRrm;
private OverlayItem mLastSelected;
private VenueItemizedOverlayTapListener mTapListener;
public VenueItemizedOverlayWithIcons(Context context, RemoteResourceManager rrm,
Drawable defaultMarker, VenueItemizedOverlayTapListener tapListener) {
super(defaultMarker);
mContext = context;
mRrm = rrm;
mTapListener = tapListener;
mLastSelected = null;
}
@Override
protected OverlayItem createItem(int i) {
Venue venue = (Venue)group.get(i);
GeoPoint point = GeoUtils.stringLocationToGeoPoint(
venue.getGeolat(), venue.getGeolong());
return new VenueOverlayItem(point, venue, mContext, mRrm);
}
@Override
public boolean onTap(GeoPoint p, MapView mapView) {
if (mTapListener != null) {
mTapListener.onTap(p, mapView);
}
return super.onTap(p, mapView);
}
@Override
public boolean onTap(int i) {
if (mTapListener != null) {
mTapListener.onTap(getItem(i), mLastSelected, group.get(i));
}
mLastSelected = getItem(i);
return true;
}
@Override
public void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow) {
super.draw(canvas, mapView, false);
}
public static class VenueOverlayItem extends OverlayItem {
private Venue mVenue;
public VenueOverlayItem(GeoPoint point, Venue venue, Context context,
RemoteResourceManager rrm) {
super(point, venue.getName(), venue.getAddress());
mVenue = venue;
constructPinDrawable(venue, context, rrm);
}
public Venue getVenue() {
return mVenue;
}
private static int dddi(int dd, float screenDensity) {
return (int)(dd * screenDensity + 0.5f);
}
private void constructPinDrawable(Venue venue, Context context, RemoteResourceManager rrm) {
float screenDensity = context.getResources().getDisplayMetrics().density;
int cx = dddi(32, screenDensity);
int cy = dddi(32, screenDensity);
Bitmap bmp = Bitmap.createBitmap(cx, cy, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bmp);
Paint paint = new Paint();
boolean laodedPin = false;
if (venue.getCategory() != null) {
Uri photoUri = Uri.parse(venue.getCategory().getIconUrl());
try {
Bitmap bitmap = BitmapFactory.decodeStream(rrm.getInputStream(photoUri));
canvas.drawBitmap(bitmap, new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()),
new Rect(0, 0, cx, cy), paint);
laodedPin = true;
} catch (IOException e) {
}
}
if (!laodedPin) {
Drawable drw = context.getResources().getDrawable(R.drawable.category_none);
drw.draw(canvas);
}
Drawable bd = new BitmapDrawable(bmp);
bd.setBounds(-cx / 2, -cy, cx / 2, 0);
setMarker(bd);
}
}
public interface VenueItemizedOverlayTapListener
{
public void onTap(OverlayItem itemSelected, OverlayItem itemLastSelected, Venue venue);
public void onTap(GeoPoint p, MapView mapView);
}
}