From 618ad59ab85c72c6a903a228e568bd302f706e6e Mon Sep 17 00:00:00 2001 From: OpenAI Codex Date: Mon, 14 Sep 2026 09:16:44 +0800 Subject: [PATCH] fix: align QBIN V4 Android particle.3 validation baseline --- .../MapLibreParticleRNTestHost/metro.config.js | 8 ++++++++ .../plugins/withParticleNativeAndroid.js | 2 +- packages/maplibre-particle-rn/android/build.gradle | 2 +- .../particle/weather/WeatherRuntimeBridgeModule.kt | 4 ++-- packages/maplibre-particle-rn/app.plugin.js | 2 +- .../android/MapLibreAndroid/src/cpp/native_map_view.hpp | 2 +- platform/android/VERSION | 2 +- 7 files changed, 15 insertions(+), 7 deletions(-) diff --git a/integration/react-native/MapLibreParticleRNTestHost/metro.config.js b/integration/react-native/MapLibreParticleRNTestHost/metro.config.js index 9300b59a2..c3b364191 100644 --- a/integration/react-native/MapLibreParticleRNTestHost/metro.config.js +++ b/integration/react-native/MapLibreParticleRNTestHost/metro.config.js @@ -1,6 +1,14 @@ +const fs = require("fs"); +const path = require("path"); const { getDefaultConfig } = require("expo/metro-config"); const config = getDefaultConfig(__dirname); config.resolver.assetExts = [...new Set([...config.resolver.assetExts, "f32", "u8", "qbin"])]; +const fixtureCandidates = [ + path.resolve(__dirname, "..", "particle-v3-fields"), + path.resolve(__dirname, "..", "..", "particle-v3-fields"), +]; +config.watchFolders = fixtureCandidates.filter((candidate) => fs.existsSync(candidate)); + module.exports = config; diff --git a/integration/react-native/MapLibreParticleRNTestHost/plugins/withParticleNativeAndroid.js b/integration/react-native/MapLibreParticleRNTestHost/plugins/withParticleNativeAndroid.js index 5def3358a..16c2afe57 100644 --- a/integration/react-native/MapLibreParticleRNTestHost/plugins/withParticleNativeAndroid.js +++ b/integration/react-native/MapLibreParticleRNTestHost/plugins/withParticleNativeAndroid.js @@ -6,7 +6,7 @@ const marker = "// MapLibreParticleRNTestHost NavSea Particle release SDK"; module.exports = function withParticleNativeAndroid(config) { return withProjectBuildGradle(config, (project) => { if (project.modResults.contents.includes(marker)) return project; - project.modResults.contents += `\n${marker}\ngradle.projectsEvaluated {\n allprojects { p ->\n p.repositories.mavenLocal()\n p.configurations.configureEach { configuration ->\n configuration.resolutionStrategy.dependencySubstitution {\n substitute module("org.maplibre.gl:android-sdk-opengl") using module("cc.navsea.maplibre:android-sdk-particle-opengl:13.4.1-particle.2")\n }\n }\n }\n}\nrootProject.ext.set("org.maplibre.reactnative.nativeVersion", "13.4.1")\nrootProject.ext.set("org.maplibre.reactnative.nativeVariant", "opengl")\n`; + project.modResults.contents += `\n${marker}\ngradle.projectsEvaluated {\n allprojects { p ->\n p.repositories.maven { repository -> repository.url = p.uri("https://pbf.jpcn.ccwu.cc/maven") }\n p.configurations.configureEach { configuration ->\n configuration.resolutionStrategy.dependencySubstitution {\n substitute module("org.maplibre.gl:android-sdk-opengl") using module("cc.navsea.maplibre:android-sdk-particle-opengl:13.4.1-particle.3")\n }\n }\n }\n}\nrootProject.ext.set("org.maplibre.reactnative.nativeVersion", "13.4.1")\nrootProject.ext.set("org.maplibre.reactnative.nativeVariant", "opengl")\n`; return project; }); }; diff --git a/packages/maplibre-particle-rn/android/build.gradle b/packages/maplibre-particle-rn/android/build.gradle index 42ed785f0..4cf94ecf3 100644 --- a/packages/maplibre-particle-rn/android/build.gradle +++ b/packages/maplibre-particle-rn/android/build.gradle @@ -14,7 +14,7 @@ android { dependencies { implementation "com.facebook.react:react-android" implementation "org.jetbrains.kotlin:kotlin-stdlib:2.1.20" - implementation "cc.navsea.maplibre:android-sdk-particle-opengl:13.4.1-particle.2" + implementation "cc.navsea.maplibre:android-sdk-particle-opengl:13.4.1-particle.3" compileOnly project(":maplibre_maplibre-react-native") } diff --git a/packages/maplibre-particle-rn/android/src/main/java/org/navsea/maplibre/particle/weather/WeatherRuntimeBridgeModule.kt b/packages/maplibre-particle-rn/android/src/main/java/org/navsea/maplibre/particle/weather/WeatherRuntimeBridgeModule.kt index 56bb72c5e..5b4f8721b 100644 --- a/packages/maplibre-particle-rn/android/src/main/java/org/navsea/maplibre/particle/weather/WeatherRuntimeBridgeModule.kt +++ b/packages/maplibre-particle-rn/android/src/main/java/org/navsea/maplibre/particle/weather/WeatherRuntimeBridgeModule.kt @@ -296,9 +296,9 @@ class WeatherRuntimeBridgeModule(private val context: ReactApplicationContext) : private fun presence(exists: Boolean) = if (exists) "present" else "missing" private fun validEncodedId(value: String) = value.toByteArray(Charsets.UTF_8).size in 1..MAX_ENCODED_ID_UTF8_BYTES private fun validEncodedContractJson(value: String) = value.isNotEmpty() && value.toByteArray(Charsets.UTF_8).size <= MAX_CONTRACT_UTF8_BYTES && try { validEncodedId(org.json.JSONObject(value).optString("profileID", "")) } catch (_: org.json.JSONException) { false } - private fun validUInt16(value: Double, positive: Boolean) = value.isFinite() && value == kotlin.math.floor(value) && value >= if (positive) 1 else 0 && value <= 0xffff + private fun validUInt16(value: Double, positive: Boolean) = value.isFinite() && value == kotlin.math.floor(value) && value >= (if (positive) 1.0 else 0.0) && value <= 0xffff private fun inactiveSelector(semanticID: Double, groupID: Double) = semanticID == 0.0 && groupID == 0.0 - private fun validSafeInteger(value: Double, positive: Boolean) = value.isFinite() && value <= MAX_SAFE_INTEGER && value >= if (positive) 1 else 0 && value == kotlin.math.floor(value) + private fun validSafeInteger(value: Double, positive: Boolean) = value.isFinite() && value <= MAX_SAFE_INTEGER && value >= (if (positive) 1.0 else 0.0) && value == kotlin.math.floor(value) private fun reject(promise: Promise, code: String, message: String) = promise.reject(code, message) private object WeatherIds { diff --git a/packages/maplibre-particle-rn/app.plugin.js b/packages/maplibre-particle-rn/app.plugin.js index b497407bb..bafe3f3ad 100644 --- a/packages/maplibre-particle-rn/app.plugin.js +++ b/packages/maplibre-particle-rn/app.plugin.js @@ -6,7 +6,7 @@ const marker = "// @navsea/maplibre-particle-rn Android OpenGL release"; module.exports = function withNavSeaMapLibreParticle(config) { return withProjectBuildGradle(config, (project) => { if (project.modResults.contents.includes(marker)) return project; - project.modResults.contents += `\n${marker}\ngradle.projectsEvaluated {\n allprojects { p ->\n p.repositories.maven { repository -> repository.url = p.uri("https://pbf.jpcn.ccwu.cc/maven") }\n p.configurations.configureEach { configuration ->\n configuration.resolutionStrategy.dependencySubstitution {\n substitute module("org.maplibre.gl:android-sdk-opengl") using module("cc.navsea.maplibre:android-sdk-particle-opengl:13.4.1-particle.2")\n }\n }\n }\n}\nrootProject.ext.set("org.maplibre.reactnative.nativeVersion", "13.4.1")\nrootProject.ext.set("org.maplibre.reactnative.nativeVariant", "opengl")\n`; + project.modResults.contents += `\n${marker}\ngradle.projectsEvaluated {\n allprojects { p ->\n p.repositories.maven { repository -> repository.url = p.uri("https://pbf.jpcn.ccwu.cc/maven") }\n p.configurations.configureEach { configuration ->\n configuration.resolutionStrategy.dependencySubstitution {\n substitute module("org.maplibre.gl:android-sdk-opengl") using module("cc.navsea.maplibre:android-sdk-particle-opengl:13.4.1-particle.3")\n }\n }\n }\n}\nrootProject.ext.set("org.maplibre.reactnative.nativeVersion", "13.4.1")\nrootProject.ext.set("org.maplibre.reactnative.nativeVariant", "opengl")\n`; return project; }); }; diff --git a/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp b/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp index 9ea178e80..11954f25e 100644 --- a/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp @@ -314,7 +314,7 @@ public: jni::jint clearRasterArraySourceEncodedField(JNIEnv&, const jni::String&, const jni::String&); jni::jint clearAllRasterArraySourceEncodedFields(JNIEnv&, const jni::String&); jni::jint setRasterArraySourceEncodedColorBinding(JNIEnv&, const jni::String&, const jni::String&, jni::jint, jni::jint, jni::jint, jni::jint); - jni::jint setRasterArraySourceEncodedParticleBinding(JNIEnv&, const jni::String&, const jni::String&, jni::jint, jni::jint, jni::jint, jni::jint, jni::jint, jni::jint, jni::jint); + jni::jint setRasterArraySourceEncodedParticleBinding(JNIEnv&, const jni::String&, const jni::String&, jni::jint, jni::jint, jni::jint, jni::jint, jni::jint, jni::jint, jni::jint, jni::jint); jni::jint setRasterArraySourceEncodedForecastTime(JNIEnv&, const jni::String&, jni::jlong); jni::jint setRasterArraySourceEncodedForecastPlaybackState(JNIEnv&, const jni::String&, jni::jboolean); jni::jint setRasterArraySourceEncodedForecastPlaybackSpeed(JNIEnv&, const jni::String&, jni::jfloat); diff --git a/platform/android/VERSION b/platform/android/VERSION index 5b0bea1dd..0948fb20a 100644 --- a/platform/android/VERSION +++ b/platform/android/VERSION @@ -1 +1 @@ -13.4.1-particle.2 +13.4.1-particle.3