diff --git a/Examples/MapTilerMobileDemo/app/src/main/java/com/maptilerdemo/maptilermobiledemo/HomeScreen.kt b/Examples/MapTilerMobileDemo/app/src/main/java/com/maptilerdemo/maptilermobiledemo/HomeScreen.kt index 557a2f4..cf3b2dc 100644 --- a/Examples/MapTilerMobileDemo/app/src/main/java/com/maptilerdemo/maptilermobiledemo/HomeScreen.kt +++ b/Examples/MapTilerMobileDemo/app/src/main/java/com/maptilerdemo/maptilermobiledemo/HomeScreen.kt @@ -22,6 +22,7 @@ import com.maptiler.maptilersdk.map.MTMapViewController import com.maptiler.maptilersdk.map.MTMapViewDelegate import com.maptiler.maptilersdk.map.style.MTMapReferenceStyle +@Suppress("FunctionName") @Composable fun HomeScreen( navController: NavController, @@ -29,10 +30,13 @@ fun HomeScreen( ) { val mapController = MapController(context) + val options = MTMapOptions() + options.setMapTilerLogoIsVisible(true) + Box(modifier = Modifier.fillMaxSize()) { MTMapView( MTMapReferenceStyle.STREETS, - MTMapOptions(), + options, mapController.controller, modifier = Modifier diff --git a/Examples/MapTilerMobileDemo/app/src/main/java/com/maptilerdemo/maptilermobiledemo/MainActivity.kt b/Examples/MapTilerMobileDemo/app/src/main/java/com/maptilerdemo/maptilermobiledemo/MainActivity.kt index f736733..c980222 100644 --- a/Examples/MapTilerMobileDemo/app/src/main/java/com/maptilerdemo/maptilermobiledemo/MainActivity.kt +++ b/Examples/MapTilerMobileDemo/app/src/main/java/com/maptilerdemo/maptilermobiledemo/MainActivity.kt @@ -5,10 +5,6 @@ import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview import com.maptiler.maptilersdk.MTConfig class MainActivity : ComponentActivity() { @@ -25,22 +21,3 @@ class MainActivity : ComponentActivity() { } } } - -@Composable -fun Greeting( - name: String, - modifier: Modifier = Modifier, -) { - Text( - text = "Hello $name!", - modifier = modifier, - ) -} - -@Preview(showBackground = true) -@Composable -fun GreetingPreview() { - MaterialTheme { - Greeting("Android") - } -} diff --git a/Examples/MapTilerMobileDemo/app/src/main/java/com/maptilerdemo/maptilermobiledemo/MainScreen.kt b/Examples/MapTilerMobileDemo/app/src/main/java/com/maptilerdemo/maptilermobiledemo/MainScreen.kt index c8bbdf7..d31b4e9 100644 --- a/Examples/MapTilerMobileDemo/app/src/main/java/com/maptilerdemo/maptilermobiledemo/MainScreen.kt +++ b/Examples/MapTilerMobileDemo/app/src/main/java/com/maptilerdemo/maptilermobiledemo/MainScreen.kt @@ -15,6 +15,7 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController +@Suppress("FunctionName") @Composable fun MainScreen(context: Context) { val navController = rememberNavController() diff --git a/Examples/MapTilerMobileDemo/app/src/main/java/com/maptilerdemo/maptilermobiledemo/ui/theme/Theme.kt b/Examples/MapTilerMobileDemo/app/src/main/java/com/maptilerdemo/maptilermobiledemo/ui/theme/Theme.kt index 1110c7c..751c940 100644 --- a/Examples/MapTilerMobileDemo/app/src/main/java/com/maptilerdemo/maptilermobiledemo/ui/theme/Theme.kt +++ b/Examples/MapTilerMobileDemo/app/src/main/java/com/maptilerdemo/maptilermobiledemo/ui/theme/Theme.kt @@ -33,6 +33,7 @@ private val LightColorScheme = */ ) +@Suppress("FunctionName") @Composable fun MapTilerMobileDemoTheme( darkTheme: Boolean = isSystemInDarkTheme(), diff --git a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/bridge/MTCommand.kt b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/bridge/MTCommand.kt index 2c76b64..fc703d2 100644 --- a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/bridge/MTCommand.kt +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/bridge/MTCommand.kt @@ -9,6 +9,8 @@ package com.maptiler.maptilersdk.bridge internal typealias JSString = String internal interface MTCommand { + val isPrimitiveReturnType: Boolean + fun toJS(): JSString } diff --git a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/bridge/WebViewExecutor.kt b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/bridge/WebViewExecutor.kt index 72982a3..67a0839 100644 --- a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/bridge/WebViewExecutor.kt +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/bridge/WebViewExecutor.kt @@ -25,7 +25,7 @@ internal interface WebViewExecutorDelegate { } internal class WebViewExecutor( - context: Context, + private val context: Context, ) : MTCommandExecutable { object Constants { object Error { @@ -51,17 +51,21 @@ internal class WebViewExecutor( } } - private var webView: WebView? = null + private var _webView: WebView? = null + val webView: WebView + get() { + if (_webView == null) { + initWebViewIfNeeded(context) + } - var delegate: WebViewExecutorDelegate? = null + return _webView!! + } - init { - initWebViewIfNeeded(context) - } + var delegate: WebViewExecutorDelegate? = null private fun initWebViewIfNeeded(context: Context) { - if (webView == null) { - webView = + if (_webView == null) { + _webView = WebView(context).apply { settings.javaScriptEnabled = true settings.allowFileAccess = true @@ -94,7 +98,11 @@ internal class WebViewExecutor( } } - fun getWebView(): WebView? = webView + fun setWebView(webView: WebView) { + this._webView = webView + } + + fun getAttachableWebView(): WebView? = webView override suspend fun execute(command: MTCommand): MTBridgeReturnType = withContext(Dispatchers.Main) { @@ -103,35 +111,41 @@ internal class WebViewExecutor( val deferred = CompletableDeferred() - webView.evaluateJavascript(command.toJS()) { result -> - try { - if (result == null || result == "null") { + if (command.isPrimitiveReturnType) { + webView.evaluateJavascript(command.toJS()) { result -> + try { + if (result == null || result == "null") { + if (isVerbose) { + MTLogger.log("$command completed with unsupported return type.", MTLogType.WARNING) + } + + deferred.complete(MTBridgeReturnType.UnsupportedType) + } else { + try { + val parsedResult = MTBridgeReturnType.from(result) + deferred.complete(parsedResult) + } catch (e: Exception) { + deferred.completeExceptionally(MTError.InvalidResultType(result)) + } + } + } catch (e: Exception) { if (isVerbose) { - MTLogger.log("$command completed with unsupported return type.", MTLogType.WARNING) + MTLogger.log("Bridging error occurred for $command: ${e.message}", MTLogType.ERROR) } - deferred.complete(MTBridgeReturnType.UnsupportedType) - } else { - try { - val parsedResult = MTBridgeReturnType.from(result) - deferred.complete(parsedResult) - } catch (e: Exception) { - deferred.completeExceptionally(MTError.InvalidResultType(result)) - } - } - } catch (e: Exception) { - if (isVerbose) { - MTLogger.log("Bridging error occurred for $command: ${e.message}", MTLogType.ERROR) + deferred.completeExceptionally(MTError.Unknown(e.message ?: "Unknown error")) } - - deferred.completeExceptionally(MTError.Unknown(e.message ?: "Unknown error")) } + } else { + webView.evaluateJavascript(command.toJS(), null) + deferred.complete(MTBridgeReturnType.UnsupportedType) } return@withContext deferred.await() } fun destroy() { - webView?.destroy() + _webView?.destroy() + _webView = null } } diff --git a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/InitializeMap.kt b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/InitializeMap.kt index 090603b..077601a 100644 --- a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/InitializeMap.kt +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/InitializeMap.kt @@ -22,6 +22,8 @@ internal data class InitializeMap( val styleVariant: MTMapStyleVariant?, val isSessionLogicEnabled: Any?, ) : MTCommand { + override val isPrimitiveReturnType: Boolean = false + override fun toJS(): JSString { val referenceStyleName = referenceStyle.getName() val styleVariantName = styleVariant?.value?.uppercase() diff --git a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/DragPanDisable.kt b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/DragPanDisable.kt index 3119ddd..4962a7f 100644 --- a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/DragPanDisable.kt +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/DragPanDisable.kt @@ -10,5 +10,7 @@ import com.maptiler.maptilersdk.bridge.MTBridge import com.maptiler.maptilersdk.bridge.MTCommand internal class DragPanDisable : MTCommand { + override val isPrimitiveReturnType: Boolean = false + override fun toJS(): String = "${MTBridge.MAP_OBJECT}.dragPan.disable();" } diff --git a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/DragPanEnable.kt b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/DragPanEnable.kt index 4c995b8..66534cf 100644 --- a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/DragPanEnable.kt +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/DragPanEnable.kt @@ -15,6 +15,8 @@ import com.maptiler.maptilersdk.map.options.MTDragPanOptions internal data class DragPanEnable( val options: MTDragPanOptions?, ) : MTCommand { + override val isPrimitiveReturnType: Boolean = false + override fun toJS(): String { val optionsString: JSString = JsonConfig.json.encodeToString(options) diff --git a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/PinchRotateAndZoomDisable.kt b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/PinchRotateAndZoomDisable.kt index c279419..d833e19 100644 --- a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/PinchRotateAndZoomDisable.kt +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/PinchRotateAndZoomDisable.kt @@ -10,5 +10,7 @@ import com.maptiler.maptilersdk.bridge.MTBridge import com.maptiler.maptilersdk.bridge.MTCommand internal class PinchRotateAndZoomDisable : MTCommand { + override val isPrimitiveReturnType: Boolean = false + override fun toJS(): String = "${MTBridge.MAP_OBJECT}.touchZoomRotate.disable();" } diff --git a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/PinchRotateAndZoomEnable.kt b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/PinchRotateAndZoomEnable.kt index 5a742ef..96b870c 100644 --- a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/PinchRotateAndZoomEnable.kt +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/PinchRotateAndZoomEnable.kt @@ -10,5 +10,7 @@ import com.maptiler.maptilersdk.bridge.MTBridge import com.maptiler.maptilersdk.bridge.MTCommand internal class PinchRotateAndZoomEnable : MTCommand { + override val isPrimitiveReturnType: Boolean = false + override fun toJS(): String = "${MTBridge.MAP_OBJECT}.touchZoomRotate.enable();" } diff --git a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/TwoFingersDragPitchDisable.kt b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/TwoFingersDragPitchDisable.kt index 4ac97ef..3aada12 100644 --- a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/TwoFingersDragPitchDisable.kt +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/TwoFingersDragPitchDisable.kt @@ -10,5 +10,7 @@ import com.maptiler.maptilersdk.bridge.MTBridge import com.maptiler.maptilersdk.bridge.MTCommand internal class TwoFingersDragPitchDisable : MTCommand { + override val isPrimitiveReturnType: Boolean = false + override fun toJS(): String = "${MTBridge.MAP_OBJECT}.touchPitch.disable();" } diff --git a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/TwoFingersDragPitchEnable.kt b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/TwoFingersDragPitchEnable.kt index 6e99c76..5e5082e 100644 --- a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/TwoFingersDragPitchEnable.kt +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/gestures/TwoFingersDragPitchEnable.kt @@ -10,5 +10,7 @@ import com.maptiler.maptilersdk.bridge.MTBridge import com.maptiler.maptilersdk.bridge.MTCommand internal class TwoFingersDragPitchEnable : MTCommand { + override val isPrimitiveReturnType: Boolean = false + override fun toJS(): String = "${MTBridge.MAP_OBJECT}.touchPitch.enable();" } diff --git a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/GetZoom.kt b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/GetZoom.kt index 4052907..60c4047 100644 --- a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/GetZoom.kt +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/GetZoom.kt @@ -10,5 +10,7 @@ import com.maptiler.maptilersdk.bridge.MTBridge import com.maptiler.maptilersdk.bridge.MTCommand internal class GetZoom : MTCommand { + override val isPrimitiveReturnType: Boolean = true + override fun toJS(): String = "${MTBridge.MAP_OBJECT}.getZoom();" } diff --git a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/PanBy.kt b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/PanBy.kt index c4256fc..a542c0a 100644 --- a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/PanBy.kt +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/PanBy.kt @@ -15,6 +15,8 @@ import com.maptiler.maptilersdk.map.types.MTPoint internal data class PanBy( val offset: MTPoint, ) : MTCommand { + override val isPrimitiveReturnType: Boolean = false + override fun toJS(): String { val offsetString: JSString = JsonConfig.json.encodeToString(offset) diff --git a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/PanTo.kt b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/PanTo.kt index 58ddeb2..8a37ec7 100644 --- a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/PanTo.kt +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/PanTo.kt @@ -15,6 +15,8 @@ import com.maptiler.maptilersdk.map.LngLat internal data class PanTo( val coordinates: LngLat, ) : MTCommand { + override val isPrimitiveReturnType: Boolean = false + override fun toJS(): String { val coordinatesString: JSString = JsonConfig.json.encodeToString(coordinates) diff --git a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/SetMaxZoom.kt b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/SetMaxZoom.kt index e5e3809..655ef54 100644 --- a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/SetMaxZoom.kt +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/SetMaxZoom.kt @@ -12,5 +12,7 @@ import com.maptiler.maptilersdk.bridge.MTCommand internal data class SetMaxZoom( val zoom: Double, ) : MTCommand { + override val isPrimitiveReturnType: Boolean = false + override fun toJS(): String = "${MTBridge.MAP_OBJECT}.setMaxZoom($zoom);" } diff --git a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/SetMinZoom.kt b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/SetMinZoom.kt index e3f2b2d..35a91bb 100644 --- a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/SetMinZoom.kt +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/SetMinZoom.kt @@ -12,5 +12,7 @@ import com.maptiler.maptilersdk.bridge.MTCommand internal data class SetMinZoom( val zoom: Double, ) : MTCommand { + override val isPrimitiveReturnType: Boolean = false + override fun toJS(): String = "${MTBridge.MAP_OBJECT}.setMinZoom($zoom);" } diff --git a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/SetZoom.kt b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/SetZoom.kt index f4edced..85c3c16 100644 --- a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/SetZoom.kt +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/SetZoom.kt @@ -12,5 +12,7 @@ import com.maptiler.maptilersdk.bridge.MTCommand internal data class SetZoom( val zoom: Double, ) : MTCommand { + override val isPrimitiveReturnType: Boolean = false + override fun toJS(): String = "${MTBridge.MAP_OBJECT}.setZoom($zoom);" } diff --git a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/ZoomIn.kt b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/ZoomIn.kt index 88c7b4c..6433664 100644 --- a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/ZoomIn.kt +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/ZoomIn.kt @@ -10,5 +10,7 @@ import com.maptiler.maptilersdk.bridge.MTBridge import com.maptiler.maptilersdk.bridge.MTCommand internal class ZoomIn : MTCommand { + override val isPrimitiveReturnType: Boolean = false + override fun toJS(): String = "${MTBridge.MAP_OBJECT}.zoomIn();" } diff --git a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/ZoomOut.kt b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/ZoomOut.kt index 0a3d9ae..8512f39 100644 --- a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/ZoomOut.kt +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/commands/navigation/ZoomOut.kt @@ -10,5 +10,7 @@ import com.maptiler.maptilersdk.bridge.MTBridge import com.maptiler.maptilersdk.bridge.MTCommand internal class ZoomOut : MTCommand { + override val isPrimitiveReturnType: Boolean = false + override fun toJS(): String = "${MTBridge.MAP_OBJECT}.zoomOut();" } diff --git a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/map/MTMapOptions.kt b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/map/MTMapOptions.kt index c3aad2f..16f093f 100644 --- a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/map/MTMapOptions.kt +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/map/MTMapOptions.kt @@ -198,7 +198,7 @@ class MTMapOptions { /** * A value representing the position of the MapTiler wordmark on the map. */ - var logoPosition: MTMapCorner? = MTMapCorner.TOP_RIGHT + var logoPosition: MTMapCorner? = MTMapCorner.TOP_LEFT private set /** @@ -389,4 +389,10 @@ class MTMapOptions { constructor() { // Defaults } + + // Setters + + fun setMapTilerLogoIsVisible(isVisible: Boolean) { + maptilerLogoIsVisible = isVisible + } } diff --git a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/map/MTMapView.kt b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/map/MTMapView.kt index 92f6a7d..1782707 100644 --- a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/map/MTMapView.kt +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/map/MTMapView.kt @@ -9,6 +9,8 @@ package com.maptiler.maptilersdk.map import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.key +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.viewinterop.AndroidView @@ -29,6 +31,7 @@ fun MTMapView( styleVariant: MTMapStyleVariant? = null, ) { val scope = rememberCoroutineScope() + val webView = remember { controller.getAttachableWebView() } LaunchedEffect(Unit) { controller.bind(scope) @@ -44,8 +47,10 @@ fun MTMapView( } } - AndroidView( - factory = { controller.getAttachableWebView() }, - modifier = modifier, - ) + key(webView) { + AndroidView( + factory = { webView }, + modifier = modifier, + ) + } } diff --git a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/map/MTMapViewController.kt b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/map/MTMapViewController.kt index 49a8c53..0339e62 100644 --- a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/map/MTMapViewController.kt +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/map/MTMapViewController.kt @@ -112,7 +112,7 @@ class MTMapViewController( webViewExecutor?.destroy() } - internal fun getAttachableWebView(): WebView = webViewExecutor?.getWebView()!! + internal fun getAttachableWebView(): WebView = webViewExecutor?.getAttachableWebView()!! override fun onNavigationFinished(url: String) { coroutineScope?.launch(Dispatchers.Default) { diff --git a/MapTilerSDK/src/test/java/com/maptiler/maptilersdk/BridgeTests.kt b/MapTilerSDK/src/test/java/com/maptiler/maptilersdk/BridgeTests.kt new file mode 100644 index 0000000..415bedd --- /dev/null +++ b/MapTilerSDK/src/test/java/com/maptiler/maptilersdk/BridgeTests.kt @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2025, MapTiler + * All rights reserved. + * SPDX-License-Identifier: BSD 3-Clause + */ + +package com.maptiler.maptilersdk + +import com.maptiler.maptilersdk.bridge.MTBridge +import com.maptiler.maptilersdk.bridge.MTBridgeReturnType +import com.maptiler.maptilersdk.bridge.MTCommand +import com.maptiler.maptilersdk.bridge.MTCommandExecutable +import com.maptiler.maptilersdk.commands.navigation.GetZoom +import junit.framework.TestCase.assertEquals +import kotlinx.coroutines.runBlocking +import org.junit.Test + +class BridgeTests { + @Test fun execute_ReturnsExpectedType() = + runBlocking { + val expectedReturnType = MTBridgeReturnType.UnsupportedType + val mockExecutor = + object : MTCommandExecutable { + override suspend fun execute(command: MTCommand): MTBridgeReturnType = expectedReturnType + } + + val bridge = MTBridge(mockExecutor) + val command = GetZoom() + + val result = bridge.execute(command) + + assertEquals(expectedReturnType, result) + } +} diff --git a/MapTilerSDK/src/test/java/com/maptiler/maptilersdk/MTMapCameraHelperTests.kt b/MapTilerSDK/src/test/java/com/maptiler/maptilersdk/MTMapCameraHelperTests.kt new file mode 100644 index 0000000..4e0b189 --- /dev/null +++ b/MapTilerSDK/src/test/java/com/maptiler/maptilersdk/MTMapCameraHelperTests.kt @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2025, MapTiler + * All rights reserved. + * SPDX-License-Identifier: BSD 3-Clause + */ + +package com.maptiler.maptilersdk + +import com.maptiler.maptilersdk.map.LngLat +import com.maptiler.maptilersdk.map.MTMapCameraHelper +import junit.framework.TestCase.assertEquals +import org.junit.Test + +class MTMapCameraHelperTests { + @Test fun getCamera_ReturnsAllZeroProperties() { + val camera = MTMapCameraHelper.getCamera() + + assertEquals(0.0, camera.centerCoordinate?.lng) + assertEquals(0.0, camera.centerCoordinate?.lat) + assertEquals(0.0, camera.bearing) + assertEquals(0.0, camera.pitch) + assertEquals(0.0, camera.roll) + assertEquals(0.0, camera.elevation) + } + + @Test fun cameraLookingAtCenterCoordinate_SetsCorrectly() { + val center = LngLat(10.0, 20.0) + val camera = + MTMapCameraHelper.cameraLookingAtCenterCoordinate( + centerCoordinate = center, + bearing = 1.0, + pitch = 2.0, + roll = 3.0, + elevation = 4.0, + ) + + assertEquals(center, camera.centerCoordinate) + assertEquals(1.0, camera.bearing) + assertEquals(2.0, camera.pitch) + assertEquals(3.0, camera.roll) + assertEquals(4.0, camera.elevation) + } +} diff --git a/MapTilerSDK/src/test/java/com/maptiler/maptilersdk/NavigationTests.kt b/MapTilerSDK/src/test/java/com/maptiler/maptilersdk/NavigationTests.kt new file mode 100644 index 0000000..1cb3289 --- /dev/null +++ b/MapTilerSDK/src/test/java/com/maptiler/maptilersdk/NavigationTests.kt @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025, MapTiler + * All rights reserved. + * SPDX-License-Identifier: BSD 3-Clause + */ + +package com.maptiler.maptilersdk + +import com.maptiler.maptilersdk.bridge.MTBridge +import com.maptiler.maptilersdk.commands.navigation.GetZoom +import com.maptiler.maptilersdk.commands.navigation.PanBy +import com.maptiler.maptilersdk.commands.navigation.PanTo +import com.maptiler.maptilersdk.commands.navigation.SetMaxZoom +import com.maptiler.maptilersdk.commands.navigation.SetMinZoom +import com.maptiler.maptilersdk.commands.navigation.SetZoom +import com.maptiler.maptilersdk.commands.navigation.ZoomIn +import com.maptiler.maptilersdk.commands.navigation.ZoomOut +import com.maptiler.maptilersdk.map.LngLat +import com.maptiler.maptilersdk.map.types.MTPoint +import junit.framework.TestCase.assertEquals +import org.junit.Test + +class NavigationTests { + @Test fun getZoomToJS_ReturnsCorrectJSString() { + val command = GetZoom() + assertEquals("${MTBridge.MAP_OBJECT}.getZoom();", command.toJS()) + } + + @Test fun zoomInToJS_ReturnsCorrectJSString() { + val command = ZoomIn() + assertEquals("${MTBridge.MAP_OBJECT}.zoomIn();", command.toJS()) + } + + @Test fun zoomOutToJS_ReturnsCorrectJSString() { + val command = ZoomOut() + assertEquals("${MTBridge.MAP_OBJECT}.zoomOut();", command.toJS()) + } + + @Test fun setZoomToJS_ReturnsCorrectJSString() { + val command = SetZoom(1.0) + assertEquals("${MTBridge.MAP_OBJECT}.setZoom(1.0);", command.toJS()) + } + + @Test fun setMaxZoomToJS_ReturnsCorrectJSString() { + val command = SetMaxZoom(1.0) + assertEquals("${MTBridge.MAP_OBJECT}.setMaxZoom(1.0);", command.toJS()) + } + + @Test fun setMinZoomToJS_ReturnsCorrectJSString() { + val command = SetMinZoom(1.0) + assertEquals("${MTBridge.MAP_OBJECT}.setMinZoom(1.0);", command.toJS()) + } + + @Test fun panByToJS_ReturnsCorrectJSString() { + val offset = MTPoint(1.0, 1.0) + val command = PanBy(offset) + assertEquals( + "${MTBridge.MAP_OBJECT}.panBy({\n" + + " \"x\": 1.0,\n" + + " \"y\": 1.0\n" + + "});", + command.toJS(), + ) + } + + @Test fun panToToJS_ReturnsCorrectJSString() { + val coordinates = LngLat(1.0, 1.0) + val command = PanTo(coordinates) + assertEquals( + "${MTBridge.MAP_OBJECT}.panTo({\n" + + " \"lng\": 1.0,\n" + + " \"lat\": 1.0\n" + + "});", + command.toJS(), + ) + } +}