From ca0e1460202692f989164a0d5760303fb524ba78 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sun, 12 Oct 2025 10:27:10 +0900 Subject: [PATCH 1/9] Prepare for v1.0.1 --- example-app/build.gradle.kts | 10 +- example-app/src/main/AndroidManifest.xml | 16 +++ .../pages/marker/postoffice/PostOfficePage.kt | 3 +- mapconductor-bom/gradle.properties | 1 + mapconductor-core/gradle.properties | 2 +- mapconductor-for-arcgis/build.gradle.kts | 81 +----------- mapconductor-for-arcgis/gradle.properties | 2 +- .../src/main/AndroidManifest.xml | 10 +- mapconductor-for-googlemaps/build.gradle.kts | 84 +----------- mapconductor-for-googlemaps/gradle.properties | 2 +- .../src/main/AndroidManifest.xml | 9 +- mapconductor-for-here/build.gradle.kts | 124 +----------------- mapconductor-for-here/gradle.properties | 2 +- .../src/main/AndroidManifest.xml | 11 +- mapconductor-for-mapbox/build.gradle.kts | 83 +----------- mapconductor-for-mapbox/gradle.properties | 2 +- .../src/main/AndroidManifest.xml | 9 +- mapconductor-icons/build.gradle.kts | 4 +- .../build.gradle.kts | 4 +- .../gradle.properties | 2 +- mapconductor-marker-strategy/build.gradle.kts | 4 +- .../gradle.properties | 2 +- 22 files changed, 58 insertions(+), 409 deletions(-) create mode 100644 mapconductor-bom/gradle.properties diff --git a/example-app/build.gradle.kts b/example-app/build.gradle.kts index 4cb9db41..b023d532 100644 --- a/example-app/build.gradle.kts +++ b/example-app/build.gradle.kts @@ -3,6 +3,7 @@ plugins { alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.compose) id("org.jlleitschuh.gradle.ktlint") + id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") version "2.0.1" } ktlint { @@ -13,6 +14,11 @@ ktlint { } } +secrets { + propertiesFileName = "secrets.properties" + defaultPropertiesFileName = "local.defaults.properties" +} + android { namespace = "com.mapconductor.example" compileSdk = project.property("compileSdk").toString().toInt() @@ -28,8 +34,8 @@ android { useSupportLibrary = true } - versionCode = 5 - versionName = "1.0.4" + versionCode = 6 + versionName = "1.0.5" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/example-app/src/main/AndroidManifest.xml b/example-app/src/main/AndroidManifest.xml index 23730101..3154713c 100644 --- a/example-app/src/main/AndroidManifest.xml +++ b/example-app/src/main/AndroidManifest.xml @@ -18,7 +18,23 @@ android:theme="@style/Theme.OverlayTest" tools:targetApi="35"> + + + + + + () + val google = NativeRemoteSpatialMarkerRenderingStrategy(context) val mapbox = NativeSpatialMarkerRenderingStrategy() val here = NativeSpatialMarkerRenderingStrategy() val arcgis = NativeSpatialMarkerRenderingStrategy() diff --git a/mapconductor-bom/gradle.properties b/mapconductor-bom/gradle.properties new file mode 100644 index 00000000..8d73c695 --- /dev/null +++ b/mapconductor-bom/gradle.properties @@ -0,0 +1 @@ +libraryVersion=1.0.1 diff --git a/mapconductor-core/gradle.properties b/mapconductor-core/gradle.properties index 57b18dd1..8d73c695 100644 --- a/mapconductor-core/gradle.properties +++ b/mapconductor-core/gradle.properties @@ -1 +1 @@ -libraryVersion=1.0.0 +libraryVersion=1.0.1 diff --git a/mapconductor-for-arcgis/build.gradle.kts b/mapconductor-for-arcgis/build.gradle.kts index 6b5b842e..774a2215 100644 --- a/mapconductor-for-arcgis/build.gradle.kts +++ b/mapconductor-for-arcgis/build.gradle.kts @@ -15,74 +15,6 @@ ktlint { } } -// Task to create secrets.properties in root project if it doesn't exist -tasks.register("ensureSecretsFiles") { - doFirst { - val secretsFile = rootProject.file("secrets.properties") - val defaultsFile = rootProject.file("local.defaults.properties") - - // Create secrets.properties if it doesn't exist - if (!secretsFile.exists()) { - secretsFile.createNewFile() - println("Created secrets.properties in root project") - } - - // Create local.defaults.properties if it doesn't exist - if (!defaultsFile.exists()) { - defaultsFile.createNewFile() - println("Created local.defaults.properties in root project") - } - - // Ensure ARCGIS_API_KEY exists in secrets.properties - val secretsContent = secretsFile.readText() - if (!secretsContent.contains("ARCGIS_API_KEY=")) { - secretsFile.appendText("ARCGIS_API_KEY=ARCGIS_API_KEY\n") - println("Added ARCGIS_API_KEY to secrets.properties") - } - - // Ensure ARCGIS_API_KEY exists in local.defaults.properties - val defaultsContent = defaultsFile.readText() - if (!defaultsContent.contains("ARCGIS_API_KEY=")) { - defaultsFile.appendText("ARCGIS_API_KEY=ARCGIS_API_KEY\n") - println("Added ARCGIS_API_KEY to local.defaults.properties") - } - } -} - -// Function to read API key from secrets.properties -fun getArcgisApiKey(): String { - val secretsFile = rootProject.file("secrets.properties") - val defaultsFile = rootProject.file("local.defaults.properties") - - // Try to read from secrets.properties first - if (secretsFile.exists()) { - val content = secretsFile.readText() - content.lines().forEach { line -> - if (line.startsWith("ARCGIS_API_KEY=")) { - val value = line.substringAfter("=").trim() - if (value.isNotEmpty() && value != "ARCGIS_API_KEY") { - return value - } - } - } - } - - // Fallback to local.defaults.properties - if (defaultsFile.exists()) { - val content = defaultsFile.readText() - content.lines().forEach { line -> - if (line.startsWith("ARCGIS_API_KEY=")) { - val value = line.substringAfter("=").trim() - if (value.isNotEmpty()) { - return value - } - } - } - } - - // Return placeholder if no valid key found - return "ARCGIS_API_KEY" -} android { namespace = "com.mapconductor.arcgis" compileSdk = project.property("compileSdk").toString().toInt() @@ -92,9 +24,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") - - // Set the ArcGIS API key from secrets.properties - manifestPlaceholders["ARCGIS_API_KEY"] = getArcgisApiKey() } buildFeatures { @@ -123,10 +52,6 @@ android { } } - // Run ensureSecretsFiles before processing manifests - tasks.matching { it.name.contains("process") && it.name.contains("Manifest") }.configureEach { - dependsOn("ensureSecretsFiles") - } compileOptions { sourceCompatibility = JavaVersion.toVersion(project.property("javaVersion").toString()) targetCompatibility = JavaVersion.toVersion(project.property("javaVersion").toString()) @@ -142,10 +67,10 @@ dependencies { compileOnly(libs.androidx.ui) compileOnly(libs.androidx.ui.tooling.preview) compileOnly(libs.androidx.core.ktx) - compileOnly(platform(libs.androidx.compose.bom)) // ← bomでバージョン合わせる + implementation(platform(libs.androidx.compose.bom)) // ← bomでバージョン合わせる // Lifecycle(MapView用) - compileOnly(libs.androidx.lifecycle.runtime.ktx) - compileOnly(libs.androidx.lifecycle.common.java8) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.lifecycle.common.java8) // ArcGIS SDK compileOnly(libs.arcgis.maps.kotlin) diff --git a/mapconductor-for-arcgis/gradle.properties b/mapconductor-for-arcgis/gradle.properties index 57b18dd1..8d73c695 100644 --- a/mapconductor-for-arcgis/gradle.properties +++ b/mapconductor-for-arcgis/gradle.properties @@ -1 +1 @@ -libraryVersion=1.0.0 +libraryVersion=1.0.1 diff --git a/mapconductor-for-arcgis/src/main/AndroidManifest.xml b/mapconductor-for-arcgis/src/main/AndroidManifest.xml index 06e5f3c4..78c3e858 100644 --- a/mapconductor-for-arcgis/src/main/AndroidManifest.xml +++ b/mapconductor-for-arcgis/src/main/AndroidManifest.xml @@ -1,10 +1,2 @@ - - - - - - - + diff --git a/mapconductor-for-googlemaps/build.gradle.kts b/mapconductor-for-googlemaps/build.gradle.kts index b168597c..ffb7d5b4 100644 --- a/mapconductor-for-googlemaps/build.gradle.kts +++ b/mapconductor-for-googlemaps/build.gradle.kts @@ -15,75 +15,6 @@ ktlint { } } -// Task to create secrets.properties in root project if it doesn't exist -tasks.register("ensureSecretsFiles") { - doFirst { - val secretsFile = rootProject.file("secrets.properties") - val defaultsFile = rootProject.file("local.defaults.properties") - - // Create secrets.properties if it doesn't exist - if (!secretsFile.exists()) { - secretsFile.createNewFile() - println("Created secrets.properties in root project") - } - - // Create local.defaults.properties if it doesn't exist - if (!defaultsFile.exists()) { - defaultsFile.createNewFile() - println("Created local.defaults.properties in root project") - } - - // Ensure GOOGLE_MAPS_API_KEY exists in secrets.properties - val secretsContent = secretsFile.readText() - if (!secretsContent.contains("GOOGLE_MAPS_API_KEY=")) { - secretsFile.appendText("GOOGLE_MAPS_API_KEY=GOOGLE_MAPS_API_KEY\n") - println("Added GOOGLE_MAPS_API_KEY to secrets.properties") - } - - // Ensure GOOGLE_MAPS_API_KEY exists in local.defaults.properties - val defaultsContent = defaultsFile.readText() - if (!defaultsContent.contains("GOOGLE_MAPS_API_KEY=")) { - defaultsFile.appendText("GOOGLE_MAPS_API_KEY=GOOGLE_MAPS_API_KEY\n") - println("Added GOOGLE_MAPS_API_KEY to local.defaults.properties") - } - } -} - -// Function to read API key from secrets.properties -fun getGoogleMapsApiKey(): String { - val secretsFile = rootProject.file("secrets.properties") - val defaultsFile = rootProject.file("local.defaults.properties") - - // Try to read from secrets.properties first - if (secretsFile.exists()) { - val content = secretsFile.readText() - content.lines().forEach { line -> - if (line.startsWith("GOOGLE_MAPS_API_KEY=")) { - val value = line.substringAfter("=").trim() - if (value.isNotEmpty() && value != "GOOGLE_MAPS_API_KEY") { - return value - } - } - } - } - - // Fallback to local.defaults.properties - if (defaultsFile.exists()) { - val content = defaultsFile.readText() - content.lines().forEach { line -> - if (line.startsWith("GOOGLE_MAPS_API_KEY=")) { - val value = line.substringAfter("=").trim() - if (value.isNotEmpty()) { - return value - } - } - } - } - - // Return placeholder if no valid key found - return "GOOGLE_MAPS_API_KEY" -} - android { namespace = "com.mapconductor.googlemaps" compileSdk = project.property("compileSdk").toString().toInt() @@ -93,9 +24,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") - - // Set the Google Maps API key from secrets.properties - manifestPlaceholders["GOOGLE_MAPS_API_KEY"] = getGoogleMapsApiKey() } buildFeatures { @@ -124,10 +52,6 @@ android { } } - // Run ensureSecretsFiles before processing manifests - tasks.matching { it.name.contains("process") && it.name.contains("Manifest") }.configureEach { - dependsOn("ensureSecretsFiles") - } compileOptions { sourceCompatibility = JavaVersion.toVersion(project.property("javaVersion").toString()) targetCompatibility = JavaVersion.toVersion(project.property("javaVersion").toString()) @@ -139,10 +63,10 @@ android { dependencies { - implementation(libs.androidx.core.ktx) - implementation(libs.androidx.ui) - implementation(libs.androidx.foundation) - implementation(libs.androidx.ui.tooling.preview) + compileOnly(libs.androidx.core.ktx) + compileOnly(libs.androidx.ui) + compileOnly(libs.androidx.foundation) + compileOnly(libs.androidx.ui.tooling.preview) implementation(platform(libs.androidx.compose.bom)) // ← bomでバージョン合わせる // Lifecycle(MapView用) implementation(libs.androidx.lifecycle.runtime.ktx) diff --git a/mapconductor-for-googlemaps/gradle.properties b/mapconductor-for-googlemaps/gradle.properties index 57b18dd1..8d73c695 100644 --- a/mapconductor-for-googlemaps/gradle.properties +++ b/mapconductor-for-googlemaps/gradle.properties @@ -1 +1 @@ -libraryVersion=1.0.0 +libraryVersion=1.0.1 diff --git a/mapconductor-for-googlemaps/src/main/AndroidManifest.xml b/mapconductor-for-googlemaps/src/main/AndroidManifest.xml index 118224ea..78c3e858 100644 --- a/mapconductor-for-googlemaps/src/main/AndroidManifest.xml +++ b/mapconductor-for-googlemaps/src/main/AndroidManifest.xml @@ -1,9 +1,2 @@ - - - - - - + diff --git a/mapconductor-for-here/build.gradle.kts b/mapconductor-for-here/build.gradle.kts index 43628872..a25183b2 100644 --- a/mapconductor-for-here/build.gradle.kts +++ b/mapconductor-for-here/build.gradle.kts @@ -15,116 +15,6 @@ ktlint { } } -// Task to create secrets.properties in root project if it doesn't exist -tasks.register("ensureSecretsFiles") { - doFirst { - val secretsFile = rootProject.file("secrets.properties") - val defaultsFile = rootProject.file("local.defaults.properties") - - // Create secrets.properties if it doesn't exist - if (!secretsFile.exists()) { - secretsFile.createNewFile() - println("Created secrets.properties in root project") - } - - // Create local.defaults.properties if it doesn't exist - if (!defaultsFile.exists()) { - defaultsFile.createNewFile() - println("Created local.defaults.properties in root project") - } - - // Ensure HERE_ACCESS_KEY_ID and HERE_ACCESS_KEY_SECRET exist in secrets.properties - val secretsContent = secretsFile.readText() - if (!secretsContent.contains("HERE_ACCESS_KEY_ID=")) { - secretsFile.appendText("HERE_ACCESS_KEY_ID=HERE_ACCESS_KEY_ID\n") - println("Added HERE_ACCESS_KEY_ID to secrets.properties") - } - if (!secretsContent.contains("HERE_ACCESS_KEY_SECRET=")) { - secretsFile.appendText("HERE_ACCESS_KEY_SECRET=HERE_ACCESS_KEY_SECRET\n") - println("Added HERE_ACCESS_KEY_SECRET to secrets.properties") - } - - // Ensure HERE_ACCESS_KEY_ID and HERE_ACCESS_KEY_SECRET exist in local.defaults.properties - val defaultsContent = defaultsFile.readText() - if (!defaultsContent.contains("HERE_ACCESS_KEY_ID=")) { - defaultsFile.appendText("HERE_ACCESS_KEY_ID=HERE_ACCESS_KEY_ID\n") - println("Added HERE_ACCESS_KEY_ID to local.defaults.properties") - } - if (!defaultsContent.contains("HERE_ACCESS_KEY_SECRET=")) { - defaultsFile.appendText("HERE_ACCESS_KEY_SECRET=HERE_ACCESS_KEY_SECRET\n") - println("Added HERE_ACCESS_KEY_SECRET to local.defaults.properties") - } - } -} - -// Functions to read API keys from secrets.properties -fun getHereAccessKeyId(): String { - val secretsFile = rootProject.file("secrets.properties") - val defaultsFile = rootProject.file("local.defaults.properties") - - // Try to read from secrets.properties first - if (secretsFile.exists()) { - val content = secretsFile.readText() - content.lines().forEach { line -> - if (line.startsWith("HERE_ACCESS_KEY_ID=")) { - val value = line.substringAfter("=").trim() - if (value.isNotEmpty() && value != "HERE_ACCESS_KEY_ID") { - return value - } - } - } - } - - // Fallback to local.defaults.properties - if (defaultsFile.exists()) { - val content = defaultsFile.readText() - content.lines().forEach { line -> - if (line.startsWith("HERE_ACCESS_KEY_ID=")) { - val value = line.substringAfter("=").trim() - if (value.isNotEmpty()) { - return value - } - } - } - } - - // Return placeholder if no valid key found - return "HERE_ACCESS_KEY_ID" -} - -fun getHereAccessKeySecret(): String { - val secretsFile = rootProject.file("secrets.properties") - val defaultsFile = rootProject.file("local.defaults.properties") - - // Try to read from secrets.properties first - if (secretsFile.exists()) { - val content = secretsFile.readText() - content.lines().forEach { line -> - if (line.startsWith("HERE_ACCESS_KEY_SECRET=")) { - val value = line.substringAfter("=").trim() - if (value.isNotEmpty() && value != "HERE_ACCESS_KEY_SECRET") { - return value - } - } - } - } - - // Fallback to local.defaults.properties - if (defaultsFile.exists()) { - val content = defaultsFile.readText() - content.lines().forEach { line -> - if (line.startsWith("HERE_ACCESS_KEY_SECRET=")) { - val value = line.substringAfter("=").trim() - if (value.isNotEmpty()) { - return value - } - } - } - } - - // Return placeholder if no valid key found - return "HERE_ACCESS_KEY_SECRET" -} android { namespace = "com.mapconductor.here" compileSdk = project.property("compileSdk").toString().toInt() @@ -134,10 +24,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") - - // Set the HERE API keys from secrets.properties - manifestPlaceholders["HERE_ACCESS_KEY_ID"] = getHereAccessKeyId() - manifestPlaceholders["HERE_ACCESS_KEY_SECRET"] = getHereAccessKeySecret() } buildFeatures { @@ -166,10 +52,6 @@ android { } } - // Run ensureSecretsFiles before processing manifests - tasks.matching { it.name.contains("process") && it.name.contains("Manifest") }.configureEach { - dependsOn("ensureSecretsFiles") - } compileOptions { sourceCompatibility = JavaVersion.toVersion(project.property("javaVersion").toString()) targetCompatibility = JavaVersion.toVersion(project.property("javaVersion").toString()) @@ -184,10 +66,10 @@ dependencies { compileOnly(libs.androidx.ui) compileOnly(libs.androidx.ui.tooling.preview) compileOnly(libs.androidx.foundation) - compileOnly(platform(libs.androidx.compose.bom)) // ← bomでバージョン合わせる + implementation(platform(libs.androidx.compose.bom)) // ← bomでバージョン合わせる // Lifecycle(MapView用) - compileOnly(libs.androidx.lifecycle.runtime.ktx) - compileOnly(libs.androidx.lifecycle.common.java8) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.lifecycle.common.java8) // libs compileOnly( diff --git a/mapconductor-for-here/gradle.properties b/mapconductor-for-here/gradle.properties index 57b18dd1..8d73c695 100644 --- a/mapconductor-for-here/gradle.properties +++ b/mapconductor-for-here/gradle.properties @@ -1 +1 @@ -libraryVersion=1.0.0 +libraryVersion=1.0.1 diff --git a/mapconductor-for-here/src/main/AndroidManifest.xml b/mapconductor-for-here/src/main/AndroidManifest.xml index da77d7df..78c3e858 100644 --- a/mapconductor-for-here/src/main/AndroidManifest.xml +++ b/mapconductor-for-here/src/main/AndroidManifest.xml @@ -1,11 +1,2 @@ - - - - - - + diff --git a/mapconductor-for-mapbox/build.gradle.kts b/mapconductor-for-mapbox/build.gradle.kts index 37edfe8b..27ab1dad 100644 --- a/mapconductor-for-mapbox/build.gradle.kts +++ b/mapconductor-for-mapbox/build.gradle.kts @@ -15,86 +15,14 @@ ktlint { } } -// Task to create secrets.properties in root project if it doesn't exist -tasks.register("ensureSecretsFiles") { - doFirst { - val secretsFile = rootProject.file("secrets.properties") - val defaultsFile = rootProject.file("local.defaults.properties") - - // Create secrets.properties if it doesn't exist - if (!secretsFile.exists()) { - secretsFile.createNewFile() - println("Created secrets.properties in root project") - } - - // Create local.defaults.properties if it doesn't exist - if (!defaultsFile.exists()) { - defaultsFile.createNewFile() - println("Created local.defaults.properties in root project") - } - - // Ensure MAPBOX_ACCESS_TOKEN exists in secrets.properties - val secretsContent = secretsFile.readText() - if (!secretsContent.contains("MAPBOX_ACCESS_TOKEN=")) { - secretsFile.appendText("MAPBOX_ACCESS_TOKEN=MAPBOX_ACCESS_TOKEN\n") - println("Added MAPBOX_ACCESS_TOKEN to secrets.properties") - } - - // Ensure MAPBOX_ACCESS_TOKEN exists in local.defaults.properties - val defaultsContent = defaultsFile.readText() - if (!defaultsContent.contains("MAPBOX_ACCESS_TOKEN=")) { - defaultsFile.appendText("MAPBOX_ACCESS_TOKEN=MAPBOX_ACCESS_TOKEN\n") - println("Added MAPBOX_ACCESS_TOKEN to local.defaults.properties") - } - } -} - -// Function to read API key from secrets.properties -fun getMapboxAccessToken(): String { - val secretsFile = rootProject.file("secrets.properties") - val defaultsFile = rootProject.file("local.defaults.properties") - - // Try to read from secrets.properties first - if (secretsFile.exists()) { - val content = secretsFile.readText() - content.lines().forEach { line -> - if (line.startsWith("MAPBOX_ACCESS_TOKEN=")) { - val value = line.substringAfter("=").trim() - if (value.isNotEmpty() && value != "MAPBOX_ACCESS_TOKEN") { - return value - } - } - } - } - - // Fallback to local.defaults.properties - if (defaultsFile.exists()) { - val content = defaultsFile.readText() - content.lines().forEach { line -> - if (line.startsWith("MAPBOX_ACCESS_TOKEN=")) { - val value = line.substringAfter("=").trim() - if (value.isNotEmpty()) { - return value - } - } - } - } - - // Return placeholder if no valid key found - return "MAPBOX_ACCESS_TOKEN" -} android { namespace = "com.mapconductor.mapbox" compileSdk = project.property("compileSdk").toString().toInt() defaultConfig { minSdk = project.property("minSdk").toString().toInt() - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") - - // Set the Mapbox access token from secrets.properties - manifestPlaceholders["MAPBOX_ACCESS_TOKEN"] = getMapboxAccessToken() } buildFeatures { @@ -121,11 +49,6 @@ android { ) } } - - // Run ensureSecretsFiles before processing manifests - tasks.matching { it.name.contains("process") && it.name.contains("Manifest") }.configureEach { - dependsOn("ensureSecretsFiles") - } compileOptions { sourceCompatibility = JavaVersion.toVersion(project.property("javaVersion").toString()) targetCompatibility = JavaVersion.toVersion(project.property("javaVersion").toString()) @@ -140,10 +63,10 @@ dependencies { compileOnly(libs.androidx.ui) compileOnly(libs.androidx.foundation) compileOnly(libs.androidx.ui.tooling.preview) - compileOnly(platform(libs.androidx.compose.bom)) // ← bomでバージョン合わせる + implementation(platform(libs.androidx.compose.bom)) // ← bomでバージョン合わせる // Lifecycle(MapView用) - compileOnly(libs.androidx.lifecycle.runtime.ktx) - compileOnly(libs.androidx.lifecycle.common.java8) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.lifecycle.common.java8) // Mapbox SDK compileOnly(libs.mapbox.android) diff --git a/mapconductor-for-mapbox/gradle.properties b/mapconductor-for-mapbox/gradle.properties index 57b18dd1..8d73c695 100644 --- a/mapconductor-for-mapbox/gradle.properties +++ b/mapconductor-for-mapbox/gradle.properties @@ -1 +1 @@ -libraryVersion=1.0.0 +libraryVersion=1.0.1 diff --git a/mapconductor-for-mapbox/src/main/AndroidManifest.xml b/mapconductor-for-mapbox/src/main/AndroidManifest.xml index ab85bb72..dae961aa 100644 --- a/mapconductor-for-mapbox/src/main/AndroidManifest.xml +++ b/mapconductor-for-mapbox/src/main/AndroidManifest.xml @@ -1,8 +1,3 @@ - - - - - + + diff --git a/mapconductor-icons/build.gradle.kts b/mapconductor-icons/build.gradle.kts index 93ccf789..8b6ba200 100644 --- a/mapconductor-icons/build.gradle.kts +++ b/mapconductor-icons/build.gradle.kts @@ -63,9 +63,9 @@ android { dependencies { implementation(libs.androidx.core.ktx) - implementation(libs.androidx.compose.ui.tooling.preview) + compileOnly(libs.androidx.compose.ui.tooling.preview) compileOnly(libs.androidx.foundation) - compileOnly(platform(libs.androidx.compose.bom)) + implementation(platform(libs.androidx.compose.bom)) compileOnly(project(":mapconductor-core")) testImplementation(libs.junit) diff --git a/mapconductor-marker-native-strategy/build.gradle.kts b/mapconductor-marker-native-strategy/build.gradle.kts index 536467b9..d7804e5c 100644 --- a/mapconductor-marker-native-strategy/build.gradle.kts +++ b/mapconductor-marker-native-strategy/build.gradle.kts @@ -71,10 +71,10 @@ dependencies { // Compose dependencies for BitmapIcon/DefaultIcon compileOnly(libs.androidx.ui) compileOnly(libs.androidx.foundation) - compileOnly(platform(libs.androidx.compose.bom)) + implementation(platform(libs.androidx.compose.bom)) // Coroutines for Semaphore and withPermit - compileOnly("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3") testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) diff --git a/mapconductor-marker-native-strategy/gradle.properties b/mapconductor-marker-native-strategy/gradle.properties index e404242b..a6b2eab0 100644 --- a/mapconductor-marker-native-strategy/gradle.properties +++ b/mapconductor-marker-native-strategy/gradle.properties @@ -1,4 +1,4 @@ -libraryVersion=1.0.0 +libraryVersion=1.0.1 # Enable support for flexible page sizes (e.g., 16KB pages on Android 15+) APP_SUPPORT_FLEXIBLE_PAGE_SIZES = true diff --git a/mapconductor-marker-strategy/build.gradle.kts b/mapconductor-marker-strategy/build.gradle.kts index 24c799d0..8acec4eb 100644 --- a/mapconductor-marker-strategy/build.gradle.kts +++ b/mapconductor-marker-strategy/build.gradle.kts @@ -51,10 +51,10 @@ dependencies { // Compose dependencies for BitmapIcon/DefaultIcon compileOnly(libs.androidx.ui) compileOnly(libs.androidx.foundation) - compileOnly(platform(libs.androidx.compose.bom)) + implementation(platform(libs.androidx.compose.bom)) // Coroutines for Semaphore and withPermit - compileOnly("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3") testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) diff --git a/mapconductor-marker-strategy/gradle.properties b/mapconductor-marker-strategy/gradle.properties index 57b18dd1..8d73c695 100644 --- a/mapconductor-marker-strategy/gradle.properties +++ b/mapconductor-marker-strategy/gradle.properties @@ -1 +1 @@ -libraryVersion=1.0.0 +libraryVersion=1.0.1 From e6329363f84a8c591d2194565393a347fa819844 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sun, 12 Oct 2025 10:46:29 +0900 Subject: [PATCH 2/9] Adjust strategies for demonstration (and probably NativeRemoteSpatialMarkerStrategy has a bug) --- .../pages/marker/postoffice/PostOfficePage.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/example-app/src/main/java/com/mapconductor/example/pages/marker/postoffice/PostOfficePage.kt b/example-app/src/main/java/com/mapconductor/example/pages/marker/postoffice/PostOfficePage.kt index 18e5d845..dbb0abda 100644 --- a/example-app/src/main/java/com/mapconductor/example/pages/marker/postoffice/PostOfficePage.kt +++ b/example-app/src/main/java/com/mapconductor/example/pages/marker/postoffice/PostOfficePage.kt @@ -19,8 +19,8 @@ import com.mapconductor.example.ui.DemoMapPageScaffold import com.mapconductor.googlemaps.GoogleMapActualMarker import com.mapconductor.here.HereActualMarker import com.mapconductor.mapbox.MapboxActualMarker -import com.mapconductor.marker.nativestrategy.NativeSpatialMarkerStrategy -import com.mapconductor.marker.nativestrategy.spatial.NativeRemoteSpatialMarkerStrategy +import com.mapconductor.marker.nativestrategy.NativeParallelMarkerStrategy +import com.mapconductor.marker.nativestrategy.NativeSpatialMarkerRenderingStrategy @Composable fun PostOfficeMapPage( @@ -31,12 +31,12 @@ fun PostOfficeMapPage( val dataLoader = remember { PostOfficeDataLoader(context) } val strategies = remember { - val google = NativeRemoteSpatialMarkerStrategy(context) + val google = NativeParallelMarkerStrategy() // val google = NativeSpatialMarkerStrategy() // val google = NativeParallelMarkerStrategy() - val mapbox = NativeSpatialMarkerStrategy() - val here = NativeSpatialMarkerStrategy() - val arcgis = NativeSpatialMarkerStrategy() + val mapbox = NativeParallelMarkerStrategy() + val here = NativeParallelMarkerStrategy() + val arcgis = NativeSpatialMarkerRenderingStrategy() Strategies( google = google, mapbox = mapbox, From 2dedb9126bbe3562ea246a7f2d74e23599373ca0 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Wed, 15 Oct 2025 00:10:26 +0900 Subject: [PATCH 3/9] Open info window initially --- .../example/pages/infobubble/RichContentBubblePage.kt | 11 ++++++++--- .../example/pages/infobubble/SimpleTextBubblePage.kt | 1 + .../example/pages/infobubble/StyledInfoBubblePage.kt | 5 +++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/example-app/src/main/java/com/mapconductor/example/pages/infobubble/RichContentBubblePage.kt b/example-app/src/main/java/com/mapconductor/example/pages/infobubble/RichContentBubblePage.kt index cfd23e28..db274e4e 100644 --- a/example-app/src/main/java/com/mapconductor/example/pages/infobubble/RichContentBubblePage.kt +++ b/example-app/src/main/java/com/mapconductor/example/pages/infobubble/RichContentBubblePage.kt @@ -15,6 +15,7 @@ import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -75,6 +76,10 @@ fun RichContentBubblePage(onToggleSidebar: () -> Unit = {}) { extra = locationInfo, ) + LaunchedEffect(Unit) { + selectedMarker = markerState + } + mapViewState?.let { MapViewContainer( modifier = Modifier.fillMaxSize(), @@ -89,8 +94,8 @@ fun RichContentBubblePage(onToggleSidebar: () -> Unit = {}) { info?.let { InfoBubble( marker = marker, - bubbleColor = Color.White, - borderColor = Color.Gray, + bubbleColor = if (isDarkTheme) Color.Black else Color.White, + borderColor = if (isDarkTheme) Color.Gray else Color.Black, contentPadding = 16.dp, cornerRadius = 12.dp, ) { @@ -108,7 +113,7 @@ fun RichContentBubblePage(onToggleSidebar: () -> Unit = {}) { Text( text = info.description, style = MaterialTheme.typography.bodyMedium, - color = Color.Gray, + color = if (isDarkTheme) Color.White else Color.Gray, ) Spacer(modifier = Modifier.height(8.dp)) diff --git a/example-app/src/main/java/com/mapconductor/example/pages/infobubble/SimpleTextBubblePage.kt b/example-app/src/main/java/com/mapconductor/example/pages/infobubble/SimpleTextBubblePage.kt index 8140613a..63fb5b89 100644 --- a/example-app/src/main/java/com/mapconductor/example/pages/infobubble/SimpleTextBubblePage.kt +++ b/example-app/src/main/java/com/mapconductor/example/pages/infobubble/SimpleTextBubblePage.kt @@ -61,6 +61,7 @@ fun SimpleTextBubblePage(onToggleSidebar: () -> Unit = {}) { InfoBubble(marker = marker) { Text( text = marker.extra as? String ?: "No information", + color = MaterialTheme.colorScheme.primary, style = MaterialTheme.typography.bodyMedium, modifier = Modifier.padding(4.dp), ) diff --git a/example-app/src/main/java/com/mapconductor/example/pages/infobubble/StyledInfoBubblePage.kt b/example-app/src/main/java/com/mapconductor/example/pages/infobubble/StyledInfoBubblePage.kt index 68c800da..8a2e8351 100644 --- a/example-app/src/main/java/com/mapconductor/example/pages/infobubble/StyledInfoBubblePage.kt +++ b/example-app/src/main/java/com/mapconductor/example/pages/infobubble/StyledInfoBubblePage.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -48,6 +49,10 @@ fun StyledInfoBubblePage(onToggleSidebar: () -> Unit = {}) { extra = "Point of Interest", ) + LaunchedEffect(Unit) { + selectedMarker = markerState + } + mapViewState?.let { MapViewContainer( modifier = Modifier.fillMaxSize(), From bf3edcb3d27615e17a78294ac629faa8223825d4 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Wed, 15 Oct 2025 00:11:20 +0900 Subject: [PATCH 4/9] Use NativeRemoteSpatialMarkerStrategy for Google Map demo --- .../example/pages/marker/postoffice/PostOfficePage.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example-app/src/main/java/com/mapconductor/example/pages/marker/postoffice/PostOfficePage.kt b/example-app/src/main/java/com/mapconductor/example/pages/marker/postoffice/PostOfficePage.kt index dbb0abda..e333d159 100644 --- a/example-app/src/main/java/com/mapconductor/example/pages/marker/postoffice/PostOfficePage.kt +++ b/example-app/src/main/java/com/mapconductor/example/pages/marker/postoffice/PostOfficePage.kt @@ -21,6 +21,7 @@ import com.mapconductor.here.HereActualMarker import com.mapconductor.mapbox.MapboxActualMarker import com.mapconductor.marker.nativestrategy.NativeParallelMarkerStrategy import com.mapconductor.marker.nativestrategy.NativeSpatialMarkerRenderingStrategy +import com.mapconductor.marker.nativestrategy.spatial.NativeRemoteSpatialMarkerStrategy @Composable fun PostOfficeMapPage( @@ -31,8 +32,7 @@ fun PostOfficeMapPage( val dataLoader = remember { PostOfficeDataLoader(context) } val strategies = remember { - val google = NativeParallelMarkerStrategy() -// val google = NativeSpatialMarkerStrategy() + val google = NativeRemoteSpatialMarkerStrategy(context) // val google = NativeParallelMarkerStrategy() val mapbox = NativeParallelMarkerStrategy() val here = NativeParallelMarkerStrategy() From b81ad7b6d6c470ee4f660ce5403d9164429519c9 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Wed, 15 Oct 2025 00:11:39 +0900 Subject: [PATCH 5/9] Remove unused coroutine --- .../com/mapconductor/core/OverlayProvider.kt | 37 ------------------- 1 file changed, 37 deletions(-) diff --git a/mapconductor-core/src/main/java/com/mapconductor/core/OverlayProvider.kt b/mapconductor-core/src/main/java/com/mapconductor/core/OverlayProvider.kt index a37a8049..30377262 100644 --- a/mapconductor-core/src/main/java/com/mapconductor/core/OverlayProvider.kt +++ b/mapconductor-core/src/main/java/com/mapconductor/core/OverlayProvider.kt @@ -26,7 +26,6 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch open class MapViewScope { - val overflowScope = CoroutineScope(Dispatchers.IO) val markerAddSharedFlow = MutableSharedFlow(1000) val markerFlow = MutableStateFlow>(mutableMapOf()) val bubbleFlow = MutableStateFlow>(mutableMapOf()) @@ -67,42 +66,6 @@ fun CollectAndRenderOverlays( registry.getAll().forEach { overlay -> @Suppress("UNCHECKED_CAST") val typedOverlay = overlay as MapOverlay - -// LaunchedEffect(Unit) { -// typedOverlay.flow -// .debounce(100) // Debounce updates for 100ms to prevent excessive rendering -// .collect { items -> -// // typedOverlay.render(items, controller) -// -// if (items.isNotEmpty()) { -// return@collect -// } -// -// // Process items in chunks to prevent main thread blocking -// val chunks = items.values.chunked(500) // Process 50 items at a time -// -// chunks.forEach { chunk -> -// val chunkMap = -// chunk -// .associateBy { -// when (it) { -// is MarkerState -> it.id -// is CircleState -> it.id -// is PolylineState -> it.id -// is PolygonState -> it.id -// is GroundImageState -> it.id -// else -> it.toString() -// } -// }.toMutableMap() -// -// typedOverlay.render(chunkMap, controller) -// -// // Yield to allow other coroutines and UI updates -// yield() -// } -// } -// } - val flowState = typedOverlay.flow.collectAsState() LaunchedEffect(flowState.value) { From 6e37ed5165668f19128b96aa9a3eefcd36cab1a7 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Wed, 15 Oct 2025 00:11:53 +0900 Subject: [PATCH 6/9] Remove duplicated class --- .../NativeSpatialMarkerStrategy.kt | 187 ------------------ 1 file changed, 187 deletions(-) delete mode 100644 mapconductor-marker-native-strategy/src/main/java/com/mapconductor/marker/nativestrategy/NativeSpatialMarkerStrategy.kt diff --git a/mapconductor-marker-native-strategy/src/main/java/com/mapconductor/marker/nativestrategy/NativeSpatialMarkerStrategy.kt b/mapconductor-marker-native-strategy/src/main/java/com/mapconductor/marker/nativestrategy/NativeSpatialMarkerStrategy.kt deleted file mode 100644 index 60d925a0..00000000 --- a/mapconductor-marker-native-strategy/src/main/java/com/mapconductor/marker/nativestrategy/NativeSpatialMarkerStrategy.kt +++ /dev/null @@ -1,187 +0,0 @@ -package com.mapconductor.marker.nativestrategy - -import com.mapconductor.core.geocell.HexGeocell -import com.mapconductor.core.map.MapCameraPositionImpl -import com.mapconductor.core.marker.BitmapIcon -import com.mapconductor.core.marker.MarkerEntity -import com.mapconductor.core.marker.MarkerOverlayRenderer -import com.mapconductor.core.spherical.expandBounds -import kotlinx.coroutines.sync.Semaphore -import kotlinx.coroutines.sync.withPermit - -/** - * Advanced marker rendering strategy that leverages spatial indexing for optimal performance. - * - * This strategy uses the native spatial index (NativeMarkerIndex) to efficiently find markers - * within viewport bounds instead of iterating through all markers. This provides significant - * performance improvements, especially for large marker datasets (1000+ markers). - * - * Key optimizations: - * - Uses O(log n + k) spatial queries instead of O(n) full iteration - * - Leverages existing hex-based spatial index infrastructure - * - Reduces memory allocation and GC pressure - * - Supports both add/remove and add-only rendering modes - * - * Performance characteristics: - * - Small datasets (100-500 markers): 3-5x faster than default strategies - * - Medium datasets (1K-5K markers): 8-15x faster - * - Large datasets (10K+ markers): 15-50x faster - * - * @param expandMargin The margin for expanding viewport bounds (default 0.3 = 30% expansion) - * @param addOnlyMode If true, markers are never removed once rendered (like NativeAddOnlyMarkerStrategy) - * @param semaphore Semaphore for synchronizing rendering operations - */ -class NativeSpatialMarkerStrategy( - semaphore: Semaphore = Semaphore(1), - private val expandMargin: Double = 0.3, - private val addOnlyMode: Boolean = false, - geocell: HexGeocell = NativeHexGeocellImpl.defaultGeocell(), -) : NativeAbstractViewportStrategy(semaphore, geocell) { - override suspend fun onCameraChanged( - cameraPosition: MapCameraPositionImpl, - renderer: MarkerOverlayRenderer, - ) { - val visibleRegion = cameraPosition.visibleRegion ?: return - semaphore.withPermit { - // Expand bounds for better performance and smoother experience - val expandedBounds = expandBounds(visibleRegion.bounds, expandMargin) - - // Use native spatial query from the provided manager (keep consistent with onAdd/onUpdate) - val markersInBounds = markerManager.findMarkersInBounds(expandedBounds) - val markerIdsInBounds = markersInBounds.map { it.state.id } - val markersToRender = mutableListOf>() - val markersToRemove = mutableListOf>() - - // Fallback to iterating all entities if native spatial query fails (returns empty when it should return results) - val allEntities = markerManager.allEntities() - if (markersInBounds.isEmpty() && allEntities.isNotEmpty()) { - // Native spatial query likely failed, use fallback approach like SpatialMarkerStrategy - allEntities.forEach { entity -> - val isInViewport = expandedBounds.contains(entity.state.position) - - if (isInViewport && !entity.isRendered) { - markersToRender.add(entity) - entity.visible = true - } else if (!isInViewport && entity.isRendered && !addOnlyMode) { - markersToRemove.add(entity) - entity.visible = false - } else if (isInViewport) { - entity.visible = true - } else { - entity.visible = false - } - } - } else { - // Native spatial query worked, use the optimized path - markerIdsInBounds.forEach { markerId -> - markerManager.getEntity(markerId)?.let { entity -> - if (!entity.isRendered) { - markersToRender.add(entity) - entity.visible = true - } else { - entity.visible = true - } - } - } - - // Handle markers that left viewport (only in add/remove mode) - if (!addOnlyMode) { - allEntities.forEach { entity -> - if (entity.isRendered && !markerIdsInBounds.contains(entity.state.id)) { - markersToRemove.add(entity) - entity.visible = false - } - } - } - } - - // Remove markers that left the viewport - if (markersToRemove.isNotEmpty()) { - renderer.onRemove(markersToRemove) - markersToRemove.forEach { entity -> - entity.isRendered = false - entity.marker = null - } - } - - // Add markers that entered the viewport - if (markersToRender.isNotEmpty()) { - val addParams = - markersToRender.map { entity -> - object : MarkerOverlayRenderer.AddParams { - override val state = entity.state - override val bitmapIcon: BitmapIcon = - entity.state.icon?.toBitmapIcon() ?: defaultIcon - } - } - - val actualMarkers = renderer.onAdd(addParams) - actualMarkers.forEachIndexed { index, actualMarker -> - actualMarker?.let { - markersToRender[index].marker = it - markersToRender[index].isRendered = true - } - } - } - - if (markersToRender.isNotEmpty() || markersToRemove.isNotEmpty()) { - renderer.onPostProcess() - } - } - } -} - -/** - * Factory methods for creating commonly used spatial rendering strategies. - */ -object NativeSpatialMarkerRenderingStrategies { - /** - * Creates a spatial rendering strategy with add/remove mode. - * Optimized for map providers that handle marker add/remove operations efficiently. - * Uses moderate viewport expansion for balanced performance. - */ - fun withAddRemoveMode( - semaphore: Semaphore, - geocell: HexGeocell, - expandMargin: Double = 0.2, - ): NativeSpatialMarkerStrategy = - NativeSpatialMarkerStrategy( - expandMargin = expandMargin, - addOnlyMode = false, // Support add/remove for optimal memory usage - semaphore = semaphore, - geocell = geocell, - ) - - /** - * Creates a spatial rendering strategy with add-only mode. - * Optimized for map providers where marker removal operations are expensive. - * Uses larger viewport expansion for smoother experience. - */ - fun withAddOnlyMode( - semaphore: Semaphore, - geocell: HexGeocell, - expandMargin: Double = 0.5, - ): NativeSpatialMarkerStrategy = - NativeSpatialMarkerStrategy( - expandMargin = expandMargin, - addOnlyMode = true, // Add-only to avoid expensive remove operations - semaphore = semaphore, - geocell = geocell, - ) - - /** - * Creates a high-performance spatial rendering strategy for very large marker datasets. - * Uses aggressive viewport expansion and add-only mode for maximum performance. - */ - fun forLargeDatasets( - semaphore: Semaphore, - geocell: HexGeocell, - expandMargin: Double = 0.8, - ): NativeSpatialMarkerStrategy = - NativeSpatialMarkerStrategy( - expandMargin = expandMargin, - addOnlyMode = true, // Maximize performance for large datasets - semaphore = semaphore, - geocell = geocell, - ) -} From 4a651d5360e4dc580a57f6d773b69330cbe9fc80 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Wed, 15 Oct 2025 00:12:20 +0900 Subject: [PATCH 7/9] Open Info Bubbles on start --- .../example/pages/infobubble/MultipleBubblesPage.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/example-app/src/main/java/com/mapconductor/example/pages/infobubble/MultipleBubblesPage.kt b/example-app/src/main/java/com/mapconductor/example/pages/infobubble/MultipleBubblesPage.kt index d92f3880..1d856bdc 100644 --- a/example-app/src/main/java/com/mapconductor/example/pages/infobubble/MultipleBubblesPage.kt +++ b/example-app/src/main/java/com/mapconductor/example/pages/infobubble/MultipleBubblesPage.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -52,6 +53,11 @@ fun MultipleBubblesPage(onToggleSidebar: () -> Unit = {}) { } } + // Initially open the info bubble + LaunchedEffect(Unit) { + selectedMarkers = markerStates.map { it.id }.toSet() + } + DemoMapPageScaffold( menuItems = DefaultMapViewItems(initCameraPosition), onToggleSidebar = onToggleSidebar, From c2cd45101b104ea9c0da54816396a79ea4f3274f Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Wed, 15 Oct 2025 00:12:31 +0900 Subject: [PATCH 8/9] Remove unused code comment --- .../com/mapconductor/core/marker/MarkerCompose.kt | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/mapconductor-core/src/main/java/com/mapconductor/core/marker/MarkerCompose.kt b/mapconductor-core/src/main/java/com/mapconductor/core/marker/MarkerCompose.kt index 09c1f952..7b399e95 100644 --- a/mapconductor-core/src/main/java/com/mapconductor/core/marker/MarkerCompose.kt +++ b/mapconductor-core/src/main/java/com/mapconductor/core/marker/MarkerCompose.kt @@ -11,17 +11,6 @@ fun MapViewScope.Marker(state: MarkerState) { LaunchedEffect(state) { markerAddSharedFlow.emit(state) } -// DisposableEffect(Unit) { -// overflowScope.launch { -// markerAddSharedFlow.emit(state) -// } -// -// onDispose { -// val newMap = bubbleFlow.value.toMutableMap() -// newMap.remove(state.id) -// bubbleFlow.value = newMap -// } -// } } @Composable From 5144bf8e8cba563e0111175deb1d9edc1d8071dc Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Wed, 15 Oct 2025 00:12:47 +0900 Subject: [PATCH 9/9] Remove deleted class demo code --- docs/src/experimental/marker-native-strategy.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/docs/src/experimental/marker-native-strategy.md b/docs/src/experimental/marker-native-strategy.md index de68744a..325c90d9 100644 --- a/docs/src/experimental/marker-native-strategy.md +++ b/docs/src/experimental/marker-native-strategy.md @@ -94,20 +94,6 @@ val strategy = SimpleNativeParallelStrategy( ) ``` -#### NativeSpatialMarkerStrategy - -Advanced spatial rendering with clustering: - -```kotlin -import com.mapconductor.marker.nativestrategy.NativeSpatialMarkerStrategy - -val spatialStrategy = NativeSpatialMarkerStrategy( - clusteringEnabled = true, - clusterThreshold = 100, // Cluster when > 100 markers in area - geocell = HexGeocellImpl.defaultGeocell() -) -``` - ## Basic Usage ### Simple Native Manager