2015-12-12 12:40:14 -08:00
|
|
|
|
2015-10-11 11:53:56 -07:00
|
|
|
package com.mapbox.reactnativemapboxgl;
|
|
|
|
|
|
|
|
|
|
import android.graphics.Color;
|
|
|
|
|
import android.util.Log;
|
|
|
|
|
|
2015-12-12 12:40:14 -08:00
|
|
|
import com.facebook.react.bridge.Arguments;
|
|
|
|
|
import com.facebook.react.bridge.ReactContext;
|
2015-11-15 14:12:26 -04:00
|
|
|
import com.facebook.react.bridge.ReadableArray;
|
2015-10-11 20:47:58 -07:00
|
|
|
import com.facebook.react.bridge.ReadableMap;
|
2015-10-24 22:29:40 -07:00
|
|
|
import com.facebook.react.bridge.WritableMap;
|
2015-11-15 14:12:26 -04:00
|
|
|
import com.facebook.react.uimanager.ReactProp;
|
2015-12-12 12:40:14 -08:00
|
|
|
import com.mapbox.mapboxsdk.constants.Style;
|
2015-10-11 11:53:56 -07:00
|
|
|
import com.facebook.react.uimanager.SimpleViewManager;
|
|
|
|
|
import com.facebook.react.uimanager.ThemedReactContext;
|
2015-12-12 12:40:14 -08:00
|
|
|
import com.facebook.react.uimanager.events.RCTEventEmitter;
|
2015-10-11 11:53:56 -07:00
|
|
|
import com.mapbox.mapboxsdk.annotations.MarkerOptions;
|
|
|
|
|
import com.mapbox.mapboxsdk.annotations.PolygonOptions;
|
|
|
|
|
import com.mapbox.mapboxsdk.annotations.PolylineOptions;
|
2015-12-12 12:40:14 -08:00
|
|
|
import com.mapbox.mapboxsdk.constants.MyLocationTracking;
|
2015-10-11 11:53:56 -07:00
|
|
|
import com.mapbox.mapboxsdk.geometry.LatLng;
|
2015-12-12 12:40:14 -08:00
|
|
|
import com.mapbox.mapboxsdk.views.MapView;
|
2015-10-11 11:53:56 -07:00
|
|
|
|
2015-11-15 14:12:26 -04:00
|
|
|
import javax.annotation.Nullable;
|
2015-10-31 10:19:55 -07:00
|
|
|
|
2015-10-11 11:53:56 -07:00
|
|
|
public class ReactNativeMapboxGLManager extends SimpleViewManager<MapView> {
|
|
|
|
|
public static final String REACT_CLASS = "RCTMapbox";
|
|
|
|
|
|
|
|
|
|
public static final String PROP_ACCESS_TOKEN = "accessToken";
|
|
|
|
|
public static final String PROP_ANNOTATIONS = "annotations";
|
|
|
|
|
public static final String PROP_CENTER_COORDINATE = "centerCoordinate";
|
2015-12-12 12:40:14 -08:00
|
|
|
public static final String PROP_CENTER_COORDINATE_ZOOM = "centerCoordinateZoom";
|
2015-10-11 11:53:56 -07:00
|
|
|
public static final String PROP_DEBUG_ACTIVE = "debugActive";
|
|
|
|
|
public static final String PROP_DIRECTION = "direction";
|
2015-10-24 22:29:40 -07:00
|
|
|
public static final String PROP_ONREGIONCHANGE = "onRegionChange";
|
2015-12-12 12:40:14 -08:00
|
|
|
public static final String PROP_ONUSER_LOCATION_CHANGE = "onUserLocationChange";
|
2015-10-11 11:53:56 -07:00
|
|
|
public static final String PROP_ROTATION_ENABLED = "rotationEnabled";
|
|
|
|
|
public static final String PROP_SCROLL_ENABLED = "scrollEnabled";
|
2015-10-11 20:47:58 -07:00
|
|
|
public static final String PROP_USER_LOCATON = "showsUserLocation";
|
2015-10-11 11:53:56 -07:00
|
|
|
public static final String PROP_STYLE_URL = "styleUrl";
|
2015-10-11 20:47:58 -07:00
|
|
|
public static final String PROP_USER_TRACKING_MODE = "UserLocationTrackingMode";
|
2015-10-11 11:53:56 -07:00
|
|
|
public static final String PROP_ZOOM_ENABLED = "zoomEnabled";
|
|
|
|
|
public static final String PROP_ZOOM_LEVEL = "zoomLevel";
|
2015-12-12 12:40:14 -08:00
|
|
|
public static final String PROP_REMOVE_ALL_ANNOTATIONS = "removeAllAnnotations";
|
|
|
|
|
public static final String PROP_SET_TILT = "tilt";
|
|
|
|
|
private MapView mapView;
|
|
|
|
|
|
2015-10-11 11:53:56 -07:00
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public String getName() {
|
|
|
|
|
return REACT_CLASS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public MapView createViewInstance(ThemedReactContext context) {
|
2015-12-12 12:40:14 -08:00
|
|
|
mapView = new MapView(context, "pk.foo");
|
|
|
|
|
mapView.onCreate(null);
|
|
|
|
|
return mapView;
|
2015-10-11 11:53:56 -07:00
|
|
|
}
|
|
|
|
|
|
2015-11-15 14:12:26 -04:00
|
|
|
@ReactProp(name = PROP_ACCESS_TOKEN)
|
|
|
|
|
public void setAccessToken(MapView view, @Nullable String value) {
|
|
|
|
|
if (value == null || value.isEmpty()) {
|
|
|
|
|
Log.e(REACT_CLASS, "Error: No access token provided");
|
2015-10-15 16:05:19 -07:00
|
|
|
} else {
|
2015-11-15 14:12:26 -04:00
|
|
|
view.setAccessToken(value);
|
2015-10-11 11:53:56 -07:00
|
|
|
}
|
2015-11-15 14:12:26 -04:00
|
|
|
}
|
|
|
|
|
|
2015-12-12 12:40:14 -08:00
|
|
|
@ReactProp(name = PROP_REMOVE_ALL_ANNOTATIONS)
|
|
|
|
|
public void removeAllAnnotations(MapView view, @Nullable Boolean placeHolder) {
|
|
|
|
|
view.removeAllAnnotations();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ReactProp(name = PROP_SET_TILT)
|
|
|
|
|
public void setTilt(MapView view, @Nullable double pitch) {
|
|
|
|
|
mapView.setTilt(pitch, 1L);
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-15 14:12:26 -04:00
|
|
|
@ReactProp(name = PROP_ANNOTATIONS)
|
|
|
|
|
public void setAnnotations(MapView view, @Nullable ReadableArray value) {
|
|
|
|
|
if (value == null || value.size() < 1) {
|
|
|
|
|
Log.e(REACT_CLASS, "Error: No annotations");
|
|
|
|
|
} else {
|
|
|
|
|
int size = value.size();
|
2015-10-11 11:53:56 -07:00
|
|
|
for (int i = 0; i < size; i++) {
|
2015-11-15 14:12:26 -04:00
|
|
|
ReadableMap annotation = value.getMap(i);
|
2015-10-11 11:53:56 -07:00
|
|
|
String type = annotation.getString("type");
|
|
|
|
|
if (type.equals("point")) {
|
|
|
|
|
double latitude = annotation.getArray("coordinates").getDouble(0);
|
|
|
|
|
double longitude = annotation.getArray("coordinates").getDouble(1);
|
|
|
|
|
LatLng markerCenter = new LatLng(latitude, longitude);
|
|
|
|
|
MarkerOptions marker = new MarkerOptions();
|
|
|
|
|
marker.position(markerCenter);
|
2015-10-11 20:47:58 -07:00
|
|
|
if (annotation.hasKey("title")) {
|
|
|
|
|
String title = annotation.getString("title");
|
|
|
|
|
marker.title(title);
|
|
|
|
|
}
|
2015-10-12 18:05:39 -07:00
|
|
|
if (annotation.hasKey("subtitle")) {
|
|
|
|
|
String subtitle = annotation.getString("subtitle");
|
2015-10-11 20:47:58 -07:00
|
|
|
marker.snippet(subtitle);
|
|
|
|
|
}
|
2015-10-11 11:53:56 -07:00
|
|
|
view.addMarker(marker);
|
|
|
|
|
} else if (type.equals("polyline")) {
|
|
|
|
|
int coordSize = annotation.getArray("coordinates").size();
|
|
|
|
|
PolylineOptions polyline = new PolylineOptions();
|
|
|
|
|
for (int p = 0; p < coordSize; p++) {
|
|
|
|
|
double latitude = annotation.getArray("coordinates").getArray(p).getDouble(0);
|
|
|
|
|
double longitude = annotation.getArray("coordinates").getArray(p).getDouble(1);
|
|
|
|
|
polyline.add(new LatLng(latitude, longitude));
|
|
|
|
|
}
|
2015-10-11 20:47:58 -07:00
|
|
|
if (annotation.hasKey("alpha")) {
|
|
|
|
|
double strokeAlpha = annotation.getDouble("alpha");
|
|
|
|
|
polyline.alpha((float) strokeAlpha);
|
|
|
|
|
}
|
|
|
|
|
if (annotation.hasKey("strokeColor")) {
|
|
|
|
|
int strokeColor = Color.parseColor(annotation.getString("strokeColor"));
|
|
|
|
|
polyline.color(strokeColor);
|
|
|
|
|
}
|
|
|
|
|
if (annotation.hasKey("strokeWidth")) {
|
|
|
|
|
float strokeWidth = annotation.getInt("strokeWidth");
|
|
|
|
|
polyline.width(strokeWidth);
|
|
|
|
|
}
|
2015-10-11 11:53:56 -07:00
|
|
|
view.addPolyline(polyline);
|
|
|
|
|
} else if (type.equals("polygon")) {
|
|
|
|
|
int coordSize = annotation.getArray("coordinates").size();
|
|
|
|
|
PolygonOptions polygon = new PolygonOptions();
|
|
|
|
|
for (int p = 0; p < coordSize; p++) {
|
|
|
|
|
double latitude = annotation.getArray("coordinates").getArray(p).getDouble(0);
|
|
|
|
|
double longitude = annotation.getArray("coordinates").getArray(p).getDouble(1);
|
|
|
|
|
polygon.add(new LatLng(latitude, longitude));
|
|
|
|
|
}
|
2015-10-11 20:47:58 -07:00
|
|
|
if (annotation.hasKey("alpha")) {
|
|
|
|
|
double fillAlpha = annotation.getDouble("alpha");
|
|
|
|
|
polygon.alpha((float) fillAlpha);
|
|
|
|
|
}
|
|
|
|
|
if (annotation.hasKey("fillColor")) {
|
|
|
|
|
int fillColor = Color.parseColor(annotation.getString("fillColor"));
|
|
|
|
|
polygon.fillColor(fillColor);
|
|
|
|
|
}
|
|
|
|
|
if (annotation.hasKey("strokeColor")) {
|
|
|
|
|
int strokeColor = Color.parseColor(annotation.getString("strokeColor"));
|
|
|
|
|
polygon.strokeColor(strokeColor);
|
|
|
|
|
}
|
2015-10-11 11:53:56 -07:00
|
|
|
view.addPolygon(polygon);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2015-11-15 14:12:26 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ReactProp(name = PROP_DEBUG_ACTIVE, defaultBoolean = false)
|
|
|
|
|
public void setDebugActive(MapView view, Boolean value) {
|
|
|
|
|
view.setDebugActive(value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ReactProp(name = PROP_DIRECTION, defaultFloat = 0f)
|
|
|
|
|
public void setDirection(MapView view, float value) {
|
2015-12-12 12:40:14 -08:00
|
|
|
view.setDirection(value, true);
|
2015-11-15 14:12:26 -04:00
|
|
|
}
|
|
|
|
|
|
2015-12-12 12:40:14 -08:00
|
|
|
@ReactProp(name = PROP_ONREGIONCHANGE, defaultBoolean = true)
|
2015-11-15 14:12:26 -04:00
|
|
|
public void onMapChanged(final MapView view, Boolean value) {
|
|
|
|
|
view.addOnMapChangedListener(new MapView.OnMapChangedListener() {
|
|
|
|
|
@Override
|
|
|
|
|
public void onMapChanged(int change) {
|
|
|
|
|
if (change == MapView.REGION_DID_CHANGE || change == MapView.REGION_DID_CHANGE_ANIMATED) {
|
|
|
|
|
WritableMap event = Arguments.createMap();
|
|
|
|
|
WritableMap location = Arguments.createMap();
|
|
|
|
|
location.putDouble("latitude", view.getCenterCoordinate().getLatitude());
|
|
|
|
|
location.putDouble("longitude", view.getCenterCoordinate().getLongitude());
|
|
|
|
|
location.putDouble("zoom", view.getZoomLevel());
|
|
|
|
|
event.putMap("src", location);
|
|
|
|
|
ReactContext reactContext = (ReactContext) view.getContext();
|
|
|
|
|
reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(view.getId(), "topChange", event);
|
2015-10-24 22:29:40 -07:00
|
|
|
}
|
2015-11-15 14:12:26 -04:00
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2015-12-12 12:40:14 -08:00
|
|
|
// @ReactProp(name = PROP_ONUSER_LOCATION_CHANGE, defaultBoolean = true)
|
|
|
|
|
// public void onUserLocationChange(final MapView view, Boolean value) {
|
|
|
|
|
// view.setOnMyLocationChangeListener(new MapView.OnMyLocationChangeListener() {
|
|
|
|
|
// @Override
|
|
|
|
|
// public void onUserLocationChange(int location) {
|
|
|
|
|
//
|
|
|
|
|
// }
|
|
|
|
|
// });
|
|
|
|
|
// }
|
|
|
|
|
|
2015-11-15 14:12:26 -04:00
|
|
|
@ReactProp(name = PROP_CENTER_COORDINATE)
|
|
|
|
|
public void setCenterCoordinate(MapView view, @Nullable ReadableMap center) {
|
|
|
|
|
if (center != null) {
|
2015-10-11 11:53:56 -07:00
|
|
|
double latitude = center.getDouble("latitude");
|
|
|
|
|
double longitude = center.getDouble("longitude");
|
|
|
|
|
view.setCenterCoordinate(new LatLng(latitude, longitude));
|
2015-11-15 14:12:26 -04:00
|
|
|
}else{
|
|
|
|
|
Log.w(REACT_CLASS, "No CenterCoordinate provided");
|
2015-10-11 11:53:56 -07:00
|
|
|
}
|
2015-11-15 14:12:26 -04:00
|
|
|
}
|
|
|
|
|
|
2015-12-12 12:40:14 -08:00
|
|
|
@ReactProp(name = PROP_CENTER_COORDINATE_ZOOM)
|
|
|
|
|
public void setCenterCoordinateZoomLevel(MapView view, @Nullable ReadableMap center) {
|
|
|
|
|
if (center != null) {
|
|
|
|
|
double latitude = center.getDouble("latitude");
|
|
|
|
|
double longitude = center.getDouble("longitude");
|
|
|
|
|
double zoom = center.getDouble("zoom");
|
|
|
|
|
view.setCenterCoordinate(new LatLng(latitude, longitude, zoom), true);
|
|
|
|
|
}else{
|
|
|
|
|
Log.w(REACT_CLASS, "No CenterCoordinate provided");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-15 14:12:26 -04:00
|
|
|
@ReactProp(name = PROP_ROTATION_ENABLED, defaultBoolean = true)
|
|
|
|
|
public void setRotateEnabled(MapView view, Boolean value) {
|
|
|
|
|
view.setRotateEnabled(value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ReactProp(name = PROP_USER_LOCATON, defaultBoolean = true)
|
|
|
|
|
public void setMyLocationEnabled(MapView view, Boolean value) {
|
|
|
|
|
view.setMyLocationEnabled(value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ReactProp(name = PROP_STYLE_URL)
|
|
|
|
|
public void setStyleUrl(MapView view, @Nullable String value) {
|
|
|
|
|
if (value != null && !value.isEmpty()) {
|
|
|
|
|
view.setStyleUrl(value);
|
|
|
|
|
}else{
|
|
|
|
|
Log.w(REACT_CLASS, "No StyleUrl provided");
|
2015-10-11 11:53:56 -07:00
|
|
|
}
|
2015-11-15 14:12:26 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ReactProp(name = PROP_USER_TRACKING_MODE)
|
|
|
|
|
public void setMyLocationTrackingMode(MapView view, @Nullable String mode) {
|
|
|
|
|
if (mode != null && !mode.isEmpty()) {
|
2015-10-24 22:29:40 -07:00
|
|
|
if (mode.equals("NONE")) {
|
2015-10-31 10:19:55 -07:00
|
|
|
view.setMyLocationTrackingMode(MyLocationTracking.TRACKING_NONE);
|
2015-10-24 22:29:40 -07:00
|
|
|
} else if (mode.equals("FOLLOW")) {
|
2015-10-31 10:19:55 -07:00
|
|
|
view.setMyLocationTrackingMode(MyLocationTracking.TRACKING_FOLLOW);
|
2015-10-24 22:29:40 -07:00
|
|
|
}
|
2015-11-15 14:12:26 -04:00
|
|
|
} else {
|
|
|
|
|
view.setMyLocationTrackingMode(MyLocationTracking.TRACKING_NONE);
|
|
|
|
|
Log.w(REACT_CLASS, "ErrorTracking mode not found. Setting to NONE.");
|
2015-10-31 10:19:55 -07:00
|
|
|
}
|
2015-11-15 14:12:26 -04:00
|
|
|
}
|
2015-10-11 11:53:56 -07:00
|
|
|
|
2015-11-15 14:12:26 -04:00
|
|
|
@ReactProp(name = PROP_ZOOM_ENABLED, defaultBoolean = true)
|
|
|
|
|
public void setZoomEnabled(MapView view, Boolean value) {
|
|
|
|
|
view.setZoomEnabled(value);
|
|
|
|
|
}
|
2015-10-24 22:29:40 -07:00
|
|
|
|
2015-11-15 14:12:26 -04:00
|
|
|
@ReactProp(name = PROP_ZOOM_LEVEL, defaultFloat = 0f)
|
|
|
|
|
public void setZoomLevel(MapView view, float value) {
|
|
|
|
|
view.setZoomLevel(value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ReactProp(name = PROP_SCROLL_ENABLED, defaultBoolean = true)
|
|
|
|
|
public void setScrollEnabled(MapView view, Boolean value) {
|
|
|
|
|
view.setScrollEnabled(value);
|
2015-10-11 20:47:58 -07:00
|
|
|
}
|
2015-12-12 12:40:14 -08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
public MapView getMapView() {
|
|
|
|
|
return mapView;
|
|
|
|
|
}
|
|
|
|
|
}
|