AvareX - EU with EU data support - #129
Open
wolverine2k wants to merge 30 commits into
Open
Conversation
Add OpenFlightMaps charts and OFMX navigation data, integrate user-authenticated openAIP country data, preserve source attribution, document US/EU parity, and cover the new workflows with tests.
Build and sign AvareX-EU APKs for tags, generate changelists, and attach named source archives and release notes to GitHub releases.
Generate local non-production Firebase placeholders for the EU artifact so tagged releases do not require Firebase authentication.
Replace the deprecated r0adkll signing action with explicit zipalign and apksigner commands so the EU release workflow signs the generated APK deterministically and surfaces missing signing secrets clearly.
Allow the GitHub release artifact to be signed even when the Play Store keystore secrets are absent or invalid, while still preferring the repository keystore when it works.
Replace the optional Dart placeholder replacement actions with an inline script so missing optional app-service secrets do not fail the EU release before APK signing.
Correct the workflow shell syntax so the optional credential replacement script executes instead of treating its Python body as shell commands.
Use the release APK produced by Flutter directly so tagged GitHub releases do not depend on Play Store signing credentials.
…tter 3.47.1 Align the Android toolchain with the Flutter 3.47.1 SDK floors so the project compiles locally without --android-skip-build-dependency-validation. Update the pinned Flutter version to 3.47.1 across the CI workflows (arm64 uses a self-hosted preinstalled SDK and is unchanged).
Add a per-airport 'Official AIP & approach charts' action on the OFM/openAIP destination view that opens the airport's aip.aero page (which links to the country's official national AIP). Pure URL hand-off: no chart data is fetched, cached, or redistributed. - lib/aip/aip_aero.dart maps ICAO -> aip.aero country/URL with a country-page fallback where the deep link is unavailable. - Adds url_launcher and an Android <queries> https VIEW entry for Android 11+. - Unit tests cover URL building, fallbacks, and ICAO edge cases.
Add a Decoded METAR card below the raw report on both the FAA and OFM/openAIP airport weather panels. It decodes wind, visibility, ceiling, present weather, temp/dewpoint spread and pressure into plain English and color-codes each element by threat, with a VFR/IFR profile selector that reruns the thresholds. - lib/weather/metar_decoder.dart is a pure, unit-tested decoder + thresholds. - lib/weather/decoded_metar_view.dart persists the chosen profile. - Uses only the raw METAR already held; advisory, not a briefing substitute.
Fresh installs now enable OFM VFR Chart, OFM Interactive Data and openAIP Interactive Data by default (opacity key bumped to v56). The layers render nothing until the matching regional data is installed, so US-only users are unaffected, and users with a saved layer-opacity preference keep their choices. Adds a test asserting the three EU layers default ON by index against the canonical layer order and that existing preferences are preserved.
…fresh parity table Add EU-data subsections for the aip.aero official-AIP link-out, the decoded METAR VFR/IFR view, and the default-on Europe map layers. Update the US/EU parity table (plates now Partial via aip.aero; add decoded-METAR row) and note the winds-aloft EU gap and preferred JSON-API path for the future.
The built-in winds aloft come from NWS FB text products that only cover the US and its territories. Beyond that radius the destination Wind tab now retrieves pressure-level winds from Open-Meteo and interpolates them into the existing WindsAloft altitude slots (surface..39,000 ft), so the display is unchanged. - lib/weather/open_meteo_winds.dart: pure, unit-tested parser (pressure level + geopotential height -> FB wind tokens, shortest-arc direction interpolation, forecast-hour selection) plus an async fetch. - Automatic selection: within ~550 km of a US FB station the existing product is used; otherwise Open-Meteo, with US data as a last-resort fallback. - Optional user Open-Meteo API key (secure storage) via Menu > Data > Open-Meteo Winds for commercial-compliant use; free endpoint by default. - WindsCache.stationLatLng exposes station coordinates for the distance test. - Visible 'Winds (c) Open-Meteo.com, CC BY 4.0' attribution; forecast/advisory. - README: winds-aloft parity row updated to Partial; Open-Meteo section added; Meteostat documented as a deferred option (paid per-user key, overlaps METAR). Verified: 13 new unit tests; live on-device render for a Sweden waypoint shows the full profile with the Open-Meteo attribution footer.
The built-in NOTAM source is a US FAA API that returns nothing in Europe. The
airport NOTAM tab now falls back to FlyBrief per-country, georeferenced NOTAM
GeoJSON (polygons with altitude bands, schedules, active-now flags), stored for
offline use.
- lib/weather/flybrief_notams.dart: pure, unit-tested provider - country bbox/
slug table (~28 EU countries), URL builder, GeoJSON parse (tolerates null
geometry), centroid + nearest-within-radius filter (active first), one-line
formatting.
- lib/weather/flybrief_store.dart: offline fetch/save/load under
{dataDir}/flybrief/; nearbyForPoint() is offline-first, fetching live only
when no stored file exists.
- NOTAM tab: FAA source tried first, FlyBrief fallback where empty; shows the
CC BY-NC-SA attribution footer.
- Menu > Data > NOTAMs (FlyBrief): download screen, defaults to the country
under current GPS; Download for Offline / Remove.
- README: NOTAM parity row -> Partial; FlyBrief section added; honestly
documents SID/STAR, georeferenced plates, and non-US terrain/GPWS as not
available in open form (no fragile scrapers).
Verified: 13 new unit tests (114 total); pure parser validated against the live
163-NOTAM Germany feed (12 near EDDF); on-device Denmark download stored 61
NOTAMs + obstacles offline under {dataDir}/flybrief/.
AvareX's terrain profile, elevation readout and GPWS are geography-agnostic but
depend on elevation tiles only distributed for the US. This builds those tiles
on device for a chosen country from open AWS Terrain Tiles (public-domain DEM),
so terrain works offline in Europe without bundling multi-GB data in the app.
- lib/weather/terrain_transcode.dart: pure, unit-tested transcoder. Decodes
terrarium RGB (elevM = R*256+G+B/256-32768), re-encodes to AvareX's exact tile
format (512x512 gray+alpha PNG, gray = round((ft-INTERCEPT)/SLOPE), slippy X /
TMS Y), with deep-ocean -> alpha 0 no-data. Tile enumeration + count for a
lat/lon bbox across zoom 1-10.
- lib/weather/terrain_download_manager.dart: fetch+transcode+write to
tiles/6/{z}/{x}/{y}.png with bounded concurrency, progress, cancel, and
skip-existing (cheap resume). Per-country size/tile estimate.
- Menu > Data > Terrain (Elevation): country picker defaulting to the country
under current GPS, shows tile count + MB estimate; Download/Cancel/Remove.
- README: terrain parity row -> Partial; terrain section documents the on-device
approach, sizes, and why all-EU is intentionally not bundled (multi-GB).
Encoding validated against a real US AvareX tile (gray 5 -> 38 ft) and TMS-Y
against Epsg900913 (Frankfurt -> 536/676). Verified end-to-end on-device:
Denmark built 561 z10 tiles (+ pyramid) with live progress; a written tile is
512x512 gray+alpha decoding to ~12 m over land with ocean pixels alpha 0.
9 new tests (123 total).
- android/app/build.gradle: applicationId com.apps4av.avaremp -> com.naresh.avarex.eu (internal namespace/code package unchanged, so MainActivity and R stay put). - avarex-eu-release.yaml: CI-generated google-services.json placeholder package_name updated to match, so the google-services plugin validates. Verified: release APK builds and reports package com.naresh.avarex.eu (aapt badging); debug build installs and launches as the new package on-device.
…ools The release build has no Gradle signingConfig, so Gradle writes app-release-unsigned.apk, but the signing step only checked for app-release.apk and failed before ever using the keystore (this is why the v0.0.1 releases failed too). Resolve the APK from the known candidate paths and locate zipalign/apksigner from whatever build-tools version the runner has instead of a pinned 34.0.0. apksigner then signs it with the repo keystore.
…rkflow
- avarex-eu-release.yaml: also build the app bundle and publish four artifacts
named AvareX-EU-<tag>{,-unsigned}.{apk,aab}. APK signed via apksigner, AAB via
jarsigner (apksigner can't sign bundles); unsigned copies published verbatim.
Ensure cmdline-tools/apkanalyzer is present so the appbundle build doesn't die
with a misleading 'failed to strip debug symbols'.
- Remove ios.yaml so tag pushes no longer trigger a failing iOS build.
Local `flutter build apk --release` now produces a signed app-release.apk instead of app-release-unsigned.apk. Reads android/key.properties (already gitignored, alongside *.jks/*.keystore) for storeFile/storePassword/keyAlias/ keyPassword; falls back to debug signing when the file is absent so CI and fresh clones still build. CI release still signs via apksigner/jarsigner in the workflow. Verified: release APK is signed with the upload key (SHA-256 f9c0dace...036a8f14) and reports package com.naresh.avarex.eu.
Radar mosaic (parity for EU): - Replace the US-only Iowa Mesonet internet Radar with RainViewer's global, animated mosaic on the EU build (Constants.isEu; --dart-define=AVAREX_EU=false restores Mesonet). New lib/weather/rainviewer_radar.dart fetches the weather-maps index and builds flutter_map tile templates; the map animates through the 2h/10-min frame loop via timeRadarChange. - User-selectable RainViewer color scheme (IDs 0-8), persisted in settings, via a "Radar colors" picker in the Weather Products panel. - "Radar (c) RainViewer.com" attribution on the map and in the panel. Flight Intelligence (bring-your-own provider): - Replace Firebase Vertex AI with a user-supplied OpenAI-compatible endpoint (base URL + optional API key + model) stored in secure storage (lib/ai/ai_credentials.dart, ai_settings_screen.dart). No login required. Remove Firebase/RevenueCat-backed features and the paywall entirely: - Delete community, scheduler, airport-businesses, backup/sync, login screen, revenue_cat, firebase_options; drop firebase_* / purchases_* deps and the google-services Gradle plugin. CI: - avarex-eu-release.yaml: drop the Firebase-placeholder and RevenueCat-injection steps (deps removed; they would now break the tagged build). Docs: - README: radar parity row + RainViewer/AI sections; refresh EU-gaps and release-workflow notes. Verified: flutter analyze clean (1 pre-existing unrelated info), 123 tests pass, release APK builds, RainViewer radar confirmed rendering over Europe on emulator.
- New lib/about_screen.dart: app version, DATA SOURCES (FAA, NWS/AWC, openFlightmaps, openAIP, Open-Meteo, FlyBrief, RainViewer, Iowa Mesonet, AWS Terrain/Mapzen, USGS, aip.aero) and OPEN-SOURCE SOFTWARE credits with licences and source links. Data-source attribution strings reuse the exact constants already shown next to the data in-app. - Open-source licenses button opens Flutter's built-in showLicensePage, which enumerates every bundled package's LICENSE (authoritative full list). - Wire About and Credits into the drawer Support section and add the /about route in main.dart. Verified on emulator: screen renders, links present, license page opens, no crash. flutter analyze clean (1 pre-existing unrelated info).
- User-supplied OpenSky OAuth2 client credentials via secure storage - Off by default; polls only when enabled + configured, self-throttling - Settings screen (/opensky) with masked secret, test, clear - Map advisory banner when active and Traffic layer visible - Menu entry under main screen
Owner
flutter build appbundle already signs via Gradle signingConfig (debug cert in CI). jarsigner appended a second signature, leaving two cert chains and causing Play's 'more than 1 certificate chain' rejection. Strip META-INF signature files before re-signing so the AAB carries exactly one chain.
… README - Add docs/eu/ landing page (EU-branded, reuses AvareX look & feel, no ad trackers) - Add docs/eu/privacy.html (GDPR-style, code-derived: no accounts/analytics/ads) - Add docs/eu/sitemap.xml - Use real EU screenshots (OFM Malmö chart, openAIP airspace, OFM data download, nav log) - Rewrite README with badges, screenshot gallery, feature table, and quick start
The EU build removed the subscription paywall and all Play Billing code, but the upstream BILLING permission was left in the manifest. Google Play reads that permission as a deprecated AIDL Play Billing Library dependency and demands an upgrade to Billing Library >=6.0.1. Since there is no billing in the app (no BillingClient, no in_app_purchase), the correct fix is to drop the permission, which clears the warning at the source.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Much parity achieved between US & EU from the available datasets though not completely.
Please refer to Parity status between EU & US in the https://github.com/wolverine2k/avarex/blob/master/README.md.
Thanks.