Skip to content

AvareX - EU with EU data support - #129

Open
wolverine2k wants to merge 30 commits into
apps4av:masterfrom
wolverine2k:master
Open

AvareX - EU with EU data support#129
wolverine2k wants to merge 30 commits into
apps4av:masterfrom
wolverine2k:master

Conversation

@wolverine2k

Copy link
Copy Markdown

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.

wolverine2k and others added 26 commits August 20, 2026 19:53
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
@apps4av

apps4av commented Aug 25, 2026 via email

Copy link
Copy Markdown
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants