test: add core particle render layer validation
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled

This commit is contained in:
OpenAI Codex
2026-08-29 12:55:54 +08:00
parent 74be2a5052
commit d046be5e52
23 changed files with 1640 additions and 1 deletions

View File

@@ -286,6 +286,18 @@
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.FeatureOverviewActivity" />
</activity>
<activity
android:name=".activity.particle.ParticleCoreLayerValidationActivity"
android:description="@string/description_particle_core_layer_validation"
android:exported="true"
android:label="@string/activity_particle_core_layer_validation">
<meta-data
android:name="@string/category"
android:value="@string/category_custom_layer" />
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.FeatureOverviewActivity" />
</activity>
<activity
android:name=".activity.annotation.PolygonActivity"
android:description="@string/description_polygon"

View File

@@ -0,0 +1,93 @@
package org.maplibre.android.testapp.activity.particle
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import org.maplibre.android.camera.CameraPosition
import org.maplibre.android.geometry.LatLng
import org.maplibre.android.maps.MapView
import org.maplibre.android.maps.MapLibreMap
import org.maplibre.android.maps.Style
import org.maplibre.android.testapp.R
/** VALIDATION ONLY: Android OpenGL host for the 30-01 Core RenderLayer experiment. */
class ParticleCoreLayerValidationActivity : AppCompatActivity() {
private lateinit var mapView: MapView
private lateinit var maplibreMap: MapLibreMap
private lateinit var status: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_particle_core_layer_validation)
mapView = findViewById(R.id.mapView)
status = findViewById(R.id.validationStatus)
mapView.onCreate(savedInstanceState)
mapView.getMapAsync { map ->
maplibreMap = map
map.cameraPosition = CameraPosition.Builder()
.target(LatLng(0.0, 0.0))
.zoom(2.0)
.build()
loadValidationStyle(active = true)
}
findViewById<Button>(R.id.validationActive).setOnClickListener {
if (this::maplibreMap.isInitialized) loadValidationStyle(active = true)
}
findViewById<Button>(R.id.validationStatic).setOnClickListener {
if (this::maplibreMap.isInitialized) loadValidationStyle(active = false)
}
}
private fun loadValidationStyle(active: Boolean) {
val state = if (active) "ACTIVE" else "STATIC"
Log.i(TAG, "ParticleValidation: Test App switching to $state")
maplibreMap.setStyle(Style.Builder().fromJson(validationStyle(active))) {
status.text = getString(
if (active) R.string.particle_validation_active_status
else R.string.particle_validation_static_status
)
}
}
private fun validationStyle(active: Boolean) = """
{
"version": 8,
"name": "Particle Core Layer Validation",
"sources": {
"validation-point": {
"type": "geojson",
"data": {"type":"Feature","geometry":{"type":"Point","coordinates":[0,0]}}
}
},
"layers": [
{"id":"validation-background","type":"background","paint":{"background-color":"#102030"}},
{"id":"validation-below","type":"circle","source":"validation-point",
"paint":{"circle-radius":46,"circle-color":"#247ba0"}},
{"id":"particle-validation-core","type":"particle-validation",
"paint":{"particle-validation-active":$active}},
{"id":"validation-above","type":"circle","source":"validation-point",
"paint":{"circle-radius":16,"circle-color":"#ffe066"}}
]
}
""".trimIndent()
override fun onStart() { super.onStart(); mapView.onStart() }
override fun onResume() { super.onResume(); mapView.onResume() }
override fun onPause() { mapView.onPause(); super.onPause() }
override fun onStop() { mapView.onStop(); super.onStop() }
override fun onDestroy() { mapView.onDestroy(); super.onDestroy() }
override fun onLowMemory() { super.onLowMemory(); mapView.onLowMemory() }
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
mapView.onSaveInstanceState(outState)
}
companion object {
private const val TAG = "ParticleValidation"
}
}

View File

@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<org.maplibre.android.maps.MapView
android:id="@id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="#DD102030"
android:orientation="vertical"
android:padding="12dp">
<TextView
android:id="@+id/validationStatus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/particle_validation_active_status"
android:textColor="@android:color/white" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/validationActive"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/particle_validation_active" />
<Button
android:id="@+id/validationStatic"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/particle_validation_static" />
</LinearLayout>
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="description_custom_layer">Overlay a custom native layer on the map</string>
<string name="description_particle_core_layer_validation">Validate a source-less Core Style/RenderLayer, frame transform and repaint lifecycle</string>
<string name="description_info_window_adapter">Learn how to create a custom InfoWindow</string>
<string name="description_cameraposition">CameraPosition capabilities</string>
<string name="description_map_fragment">Showcase MapFragment</string>

View File

@@ -9,4 +9,8 @@
<string name="description_world_tour_benchmark">Writes out avg. fps and 1% fps after world tour with .flyTo()</string>
<string name="search">Search</string>
<string name="category_data">Data Sources</string>
<string name="particle_validation_active">ACTIVE</string>
<string name="particle_validation_static">STATIC</string>
<string name="particle_validation_active_status">ACTIVE: Core Layer requests MapLibre frames. Move, zoom, rotate and pitch the map.</string>
<string name="particle_validation_static_status">STATIC: Core Layer stopped requesting frames. Map gestures must still render normally.</string>
</resources>

View File

@@ -25,6 +25,7 @@
<string name="activity_snapshot">Snapshot Activity</string>
<string name="activity_snapshot_within">Snapshot with within expression</string>
<string name="activity_custom_layer">Custom Layer</string>
<string name="activity_particle_core_layer_validation">Particle Core Layer Validation</string>
<string name="activity_map_padding">Map Padding</string>
<string name="activity_debug_mode">Debug Mode</string>
<string name="activity_offline">Offline Map</string>