feat: add real WeatherV2 Android composite validation
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled
This commit is contained in:
@@ -7,7 +7,9 @@ import android.widget.PopupMenu
|
||||
import android.widget.TextView
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import org.maplibre.android.camera.CameraPosition
|
||||
import org.maplibre.android.camera.CameraUpdateFactory
|
||||
import org.maplibre.android.geometry.LatLng
|
||||
import org.maplibre.android.geometry.LatLngBounds
|
||||
import org.maplibre.android.maps.MapView
|
||||
import org.maplibre.android.maps.MapLibreMap
|
||||
import org.maplibre.android.maps.Style
|
||||
@@ -34,6 +36,7 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
private var timeWindowMode = false
|
||||
private var productionFeedMode = false
|
||||
private var hostSubmissionMode = false
|
||||
private var realWeatherMode = false
|
||||
private var styleLoadEpoch = 0L
|
||||
private var styleReady = false
|
||||
// Display mirror only; Core remains the playback state authority.
|
||||
@@ -54,6 +57,8 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
trailFade = savedInstanceState?.getFloat(STATE_TRAIL_FADE, DEFAULT_TRAIL_FADE) ?: DEFAULT_TRAIL_FADE
|
||||
speedColorEnabled = savedInstanceState?.getBoolean(STATE_SPEED_COLOR, true) ?: true
|
||||
timeWindowMode = savedInstanceState?.getBoolean(STATE_TIME_WINDOW, false) ?: false
|
||||
hostSubmissionMode = savedInstanceState?.getBoolean(STATE_HOST_SUBMISSION, false) ?: false
|
||||
realWeatherMode = savedInstanceState?.getBoolean(STATE_REAL_WEATHER, false) ?: false
|
||||
super.onCreate(savedInstanceState)
|
||||
Log.i(
|
||||
TAG,
|
||||
@@ -101,6 +106,7 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
timeWindowMode = false
|
||||
productionFeedMode = false
|
||||
hostSubmissionMode = false
|
||||
realWeatherMode = false
|
||||
fixtureMode = FIXTURE_UNIFORM_EAST
|
||||
if (this::maplibreMap.isInitialized) loadValidationStyle(active, enabled, "UNIFORM_EAST")
|
||||
}
|
||||
@@ -108,6 +114,7 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
timeWindowMode = false
|
||||
productionFeedMode = false
|
||||
hostSubmissionMode = false
|
||||
realWeatherMode = false
|
||||
fixtureMode = FIXTURE_UNIFORM_NORTH
|
||||
if (this::maplibreMap.isInitialized) loadValidationStyle(active, enabled, "UNIFORM_NORTH")
|
||||
}
|
||||
@@ -115,6 +122,7 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
timeWindowMode = false
|
||||
productionFeedMode = false
|
||||
hostSubmissionMode = false
|
||||
realWeatherMode = false
|
||||
fixtureMode = FIXTURE_VORTEX
|
||||
if (this::maplibreMap.isInitialized) loadValidationStyle(active, enabled, "VORTEX")
|
||||
}
|
||||
@@ -122,6 +130,7 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
timeWindowMode = true
|
||||
productionFeedMode = true
|
||||
hostSubmissionMode = false
|
||||
realWeatherMode = false
|
||||
fixtureMode = FIXTURE_UNIFORM_EAST
|
||||
timeMix = 0.0f
|
||||
timelineState = "NOT READY"
|
||||
@@ -146,6 +155,7 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
findViewById<Button>(R.id.validationProductionInvalid).setOnClickListener {
|
||||
productionFeedMode = true
|
||||
hostSubmissionMode = false
|
||||
realWeatherMode = false
|
||||
timeWindowMode = true
|
||||
timelineState = "NOT READY"
|
||||
if (this::maplibreMap.isInitialized) loadValidationStyle(active, enabled, "INVALID_PRODUCTION_METADATA")
|
||||
@@ -154,6 +164,7 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
timeWindowMode = true
|
||||
productionFeedMode = false
|
||||
hostSubmissionMode = true
|
||||
realWeatherMode = false
|
||||
fixtureMode = FIXTURE_UNIFORM_EAST
|
||||
timeMix = 0.0f
|
||||
timelineState = "NOT READY"
|
||||
@@ -162,6 +173,16 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
findViewById<Button>(R.id.validationHostFieldDuplicate).setOnClickListener {
|
||||
if (this::maplibreMap.isInitialized) submitHostValidationField(3, duplicate = true)
|
||||
}
|
||||
findViewById<Button>(R.id.validationRealWeather).setOnClickListener {
|
||||
timeWindowMode = true
|
||||
productionFeedMode = false
|
||||
hostSubmissionMode = true
|
||||
realWeatherMode = true
|
||||
fixtureMode = FIXTURE_UNIFORM_EAST
|
||||
timeMix = 0.0f
|
||||
timelineState = "NOT READY"
|
||||
if (this::maplibreMap.isInitialized) loadValidationStyle(active, enabled, "REAL_WEATHER")
|
||||
}
|
||||
findViewById<Button>(R.id.validationHostFieldInvalid).setOnClickListener {
|
||||
if (this::maplibreMap.isInitialized) submitInvalidHostValidationField()
|
||||
}
|
||||
@@ -189,7 +210,7 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
findViewById<Button>(R.id.validationMenuVisual).setOnClickListener { showMenu(it, "VIS", intArrayOf(R.id.validationVisualDefault, R.id.validationVisualColor, R.id.validationVisualSizeDown, R.id.validationVisualSizeUp, R.id.validationVisualLengthDown, R.id.validationVisualLengthUp, R.id.validationVisualOpacityDown, R.id.validationVisualOpacityUp, R.id.validationVisualTrailDown, R.id.validationVisualTrailUp, R.id.validationVisualFadeDown, R.id.validationVisualFadeUp)) }
|
||||
findViewById<Button>(R.id.validationMenuCount).setOnClickListener { showMenu(it, "COUNT", intArrayOf(R.id.validationParticle256, R.id.validationParticle1024, R.id.validationParticle4096, R.id.validationParticle16384, R.id.validationParticle65536, R.id.validationParticle262144, R.id.validationParticle1048576)) }
|
||||
findViewById<Button>(R.id.validationMenuMap).setOnClickListener { showMenu(it, "MAP", intArrayOf(R.id.validationGlobal, R.id.validationOceanA, R.id.validationOceanB, R.id.validationDateline, R.id.validationWorldWrap)) }
|
||||
findViewById<Button>(R.id.validationMenuMore).setOnClickListener { showMenu(it, "MORE", intArrayOf(R.id.validationActive, R.id.validationStatic, R.id.validationDisable, R.id.validationEnable, R.id.validationUniformEast, R.id.validationUniformNorth, R.id.validationVortex, R.id.validationTimeWindow, R.id.validationHostFieldSubmit, R.id.validationProductionInvalid, R.id.validationHostFieldDuplicate, R.id.validationHostFieldInvalid, R.id.validationAdvanceWindow, R.id.validationDuplicateWindow)) }
|
||||
findViewById<Button>(R.id.validationMenuMore).setOnClickListener { showMenu(it, "MORE", intArrayOf(R.id.validationActive, R.id.validationStatic, R.id.validationDisable, R.id.validationEnable, R.id.validationUniformEast, R.id.validationUniformNorth, R.id.validationVortex, R.id.validationTimeWindow, R.id.validationHostFieldSubmit, R.id.validationRealWeather, R.id.validationProductionInvalid, R.id.validationHostFieldDuplicate, R.id.validationHostFieldInvalid, R.id.validationAdvanceWindow, R.id.validationDuplicateWindow)) }
|
||||
}
|
||||
|
||||
private fun showMenu(anchor: android.view.View, title: String, actions: IntArray) {
|
||||
@@ -239,7 +260,46 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
}
|
||||
|
||||
private fun actionLabel(id: Int): String = when (id) {
|
||||
R.id.validationVisualDefault -> "VIS DEFAULT"; R.id.validationVisualSizeDown -> "SIZE -"; R.id.validationVisualSizeUp -> "SIZE +"; R.id.validationVisualLengthDown -> "LENGTH -"; R.id.validationVisualLengthUp -> "LENGTH +"; R.id.validationVisualOpacityDown -> "OPACITY -"; R.id.validationVisualOpacityUp -> "OPACITY +"; R.id.validationVisualTrailDown -> "TRAIL -"; R.id.validationVisualTrailUp -> "TRAIL +"; R.id.validationVisualFadeDown -> "FADE -"; R.id.validationVisualFadeUp -> "FADE +"; R.id.validationVisualColor -> "COLOR"; R.id.validationParticle256 -> "256"; R.id.validationParticle1024 -> "1K"; R.id.validationParticle4096 -> "4K"; R.id.validationParticle16384 -> "16K"; R.id.validationParticle65536 -> "64K"; R.id.validationParticle262144 -> "256K"; R.id.validationParticle1048576 -> "1M"; R.id.validationGlobal -> "GLOBAL"; R.id.validationOceanA -> "OCEAN A"; R.id.validationOceanB -> "OCEAN B"; R.id.validationDateline -> "DATELINE"; R.id.validationWorldWrap -> "WORLD WRAP"; R.id.validationActive -> "ACTIVE"; R.id.validationStatic -> "STATIC"; R.id.validationDisable -> "DISABLE"; R.id.validationEnable -> "ENABLE"; R.id.validationUniformEast -> "UNIFORM EAST"; R.id.validationUniformNorth -> "UNIFORM NORTH"; R.id.validationVortex -> "VORTEX"; R.id.validationTimeWindow -> "PRODUCTION FEED"; R.id.validationHostFieldSubmit -> "HOST FIELD"; R.id.validationProductionInvalid -> "INVALID PROD"; R.id.validationHostFieldDuplicate -> "HOST DUPLICATE"; R.id.validationHostFieldInvalid -> "HOST INVALID"; R.id.validationAdvanceWindow -> "ADVANCE WINDOW"; else -> "DUPLICATE T1"
|
||||
R.id.validationTimeWindow -> "PRODUCTION FEED"
|
||||
R.id.validationHostFieldSubmit -> "HOST FIELD"
|
||||
R.id.validationRealWeather -> "REAL WEATHER"
|
||||
R.id.validationProductionInvalid -> "INVALID PROD"
|
||||
R.id.validationHostFieldDuplicate -> "HOST DUPLICATE"
|
||||
R.id.validationHostFieldInvalid -> "HOST INVALID"
|
||||
R.id.validationParticle1048576 -> "1M"
|
||||
R.id.validationParticle262144 -> "256K"
|
||||
R.id.validationParticle65536 -> "64K"
|
||||
R.id.validationParticle16384 -> "16K"
|
||||
R.id.validationParticle4096 -> "4K"
|
||||
R.id.validationParticle1024 -> "1K"
|
||||
R.id.validationParticle256 -> "256"
|
||||
R.id.validationActive -> "ACTIVE"
|
||||
R.id.validationStatic -> "STATIC"
|
||||
R.id.validationDisable -> "DISABLE"
|
||||
R.id.validationEnable -> "ENABLE"
|
||||
R.id.validationUniformEast -> "UNIFORM EAST"
|
||||
R.id.validationUniformNorth -> "UNIFORM NORTH"
|
||||
R.id.validationVortex -> "VORTEX"
|
||||
R.id.validationAdvanceWindow -> "ADVANCE WINDOW"
|
||||
R.id.validationGlobal -> "GLOBAL"
|
||||
R.id.validationOceanA -> "OCEAN A"
|
||||
R.id.validationOceanB -> "OCEAN B"
|
||||
R.id.validationDateline -> "DATELINE"
|
||||
R.id.validationWorldWrap -> "WORLD WRAP"
|
||||
R.id.validationVisualDefault -> "VIS DEFAULT"
|
||||
R.id.validationVisualSizeDown -> "SIZE -"
|
||||
R.id.validationVisualSizeUp -> "SIZE +"
|
||||
R.id.validationVisualLengthDown -> "LENGTH -"
|
||||
R.id.validationVisualLengthUp -> "LENGTH +"
|
||||
R.id.validationVisualOpacityDown -> "OPACITY -"
|
||||
R.id.validationVisualOpacityUp -> "OPACITY +"
|
||||
R.id.validationVisualTrailDown -> "TRAIL -"
|
||||
R.id.validationVisualTrailUp -> "TRAIL +"
|
||||
R.id.validationVisualFadeDown -> "FADE -"
|
||||
R.id.validationVisualFadeUp -> "FADE +"
|
||||
R.id.validationVisualColor -> "COLOR"
|
||||
R.id.validationDuplicateWindow -> "DUPLICATE T1"
|
||||
else -> "ACTION"
|
||||
}
|
||||
|
||||
private fun loadValidationStyle(active: Boolean, enabled: Boolean, reason: String = "STYLE_CHANGE") {
|
||||
@@ -252,7 +312,7 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
maplibreMap.setStyle(Style.Builder().fromJson(validationStyle(active, enabled, reason))) {
|
||||
styleReady = true
|
||||
if (hostSubmissionMode) {
|
||||
submitHostValidationDataset()
|
||||
if (realWeatherMode) submitRealWeatherDataset() else submitHostValidationDataset()
|
||||
} else if (timeWindowMode) {
|
||||
timelineState = "READY"
|
||||
}
|
||||
@@ -408,6 +468,39 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
Log.i(TAG, "ParticleField: event=HOST_FIELD_DATASET_SUBMIT results=${results.joinToString(",")} timeline=$timelineState")
|
||||
}
|
||||
|
||||
private fun submitRealWeatherDataset() {
|
||||
val cycles = arrayOf("2026080700", "2026080706", "2026080712", "2026080718")
|
||||
val root = "integration/particle-weatherv2/ecmwf-hres-wind-20260807"
|
||||
val results = cycles.mapIndexed { index, cycle ->
|
||||
try {
|
||||
val metadataPath = "$root/$cycle/metadata.json"
|
||||
val payloadPath = "$root/$cycle/field.f32"
|
||||
val metadata = assets.open(metadataPath).bufferedReader().use { it.readText() }
|
||||
val payload = assets.open(payloadPath).use { it.readBytes() }
|
||||
Log.i(TAG, "ParticleField: event=REAL_WEATHER_DATASET_LOAD index=$index metadata=$metadataPath payloadBytes=${payload.size}")
|
||||
maplibreMap.submitRasterArraySourceHostField(PARTICLE_SOURCE_ID, metadata, payload)
|
||||
} catch (error: Exception) {
|
||||
Log.e(TAG, "ParticleField: event=REAL_WEATHER_SUBMIT_REJECTED index=$index reason=ASSET_READ_FAILED", error)
|
||||
MapLibreMap.HOST_FIELD_REJECTED_ADAPTER
|
||||
}
|
||||
}
|
||||
timelineState = if (results.size == 4 && results.all { it > 0 }) "READY" else "NOT READY"
|
||||
fitRealWeatherBounds()
|
||||
status.text = statusText()
|
||||
Log.i(TAG, "ParticleField: event=REAL_WEATHER_INITIAL_WINDOW_READY results=${results.joinToString(",")} timeline=$timelineState")
|
||||
Log.i(TAG, "WeatherColorLayer: event=WEATHER_COLOR_FIELD_READY source=$PARTICLE_SOURCE_ID scale=0..30mps")
|
||||
Log.i(TAG, "ParticleField: event=REAL_WEATHER_COMPOSITE_READY source=$PARTICLE_SOURCE_ID basemap=OSM color=weather-color particle=raster-particle")
|
||||
}
|
||||
|
||||
private fun fitRealWeatherBounds() {
|
||||
val bounds = LatLngBounds.Builder()
|
||||
.include(LatLng(0.0, 112.5))
|
||||
.include(LatLng(55.77657301866769, 157.5))
|
||||
.build()
|
||||
maplibreMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 48))
|
||||
Log.i(TAG, "ParticleField: event=REAL_WEATHER_CAMERA_FIT bounds=112.5,0.0,157.5,55.77657301866769")
|
||||
}
|
||||
|
||||
private fun submitHostValidationField(index: Int, duplicate: Boolean): Int {
|
||||
if (!styleReady || !hostSubmissionMode) {
|
||||
Log.i(TAG, "ParticleField: event=HOST_FIELD_SUBMIT_REJECTED reason=HOST_MODE_NOT_READY index=$index")
|
||||
@@ -466,7 +559,7 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
} else {
|
||||
"EAST"
|
||||
}
|
||||
val playback = if (timeWindowMode) " · ${if (hostSubmissionMode) "HOST" else if (productionFeedMode) "PRODUCTION" else "FIXTURE"} · TL $timelineState · $timelineSpeed" else ""
|
||||
val playback = if (timeWindowMode) " · ${if (realWeatherMode) "REAL WEATHER" else if (hostSubmissionMode) "HOST" else if (productionFeedMode) "PRODUCTION" else "FIXTURE"} · TL $timelineState · $timelineSpeed" else ""
|
||||
return "$mask · $runtime · $fields$playback · MIX ${(timeMix * 100).toInt()}% · $particleCount · W ${"%.1f".format(lineWidth)} L ${"%.3f".format(particleLength)} O ${(particleOpacity * 100).toInt()} T ${(trailOpacity * 100).toInt()} F ${(trailFade * 100).toInt()} C ${if (speedColorEnabled) "ON" else "OFF"}"
|
||||
}
|
||||
|
||||
@@ -487,6 +580,20 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
} else {
|
||||
""
|
||||
}
|
||||
val weatherColorLayer = if (realWeatherMode && enabled) {
|
||||
"""{"id":"weather-color-real","type":"weather-color","source":"particle-fixture",
|
||||
"paint":{"weather-color-opacity":0.62}},"""
|
||||
} else ""
|
||||
val validationDecorations = if (realWeatherMode) "" else """
|
||||
{"id":"validation-below","type":"circle","source":"validation-point",
|
||||
"paint":{"circle-radius":46,"circle-color":"#247ba0"}},
|
||||
"""
|
||||
val validationHud = if (realWeatherMode) """
|
||||
{"id":"validation-real-weather-hud","type":"background","paint":{"background-opacity":0.0}}
|
||||
""" else """
|
||||
{"id":"validation-above","type":"circle","source":"validation-point",
|
||||
"paint":{"circle-radius":16,"circle-color":"#ffe066"}}
|
||||
"""
|
||||
val source = if (hostSubmissionMode) {
|
||||
"""{"type":"raster-array","host-field-submission":true}"""
|
||||
} else if (productionFeedMode) {
|
||||
@@ -516,6 +623,7 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
"name": "Particle Core Layer Validation",
|
||||
"sources": {
|
||||
"particle-fixture": $source,
|
||||
"osm-basemap": {"type":"raster","tiles":["https://tile.openstreetmap.org/{z}/{x}/{y}.png"],"tileSize":256,"maxzoom":19},
|
||||
"validation-point": {
|
||||
"type": "geojson",
|
||||
"data": {"type":"Feature","geometry":{"type":"Point","coordinates":[0,0]}}
|
||||
@@ -523,11 +631,11 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
},
|
||||
"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"}},
|
||||
${if (realWeatherMode) "{\"id\":\"osm-basemap\",\"type\":\"raster\",\"source\":\"osm-basemap\",\"paint\":{\"raster-opacity\":1.0}}," else ""}
|
||||
$validationDecorations
|
||||
$weatherColorLayer
|
||||
$particleLayer
|
||||
{"id":"validation-above","type":"circle","source":"validation-point",
|
||||
"paint":{"circle-radius":16,"circle-color":"#ffe066"}}
|
||||
$validationHud
|
||||
]
|
||||
}
|
||||
""".trimIndent()
|
||||
@@ -554,6 +662,8 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
outState.putFloat(STATE_TRAIL_FADE, trailFade)
|
||||
outState.putBoolean(STATE_SPEED_COLOR, speedColorEnabled)
|
||||
outState.putBoolean(STATE_TIME_WINDOW, timeWindowMode)
|
||||
outState.putBoolean(STATE_HOST_SUBMISSION, hostSubmissionMode)
|
||||
outState.putBoolean(STATE_REAL_WEATHER, realWeatherMode)
|
||||
super.onSaveInstanceState(outState)
|
||||
mapView.onSaveInstanceState(outState)
|
||||
}
|
||||
@@ -579,6 +689,8 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
private const val STATE_TRAIL_FADE = "particle_validation.trail_fade"
|
||||
private const val STATE_SPEED_COLOR = "particle_validation.speed_color"
|
||||
private const val STATE_TIME_WINDOW = "particle_validation.time_window"
|
||||
private const val STATE_HOST_SUBMISSION = "particle_validation.host_submission"
|
||||
private const val STATE_REAL_WEATHER = "particle_validation.real_weather"
|
||||
private const val PARTICLE_LAYER_ID = "particle-raster-core"
|
||||
private const val PARTICLE_SOURCE_ID = "particle-fixture"
|
||||
private const val MASK_GLOBAL = 0
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<Button style="@style/ParticleValidationButton" android:id="@+id/validationActive"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationStatic"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationDisable"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationEnable"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationGlobal"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationOceanA"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationOceanB"/>
|
||||
<Button style="@style/ParticleValidationButton" android:id="@+id/validationUniformEast"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationUniformNorth"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVortex"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationTimeWindow"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationMix0"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationMix50"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationMix100"/>
|
||||
<Button style="@style/ParticleValidationButton" android:id="@+id/validationParticle256"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationParticle1024"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationParticle4096"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationParticle16384"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationParticle65536"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationParticle262144"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationParticle1048576"/>
|
||||
<Button style="@style/ParticleValidationButton" android:id="@+id/validationAdvanceWindow"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationDuplicateWindow"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationProductionInvalid"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationHostFieldSubmit"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationHostFieldDuplicate"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationHostFieldInvalid"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualDefault"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualSizeDown"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualSizeUp"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualLengthDown"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualLengthUp"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualOpacityDown"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualOpacityUp"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualTrailDown"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualTrailUp"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualFadeDown"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualFadeUp"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualColor"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationDateline"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationWorldWrap"/>
|
||||
<Button style="@style/ParticleValidationButton" android:id="@+id/validationAdvanceWindow"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationDuplicateWindow"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationProductionInvalid"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationHostFieldSubmit"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationRealWeather"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationHostFieldDuplicate"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationHostFieldInvalid"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualDefault"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualSizeDown"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualSizeUp"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualLengthDown"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualLengthUp"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualOpacityDown"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualOpacityUp"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualTrailDown"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualTrailUp"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualFadeDown"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualFadeUp"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualColor"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationDateline"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationWorldWrap"/>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
|
||||
Reference in New Issue
Block a user