Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
25 changes: 15 additions & 10 deletions android/src/main/java/com/rnmapbox/rnmbx/RNMBXPackage.kt
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ import com.rnmapbox.rnmbx.utils.ViewTagResolver
class RNMBXPackage : TurboReactPackage() {

var viewTagResolver: ViewTagResolver? = null
fun getViewTagResolver(context: ReactApplicationContext) : ViewTagResolver {
fun getViewTagResolver(context: ReactApplicationContext, module: String) : ViewTagResolver {
val viewTagResolver = viewTagResolver
if (viewTagResolver == null) {
val result = ViewTagResolver(context)
Expand All @@ -61,6 +61,10 @@ class RNMBXPackage : TurboReactPackage() {
return viewTagResolver
}

fun resetViewTagResolver() {
viewTagResolver = null
}

override fun getModule(
s: String,
reactApplicationContext: ReactApplicationContext
Expand All @@ -71,11 +75,11 @@ class RNMBXPackage : TurboReactPackage() {
RNMBXOfflineModule.REACT_CLASS -> return RNMBXOfflineModule(reactApplicationContext)
RNMBXSnapshotModule.REACT_CLASS -> return RNMBXSnapshotModule(reactApplicationContext)
RNMBXLogging.REACT_CLASS -> return RNMBXLogging(reactApplicationContext)
NativeMapViewModule.NAME -> return NativeMapViewModule(reactApplicationContext, getViewTagResolver(reactApplicationContext))
RNMBXViewportModule.NAME -> return RNMBXViewportModule(reactApplicationContext, getViewTagResolver(reactApplicationContext))
RNMBXShapeSourceModule.NAME -> return RNMBXShapeSourceModule(reactApplicationContext, getViewTagResolver(reactApplicationContext))
RNMBXImageModule.NAME -> return RNMBXImageModule(reactApplicationContext, getViewTagResolver(reactApplicationContext))
RNMBXPointAnnotationModule.NAME -> return RNMBXPointAnnotationModule(reactApplicationContext, getViewTagResolver(reactApplicationContext))
NativeMapViewModule.NAME -> return NativeMapViewModule(reactApplicationContext, getViewTagResolver(reactApplicationContext, s))
RNMBXViewportModule.NAME -> return RNMBXViewportModule(reactApplicationContext, getViewTagResolver(reactApplicationContext, s))
RNMBXShapeSourceModule.NAME -> return RNMBXShapeSourceModule(reactApplicationContext, getViewTagResolver(reactApplicationContext, s))
RNMBXImageModule.NAME -> return RNMBXImageModule(reactApplicationContext, getViewTagResolver(reactApplicationContext, s))
RNMBXPointAnnotationModule.NAME -> return RNMBXPointAnnotationModule(reactApplicationContext, getViewTagResolver(reactApplicationContext, s))
}
return null
}
Expand All @@ -91,26 +95,26 @@ class RNMBXPackage : TurboReactPackage() {
// components
managers.add(RNMBXCameraManager(reactApplicationContext))
managers.add(RNMBXViewportManager(reactApplicationContext))
managers.add(RNMBXMapViewManager(reactApplicationContext, getViewTagResolver(reactApplicationContext)))
managers.add(RNMBXMapViewManager(reactApplicationContext, getViewTagResolver(reactApplicationContext, "RNMBXMapViewManager")))
managers.add(RNMBXStyleImportManager(reactApplicationContext))

// annotations
managers.add(RNMBXMarkerViewManager(reactApplicationContext))
managers.add(RNMBXPointAnnotationManager(reactApplicationContext, getViewTagResolver(reactApplicationContext)))
managers.add(RNMBXPointAnnotationManager(reactApplicationContext, getViewTagResolver(reactApplicationContext, "RNMBXPointAnnotationManager")))
managers.add(RNMBXCalloutManager())
managers.add(RNMBXNativeUserLocationManager())
managers.add(RNMBXCustomLocationProviderManager())

// sources
managers.add(RNMBXVectorSourceManager(reactApplicationContext))
managers.add(RNMBXShapeSourceManager(reactApplicationContext, getViewTagResolver(reactApplicationContext)))
managers.add(RNMBXShapeSourceManager(reactApplicationContext, getViewTagResolver(reactApplicationContext, "RNMBXShapeSourceManager")))
managers.add(RNMBXRasterDemSourceManager(reactApplicationContext))
managers.add(RNMBXRasterSourceManager(reactApplicationContext))
managers.add(RNMBXImageSourceManager())

// images
managers.add(RNMBXImagesManager(reactApplicationContext))
managers.add(RNMBXImageManager(reactApplicationContext, getViewTagResolver(reactApplicationContext)))
managers.add(RNMBXImageManager(reactApplicationContext, getViewTagResolver(reactApplicationContext, "RNMBXImageManager")))

// layers
managers.add(RNMBXFillLayerManager())
Expand All @@ -129,6 +133,7 @@ class RNMBXPackage : TurboReactPackage() {
}

override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
resetViewTagResolver()
return ReactModuleInfoProvider {
val moduleInfos: MutableMap<String, ReactModuleInfo> = HashMap()
val isTurboModule = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.Callback
import com.facebook.react.bridge.Promise
import com.facebook.react.bridge.ReadableMap
import com.facebook.react.bridge.ReadableType
import com.facebook.react.bridge.UIManager
import com.facebook.react.bridge.WritableMap
import com.facebook.react.uimanager.UIManagerHelper
Expand All @@ -27,12 +28,13 @@ import com.rnmapbox.rnmbx.components.AbstractMapFeature
import com.rnmapbox.rnmbx.components.mapview.RNMBXMapView
import com.rnmapbox.rnmbx.modules.RNMBXLogging
import com.rnmapbox.rnmbx.utils.Logger
import com.rnmapbox.rnmbx.utils.extensions.getAndLogIfNotBoolean
import com.rnmapbox.rnmbx.utils.extensions.getAndLogIfNotDouble
import com.rnmapbox.rnmbx.utils.extensions.getAndLogIfNotString
import com.rnmapbox.rnmbx.utils.extensions.*
import com.rnmapbox.rnmbx.utils.writableMapOf

import com.facebook.react.uimanager.events.Event
import com.mapbox.maps.EdgeInsets
import com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateBearing
import com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions
import com.rnmapbox.rnmbx.events.constants.EventKeys

class BaseEvent(
Expand Down Expand Up @@ -116,9 +118,11 @@ mContext
applyHasStatusChanged(mapView.mapView)
}

fun toState(viewport: ViewportPlugin, state: ReadableMap): ViewportState? {
private fun toState(viewport: ViewportPlugin, state: ReadableMap): ViewportState? {
return when (val kind = state.getAndLogIfNotString("kind")) {
"followPuck" -> viewport.makeFollowPuckViewportState()
"followPuck" -> viewport.makeFollowPuckViewportState(
parseFollowViewportOptions(state)
)
//"overview" -> return viewport.makeOverviewViewportState()
else -> {
Logger.e(LOG_TAG, "toState: unexpected state: $kind")
Expand All @@ -127,7 +131,79 @@ mContext
}
}

fun toDefaultViewportTransitionOptions(state: ReadableMap?): DefaultViewportTransitionOptions {
data class FollowPuckViewportStateBearingOrNull(val state: FollowPuckViewportStateBearing?)
private fun parseFollowViewportOptions(state: ReadableMap): FollowPuckViewportStateOptions {
val builder = FollowPuckViewportStateOptions.Builder()
state.getAndLogIfNotMap("options", LOG_TAG)?.let { options ->
if (options.hasKey("zoom")) {
if (options.isKeep("zoom")) {
builder.zoom(null)
} else {
options.getAndLogIfNotDouble("zoom", LOG_TAG)?.let { zoom ->
builder.zoom(zoom)
}
}
}
if (options.hasKey("pitch")) {
if (options.isKeep("pitch")) {
builder.pitch(null)
} else {
options.getAndLogIfNotDouble("pitch", LOG_TAG)?.let {pitch ->
builder.pitch(pitch)
}
}
}

if (options.hasKey("bearing")) {
when (options.getType("bearing")) {
ReadableType.Number ->
FollowPuckViewportStateBearingOrNull(FollowPuckViewportStateBearing.Constant(options.getDouble("bearing")))

ReadableType.String ->
when (options.getString("bearing")) {
"course" ->
FollowPuckViewportStateBearingOrNull(FollowPuckViewportStateBearing.SyncWithLocationPuck)
"heading" ->
FollowPuckViewportStateBearingOrNull(FollowPuckViewportStateBearing.SyncWithLocationPuck)
"keep" ->
FollowPuckViewportStateBearingOrNull(null)
else -> {
Logger.e(
LOG_TAG,
"bearing in viewport options should be either a constant number or syncWithLocationPuck"
)
null
}
}
else -> {
Logger.e(
LOG_TAG,
"bearing in viewport options should be either constant number or course or heading or keep"
)
null
}
}?.let { bearing ->
builder.bearing(bearing.state)
}
}
if (options.hasKey("padding")) {
if (options.isNull("padding")) {
builder.padding(null)
} else {
options.getAndLogIfNotMap("padding", LOG_TAG)?.let { paddingMap ->
paddingMap?.toPadding(LOG_TAG)?.let { padding ->
builder.padding(padding)
}
}
}
}

}
return builder.build()
}


private fun toDefaultViewportTransitionOptions(state: ReadableMap?): DefaultViewportTransitionOptions {
val builder = DefaultViewportTransitionOptions.Builder()
if (state?.hasKey("maxDurationMs") == true) {
val maxDurationMs = state.getAndLogIfNotDouble("maxDurationMs", LOG_TAG)
Expand All @@ -139,7 +215,7 @@ mContext
return builder.build()
}

fun toTransition(viewport: ViewportPlugin, state: ReadableMap?): ViewportTransition? {
private fun toTransition(viewport: ViewportPlugin, state: ReadableMap?): ViewportTransition? {
viewport.idle()
return when (val kind = state?.getAndLogIfNotString("kind", LOG_TAG)) {
"default" -> viewport.makeDefaultViewportTransition(
Expand Down Expand Up @@ -256,4 +332,10 @@ mContext
companion object {
const val LOG_TAG = "RNMBXViewport"
}
}
}

private fun ReadableMap.isKeep(s: String): Boolean {
return ((getType(s) == ReadableType.String) && (getString(s) == "keep"))
}


Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.facebook.react.bridge.ReadableType
import com.google.gson.JsonArray
import com.google.gson.JsonElement
import com.google.gson.JsonObject
import com.mapbox.maps.EdgeInsets
import com.rnmapbox.rnmbx.utils.ConvertUtils
import com.rnmapbox.rnmbx.utils.Logger

Expand Down Expand Up @@ -44,6 +45,7 @@ fun ReadableMap.getAndLogIfNotBoolean(key: String, tag:String = "RNMBXReadableMa
}
}

/* If key is there it should be number or log otherwise */
fun ReadableMap.getAndLogIfNotDouble(key: String, tag: String = "RNMBXReadableMap"): Double? {
return if (hasKey(key)) {
if (getType(key) == ReadableType.Number) {
Expand All @@ -57,6 +59,7 @@ fun ReadableMap.getAndLogIfNotDouble(key: String, tag: String = "RNMBXReadableMa
}
}

/* If key is there it should be string or log otherwise */
fun ReadableMap.getAndLogIfNotString(key: String, tag: String = "RNMBXReadableMap"): String? {
return if (hasKey(key)) {
if (getType(key) == ReadableType.String) {
Expand All @@ -70,6 +73,19 @@ fun ReadableMap.getAndLogIfNotString(key: String, tag: String = "RNMBXReadableMa
}
}

fun ReadableMap.getAndLogIfNotMap(key: String, tag: String = "RNMBXReadableMap"): ReadableMap? {
return if (hasKey(key)) {
if (getType(key) == ReadableType.Map) {
getMap(key)
} else {
Logger.e("RNMBXReadableMap", "$key is exected to be a Map but was: ${getType(key)}")
null
}
} else {
null
}
}

fun ReadableMap.toJsonObject() : JsonObject {
val result = JsonObject()
val it = keySetIterator()
Expand All @@ -86,3 +102,32 @@ fun ReadableMap.toJsonObject() : JsonObject {
}
return result
}

fun ReadableMap.toPadding(tag: String = "RNMBXReadableMap"): EdgeInsets? {
var top: Double = 0.0
var bottom: Double = 0.0
var left: Double = 0.0
var right: Double = 0.0
var empty = true

getAndLogIfNotDouble("top", tag)?.let {
top = it
empty = false
}
getAndLogIfNotDouble("bottom", tag)?.let {
bottom = it
empty = false
}
getAndLogIfNotDouble("left", tag)?.let {
left = it
empty = false
}
getAndLogIfNotDouble("right", tag)?.let {
right = it
empty = false
}
if (empty) {
return null
}
return EdgeInsets(top, left, bottom, right)
}
5 changes: 4 additions & 1 deletion example/src/examples/Camera/Viewport.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@ export default function ViewportExample() {
title="followPuck"
onPress={async () => {
const completed = await viewport.current?.transitionTo(
{ kind: 'followPuck' },
{
kind: 'followPuck',
options: { zoom: 'keep', padding: { top: 200, left: 200 } },
},
{ kind: 'default', maxDurationMs: 5000 },
);
console.log(' => transitionTo completed:', completed);
Expand Down
Loading