Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
16 changes: 8 additions & 8 deletions .github/workflows/airo-macos-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,23 +50,23 @@ on:
version:
description: 'Artifact and release version label'
required: true
default: airo-tv-v0.0.2
default: airo-tv-v0.0.5
build_name:
description: 'Flutter build name, for example 0.0.2'
description: 'Flutter build name, for example 0.0.5'
required: true
default: 0.0.2
default: 0.0.5
build_number:
description: 'Flutter build number'
required: true
default: '2'
default: '5'
release_ref:
description: 'Git ref to release; must contain latest origin/main'
required: true
default: main
release_branch:
description: 'Release branch to create/update from release_ref before building'
required: true
default: release/airo-tv-v0.0.2
default: release/airo-tv-v0.0.5
require_notarization:
description: 'Fail unless Developer ID signing and notarization succeed'
required: true
Expand All @@ -82,9 +82,9 @@ permissions:

env:
FLUTTER_VERSION: '3.44.4'
RELEASE_VERSION: ${{ inputs.version || github.event.inputs.version || github.ref_name || 'airo-tv-v0.0.2' }}
BUILD_NAME: ${{ inputs.build_name || github.event.inputs.build_name || '0.0.2' }}
BUILD_NUMBER: ${{ inputs.build_number || github.event.inputs.build_number || '2' }}
RELEASE_VERSION: ${{ inputs.version || github.event.inputs.version || github.ref_name || 'airo-tv-v0.0.5' }}
BUILD_NAME: ${{ inputs.build_name || github.event.inputs.build_name || '0.0.5' }}
BUILD_NUMBER: ${{ inputs.build_number || github.event.inputs.build_number || '5' }}
PROFILE: ${{ inputs.profile || github.event.inputs.profile || 'tv' }}

jobs:
Expand Down
12 changes: 6 additions & 6 deletions .github/workflows/airo-mobile-tablet-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,15 +65,15 @@ on:
version:
description: 'Artifact and release version label'
required: true
default: v2.0.0
default: v0.0.5
build_name:
description: 'Android versionName, for example 2.0.0'
description: 'Android versionName, for example 0.0.5'
required: true
default: 2.0.0
default: 0.0.5
build_number:
description: 'Android versionCode, must increase for every Play upload'
required: true
default: '200'
default: '7'
release_ref:
description: 'Git ref to release; must contain latest origin/main'
required: true
Expand Down Expand Up @@ -121,8 +121,8 @@ permissions:
env:
FLUTTER_VERSION: '3.44.4'
RELEASE_VERSION: ${{ inputs.version || github.event.inputs.version || github.ref_name }}
BUILD_NAME: ${{ inputs.build_name || github.event.inputs.build_name || '2.0.0' }}
BUILD_NUMBER: ${{ inputs.build_number || github.event.inputs.build_number || '200' }}
BUILD_NAME: ${{ inputs.build_name || github.event.inputs.build_name || '0.0.5' }}
BUILD_NUMBER: ${{ inputs.build_number || github.event.inputs.build_number || '7' }}
PROFILE: ${{ inputs.profile || github.event.inputs.profile || 'full' }}

