Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
350521e
feat: add European aviation data support
wolverine2k Aug 20, 2026
1862eec
ci: publish tagged AvareX-EU releases
wolverine2k Aug 20, 2026
b107bc1
fix(ci): remove Firebase login from EU release
wolverine2k Aug 20, 2026
fede198
fix(ci): sign EU release APK directly
wolverine2k Aug 20, 2026
f0ba027
fix(ci): fall back to generated EU APK signing key
wolverine2k Aug 20, 2026
98639a7
fix(ci): avoid optional credential action failures
wolverine2k Aug 20, 2026
7305b3a
fix(ci): run optional credential injection as inline Python
wolverine2k Aug 20, 2026
e377d69
fix(ci): publish EU APK without store signing
wolverine2k Aug 20, 2026
2d6a3db
build(android): bump Gradle 8.14 / AGP 8.11.1 / Kotlin 2.2.20; CI Flu…
wolverine2k Aug 24, 2026
81ae55a
feat(eu): link airports to official AIP charts via aip.aero
wolverine2k Aug 24, 2026
8bf18e0
feat(weather): decoded METAR with selectable VFR/IFR threat coloring
wolverine2k Aug 24, 2026
d30e204
feat(map): default Europe layers ON for fresh installs
wolverine2k Aug 24, 2026
294f01d
docs(readme): document aip.aero, decoded METAR, default EU layers; re…
wolverine2k Aug 24, 2026
bea828c
feat(weather): global winds aloft via Open-Meteo outside US coverage
wolverine2k Aug 24, 2026
b502c99
feat(notam): offline European NOTAMs via FlyBrief outside US coverage
wolverine2k Aug 24, 2026
c009765
feat(terrain): on-device elevation/GPWS tiles per country from open DEM
wolverine2k Aug 24, 2026
558a259
build(eu): set applicationId to com.naresh.avarex.eu for the EU fork
wolverine2k Aug 24, 2026
c777a10
fix(ci): sign whichever release APK Gradle emits; auto-detect build-t…
wolverine2k Aug 24, 2026
3c1ccb0
ci(eu): publish signed+unsigned APK and AAB as AvareX-EU; drop iOS wo…
wolverine2k Aug 24, 2026
68fb23b
build(android): add release signingConfig from gitignored key.properties
wolverine2k Aug 24, 2026
3aca3cd
feat(eu): RainViewer radar mosaic, BYO-AI, remove Firebase/paywall
wolverine2k Aug 24, 2026
acf452a
feat(about): add About & Credits screen with third-party attributions
wolverine2k Aug 24, 2026
5845084
chore(release): bump version to 0.0.120 for AvareX-EU v0.0.120-eu
wolverine2k Aug 24, 2026
e3db3f8
chore(branding): rename app to AvareX-EU and update launcher icons
wolverine2k Aug 25, 2026
78deef3
feat(traffic): add OpenSky internet ADS-B traffic layer (advisory)
wolverine2k Aug 25, 2026
6cae7a4
chore(release): bump version to 0.0.121 for AvareX-EU v0.0.121-eu
wolverine2k Aug 25, 2026
03c6963
fix(release): strip Gradle debug signature before jarsigner re-signs AAB
wolverine2k Aug 25, 2026
b7ec473
docs(eu): add AvareX-EU GitHub Pages site, privacy policy, and modern…
wolverine2k Aug 25, 2026
ea0cc9a
fix(android): remove dead com.android.vending.BILLING permission
wolverine2k Aug 25, 2026
79e98df
chore(release): bump version to 0.0.122 for AvareX-EU v0.0.122-eu
wolverine2k Aug 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/android.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
- uses: subosito/flutter-action@v2
with:
channel: 'stable'
flutter-version: '3.35.1'
flutter-version: '3.47.1'

- name: Find and Replace NMS FAA
uses: richardrigutins/replace-in-files@v2
Expand Down
242 changes: 242 additions & 0 deletions .github/workflows/avarex-eu-release.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,242 @@
name: AvareX-EU Release

on:
push:
tags:
- '**'

permissions:
contents: write

