Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions .eslintignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
/plugin/build
/example
/lib
plugin
example
lib
__tests__
ios/RCTMGL/index.d.ts
2 changes: 1 addition & 1 deletion .eslintrc.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module.exports = {
root: true,
parser: 'babel-eslint',
parser: '@babel/eslint-parser',
plugins: ['react', 'react-native', 'fp', 'import'],
env: {
jest: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,10 @@ public String getString(String key) {
return mPayload.getString(key);
}

public String getEnumName() {
return mPayload.getString("value").toUpperCase().replaceAll("-","_");
}

public Double getDouble(String key) {
return mPayload.getDouble(key);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,30 +1,34 @@
package com.mapbox.rctmgl.components.mapview

import android.content.Context
import com.mapbox.maps.extension.style.layers.getLayer
import com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager
import com.mapbox.maps.plugin.annotation.AnnotationPlugin
import com.mapbox.maps.plugin.annotation.generated.PointAnnotation
import com.mapbox.android.gestures.MoveGestureDetector
import com.mapbox.rctmgl.components.styles.terrain.RCTMGLTerrain
import com.mapbox.maps.plugin.delegates.listeners.OnMapLoadErrorListener
import com.mapbox.maps.extension.observable.eventdata.MapLoadingErrorEventData
import android.graphics.PointF
import com.facebook.react.bridge.WritableMap
import com.facebook.react.bridge.WritableNativeMap
import android.graphics.BitmapFactory
import android.graphics.PointF
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import com.facebook.react.bridge.WritableArray
import com.facebook.react.bridge.WritableMap
import com.facebook.react.bridge.WritableNativeArray
import com.facebook.react.bridge.WritableNativeMap
import com.mapbox.android.gestures.MoveGestureDetector
import com.mapbox.geojson.Feature
import com.mapbox.geojson.Point
import com.mapbox.maps.*
import com.mapbox.maps.plugin.delegates.listeners.OnMapLoadedListener
import com.mapbox.maps.extension.observable.eventdata.MapLoadingErrorEventData
import com.mapbox.maps.extension.style.layers.Layer
import com.mapbox.maps.extension.style.layers.generated.*
import com.mapbox.maps.extension.style.layers.getLayer
import com.mapbox.maps.extension.style.utils.unwrap
import com.mapbox.maps.extension.style.layers.properties.generated.Visibility
import com.mapbox.maps.plugin.annotation.annotations
import com.mapbox.maps.plugin.annotation.generated.OnPointAnnotationClickListener
import com.mapbox.maps.plugin.annotation.generated.PointAnnotation
import com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager
import com.mapbox.maps.plugin.annotation.generated.createPointAnnotationManager
import com.mapbox.maps.plugin.compass.compass
import com.mapbox.maps.plugin.delegates.listeners.OnCameraChangeListener
import com.mapbox.maps.plugin.delegates.listeners.OnMapIdleListener
import com.mapbox.maps.plugin.delegates.listeners.OnMapLoadErrorListener
import com.mapbox.maps.plugin.delegates.listeners.OnMapLoadedListener
import com.mapbox.maps.plugin.gestures.*
import com.mapbox.rctmgl.R
import com.mapbox.rctmgl.components.AbstractMapFeature
Expand All @@ -38,6 +42,7 @@ import com.mapbox.rctmgl.components.mapview.helpers.CameraChangeTracker
import com.mapbox.rctmgl.components.styles.layers.RCTLayer
import com.mapbox.rctmgl.components.styles.light.RCTMGLLight
import com.mapbox.rctmgl.components.styles.sources.RCTSource
import com.mapbox.rctmgl.components.styles.terrain.RCTMGLTerrain
import com.mapbox.rctmgl.events.AndroidCallbackEvent
import com.mapbox.rctmgl.events.IEvent
import com.mapbox.rctmgl.events.MapChangeEvent
Expand All @@ -46,11 +51,12 @@ import com.mapbox.rctmgl.events.constants.EventTypes
import com.mapbox.rctmgl.utils.GeoJSONUtils
import com.mapbox.rctmgl.utils.LatLng
import com.mapbox.rctmgl.utils.Logger
import com.mapbox.rctmgl.utils.extensions.toReadableArray
import org.json.JSONException
import org.json.JSONObject
import java.lang.Exception
import java.util.*


open class RCTMGLMapView(private val mContext: Context, var mManager: RCTMGLMapViewManager /*, MapboxMapOptions options*/) : MapView(mContext), OnMapClickListener {
private val mSources: MutableMap<String, RCTSource<*>>
private val mImages: MutableList<RCTMGLImages>
Expand Down Expand Up @@ -106,6 +112,14 @@ open class RCTMGLMapView(private val mContext: Context, var mManager: RCTMGLMapV
})
val _this = this

map.addOnCameraChangeListener(OnCameraChangeListener { cameraChangedEventData ->
handleMapChangedEvent(EventTypes.REGION_IS_CHANGING)
})

map.addOnMapIdleListener(OnMapIdleListener { mapIdleEventData ->
sendRegionDidChangeEvent()
})

val gesturesPlugin: GesturesPlugin = this.gestures
gesturesPlugin.addOnMapClickListener(_this)
gesturesPlugin.addOnMoveListener(object : OnMoveListener {
Expand Down Expand Up @@ -620,6 +634,60 @@ open class RCTMGLMapView(private val mContext: Context, var mManager: RCTMGLMapV
// }
//}

// region Callbacks

fun getCenter(callbackID: String?) {
var center = mMap!!.cameraState!!.center
val array: WritableArray = WritableNativeArray()
array.pushDouble(center.longitude())
array.pushDouble(center.latitude())
val payload: WritableMap = WritableNativeMap()
payload.putArray("center", array)

val event = AndroidCallbackEvent(this, callbackID, payload)
mManager.handleEvent(event)
}

fun getZoom(callbackID: String?) {
var zoom = mMap!!.cameraState!!.zoom

val payload: WritableMap = WritableNativeMap()
payload.putDouble("zoom", zoom)

val event = AndroidCallbackEvent(this, callbackID, payload)
mManager.handleEvent(event)
}

private fun getDisplayDensity(): Float {
return mContext.resources.displayMetrics.density
}

fun getCoordinateFromView(callbackID: String?, pixel: ScreenCoordinate) {
val density: Float = getDisplayDensity()
val screenCoordinate = ScreenCoordinate(pixel.x * density, pixel.y * density)

val coordinate = mMap!!.coordinateForPixel(pixel)

val payload: WritableMap = WritableNativeMap()
payload.putArray("coordinateFromView", coordinate.toReadableArray())

val event = AndroidCallbackEvent(this, callbackID, payload)
mManager.handleEvent(event)
}

fun getPointInView(callbackID: String?, coordinate: Point) {
val point = mMap!!.pixelForCoordinate(coordinate)

val array: WritableArray = WritableNativeArray()
array.pushDouble(point.x)
array.pushDouble(point.y)
val payload: WritableMap = WritableNativeMap()
payload.putArray("pointInView", array)

val event = AndroidCallbackEvent(this, callbackID, payload)
mManager.handleEvent(event)
}

fun queryTerrainElevation(callbackID: String?, longitude: Double, latitude: Double) {
val result = mMap?.getElevation(Point.fromLngLat(longitude, latitude))
val payload: WritableMap = WritableNativeMap()
Expand All @@ -630,6 +698,51 @@ open class RCTMGLMapView(private val mContext: Context, var mManager: RCTMGLMapV
}
}

fun match(layer: Layer, sourceId:String, sourceLayerId: String?) : Boolean {
fun match(actSourceId: String, actSourceLayerId: String?) : Boolean {
return (actSourceId == sourceId && ((sourceLayerId == null) || (sourceLayerId == actSourceLayerId)))
}
return when (layer) {
is BackgroundLayer -> false
is LocationIndicatorLayer -> false
is SkyLayer -> false
is CircleLayer -> match(layer.sourceId, layer.sourceLayer)
is FillExtrusionLayer -> match(layer.sourceId, layer.sourceLayer)
is FillLayer -> match(layer.sourceId, layer.sourceLayer)
is HeatmapLayer -> match(layer.sourceId, layer.sourceLayer)
is HillshadeLayer -> match(layer.sourceId, layer.sourceLayer)
is LineLayer -> match(layer.sourceId, layer.sourceLayer)
is RasterLayer -> match(layer.sourceId, layer.sourceLayer)
is SymbolLayer -> match(layer.sourceId, layer.sourceLayer)
else -> {
logE("MapView", "Layer type: $layer.type unknown.")
false
}
}
}

fun setSourceVisibility(
visible: Boolean,
sourceId: String,
sourceLayerId: String?
) {
if (mMap == null) {
Logger.e("MapView", "setSourceVisibility, map is null")
return
}
val style = mMap!!.getStyle();
style!!.styleLayers.forEach {
val layer = style.getLayer(it.id)
if ((layer != null) && match(layer, sourceId, sourceLayerId)) {
layer.visibility(
if (visible) Visibility.VISIBLE else Visibility.NONE
)
}
}
}

// endregion

companion object {
const val LOG_TAG = "RCTMGLMapView"
}
Expand Down
Loading