jobs:
Expand Down
62 changes: 31 additions & 31 deletions .github/workflows/airo-tv-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@ on:
required: true
type: string
build_name:
description: 'Android versionName, for example 0.0.2'
description: 'Android versionName, for example 0.0.5'
required: true
type: string
build_number:
description: 'Android versionCode, must increase for every Play upload'
required: true
type: string
release_ref:
description: 'Git ref to cut the release from; use v2 for Airo TV release line'
description: 'Git ref to cut the release from; use main for the active Airo TV release line'
required: true
type: string
release_branch:
Expand Down Expand Up @@ -58,14 +58,14 @@ on:
required: false
type: string
pull_request:
branches: [ v2 ]
branches: [ main ]
paths:
- 'app/**'
- 'packages/**'
- 'scripts/**'
- '.github/workflows/airo-tv-release.yml'
push:
branches: [ v2 ]
branches: [ main ]
paths:
- 'app/**'
- 'packages/**'
Expand All @@ -76,23 +76,23 @@ on:
version:
description: 'Airo TV artifact and release version label'
required: true
default: 'airo-tv-v0.0.2'
default: 'airo-tv-v0.0.5'
build_name:
description: 'Android versionName, for example 0.0.2'
description: 'Android versionName, for example 0.0.5'
required: true
default: '0.0.2'
default: '0.0.5'
build_number:
description: 'Android versionCode, must increase for every Play upload'
required: true
default: '2'
default: '5'
release_ref:
description: 'Git ref to cut the release from; use v2 for Airo TV release line'
description: 'Git ref to cut the release from; use main for the active Airo TV release line'
required: true
default: 'v2'
default: 'main'
release_branch:
description: 'Release branch to create/update from release_ref before building'
required: true
default: 'release/airo-tv-v0.0.2'
default: 'release/airo-tv-v0.0.5'
publish_github_release:
description: 'Create/update the GitHub release and attach artifacts'
required: true
Expand Down Expand Up @@ -141,12 +141,12 @@ permissions:
env:
FLUTTER_VERSION: '3.44.4'
RELEASE_VERSION: ${{ inputs.version || github.event.inputs.version || github.ref_name }}
BUILD_NAME: ${{ inputs.build_name || github.event.inputs.build_name || '0.0.2' }}
BUILD_NUMBER: ${{ inputs.build_number || github.event.inputs.build_number || '2' }}
BUILD_NAME: ${{ inputs.build_name || github.event.inputs.build_name || '0.0.5' }}
BUILD_NUMBER: ${{ inputs.build_number || github.event.inputs.build_number || '5' }}

jobs:
prepare-release-branch:
name: Cut release branch from v2
name: Cut release branch from main
runs-on: ubuntu-latest
outputs:
release_ref: ${{ steps.release_ref.outputs.ref || steps.current_ref.outputs.ref }}
Expand All @@ -165,8 +165,8 @@ jobs:
id: release_ref
if: github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call'
env:
RELEASE_BRANCH: ${{ inputs.release_branch || github.event.inputs.release_branch || 'release/airo-tv-v0.0.2' }}
RELEASE_REF: ${{ inputs.release_ref || github.event.inputs.release_ref || 'v2' }}
RELEASE_BRANCH: ${{ inputs.release_branch || github.event.inputs.release_branch || 'release/airo-tv-v0.0.5' }}
RELEASE_REF: ${{ inputs.release_ref || github.event.inputs.release_ref || 'main' }}
run: |
git fetch origin main
if [ "$RELEASE_REF" != "main" ]; then
Expand Down Expand Up @@ -783,7 +783,7 @@ jobs:
env:
GH_TOKEN: ${{ github.token }}
RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
RELEASE_BRANCH: ${{ needs.prepare-release-branch.outputs.release_ref || inputs.release_branch || github.event.inputs.release_branch || 'release/airo-tv-v0.0.2' }}
RELEASE_BRANCH: ${{ needs.prepare-release-branch.outputs.release_ref || inputs.release_branch || github.event.inputs.release_branch || 'release/airo-tv-v0.0.5' }}
SIGNING_CERT: ${{ needs.build-tv.outputs.signing_cert }}
run: |
case "$SIGNING_CERT" in
Expand All @@ -798,27 +798,26 @@ jobs:
cat > "$notes" <<NOTES
# Airo TV ${BUILD_NAME}

Airo TV ${BUILD_NAME} is a release-management and trust-readiness update for the Android TV variant of Airo.
Airo TV ${BUILD_NAME} is a product-surface consolidation and playback usability release for the Android TV variant of Airo.

## Highlights

