package org.osmdroid.google.wrapper.v2;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
import org.osmdroid.api.IGeoPoint;
import org.osmdroid.api.IMap;
import org.osmdroid.api.IPosition;
import org.osmdroid.api.IProjection;
import org.osmdroid.api.Marker;
import org.osmdroid.api.OnCameraChangeListener;
import org.osmdroid.api.Polyline;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.ItemizedIconOverlay;
import org.osmdroid.views.overlay.ItemizedOverlayWithFocus;
import org.osmdroid.views.overlay.Overlay;
import org.osmdroid.views.overlay.OverlayItem;
import org.osmdroid.views.overlay.PathOverlay;
import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.view.MotionEvent;
class OsmdroidMapWrapper implements IMap {
private final MapView mMapView;
private MyLocationNewOverlay mMyLocationOverlay;
private ItemizedOverlayWithFocus<OverlayItem> mItemizedOverlay;
private HashMap<Integer, PathOverlay> mPolylines;
private OnCameraChangeListener mOnCameraChangeListener;
private static final Random random = new Random();
OsmdroidMapWrapper(final MapView aMapView) {
mMapView = aMapView;
mMapView.getOverlays().add(new Overlay(mMapView.getContext()) {
@Override
public void draw(final Canvas c, final MapView osmv, final boolean shadow) {
// nothing to draw
}
@Override
public boolean onTouchEvent(final MotionEvent aMotionEvent, final MapView aMapView) {
if (aMotionEvent.getAction() == MotionEvent.ACTION_UP) {
onCameraChange();
}
return super.onTouchEvent(aMotionEvent, aMapView);
}
});
}
@Override
public float getZoomLevel() {
return mMapView.getZoomLevel();
}
@Override
public void setZoom(final float aZoomLevel) {
mMapView.getController().setZoom((int) aZoomLevel);
}
@Override
public IGeoPoint getCenter() {
return mMapView.getMapCenter();
}
@Override
public void setCenter(final double aLatitude, final double aLongitude) {
mMapView.getController().setCenter(new GeoPoint(aLatitude, aLongitude));
onCameraChange();
}
@Override
public float getBearing() {
return -mMapView.getMapOrientation();
}
@Override
public void setBearing(final float aBearing) {
mMapView.setMapOrientation(-aBearing);
}
@Override
public void setPosition(final IPosition aPosition) {
if (aPosition.hasBearing()) {
setBearing(aPosition.getBearing());
}
if (aPosition.hasZoomLevel()) {
setZoom(aPosition.getZoomLevel());
}
setCenter(aPosition.getLatitude(), aPosition.getLongitude());
}
@Override
public boolean zoomIn() {
return mMapView.getController().zoomIn();
}
@Override
public boolean zoomOut() {
return mMapView.getController().zoomOut();
}
@Override
public void setMyLocationEnabled(final boolean aEnabled) {
if (aEnabled) {
if (mMyLocationOverlay == null) {
mMyLocationOverlay = new MyLocationNewOverlay(mMapView);
mMapView.getOverlays().add(mMyLocationOverlay);
}
mMyLocationOverlay.enableMyLocation();
}
if (!aEnabled && mMyLocationOverlay != null) {
mMyLocationOverlay.disableMyLocation();
}
}
@Override
public boolean isMyLocationEnabled() {
return mMyLocationOverlay != null && mMyLocationOverlay.isMyLocationEnabled();
}
@Override
public IProjection getProjection() {
return mMapView.getProjection();
}
@Override
public void addMarker(final Marker aMarker) {
if (mItemizedOverlay == null) {
// XXX this is a bit cumbersome. Maybe we should just do a simple ItemizedIconOverlay with null listener
mItemizedOverlay = new ItemizedOverlayWithFocus<OverlayItem>(new ArrayList<OverlayItem>(), new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
@Override
public boolean onItemSingleTapUp(final int index, final OverlayItem item) {
return false;
}
@Override
public boolean onItemLongPress(final int index, final OverlayItem item) {
return false;
}
},this.mMapView.getContext());
mItemizedOverlay.setFocusItemsOnTap(true);
mMapView.getOverlays().add(mItemizedOverlay);
}
final OverlayItem item = new OverlayItem(aMarker.title, aMarker.snippet, new GeoPoint(aMarker.latitude, aMarker.longitude));
if (aMarker.bitmap != null) {
item.setMarker(new BitmapDrawable(mMapView.getResources(), aMarker.bitmap));
} else {
if (aMarker.icon != 0) {
item.setMarker(mMapView.getResources().getDrawable(aMarker.icon));
}
}
if (aMarker.anchor == Marker.Anchor.CENTER) {
item.setMarkerHotspot(OverlayItem.HotspotPlace.CENTER);
}
mItemizedOverlay.addItem(item);
}
@Override
public int addPolyline(final Polyline aPolyline) {
if (mPolylines == null) {
mPolylines = new HashMap<Integer, PathOverlay>();
}
final PathOverlay overlay = new PathOverlay(aPolyline.color, aPolyline.width, mMapView.getContext());
overlay.addPoints(aPolyline.points);
mMapView.getOverlays().add(0, overlay); // add polyline overlay below markers, etc
final int id = random.nextInt();
mPolylines.put(id, overlay);
return id;
}
@Override
public void addPointsToPolyline(final int id, final IGeoPoint... aPoints) {
getPolyline(id).addPoints(aPoints);
}
@Override
public void clearPolyline(final int id) {
final PathOverlay polyline = getPolyline(id);
mMapView.getOverlays().remove(polyline);
mPolylines.remove(id);
}
private PathOverlay getPolyline(final int id) {
if (mPolylines == null) {
throw new IllegalArgumentException("No such id");
}
final PathOverlay polyline = mPolylines.get(id);
if (polyline == null) {
throw new IllegalArgumentException("No such id");
}
return polyline;
}
@Override
public void clear() {
if (mItemizedOverlay != null) {
mItemizedOverlay.removeAllItems();
}
if (mPolylines != null) {
for(final PathOverlay polyline : mPolylines.values()) {
mMapView.getOverlays().remove(mPolylines.remove(polyline));
}
mPolylines.clear();
}
}
@Override
public void setOnCameraChangeListener(final OnCameraChangeListener aListener) {
mOnCameraChangeListener = aListener;
}
private void onCameraChange() {
if (mOnCameraChangeListener != null) {
mOnCameraChangeListener.onCameraChange(null); // TODO set the parameter
}
}
}