Repository navigation
Releases: mkatadev/GoogleTVAirPlay
Release list
v1.3.6
Fixed
- AirPlay music sessions now stop when another app takes audio focus, or when the enabled accessibility service detects switching to another app. Foreground-app detection works independently of HomeKit; the accessibility settings entry is available with HomeKit disabled.
- Late track metadata, artwork and progress callbacks no longer restore stale now-playing information after a session ends.
- The pairing PIN can bring the app to the foreground while another app is open when Display over other apps permission and Open app on connect are enabled. PIN notifications take priority over track metadata, and refreshed prompts use their current expiry.
- The PIN survives the iPhone closing its initial PIN-request connection before opening the verification connection.
- UxPlay's legacy pairing now accepts the 20-byte SRP SHA-1 proof sent by the iPhone instead of incorrectly requiring 64 bytes.
Known issues
- Ending a session stops playback and closes receiver connections, but Google TV can remain selected as the AirPlay output on the iPhone. This release does not fix output deselection or occasional silent resume; select the iPhone or another output manually if needed.
Install: on macOS/Linux run curl -fsSL https://raw.githubusercontent.com/mkatadev/GoogleTVAirPlay/main/install.sh | bash,
or download the APK and sideload it (adb install -r AirPlay-for-Google-TV-v1.3.6.apk or any TV file manager).
Already installed? Settings → About → App update installs it from the TV. Verify with the .sha256 file. Requires Android TV 12+.
*-full-source.tar.gz is the complete source including the third-party submodules (UxPlay, libplist,
FFmpeg, openssl-cmake) at the exact pinned commits listed in THIRD-PARTY-VERSIONS.md — GitHub's
auto-generated "Source code" archives below do not include them.
v1.3.5
Added
- Settings → Music delay: how much of the sender's ~2 s lead music keeps buffered — Short (≈ 0.5 s), Medium (≈ 1 s) or AirPlay standard (default, exactly on the sender's schedule). Shorter starts and resumes faster, longer rides out more Wi-Fi loss; applies live.
Changed
- Music (audio-only) sessions now play on the sender's schedule like an AirPlay speaker: the receiver holds the ~2 s lead iOS streams ahead of the play time instead of the low-latency mirroring cushion, so bursty Wi-Fi delivery and resent packets no longer cause drop-outs. Playback starts/resumes ~2 s after the sender, exactly as with other AirPlay speakers (iOS compensates for it). Mirroring audio keeps the low-latency cushion.
- README Known issues: explains why a "root mode" would not fix the iOS 26/27 output-switching issue on its own — root only unblocks UDP 319/320, the rest is a full AirPlay 2 receiver (pairing, encrypted control channel, PTP clock, buffered stream) that UxPlay does not implement; iOS does not fall back to NTP without the PTP feature bit.
- README Known issues: October 2026 status check of the AirPlay 2 question — UxPlay 1.73.7/1.74, shairport-sync 5.6 and
nqptp1.2.9 still hard-require UDP 319/320, iOS 27 still speaks classic RAOP, no non-root way to bind privileged ports on Android (adb/Shizuku,ip_unprivileged_port_start,android.uid.system); the only loophole (advertise PTP, never answer it, anchor playback locally, asopenairplay/airplay2-receiverdoes) gives unsynchronised single-device audio and was verified only up to iOS 17.
Fixed
- A sender
FLUSH(pause, seek, track change) now discards the audio buffered on the TV, so the old track no longer plays on after a skip. - UxPlay patch
0007: a missing audio packet was re-requested on every following packet (the iPhone resent it ~15 times per loss, eating airtime on an already lossy link) — now at most every 100 ms; a packet whose resend never arrives is given up on after 500 ms instead of stalling the stream for up to 2 s (256 packets), and held-back packets are released even when the sender pauses. - Developer benchmark log also reports the audio timeline (backlog, target cushion, trims/drops/silences/underruns) every ~2 s.
Install: on macOS/Linux run curl -fsSL https://raw.githubusercontent.com/mkatadev/GoogleTVAirPlay/main/install.sh | bash,
or download the APK and sideload it (adb install -r AirPlay-for-Google-TV-v1.3.5.apk or any TV file manager).
Already installed? Settings → About → App update installs it from the TV. Verify with the .sha256 file. Requires Android TV 12+.
*-full-source.tar.gz is the complete source including the third-party submodules (UxPlay, libplist,
FFmpeg, openssl-cmake) at the exact pinned commits listed in THIRD-PARTY-VERSIONS.md — GitHub's
auto-generated "Source code" archives below do not include them.
v1.3.4
Added
psi(public service identifier) in the AirPlay Bonjour record, so iOS tracks the receiver like any other AirPlay device instead of a "device without pairing ID".- README Known issues: ending a music session from the TV leaves the receiver selected on iOS 26/27 — what the receiver does about it, why iOS only re-routes AirPlay 2 endpoints, and what a fix would take (AirPlay 2 buffered audio needs PTP on ports 319/320, i.e. root).
Changed
- Ending a session from the TV (Back / End, or the TV going to sleep) now behaves like an AirPlay speaker switching input: the music is paused and the sender is told the receiver is no longer an output (DACP
device-prevent-playback) before the connection is closed, so playback no longer runs on in silence. - Third-party components are pinned to their newest official releases: UxPlay v1.73.7 (iOS 27 teardown fix, memcpy/strstr hardening), libplist 2.8.0, FFmpeg 9.0.2, OpenSSL 3.6.1.
tools/third-party.sh updatenow defaults to the newest release tag andcheck-releasesenforces release-only pins in CI; the Android dnssd shim implements UxPlay'sdnssd.hdirectly.
Fixed
- Remote control of the sender (play/pause, next/previous, volume from the TV) did not work for senders whose DACP-ID starts with a zero (about one session in sixteen): the Bonjour service name is now zero-padded to 16 digits.
- Track metadata arriving between the end of a session and the socket closing no longer lingers in the notification.
Install: on macOS/Linux run curl -fsSL https://raw.githubusercontent.com/mkatadev/GoogleTVAirPlay/main/install.sh | bash,
or download the APK and sideload it (adb install -r AirPlay-for-Google-TV-v1.3.4.apk or any TV file manager).
Already installed? Settings → About → App update installs it from the TV. Verify with the .sha256 file. Requires Android TV 12+.
*-full-source.tar.gz is the complete source including the third-party submodules (UxPlay, libplist,
FFmpeg, openssl-cmake) at the exact pinned commits listed in THIRD-PARTY-VERSIONS.md — GitHub's
auto-generated "Source code" archives below do not include them.
v1.3.3
Fixed
- Failed AirPlay video loads now show a brief, non-blocking error toast with the HTTP status when available.
- Back first hides visible video controls; a second press stops playback and ends the complete AirPlay session, including audio.
- The AirPlay PIN prompt closes when pairing completes, and the HomeKit setup screen returns after successful pairing.
Install: on macOS/Linux run curl -fsSL https://raw.githubusercontent.com/mkatadev/GoogleTVAirPlay/main/install.sh | bash,
or download the APK and sideload it (adb install -r AirPlay-for-Google-TV-v1.3.3.apk or any TV file manager).
Already installed? Settings → About → App update installs it from the TV. Verify with the .sha256 file. Requires Android TV 12+.
*-full-source.tar.gz is the complete source including the third-party submodules (UxPlay, libplist,
FFmpeg, openssl-cmake) at the exact pinned commits listed in THIRD-PARTY-VERSIONS.md — GitHub's
auto-generated "Source code" archives below do not include them.
v1.3.2
Added
-
HomeKit inputs: the Television accessory now lists AirPlay, the Google TV home screen and the installed streaming apps as inputs. Selecting one in Home (or via Siri/automations) launches it; the current input follows the app in front. Inputs can be renamed and hidden in Home; the list updates when apps are installed or removed (accessory configuration number bumps, no re-pairing). Ids stay stable per package.
-
"Supported by ProDevCode" footer on the now-playing and video screens; HomeKit manufacturer reads "Google powered by ProDevCode".
-
Receiver log lines shown on the idle and diagnostics screens are translated (receiver started/stopped, device connected, paired, …).
-
Compose previews for the receiver screen (idle, music, video).
-
Back on the now-playing screen ends the AirPlay session on the sender (also the Stop media key). Home keeps the music playing only when Run in background is on (and the app then stays out of the way until that session ends); with it off, Home ends the session.
Fixed
- A session that starts while Settings is open now switches to the receiver screen instead of playing behind the menu.
- Leaving the app (Home) during a background session no longer pulls it back to the front on every sender reconnect.
- A session that starts while the system screensaver is showing dismisses it instead of playing behind it.
Changed
- Now-playing screen: transport buttons centred, key hint removed; README screenshots refreshed (home, settings, Apple Home with setup code, now playing).
Install: on macOS/Linux run curl -fsSL https://raw.githubusercontent.com/mkatadev/GoogleTVAirPlay/main/install.sh | bash,
or download the APK and sideload it (adb install -r AirPlay-for-Google-TV-v1.3.2.apk or any TV file manager).
Already installed? Settings → About → App update installs it from the TV. Verify with the .sha256 file. Requires Android TV 12+.
*-full-source.tar.gz is the complete source including the third-party submodules (UxPlay, libplist,
FFmpeg, openssl-cmake) at the exact pinned commits listed in THIRD-PARTY-VERSIONS.md — GitHub's
auto-generated "Source code" archives below do not include them.
v1.3.1
Changed
- When the TV goes to sleep the AirPlay receiver is taken off the network (senders drop the route instead of streaming into a dark screen) and comes back automatically when the screen turns on.
- Apple Home Power on wakes the display through an invisible activity (
setTurnScreenOn) — Android 14 TV builds deny the wake-lock app-op to normal apps. - Now-playing screen: title/artist/album no longer overlap on two-line titles; transport buttons are centred under the progress bar and the key hint is gone.
Fixed
- HomeKit record is re-announced and controller sessions reset after a network change even while the receiver is off; the network watcher no longer treats the first address after going offline as a new baseline.
- Audio-mode layout on long translations.
Install: on macOS/Linux run curl -fsSL https://raw.githubusercontent.com/mkatadev/GoogleTVAirPlay/main/install.sh | bash,
or download the APK and sideload it (adb install -r AirPlay-for-Google-TV-v1.3.1.apk or any TV file manager).
Already installed? Settings → About → App update installs it from the TV. Verify with the .sha256 file. Requires Android TV 12+.
*-full-source.tar.gz is the complete source including the third-party submodules (UxPlay, libplist,
FFmpeg, openssl-cmake) at the exact pinned commits listed in THIRD-PARTY-VERSIONS.md — GitHub's
auto-generated "Source code" archives below do not include them.
v1.3.0
Added
- Control Google TV from Apple Home (Settings → Apple Home → Control Google TV): after enabling the app's accessibility service once, the Home remote navigates the Google TV UI (arrows, select, back, home), Power puts the device to sleep and wakes it (HDMI‑CEC turns the TV set off/on if enabled), and the transport keys reach whatever app is playing. Without the service the behaviour is as before — Power switches the AirPlay receiver and the remote controls AirPlay playback only.
- HomeKit setup QR code on the Apple Home screen (scannable with the Home app), next to the numeric code.
Fixed
- HomeKit record is advertised as "name HomeKit" so it no longer collides with the AirPlay record of the same name in Android's mDNS stack.
Install: on macOS/Linux run curl -fsSL https://raw.githubusercontent.com/mkatadev/GoogleTVAirPlay/main/install.sh | bash,
or download the APK and sideload it (adb install -r AirPlay-for-Google-TV-v1.3.0.apk or any TV file manager).
Already installed? Settings → About → App update installs it from the TV. Verify with the .sha256 file. Requires Android TV 12+.
*-full-source.tar.gz is the complete source including the third-party submodules (UxPlay, libplist,
FFmpeg, openssl-cmake) at the exact pinned commits listed in THIRD-PARTY-VERSIONS.md — GitHub's
auto-generated "Source code" archives below do not include them.
v1.2.0
Added
- Apple Home (HomeKit) integration (Settings → Smart home → Apple Home): the TV appears in the Home app on iPhone, iPad and Mac as a Television accessory — switch the AirPlay receiver on and off, use the remote keys (play/pause, next/previous track, seek in AirPlay Video) and control volume/mute, locally or through a home hub. Pairing with a setup code shown on the TV; Remove from Home forgets all pairings.
- Own HomeKit Accessory Protocol implementation in the new
:homekitmodule (TLV8, SRP-6a, pair-setup/pair-verify, encrypted sessions, characteristic events,_hap._tcpadvertisement) with end-to-end JVM tests; no bridge or Home Assistant required. - With HomeKit enabled the receiver service stays running in the background (also after boot) so Home can turn the receiver on while it is off; the notification shows the receiver as off.
Changed
- Shared JVM test helpers moved to the
:testingmodule.
Fixed
- A failed update check (e.g. the TV still waking up without network) is retried on the next visit to Settings instead of being cached for six hours.
install.shprinted the requested version twice in its "Looking up" line.- Update check no longer depends on the GitHub REST API (60 unauthenticated requests per hour per IP, shared by every device on the same network): the latest version comes from the
releases/latestredirect, assets are addressed by their fixed names.
Install: on macOS/Linux run curl -fsSL https://raw.githubusercontent.com/mkatadev/GoogleTVAirPlay/main/install.sh | bash,
or download the APK and sideload it (adb install -r AirPlay-for-Google-TV-v1.2.0.apk or any TV file manager).
Already installed? Settings → About → App update installs it from the TV. Verify with the .sha256 file. Requires Android TV 12+.
*-full-source.tar.gz is the complete source including the third-party submodules (UxPlay, libplist,
FFmpeg, openssl-cmake) at the exact pinned commits listed in THIRD-PARTY-VERSIONS.md — GitHub's
auto-generated "Source code" archives below do not include them.
v1.1.0
Added
- Diagnostics screen (Settings → Diagnostics): receiver, network address, mDNS registration per service and port checks with plain-language hints, live session counters, restart button.
- Trusted devices: a sender that entered the PIN once is remembered and skips it next time; manage them under Settings → Security (forget / forget all). Remember paired devices toggle.
- Mirroring latency presets (Settings → Media): Low / Balanced / Smooth, applied live.
- Screen dimming for audio-only sessions after a configurable idle time (Settings → General); any remote key wakes it; a paused, dimmed session lets the TV sleep.
- Update check and in-app install: Settings → About compares with GitHub Releases, downloads the signed APK, verifies its SHA-256 and hands it to the system installer (confirmed with the remote). The idle screen hints when an update is available.
- Audio track and subtitle selection for AirPlay Video (HLS): ▼ on the playback overlay opens the track menu; subtitles render through Media3; Subtitles on by default setting.
- Now-playing screen: focus lands on play/pause, ◀ ▶ and media keys switch tracks directly.
- App language (Settings → General): Same as the TV, English or Polish, applied instantly and remembered (per-app locale, also in the Android 13+ system language settings).
- Device name editor with ready-made suggestions (Living Room TV, Bedroom TV, …).
- Settings sub-pages (device name, language, dimming, latency, trusted devices) are separate screens; Back returns to the row you came from.
- PIN prompt: shown on every screen, with a 60 s countdown ring; Cancel / Back hides it while the PIN stays valid; blocks remote keys from reaching the screen underneath.
install.shone-liner installer documented in the README (EN/PL).- Project rules for AI assistants (
.github/copilot-instructions.md).
Changed
- PIN pairing is on by default.
- The receiver re-announces itself over mDNS when the TV changes network (Wi-Fi ↔ Ethernet, new DHCP lease) — no manual Stop/Start.
- Locking the iPhone no longer ends audio/video playback: the session is held for 8 s over the short connection drop and a reconnecting sender is treated as the same client.
- Media controls moved to a Media3
MediaSession(system now-playing surface, media keys, notification) backed by the sender's audio session or the video player. - Architecture:
:appis Clean Architecture + MVI with a contract (UiState · Intent · Effect) per screen and a pure-Kotlin domain;AirPlayServiceis split into focused collaborators (video session, now-playing state, volume sync, media session, notifications, network watcher, device identity). - Toolchain: Gradle 9.8, Compose compiler plugin 2.4.20, Compose BOM 2026.09, Media3 1.11.1, coroutines 1.11, Oboe 1.11;
androidx.mediadropped,androidx.appcompatadded for per-app locales. - CI runs unit tests of both modules and Android Lint; compiler and Lint are warning-free.
Fixed
LifecycleService.onStartCommandwas not callingsuper, so the service lifecycle never reached STARTED.DacpControllerused the deprecatedresolveServicepath on API 34+.
Install: on macOS/Linux run curl -fsSL https://raw.githubusercontent.com/mkatadev/GoogleTVAirPlay/main/install.sh | bash,
or download the APK and sideload it (adb install -r AirPlay-for-Google-TV-v1.1.0.apk or any TV file manager).
Already installed? Settings → About → App update installs it from the TV. Verify with the .sha256 file. Requires Android TV 12+.
*-full-source.tar.gz is the complete source including the third-party submodules (UxPlay, libplist,
FFmpeg, openssl-cmake) at the exact pinned commits listed in THIRD-PARTY-VERSIONS.md — GitHub's
auto-generated "Source code" archives below do not include them.
v1.0.0
Install: download the APK and sideload it onto your Google TV / Chromecast
(adb install -r AirPlay-for-Google-TV-v1.0.0.apk or any TV file manager).
Verify with the .sha256 file. Requires Android TV 12+.
*-full-source.tar.gz is the complete source including the third-party submodules (UxPlay, libplist,
FFmpeg, openssl-cmake) at the exact pinned commits listed in THIRD-PARTY-VERSIONS.md — GitHub's
auto-generated "Source code" archives below do not include them.
Full Changelog: https://github.com/mkatadev/GoogleTVAirPlay/commits/v1.0.0