- Published clean release asset names for APK and Play Store AAB downloads.
- Added SHA256 checksum publishing for release artifacts.
- Added structured release notes for Airo TV releases.
- Documented privacy, security, threat model, roadmap, architecture, and feature matrix.
- Updated public download links and release documentation.
- Kept Airo TV as the focused IPTV product surface.
- Removed obsolete Airo Streaming and Airo IPTV product-target wiring from release configuration.
- Added TV Explorer-inspired filters, settings, player controls, and bounded channel warmup.
- Updated public release documentation, store posture, and feature matrix for ${BUILD_NAME}.

## New Features

### IPTV

- Supports user-supplied M3U playlist URLs.
- Supports user-supplied M3U playlist URLs and XMLTV guide URLs.
- Keeps IPTV content responsibility with the user; Airo TV does not bundle channels or playlists.

### Search

- Supports channel search by channel name.
- Includes validation coverage for Music India search/play.
- Supports channel search by channel name and available guide data.
- Supports category, country, and language filtering with deduplicated category values.

### Android TV

Expand All @@ -834,6 +833,7 @@ jobs:
### Playback

- Supports IPTV channel playback from authorized playlist URLs.
- Warms nearby visible channels with bounded async stream-health checks.

### User Interface

Expand All @@ -845,11 +845,12 @@ jobs:
- Release artifacts use clean user-facing names.
- Release assets include SHA256SUMS for download verification.
- Release notes follow a stable template for future Airo TV versions.
- Player controls use a single Airo TV overlay layer in compact and fullscreen modes.

## Bug Fixes

- Fixed broken and misleading Airo TV download references that pointed to generic or missing release assets.
- Removed debug-looking public APK names from the Airo TV release flow.
- Fixed stale release defaults that pointed at earlier Airo TV releases.
- Fixed no-op player controls by wiring supported actions or removing unsupported affordances.

## Performance

Expand All @@ -868,9 +869,8 @@ jobs:

## Known Limitations

- No EPG support.
- No recording.
- No favorites sync.
- No cloud favorites sync.
- No cloud playlists.
- No multiple playlist merge.
- No bundled IPTV channels or media content.
Expand Down Expand Up @@ -913,7 +913,7 @@ jobs:

## Full Changelog