concurrency:
group: avarex-eu-release-${{ github.ref }}
cancel-in-progress: false

jobs:
build-and-release:
runs-on: ubuntu-24.04

steps:
- name: Check out tagged source
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Validate tag and set release names
shell: bash
run: |
set -euo pipefail
TAG="${GITHUB_REF_NAME}"
if [[ ! "$TAG" =~ ^[A-Za-z0-9._-]+$ ]]; then
echo "Tag '$TAG' cannot be used safely in a release filename."
exit 1
fi
echo "TAG=$TAG" >> "$GITHUB_ENV"
echo "APK_NAME=AvareX-EU-$TAG.apk" >> "$GITHUB_ENV"
echo "APK_UNSIGNED_NAME=AvareX-EU-$TAG-unsigned.apk" >> "$GITHUB_ENV"
echo "AAB_NAME=AvareX-EU-$TAG.aab" >> "$GITHUB_ENV"
echo "AAB_UNSIGNED_NAME=AvareX-EU-$TAG-unsigned.aab" >> "$GITHUB_ENV"
echo "SOURCE_BASENAME=AvareX-EU-$TAG-source" >> "$GITHUB_ENV"
echo "CHANGELOG_NAME=CHANGELOG-$TAG.md" >> "$GITHUB_ENV"

- name: Generate changelist
shell: bash
run: |
set -euo pipefail
mkdir -p dist
PREVIOUS_TAG="$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || true)"
{
echo "# AvareX-EU $TAG"
echo
if [[ -n "$PREVIOUS_TAG" ]]; then
echo "Changes since $PREVIOUS_TAG:"
echo
git log --no-merges --pretty='- %s (`%h`)' "$PREVIOUS_TAG..HEAD"
else
echo "Changes included in this release:"
echo
git log --no-merges --pretty='- %s (`%h`)' HEAD
fi
} > "dist/$CHANGELOG_NAME"

- name: Create source archives
shell: bash
run: |
set -euo pipefail
STAGING="dist/$SOURCE_BASENAME"
mkdir -p "$STAGING"
git archive HEAD | tar -x -C "$STAGING"
cp "dist/$CHANGELOG_NAME" "$STAGING/CHANGELOG-RELEASE.md"
tar -C dist -czf "dist/$SOURCE_BASENAME.tar.gz" "$SOURCE_BASENAME"
(cd dist && zip -qr "$SOURCE_BASENAME.zip" "$SOURCE_BASENAME")
rm -rf "$STAGING"

- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
channel: stable
flutter-version: '3.47.1'
cache: true

- name: Inject optional app service credentials
shell: bash
env:
FAA_NMS_API_CLIENT_ID_SECRET: ${{ secrets.FAA_NMS_API_CLIENT_ID_SECRET }}
run: |
set -euo pipefail
python3 -c "
import os
from pathlib import Path

replacements = {
'@@__faa_nms_api_client_id_secret__@@': os.environ.get('FAA_NMS_API_CLIENT_ID_SECRET', ''),
}
for path in Path('.').rglob('*.dart'):
text = path.read_text(encoding='utf-8')
updated = text
for needle, replacement in replacements.items():
updated = updated.replace(needle, replacement)
if updated != text:
path.write_text(updated, encoding='utf-8')
"

- name: Install project dependencies
run: flutter pub get

- name: Run tests and analyzer
run: |
flutter test
flutter analyze --no-fatal-infos

- name: Ensure Android cmdline-tools (apkanalyzer) for AAB build
shell: bash
run: |
set -euo pipefail
# `flutter build appbundle` runs apkanalyzer to strip debug symbols;
# without cmdline-tools it fails with a misleading
# "failed to strip debug symbols". Make sure it's installed.
SDK_ROOT="${ANDROID_HOME:-${ANDROID_SDK_ROOT:-/usr/local/lib/android/sdk}}"
if ! find "$SDK_ROOT/cmdline-tools" -type f -name apkanalyzer 2>/dev/null | grep -q .; then
echo "apkanalyzer not found; installing cmdline-tools;latest"
yes | "$SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" "cmdline-tools;latest" 2>/dev/null \
|| (command -v sdkmanager >/dev/null && yes | sdkmanager "cmdline-tools;latest") \
|| echo "Could not auto-install cmdline-tools; relying on preinstalled tooling."
fi
find "$SDK_ROOT" -type f -name apkanalyzer -print 2>/dev/null | head -1 || true

