An open-source Android radio app tailored for Australian football fans. Stream radio stations and catch live AFL scores — all in one place - with Android Auto support.
Forked from Swift Radio Android by Fethi, built with Kotlin, Jetpack Compose, and Media3.
Config.kt to set your stations URL, contact info, and feature flagsstations/stations.json with your own stations (hosted or bundled)Stations are loaded from a remote JSON file hosted at https://markcs.github.io/Footy-Radio/stations/stations.json and user configurable within the app at Config.stationsURL. Each station supports the following fields:
{
"station": [
{
"name": "Station Name",
"streamURLs": [
"https://example.com/stream.aac",
"https://example.com/stream.mp3"
],
"imageURL": "https://example.com/station-image.png",
"desc": "Short description",
"longDesc": "Detailed description shown in the station info sheet.",
"website": "https://example.com"
}
]
}
| Field | Required | Description |
|---|---|---|
name |
Yes | Station name displayed in the list and player |
streamURLs |
Yes | Ordered list of stream URLs — the app tries each in turn |
imageURL |
Yes | Asset filename (without extension) or a full URL |
desc |
Yes | Short subtitle shown below the station name |
longDesc |
No | Longer description shown in the station info sheet |
website |
No | Station website URL shown in the info sheet |
Note:
streamURLsreplaces the original singlestreamURLfield. The app falls back through the list automatically if a stream fails to connect. The legacystreamURLfield is still accepted for compatibility.
All app-wide settings live in Config.kt:
object Config {
val gradientColor: Color = Color.White // Diagonal gradient overlay color
const val stationsURL = "https://..." // Remote stations JSON URL
const val hideNextPreviousButtons = false // Hide skip controls on the player
const val enableSearch = true // Show/hide search bar on station list
const val email = "contact@example.com"
const val feedbackURL = "https://..."
const val licenseURL = "https://..."
const val shareText = "Check out Footy Radio!"
}
Footy Radio integrates with the Squiggle API to display live AFL scores on the Now Playing screen. Scores update in real time via a Server-Sent Events (SSE) connection that opens automatically around game time and closes when all games for the day are complete.
Team logos for all 18 AFL clubs are bundled in the team-logos/ directory and are displayed alongside the score ticker.
Station artwork is hosted on GitHub Pages at https://markcs.github.io/Footy-Radio/stations/icons/ and referenced directly from the stations JSON. Icons for the included Melbourne stations are provided in the stations/icons/ directory.
All user-facing strings are in app/src/main/res/values/strings.xml. To add a new language:
app/src/main/res/values-XX/ (e.g., values-fr for French)strings.xml into the new directoryAndroid will automatically use the correct language based on the user’s device settings.
| Library | Purpose |
|---|---|
| AndroidX Media3 | Audio playback, media session, Android Auto |
| Jetpack Compose | UI framework with Material 3 |
| Coil | Image loading and caching |
| Ktor | HTTP client for remote stations and SSE |
| Kotlinx Serialization | JSON parsing |
Footy Radio is open source and available under the MIT License.