From 0f1d499d5f194dd517891d265ebc9d66942cfc59 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sun, 12 Oct 2025 00:57:40 +0900 Subject: [PATCH 1/2] Fix: can not initialize map views without the marker-strategy module --- mapconductor-core/build.gradle.kts | 12 ++--- .../src/main/AndroidManifest.xml | 1 + .../com/mapconductor/core/ResourceProvider.kt | 6 --- .../com/mapconductor/core/map/MapViewBase.kt | 6 +-- mapconductor-for-googlemaps/build.gradle.kts | 18 ++++---- .../src/main/AndroidManifest.xml | 5 +-- .../marker/strategy/spatial/InitProvider.kt | 45 ------------------- 7 files changed, 20 insertions(+), 73 deletions(-) delete mode 100644 mapconductor-marker-strategy/src/main/java/com/mapconductor/marker/strategy/spatial/InitProvider.kt diff --git a/mapconductor-core/build.gradle.kts b/mapconductor-core/build.gradle.kts index b395ae15..b8689f11 100644 --- a/mapconductor-core/build.gradle.kts +++ b/mapconductor-core/build.gradle.kts @@ -1,7 +1,7 @@ plugins { - id("com.android.library") - id("org.jetbrains.kotlin.android") alias(libs.plugins.kotlin.compose) + alias(libs.plugins.android.library) + alias(libs.plugins.kotlin.android) id("org.jlleitschuh.gradle.ktlint") id("maven-publish") id("signing") @@ -63,16 +63,16 @@ dependencies { // Make Compose dependencies implementation instead of compileOnly for proper runtime support implementation(libs.androidx.ui) implementation(libs.androidx.ui.graphics) - implementation(libs.androidx.ui.tooling.preview) + compileOnly(libs.androidx.ui.tooling.preview) implementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.foundation) implementation(libs.net.sf.geographiclib) // Core dependencies - use api to avoid version conflicts - api(libs.androidx.core.ktx) + implementation(libs.androidx.core.ktx) // Lifecycle(MapView用) - api(libs.androidx.lifecycle.runtime.ktx) - api(libs.androidx.lifecycle.common.java8) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.lifecycle.common.java8) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) diff --git a/mapconductor-core/src/main/AndroidManifest.xml b/mapconductor-core/src/main/AndroidManifest.xml index a60fb083..9c11f207 100644 --- a/mapconductor-core/src/main/AndroidManifest.xml +++ b/mapconductor-core/src/main/AndroidManifest.xml @@ -4,4 +4,5 @@ + diff --git a/mapconductor-core/src/main/java/com/mapconductor/core/ResourceProvider.kt b/mapconductor-core/src/main/java/com/mapconductor/core/ResourceProvider.kt index 09084bb0..6d62e264 100644 --- a/mapconductor-core/src/main/java/com/mapconductor/core/ResourceProvider.kt +++ b/mapconductor-core/src/main/java/com/mapconductor/core/ResourceProvider.kt @@ -8,8 +8,6 @@ import android.content.res.Resources import android.os.Build import android.util.DisplayMetrics import android.util.TypedValue -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow data class IconResource( val name: String, @@ -21,9 +19,6 @@ data class IconResource( ) object ResourceProvider { - private val _initialized: MutableStateFlow = MutableStateFlow(false) - val initialized = _initialized.asStateFlow() - private lateinit var appContext: Context fun getDisplayMetrics(): DisplayMetrics = Resources.getSystem().displayMetrics @@ -32,7 +27,6 @@ object ResourceProvider { fun init(context: Context) { appContext = context.applicationContext - _initialized.value = true } fun getDensity(): Float = getDisplayMetrics().density diff --git a/mapconductor-core/src/main/java/com/mapconductor/core/map/MapViewBase.kt b/mapconductor-core/src/main/java/com/mapconductor/core/map/MapViewBase.kt index 0706a464..c7ef472a 100644 --- a/mapconductor-core/src/main/java/com/mapconductor/core/map/MapViewBase.kt +++ b/mapconductor-core/src/main/java/com/mapconductor/core/map/MapViewBase.kt @@ -20,6 +20,7 @@ import androidx.compose.ui.geometry.Size import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.SubcomposeLayout import androidx.compose.ui.node.Ref +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.Constraints @@ -87,7 +88,7 @@ fun < shouldInitialize: Boolean = true, // Allow deferring initialization content: (@Composable SpecificScope.() -> Unit)? = null, ) { - val isResourceProviderReady by ResourceProvider.initialized.collectAsState() + ResourceProvider.init(LocalContext.current) val initState by state.isInitialized.collectAsState() val cameraPosition by state.cameraPosition.collectAsState() val bubbles by scope.bubbleFlow.collectAsState() @@ -276,8 +277,7 @@ fun < } } - LaunchedEffect(isResourceProviderReady, initState, shouldInitialize) { - if (!isResourceProviderReady) return@LaunchedEffect + LaunchedEffect(initState, shouldInitialize) { if (!shouldInitialize) return@LaunchedEffect // Don't initialize if deferred if (initState != InitState.NotStarted) return@LaunchedEffect state.initAsync(onInitialize) diff --git a/mapconductor-for-googlemaps/build.gradle.kts b/mapconductor-for-googlemaps/build.gradle.kts index 52ebaaef..c7eabe7c 100644 --- a/mapconductor-for-googlemaps/build.gradle.kts +++ b/mapconductor-for-googlemaps/build.gradle.kts @@ -62,18 +62,18 @@ android { dependencies { - compileOnly(libs.androidx.core.ktx) - compileOnly(libs.androidx.ui) - compileOnly(libs.androidx.foundation) - compileOnly(libs.androidx.ui.tooling.preview) - compileOnly(platform(libs.androidx.compose.bom)) // ← bomでバージョン合わせる + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.ui) + implementation(libs.androidx.foundation) + implementation(libs.androidx.ui.tooling.preview) + 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) // Google Maps SDK - compileOnly(libs.play.services.maps) - compileOnly(project(":mapconductor-core")) + implementation(libs.play.services.maps) + implementation(project(":mapconductor-core")) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) diff --git a/mapconductor-marker-strategy/src/main/AndroidManifest.xml b/mapconductor-marker-strategy/src/main/AndroidManifest.xml index bd2f207e..eaacd03c 100644 --- a/mapconductor-marker-strategy/src/main/AndroidManifest.xml +++ b/mapconductor-marker-strategy/src/main/AndroidManifest.xml @@ -1,9 +1,6 @@ - + diff --git a/mapconductor-marker-strategy/src/main/java/com/mapconductor/marker/strategy/spatial/InitProvider.kt b/mapconductor-marker-strategy/src/main/java/com/mapconductor/marker/strategy/spatial/InitProvider.kt deleted file mode 100644 index c3619e3c..00000000 --- a/mapconductor-marker-strategy/src/main/java/com/mapconductor/marker/strategy/spatial/InitProvider.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.mapconductor.marker.strategy.spatial - -import com.mapconductor.core.ResourceProvider -import android.content.ContentProvider -import android.content.ContentValues -import android.database.Cursor -import android.net.Uri - -class InitProvider : ContentProvider() { - override fun onCreate(): Boolean { - val context = context?.applicationContext - if (context != null) { - ResourceProvider.init(context) - } - return true - } - - override fun query( - uri: Uri, - projection: Array?, - selection: String?, - selectionArgs: Array?, - sortOrder: String?, - ): Cursor? = null - - override fun getType(uri: Uri): String? = null - - override fun insert( - uri: Uri, - values: ContentValues?, - ): Uri? = null - - override fun delete( - uri: Uri, - selection: String?, - selectionArgs: Array?, - ): Int = 0 - - override fun update( - uri: Uri, - values: ContentValues?, - selection: String?, - selectionArgs: Array?, - ): Int = 0 -} From dae45f07a67e8c86bbd42f8bbb3e240bb28cb233 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sun, 12 Oct 2025 02:05:10 +0900 Subject: [PATCH 2/2] Get rid of the GoogleMaps secrets plugin --- build.gradle.kts | 3 - example-app/build.gradle.kts | 39 ------ example-app/src/main/AndroidManifest.xml | 18 --- gradle/libs.versions.toml | 3 - mapconductor-for-arcgis/build.gradle.kts | 76 +++++++++++ .../src/main/AndroidManifest.xml | 10 +- mapconductor-for-googlemaps/build.gradle.kts | 77 ++++++++++++ .../src/main/AndroidManifest.xml | 9 +- mapconductor-for-here/build.gradle.kts | 119 ++++++++++++++++++ .../src/main/AndroidManifest.xml | 11 +- mapconductor-for-mapbox/build.gradle.kts | 76 +++++++++++ .../src/main/AndroidManifest.xml | 8 +- 12 files changed, 381 insertions(+), 68 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 0039fd6c..0d2baf80 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,9 +14,6 @@ buildscript { google() mavenCentral() } - dependencies { - classpath(libs.secrets.gradle.plugin) - } } val localPropertiesFile = rootProject.file("local.properties") diff --git a/example-app/build.gradle.kts b/example-app/build.gradle.kts index e8608290..4cb9db41 100644 --- a/example-app/build.gradle.kts +++ b/example-app/build.gradle.kts @@ -1,40 +1,25 @@ plugins { - alias(libs.plugins.android.application) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.compose) - - id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") - id("org.jlleitschuh.gradle.ktlint") } ktlint { - android.set(true) - reporters { - reporter(org.jlleitschuh.gradle.ktlint.reporter.ReporterType.PLAIN) - reporter(org.jlleitschuh.gradle.ktlint.reporter.ReporterType.CHECKSTYLE) } } android { - namespace = "com.mapconductor.example" - compileSdk = project.property("compileSdk").toString().toInt() defaultConfig { - applicationId = "com.mapconductor.example" - minSdk = project.property("minSdk").toString().toInt() - targetSdk = project.property("targetSdk").toString().toInt() ndk { abiFilters += listOf("arm64-v8a") @@ -44,23 +29,18 @@ android { } versionCode = 5 - versionName = "1.0.4" - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } composeOptions { - kotlinCompilerExtensionVersion = - project.property("kotlinCompilerExtensionVersion").toString() } buildTypes { debug { - isMinifyEnabled = false proguardFiles( @@ -150,25 +130,6 @@ android { } } -secrets { - - // To add your Maps API key to this project: - - // 1. If the secrets.properties file does not exist, create it in the same folder as the local.properties file. - - // 2. Add this line, where YOUR_API_KEY is your API key: - - // MAPS_API_KEY=YOUR_API_KEY - - propertiesFileName = "secrets.properties" - - // A properties file containing default secret values. This file can be - - // checked in version control. - - defaultPropertiesFileName = "local.defaults.properties" -} - dependencies { implementation(libs.androidx.core.ktx) diff --git a/example-app/src/main/AndroidManifest.xml b/example-app/src/main/AndroidManifest.xml index ad65088c..23730101 100644 --- a/example-app/src/main/AndroidManifest.xml +++ b/example-app/src/main/AndroidManifest.xml @@ -18,24 +18,6 @@ android:theme="@style/Theme.OverlayTest" tools:targetApi="35"> - - - - - - - - + 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() @@ -24,6 +92,9 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") + + // Set the ArcGIS API key from secrets.properties + manifestPlaceholders["ARCGIS_API_KEY"] = getArcgisApiKey() } buildFeatures { @@ -51,6 +122,11 @@ 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()) diff --git a/mapconductor-for-arcgis/src/main/AndroidManifest.xml b/mapconductor-for-arcgis/src/main/AndroidManifest.xml index 78c3e858..06e5f3c4 100644 --- a/mapconductor-for-arcgis/src/main/AndroidManifest.xml +++ b/mapconductor-for-arcgis/src/main/AndroidManifest.xml @@ -1,2 +1,10 @@ - + + + + + + + diff --git a/mapconductor-for-googlemaps/build.gradle.kts b/mapconductor-for-googlemaps/build.gradle.kts index c7eabe7c..b168597c 100644 --- a/mapconductor-for-googlemaps/build.gradle.kts +++ b/mapconductor-for-googlemaps/build.gradle.kts @@ -15,6 +15,75 @@ 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() @@ -24,6 +93,9 @@ 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 { @@ -51,6 +123,11 @@ 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()) diff --git a/mapconductor-for-googlemaps/src/main/AndroidManifest.xml b/mapconductor-for-googlemaps/src/main/AndroidManifest.xml index 44008a43..118224ea 100644 --- a/mapconductor-for-googlemaps/src/main/AndroidManifest.xml +++ b/mapconductor-for-googlemaps/src/main/AndroidManifest.xml @@ -1,4 +1,9 @@ - + - \ No newline at end of file + + + + diff --git a/mapconductor-for-here/build.gradle.kts b/mapconductor-for-here/build.gradle.kts index 60f72572..43628872 100644 --- a/mapconductor-for-here/build.gradle.kts +++ b/mapconductor-for-here/build.gradle.kts @@ -15,6 +15,116 @@ 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() @@ -24,6 +134,10 @@ 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 { @@ -51,6 +165,11 @@ 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()) diff --git a/mapconductor-for-here/src/main/AndroidManifest.xml b/mapconductor-for-here/src/main/AndroidManifest.xml index 78c3e858..da77d7df 100644 --- a/mapconductor-for-here/src/main/AndroidManifest.xml +++ b/mapconductor-for-here/src/main/AndroidManifest.xml @@ -1,2 +1,11 @@ - + + + + + + diff --git a/mapconductor-for-mapbox/build.gradle.kts b/mapconductor-for-mapbox/build.gradle.kts index 60b590ea..37edfe8b 100644 --- a/mapconductor-for-mapbox/build.gradle.kts +++ b/mapconductor-for-mapbox/build.gradle.kts @@ -15,6 +15,74 @@ 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() @@ -24,6 +92,9 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") + + // Set the Mapbox access token from secrets.properties + manifestPlaceholders["MAPBOX_ACCESS_TOKEN"] = getMapboxAccessToken() } buildFeatures { @@ -50,6 +121,11 @@ 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()) diff --git a/mapconductor-for-mapbox/src/main/AndroidManifest.xml b/mapconductor-for-mapbox/src/main/AndroidManifest.xml index 78c3e858..ab85bb72 100644 --- a/mapconductor-for-mapbox/src/main/AndroidManifest.xml +++ b/mapconductor-for-mapbox/src/main/AndroidManifest.xml @@ -1,2 +1,8 @@ - + + + + +