package edu.mit.mobile.android.locast.ver2.itineraries;
import android.database.ContentObserver;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;
import edu.mit.mobile.android.locast.data.Locatable;
import edu.mit.mobile.android.locast.maps.MapsUtils;
abstract public class LocatableItemIconOverlay extends ItemizedOverlay<OverlayItem> {
protected Cursor mLocatableItems;
private int mLatCol, mLonCol;
public static final String[] LOCATABLE_ITEM_PROJECTION = {Locatable.Columns._LATITUDE, Locatable.Columns._LONGITUDE};
private final ContentObserver mContentObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
populate();
}
};
public LocatableItemIconOverlay(Drawable marker) {
this(null, marker);
}
public LocatableItemIconOverlay(Cursor items, Drawable marker) {
super(marker);
mLocatableItems = items;
populate();
}
public static Drawable boundCenterBottom(Drawable drawable){
// why isn't this visible?
return ItemizedOverlay.boundCenterBottom(drawable);
}
public void swapCursor(Cursor locatableItems){
mLocatableItems = locatableItems;
updateCursorCols();
populate();
}
public void onPause(){
if (mLocatableItems != null){
mLocatableItems.unregisterContentObserver(mContentObserver);
}
}
public void onResume(){
if (mLocatableItems != null){
mLocatableItems.registerContentObserver(mContentObserver);
}
}
public void changeCursor(Cursor locatableItems){
final Cursor oldCursor = mLocatableItems;
mLocatableItems = locatableItems;
updateCursorCols();
populate();
if (oldCursor != null && !oldCursor.isClosed()){
oldCursor.close();
}
}
protected void updateCursorCols(){
if (mLocatableItems != null){
//mItemList.clear();
mLatCol = mLocatableItems.getColumnIndex(Locatable.Columns._LATITUDE);
mLonCol = mLocatableItems.getColumnIndex(Locatable.Columns._LONGITUDE);
}
}
protected GeoPoint getItemLocation(Cursor item){
return MapsUtils.getGeoPoint(item, mLatCol, mLonCol);
}
/**
* this does not work properly when crossing -180/180 boundaries.
*
* @see com.google.android.maps.ItemizedOverlay#getCenter()
*/
@Override
public GeoPoint getCenter() {
int maxLat, minLat;
int maxLon, minLon;
mLocatableItems.moveToFirst();
final double[] latLon = new double[2];
Locatable.toLocationArray(mLocatableItems, mLatCol, mLonCol, latLon);
maxLat = minLat = (int)(latLon[0] * 1E6);
maxLon = minLon = (int)(latLon[1] * 1E6);
mLocatableItems.moveToNext();
for (; !mLocatableItems.isAfterLast(); mLocatableItems.moveToNext()){
Locatable.toLocationArray(mLocatableItems, mLatCol, mLonCol, latLon);
maxLat = Math.max(maxLat, (int)(latLon[0] * 1E6));
minLat = Math.min(minLat, (int)(latLon[0] * 1E6));
maxLon = Math.max(maxLon, (int)(latLon[1] * 1E6));
minLon = Math.min(minLon, (int)(latLon[1] * 1E6));
}
return new GeoPoint((maxLat - minLat)/2 + minLat, (maxLon - minLon)/2 + minLon);
}
@Override
public int size() {
if (mLocatableItems == null){
return 0;
}
return mLocatableItems.getCount();
}
}