https://github.com/DevelopersCoffee/airo/compare/airo-tv-v0.0.1...${RELEASE_VERSION}
https://github.com/DevelopersCoffee/airo/compare/airo-tv-v0.0.4...${RELEASE_VERSION}
NOTES
gh release create "$RELEASE_VERSION" release-artifacts/* \
--title "Airo TV ${BUILD_NAME}" \
Expand Down
23 changes: 12 additions & 11 deletions .github/workflows/release-orchestrator.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,29 +3,30 @@ name: Release Orchestrator
on:
push:
tags:
- 'v2*'
- 'v*'
- 'airo-tv-v*'
workflow_dispatch:
inputs:
version:
description: 'Release version label, for example v2.0.0'
description: 'Release version label, for example v0.0.5'
required: true
default: 'v2.0.0'
default: 'airo-tv-v0.0.5'
build_name:
description: 'Android versionName, for example 2.0.0'
description: 'Android versionName, for example 0.0.5'
required: true
default: '2.0.0'
default: '0.0.5'
build_number:
description: 'Android versionCode shared by v2 Android artifacts'
description: 'Android versionCode shared by Android artifacts'
required: true
default: '200'
default: '7'
release_ref:
description: 'Git ref to release; must be based on origin/main'
required: true
default: 'main'
release_branch:
description: 'Release branch to create/update from release_ref'
required: true
default: 'release/v2.0.0'
default: 'release/airo-tv-v0.0.5'
dry_run:
description: 'Build and upload workflow artifacts without public/store publishing'
required: true
Expand Down Expand Up @@ -130,9 +131,9 @@ concurrency:
cancel-in-progress: false

env:
DEFAULT_VERSION: v2.0.0
DEFAULT_BUILD_NAME: 2.0.0
DEFAULT_BUILD_NUMBER: '200'
DEFAULT_VERSION: airo-tv-v0.0.5
DEFAULT_BUILD_NAME: 0.0.5
DEFAULT_BUILD_NUMBER: '7'

jobs:
prepare:
Expand Down
43 changes: 42 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,46 @@ All notable changes to this project are documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html) for public release tags.

## [Airo TV v0.0.5] - 2026-07-22

### Added

- First-run country selection and a Settings path for changing the country
filter after onboarding.
- TV Explorer-inspired browse controls for search, category, country, and
language filtering, including clearer country labels and deduplicated
category values.
- Bounded visible-channel health warmup and adaptive nearby-channel warming so
channel switching can avoid known-unavailable streams without scanning the
full playlist on the UI path.

### Changed

- Airo TV is the focused IPTV product surface. Obsolete Airo Streaming and Airo
IPTV product-target wiring was removed from build profiles, package IDs,
Firebase/preflight expectations, scripts, and release documentation.
- Compact phone/tablet and fullscreen player controls now keep a single Airo TV
overlay layer instead of falling back to mixed legacy/native overlay buttons.
- Channel rows prioritize channel and category space, move country to a compact
flag/metadata position, and keep list scrolling virtualized for large
playlists.

### Fixed

- Restored Settings entry points for theme and playback/PiP preferences.
- Corrected player lock/unlock behavior and fullscreen escape affordances.
- Fixed no-op player actions by either wiring supported controls or removing
unsupported affordances from the active Airo TV product surface.

### Known limitations

- Airo TV remains BYOC: it does not bundle playlists, channels, subscriptions,
or media content.
- Production signing, Play upload, Firebase distribution, and macOS
notarization require maintainer-owned credentials.
- Fire TV and legacy Android TV support remain compatible/experimental until
dedicated physical-device evidence is attached.

## [Airo TV v0.0.4] - 2026-07-22

### Added
Expand Down Expand Up @@ -138,7 +178,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
- Android TV package `io.airo.app.tv`.
- IPTV playlist import, search, playback, Cast controls, and Play Store readiness notes.

[Airo TV v0.0.4-rc.1]: https://github.com/DevelopersCoffee/airo/compare/airo-tv-v0.0.3...airo-tv-v0.0.4-rc.1
[Airo TV v0.0.5]: https://github.com/DevelopersCoffee/airo/compare/airo-tv-v0.0.4...airo-tv-v0.0.5
[Airo TV v0.0.4]: https://github.com/DevelopersCoffee/airo/compare/airo-tv-v0.0.3...airo-tv-v0.0.4
[Airo TV v0.0.4-rc.1]: https://github.com/DevelopersCoffee/airo/compare/airo-tv-v0.0.3...airo-tv-v0.0.4-rc.1
[Airo TV v0.0.2]: https://github.com/DevelopersCoffee/airo/compare/airo-tv-v0.0.1...airo-tv-v0.0.2
[Airo TV v0.0.1]: https://github.com/DevelopersCoffee/airo/releases/tag/airo-tv-v0.0.1
2 changes: 1 addition & 1 deletion app/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix.
version: 0.0.4-rc.3+6
version: 0.0.5+7

environment:
sdk: ">=3.12.2 <4.0.0"
Expand Down
2 changes: 1 addition & 1 deletion app/pubspec_tv.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
name: airo_app
description: "Airo TV - IPTV streaming for Android TV"
publish_to: 'none'
version: 0.0.4+4
version: 0.0.5+5

environment:
sdk: ">=3.12.2 <4.0.0"
Expand Down
1 change: 1 addition & 0 deletions app/test/main_tv_debug_playlist_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ void main() {
dio: Dio(),
prefs: prefs,
cacheDirectoryProvider: () async => cacheDir,
downloadDirectoryProvider: () async => cacheDir,
);

unawaited(
Expand Down
Loading
Loading