- name: Build release APK and AAB
run: |
flutter build apk --release
flutter build appbundle --release

- name: Sign and name release artifacts (APK + AAB, signed + unsigned)
shell: bash
env:
SIGNING_KEY_BASE64: ${{ secrets.KEY_STORE }}
KEY_ALIAS: ${{ secrets.KEY_STORE_ALIAS }}
KEYSTORE_PASSWORD: ${{ secrets.KEY_STORE_PASS }}
KEY_PASSWORD: ${{ secrets.KEY_STORE_PASS }}
run: |
set -euo pipefail

# --- Locate the built artifacts (names vary with signingConfig) ---
RELEASE_APK=""
for candidate in \
"build/app/outputs/apk/release/app-release.apk" \
"build/app/outputs/apk/release/app-release-unsigned.apk" \
"build/app/outputs/flutter-apk/app-release.apk"; do
if [[ -f "$candidate" ]]; then RELEASE_APK="$candidate"; break; fi
done
if [[ -z "$RELEASE_APK" ]]; then
echo "No release APK was generated under build/app/outputs"
find build/app/outputs -type f -name '*.apk' -print || true
exit 1
fi
RELEASE_AAB=""
for candidate in \
"build/app/outputs/bundle/release/app-release.aab" \
"build/app/outputs/bundle/release/app.aab"; do
if [[ -f "$candidate" ]]; then RELEASE_AAB="$candidate"; break; fi
done
if [[ -z "$RELEASE_AAB" ]]; then
echo "No release AAB was generated under build/app/outputs/bundle"
find build/app/outputs/bundle -type f -name '*.aab' -print || true
exit 1
fi
echo "APK: $RELEASE_APK"
echo "AAB: $RELEASE_AAB"

# --- Publish the unsigned artifacts verbatim ---
cp "$RELEASE_APK" "dist/$APK_UNSIGNED_NAME"
cp "$RELEASE_AAB" "dist/$AAB_UNSIGNED_NAME"

# --- Locate signing tools ---
SDK_ROOT="${ANDROID_HOME:-${ANDROID_SDK_ROOT:-/usr/local/lib/android/sdk}}"
ZIPALIGN="$(find "$SDK_ROOT/build-tools" -maxdepth 2 -type f -name zipalign 2>/dev/null | sort -V | tail -1 || true)"
APKSIGNER="$(find "$SDK_ROOT/build-tools" -maxdepth 2 -type f -name apksigner 2>/dev/null | sort -V | tail -1 || true)"
if [[ ! -x "$ZIPALIGN" || ! -x "$APKSIGNER" ]]; then
echo "Android build-tools signing utilities were not found under $SDK_ROOT/build-tools"
find "$SDK_ROOT/build-tools" -maxdepth 2 -type f \( -name zipalign -o -name apksigner \) -print || true
exit 1
fi
echo "zipalign: $ZIPALIGN"
echo "apksigner: $APKSIGNER"

