/*
* Copyright (c) 2017 Daimler AG / Moovel GmbH
*
* All rights reserved
*/
package com.car2go.maps.baidu;
import android.util.Log;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.car2go.maps.AnyMap;
import com.car2go.maps.CameraUpdate;
import com.car2go.maps.Projection;
import com.car2go.maps.UiSettings;
import com.car2go.maps.baidu.model.BaiduCameraUpdate;
import com.car2go.maps.baidu.model.BaiduToModelConverter;
import com.car2go.maps.baidu.model.ModelToBaiduConverter;
import com.car2go.maps.baidu.model.overlay.BaiduPolygon;
import com.car2go.maps.model.CameraPosition;
import com.car2go.maps.model.Circle;
import com.car2go.maps.model.CircleOptions;
import com.car2go.maps.model.LatLng;
import com.car2go.maps.model.Marker;
import com.car2go.maps.model.MarkerOptions;
import com.car2go.maps.model.Polygon;
import com.car2go.maps.model.PolygonOptions;
import com.car2go.maps.model.Polyline;
import com.car2go.maps.model.PolylineOptions;
/**
* Implementation of {@link AnyMap} which works with Open Street Maps
*/
public class BaiduMap implements AnyMap {
private final MapView mapView;
private final com.baidu.mapapi.map.BaiduMap map;
private final CameraUpdateController cameraUpdateController;
BaiduMap(MapView mapView) {
this.mapView = mapView;
map = mapView.getMap();
map.getUiSettings().setCompassEnabled(false);
map.getUiSettings().setRotateGesturesEnabled(false);
cameraUpdateController = new CameraUpdateController(map);
}
@Override
public void moveCamera(CameraUpdate cameraUpdate) {
cameraUpdateController.animateMapStatus((BaiduCameraUpdate) cameraUpdate, false, null);
}
@Override
public void animateCamera(CameraUpdate cameraUpdate) {
cameraUpdateController.animateMapStatus((BaiduCameraUpdate) cameraUpdate, true, null);
}
@Override
public void animateCamera(CameraUpdate cameraUpdate, CancelableCallback callback) {
cameraUpdateController.animateMapStatus((BaiduCameraUpdate) cameraUpdate, true, null);
callback.onFinish();
}
@Override
public void animateCamera(CameraUpdate cameraUpdate, int duration, CancelableCallback callback) {
cameraUpdateController.animateMapStatus((BaiduCameraUpdate) cameraUpdate, true, duration);
callback.onFinish();
}
@Override
public CameraPosition getCameraPosition() {
return cameraUpdateController.currentCameraPosition();
}
@Override
public Projection getProjection() {
return BaiduToModelConverter.convert(map.getMapStatus().bound);
}
@Override
public Marker addMarker(MarkerOptions options) {
com.baidu.mapapi.map.Marker marker = (com.baidu.mapapi.map.Marker) map.addOverlay(ModelToBaiduConverter.convert(options));
return BaiduToModelConverter.convert(marker);
}
@Override
public Circle addCircle(CircleOptions options) {
com.baidu.mapapi.map.Circle circle = (com.baidu.mapapi.map.Circle) map.addOverlay(ModelToBaiduConverter.convert(options));
return BaiduToModelConverter.convert(circle);
}
@Override
public Polygon addPolygon(PolygonOptions options) {
if (options.isOutsider()) {
// return empty polygon
// it is used for holes later
return new BaiduPolygon(map);
}
com.baidu.mapapi.map.Polygon polygon = (com.baidu.mapapi.map.Polygon) map.addOverlay(ModelToBaiduConverter.convert(options));
// draw it on top of "outsider" polygon
polygon.setZIndex(1);
return BaiduToModelConverter.convert(map, polygon);
}
@Override
public Polyline addPolyline(final PolylineOptions options) {
com.baidu.mapapi.map.Polyline polyline = (com.baidu.mapapi.map.Polyline) map.addOverlay(ModelToBaiduConverter.convert(options));
return BaiduToModelConverter.convert(polyline);
}
@Override
public UiSettings getUiSettings() {
return new UiSettings() {
@Override
public void setAllGesturesEnabled(boolean enabled) {
map.getUiSettings().setAllGesturesEnabled(enabled);
}
@Override
public void setMyLocationButtonEnabled(boolean enabled) {
// Do nothing
}
@Override
public void setMapToolbarEnabled(boolean enabled) {
// Do nothing
}
};
}
@Override
public void setOnMapClickListener(final OnMapClickListener listener) {
map.setOnMapClickListener(new com.baidu.mapapi.map.BaiduMap.OnMapClickListener() {
@Override
public void onMapClick(com.baidu.mapapi.model.LatLng latLng) {
listener.onMapClick(BaiduToModelConverter.convert(latLng));
}
@Override
public boolean onMapPoiClick(MapPoi mapPoi) {
return false;
}
});
}
@Override
public void setOnMapLongClickListener(final OnMapLongClickListener listener) {
map.setOnMapLongClickListener(new com.baidu.mapapi.map.BaiduMap.OnMapLongClickListener() {
@Override
public void onMapLongClick(com.baidu.mapapi.model.LatLng latLng) {
listener.onMapLongClick(BaiduToModelConverter.convert(latLng));
}
});
}
@Override
public void setOnCameraChangeListener(final OnCameraChangeListener listener) {
map.setOnMapStatusChangeListener(new com.baidu.mapapi.map.BaiduMap.OnMapStatusChangeListener() {
@Override
public void onMapStatusChangeStart(MapStatus mapStatus) {
listener.onCameraChange(BaiduToModelConverter.convert(mapStatus));
}
@Override
public void onMapStatusChange(MapStatus mapStatus) {
listener.onCameraChange(BaiduToModelConverter.convert(mapStatus));
}
@Override
public void onMapStatusChangeFinish(MapStatus mapStatus) {
listener.onCameraChange(BaiduToModelConverter.convert(mapStatus));
}
});
}
@Override
public void setOnMarkerClickListener(final OnMarkerClickListener listener) {
map.setOnMarkerClickListener(new com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(com.baidu.mapapi.map.Marker marker) {
listener.onMarkerClick(BaiduToModelConverter.convert(marker));
return true;
}
});
}
@Override
public void setInfoWindowAdapter(InfoWindowAdapter adapter) {
// Do nothing
}
@Override
public void setTrafficEnabled(boolean enabled) {
map.setTrafficEnabled(enabled);
}
@Override
public void setMyLocationEnabled(boolean enabled) {
map.setMyLocationEnabled(enabled);
}
@Override
public void setMapType(Type type) {
switch (type) {
case SATELLITE:
map.setMapType(com.baidu.mapapi.map.BaiduMap.MAP_TYPE_SATELLITE);
break;
case NORMAL:
map.setMapType(com.baidu.mapapi.map.BaiduMap.MAP_TYPE_NORMAL);
break;
default:
Log.d(BaiduMap.class.getSimpleName(), "Could not set unknown MapType " + type);
}
}
@Override
public void setPadding(int left, int top, int right, int bottom) {
mapView.setPadding(left, top, right, bottom);
}
/**
* @return native MapView reference
*/
MapView getNativeMapView() {
return mapView;
}
@Override
public void onUserLocationChanged(LatLng location, float accuracy) {
map.setMyLocationData(new MyLocationData.Builder().latitude(location.latitude).longitude(location.longitude).accuracy(accuracy).build());
}
}