# Linthra v0.1.10 — release notes

**Linthra is an Android music player for local files and self-hosted music
servers.** v0.1.10 is a **mobile-data control and playlist workflow release**.
It adds real Android metered-network detection, three clear mobile-data
profiles, bulk album/artist playlist actions, song multi-selection, and an
optional custom palette in the separate GitHub Sponsor edition.

This release adds Android's normal `ACCESS_NETWORK_STATE` permission. It has no
runtime prompt and is used only to classify the active connection as unmetered,
metered, offline, or unknown. Linthra does not read an SSID, carrier identity,
IP address, server URL, location, or credential through this feature.

- **Version:** `0.1.10` (`versionName`), `versionCode` `110999`
- **Platform:** Android
- **Application ID:** `io.github.thezupzup.linthra`
- **License:** [MPL-2.0](../../LICENSE)
- **Get it:** Available from the
  [GitHub Releases page](https://github.com/TheZupZup/Linthra/releases) first
  (signed APKs); [Obtainium](https://github.com/ImranR98/Obtainium) can track
  this repository for updates. The
  [F-Droid](https://f-droid.org/packages/io.github.thezupzup.linthra/) build
  follows after F-Droid detects the tag and completes its build process.

## What's new

### Mobile-data profiles

- **Wi-Fi only.** Before a new remote download or smart pre-cache starts,
  Linthra requires an unmetered connection. LTE/5G and metered hotspots wait
  instead of being treated as Wi-Fi.
- **Save data.** User-requested downloads may use a metered connection, while
  automatic smart pre-cache stays paused to avoid background consumption.
- **Unlimited.** User-requested downloads and smart pre-cache may use metered
  connections normally.
- **Real Android metering.** Linthra now follows Android's active-network
  capability instead of guessing from the transport name. This handles metered
  Wi-Fi, unmetered cellular service, VPN default networks, offline state, and
  unusual devices conservatively.
- **Safe migration.** The previous mobile-data toggle migrates automatically:
  disabled or absent becomes *Wi-Fi only*, while enabled becomes *Unlimited*.

### Playlists

- **Add an entire album or artist.** Long-press an album or artist row, or use
  the visible action in its detail screen, to send every song to a playlist.
- **Select several songs.** Long-press a song in Songs, album detail, or artist
  detail, select the tracks you want, then add only that selection.
- **One consistent playlist flow.** Existing playlists and newly created
  playlists use the same duplicate-aware path and report added/skipped tracks.

### Appearance and support

- **Optional custom two-color palette.** The separate GitHub Sponsor edition
  can unlock a custom Linthra identity and playback accent for an active GitHub
  sponsorship of at least $3 USD/month.
- **The free core is unchanged.** Classic, Neon, Gold, and Black & White remain
  free everywhere. Playback, offline listening, local files, Jellyfin,
  Navidrome/Subsonic, Plex, Cast, and Android Auto are not locked.
- **F-Droid stays independent.** The F-Droid and ordinary canonical builds hide
  the GitHub-dependent custom-palette unlock path and require no billing SDK.

## Scope note

v0.1.10 fixes the previous production placeholder that always reported Wi-Fi
and protects the common case where a download or smart pre-cache is considered
while the device is already on a metered connection. Guaranteed cancellation
and automatic retry when the network changes during an already active transfer
remain follow-up work in [#275](https://github.com/TheZupZup/Linthra/issues/275).
The release does not claim that zero bytes can continue after every possible
mid-transfer Wi-Fi-to-LTE handoff.

## Technical summary

- **Android metered-network detection and mobile-data profiles**
  ([PR #284](https://github.com/TheZupZup/Linthra/pull/284), partially addresses
  [#275](https://github.com/TheZupZup/Linthra/issues/275)): a small native
  `ConnectivityManager` channel reports unmetered, metered, offline, or unknown;
  Dart preferences expose Wi-Fi only, Save data, and Unlimited; smart pre-cache
  pauses in Save data; legacy settings migrate without a database change.
- **Bulk playlist actions and song multi-selection**
  ([PR #280](https://github.com/TheZupZup/Linthra/pull/280), closes
  [#279](https://github.com/TheZupZup/Linthra/issues/279)): album/artist row
  gestures, detail-screen actions, and multi-select all reuse the existing
  playlist sheet and mutation safeguards.
- **Supporter custom palette and distribution boundary**
  ([PR #277](https://github.com/TheZupZup/Linthra/pull/277), corrected by
  [PR #278](https://github.com/TheZupZup/Linthra/pull/278)): local palette
  persistence and accessible derived tones, with GitHub Sponsor verification
  isolated to the dedicated Sponsor APK; F-Droid and ordinary builds keep all
  core features and built-in themes without exposing the unlock UI.

No dependency, Drift schema, provider account, playback-engine, or media-library
data migration is included in this release preparation.

## Manual QA checklist (Pixel / Android)

- [ ] Upgrade from v0.1.9 and verify settings, servers, library, and downloads
      remain available.
- [ ] Select *Wi-Fi only* on Wi-Fi and verify a remote download and smart
      pre-cache can start.
- [ ] Move to LTE/5G, then verify a new remote download waits and smart
      pre-cache does not start.
- [ ] Select *Save data* on LTE/5G and verify an explicit download is allowed
      while automatic smart pre-cache remains paused.
- [ ] Select *Unlimited* on LTE/5G and verify explicit downloads and smart
      pre-cache are allowed.
- [ ] Restart the app after each profile choice and verify the selection remains.
- [ ] Add all songs from an album and an artist to an existing playlist.
- [ ] Multi-select songs and add only the selected tracks to a playlist.
- [ ] Create a playlist from the shared sheet and verify duplicate reporting.
- [ ] In the ordinary/F-Droid build, verify built-in themes remain available and
      the GitHub Sponsor custom-palette unlock is hidden.
- [ ] In the GitHub Sponsor build, verify the custom palette remains locked until
      sponsor verification succeeds, then persists after restart.
- [ ] Verify Jellyfin and Navidrome/Subsonic sign-in, sync, playback, downloads,
      background playback, and the media notification.
- [ ] Verify no new runtime permission prompt appears.

## Upgrade and distribution notes

- Existing mobile-data preferences migrate automatically; no manual reset is
  required.
- **Don't mix install sources.** A GitHub-release APK is signed with Linthra's
  key, while the F-Droid build is signed with F-Droid's key; the two cannot
  update each other. Stay with one source.
- F-Droid detects stable tags automatically and builds from source. The local
  metadata mirror is updated after tagging because its build entries need the
  final tag commit SHA and per-ABI version codes.

No ads, no tracking, no analytics, no telemetry. No Spotify, stream-ripping, or
DRM-bypass claims — Linthra plays music you already own or that your own server
provides.
