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 c980222..3cf9294 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 @@ -7,6 +7,12 @@ import androidx.activity.enableEdgeToEdge import androidx.compose.material3.MaterialTheme import com.maptiler.maptilersdk.MTConfig +// Classic Map View Imports +// import com.maptiler.maptilersdk.map.MTMapOptions +// import com.maptiler.maptilersdk.map.MTMapViewClassic +// import com.maptiler.maptilersdk.map.MTMapViewController +// import com.maptiler.maptilersdk.map.style.MTMapReferenceStyle + class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -20,4 +26,21 @@ class MainActivity : ComponentActivity() { } } } + + // Classic Map View Example using XML Layout + // Implementing main_activity_layout.xml + +// private lateinit var mapView: MTMapViewClassic +// +// override fun onCreate(savedInstanceState: Bundle?) { +// super.onCreate(savedInstanceState) +// +// MTConfig.setAPIKey(BuildConfig.MAPTILER_API_KEY) +// val mapController = MTMapViewController(baseContext) +// enableEdgeToEdge() +// setContentView(R.layout.main_activity_layout) +// +// mapView = findViewById(R.id.classicMapView) +// mapView.initialize(MTMapReferenceStyle.SATELLITE, MTMapOptions(), mapController) +// } } diff --git a/Examples/MapTilerMobileDemo/app/src/main/res/layout/main_activity_layout.xml b/Examples/MapTilerMobileDemo/app/src/main/res/layout/main_activity_layout.xml new file mode 100644 index 0000000..4e38498 --- /dev/null +++ b/Examples/MapTilerMobileDemo/app/src/main/res/layout/main_activity_layout.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/map/MTMapViewClassic.kt b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/map/MTMapViewClassic.kt new file mode 100644 index 0000000..e9fd4e1 --- /dev/null +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/map/MTMapViewClassic.kt @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2025, MapTiler + * All rights reserved. + * SPDX-License-Identifier: BSD 3-Clause + */ + +package com.maptiler.maptilersdk.map + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.webkit.WebChromeClient +import android.webkit.WebSettings +import android.webkit.WebView +import android.webkit.WebViewClient +import android.widget.FrameLayout +import com.maptiler.maptilersdk.R +import com.maptiler.maptilersdk.bridge.MTBridge +import com.maptiler.maptilersdk.bridge.WebViewExecutor.Constants +import com.maptiler.maptilersdk.logging.MTLogType +import com.maptiler.maptilersdk.logging.MTLogger +import com.maptiler.maptilersdk.map.style.MTMapReferenceStyle +import com.maptiler.maptilersdk.map.style.MTMapStyleVariant +import com.maptiler.maptilersdk.map.style.MTStyle +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +class MTMapViewClassic( + context: Context, + attrs: AttributeSet, +) : FrameLayout(context, attrs) { + private lateinit var webView: WebView + + @Suppress("PropertyName") + private lateinit var _referenceStyle: MTMapReferenceStyle + + @Suppress("PropertyName") + private lateinit var _controller: MTMapViewController + + @Suppress("PropertyName") + private lateinit var _options: MTMapOptions + + @Suppress("PropertyName") + private var _styleVariant: MTMapStyleVariant? = null + + val scope = CoroutineScope(Dispatchers.Default) + + internal var bridge: MTBridge? = null + + fun initialize( + referenceStyle: MTMapReferenceStyle, + options: MTMapOptions, + controller: MTMapViewController, + styleVariant: MTMapStyleVariant? = null, + ) { + this._referenceStyle = referenceStyle + this._options = options + this._controller = controller + this._styleVariant = styleVariant + + _controller.bind(scope) + _controller.options = options + + val style = MTStyle(referenceStyle, styleVariant) + _controller.style = style + + val rootView = LayoutInflater.from(context).inflate(R.layout.mtmapview_layout, this, true) + webView = rootView.findViewById(R.id.map) + + webView.apply { + settings.javaScriptEnabled = true + settings.allowFileAccess = true + settings.domStorageEnabled = true + settings.cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK + settings.useWideViewPort = true + settings.loadWithOverviewMode = true + + isVerticalScrollBarEnabled = false + + webChromeClient = WebChromeClient() + webViewClient = + object : WebViewClient() { + override fun onPageFinished( + view: WebView?, + url: String?, + ) { + scope.launch(Dispatchers.Main) { + try { + _controller.initializeMap() + } catch (error: Exception) { + MTLogger.log("Map Init error $error", MTLogType.ERROR) + } + } + } + } + + loadUrl("file:///android_asset/${Constants.JSResources.MAPTILER_MAP}.${Constants.JSResources.HTML_EXTENSION}") + } + + _controller.setWebView(webView) + } +} 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 1a38b22..c75af39 100644 --- a/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/map/MTMapViewController.kt +++ b/MapTilerSDK/src/main/java/com/maptiler/maptilersdk/map/MTMapViewController.kt @@ -74,7 +74,7 @@ class MTMapViewController( bridge = MTBridge(webViewExecutor) } - private suspend fun initializeMap() { + internal suspend fun initializeMap() { val apiKey = MTConfig.getAPIKey() if (options != null) { @@ -101,17 +101,21 @@ class MTMapViewController( navigableWorker = NavigableWorker(bridge!!, coroutineScope!!) } - fun bind(scope: CoroutineScope) { + internal fun bind(scope: CoroutineScope) { coroutineScope = scope gestureService = MTGestureService.create(coroutineScope!!, bridge!!, this) initializeWorkers() } - fun destroy() { + internal fun destroy() { webViewExecutor?.destroy() } + internal fun setWebView(webView: WebView) { + webViewExecutor?.setWebView(webView) + } + internal fun getAttachableWebView(): WebView = webViewExecutor?.getAttachableWebView()!! override fun onNavigationFinished(url: String) { diff --git a/MapTilerSDK/src/main/res/layout/mtmapview_layout.xml b/MapTilerSDK/src/main/res/layout/mtmapview_layout.xml new file mode 100644 index 0000000..6c02ab2 --- /dev/null +++ b/MapTilerSDK/src/main/res/layout/mtmapview_layout.xml @@ -0,0 +1,10 @@ + + + + +