# --- Prepare the keystore (repo secret, else a generated fallback) ---
KEYSTORE="${RUNNER_TEMP:-/tmp}/avarex-eu-release.jks"
KS_ALIAS=""; KS_STOREPASS=""; KS_KEYPASS=""
if [[ -n "$SIGNING_KEY_BASE64" && -n "$KEY_ALIAS" && -n "$KEYSTORE_PASSWORD" && -n "$KEY_PASSWORD" ]] \
&& printf '%s' "$SIGNING_KEY_BASE64" | base64 --decode --ignore-garbage > "$KEYSTORE" 2>/dev/null \
&& keytool -list -keystore "$KEYSTORE" -storepass "$KEYSTORE_PASSWORD" -alias "$KEY_ALIAS" >/dev/null 2>&1; then
echo "Using repository signing key."
KS_ALIAS="$KEY_ALIAS"; KS_STOREPASS="$KEYSTORE_PASSWORD"; KS_KEYPASS="$KEY_PASSWORD"
else
echo "Repository signing secrets missing/invalid; generating a fallback signing key."
KEYSTORE="${RUNNER_TEMP:-/tmp}/avarex-eu-release-generated.jks"
KS_ALIAS="avarex-eu-release"; KS_STOREPASS="avarex-eu-release-pass"; KS_KEYPASS="avarex-eu-release-pass"
keytool -genkeypair -keystore "$KEYSTORE" -storepass "$KS_STOREPASS" -keypass "$KS_KEYPASS" \
-alias "$KS_ALIAS" -keyalg RSA -keysize 2048 -validity 10000 \
-dname "CN=AvareX EU GitHub Release, O=AvareX, C=US"
fi

# --- Sign the APK (zipalign + apksigner) ---
ALIGNED_APK="${RUNNER_TEMP:-/tmp}/aligned.apk"
"$ZIPALIGN" -f -p 4 "$RELEASE_APK" "$ALIGNED_APK"
"$APKSIGNER" sign \
--ks "$KEYSTORE" --ks-key-alias "$KS_ALIAS" \
--ks-pass "pass:$KS_STOREPASS" --key-pass "pass:$KS_KEYPASS" \
--out "dist/$APK_NAME" "$ALIGNED_APK"
"$APKSIGNER" verify --verbose --print-certs "dist/$APK_NAME"

# --- Sign the AAB (jarsigner; apksigner does not handle AABs) ---
# `flutter build appbundle` already signs the bundle via Gradle's
# signingConfig (debug cert in CI, since there is no key.properties).
# jarsigner ADDS a signature rather than replacing it, so signing the
# bundle as-is leaves TWO certificate chains in META-INF and Play
# rejects it with "more than 1 certificate chain". Strip any existing
# signature block first so the bundle carries exactly one chain.
cp "$RELEASE_AAB" "dist/$AAB_NAME"
zip -qd "dist/$AAB_NAME" 'META-INF/*.RSA' 'META-INF/*.DSA' \
'META-INF/*.EC' 'META-INF/*.SF' 2>/dev/null || true
jarsigner -sigalg SHA256withRSA -digestalg SHA-256 \
-keystore "$KEYSTORE" -storepass "$KS_STOREPASS" -keypass "$KS_KEYPASS" \
"dist/$AAB_NAME" "$KS_ALIAS"
jarsigner -verify "dist/$AAB_NAME"

rm -f "$KEYSTORE" "$ALIGNED_APK"
echo "Artifacts:"; ls -la dist/*.apk dist/*.aab

- name: Publish GitHub release
uses: softprops/action-gh-release@v2
with:
name: AvareX-EU ${{ github.ref_name }}
body_path: dist/${{ env.CHANGELOG_NAME }}
files: |
dist/${{ env.APK_NAME }}
dist/${{ env.APK_UNSIGNED_NAME }}
dist/${{ env.AAB_NAME }}
dist/${{ env.AAB_UNSIGNED_NAME }}
dist/${{ env.SOURCE_BASENAME }}.tar.gz
dist/${{ env.SOURCE_BASENAME }}.zip
dist/${{ env.CHANGELOG_NAME }}
fail_on_unmatched_files: true
115 changes: 0 additions & 115 deletions .github/workflows/ios.yaml

This file was deleted.

2 changes: 1 addition & 1 deletion .github/workflows/snap.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
- uses: subosito/flutter-action@v2
with:
channel: 'stable'
flutter-version: '3.35.1'
flutter-version: '3.47.1'

- name: Find and Replace NMS FAA
uses: richardrigutins/replace-in-files@v2
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/windows.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
- uses: subosito/flutter-action@v2
with:
channel: 'stable'
flutter-version: '3.35.1'
flutter-version: '3.47.1'

- name: Find and Replace NMS FAA
uses: richardrigutins/replace-in-files@v2
Expand Down
Loading