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
22 changes: 22 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,28 @@ automatically from the `## [x.y.z]` heading matching `versionName` in `app/build

## [Unreleased]

## [1.2.0] - 2026-08-19

### Added
- **Coil now copes with a box that plays from more than one source.** A coming Phoniebox release
lets a box have a streaming service alongside its own music, and then the album list holds both.
An album's name and artist are no longer enough to say which one you meant — two sources can
offer the same record — so Coil now remembers where each album came from and tells the box, for
favourites and home screen shortcuts as well as the library. Without this, starting an album from
the streaming service would have emptied the queue and played nothing at all. Nothing changes on
a box with only its own music, and your existing favourites and covers carry over untouched
- **The library says which source each album came from**, on a box that has more than one. A small
icon marks whether an entry is an album, a playlist or a saved-songs collection, and the line
under the title names the source — so the same record held both on your box and in a streaming
account reads as two entries rather than one mysterious duplicate. A box with only its own music
shows none of this, because there it would be the same mark on every row
- **A setting for cover art that does not live on your box.** Phoniebox is gaining the ability to play
from a streaming service, and such a service keeps its cover art on its own servers rather than on
the box. Coil can now show those covers, but only if you ask it to: the switch sits under Appearance
and is **off by default**, because turning it on is the one thing in the app that makes your phone
talk to anything other than your box on the local network. Left off, those albums show a stand-in
cover and nothing leaves your network

## [1.1.1] - 2026-08-12

### Fixed
Expand Down
4 changes: 2 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ android {
applicationId = "app.coilforphoniebox"
minSdk = 26
targetSdk = 36
versionCode = 7
versionName = "1.1.1"
versionCode = 8
versionName = "1.2.0"
}

androidResources {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ fun FavoritesScreen(
FavoriteEntry(
favorite = favorite,
box = state.activeBox,
allowExternalCovers = state.allowExternalCovers,
compact = compact,
coverPending = state.coverPending(favorite),
link = viewModel.linkFor(favorite),
Expand All @@ -118,6 +119,7 @@ fun FavoritesScreen(
private fun FavoriteEntry(
favorite: Favorite,
box: PhonieBox?,
allowExternalCovers: Boolean,
compact: Boolean,
/** Whether this favourite is still waiting to hear whether the box has artwork for it. */
coverPending: Boolean,
Expand All @@ -130,8 +132,8 @@ private fun FavoriteEntry(
onLinkCopied: () -> Unit,
) {
var menuOpen by remember { mutableStateOf(false) }
val coverUrl = remember(favorite.coverFile, box?.host) {
favorite.coverFile?.let { file -> box?.coverUrl(file) }
val coverUrl = remember(favorite.coverFile, box?.host, allowExternalCovers) {
favorite.coverFile?.let { ref -> box?.coverUrl(ref, allowExternalCovers) }
}

val menuButton: @Composable () -> Unit = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import app.coilforphoniebox.domain.model.Favorite
import app.coilforphoniebox.domain.repository.BoxRepository
import app.coilforphoniebox.domain.repository.FavoriteRepository
import app.coilforphoniebox.domain.repository.PlayerRepository
import app.coilforphoniebox.domain.repository.SettingsRepository
import app.coilforphoniebox.domain.usecase.PlayFavoriteUseCase
import app.coilforphoniebox.domain.usecase.ResolveFavoriteCoverUseCase
import app.coilforphoniebox.shortcuts.PlayDeepLink
Expand Down Expand Up @@ -41,6 +42,7 @@ class FavoritesViewModel @Inject constructor(
private val playFavorite: PlayFavoriteUseCase,
private val resolveCover: ResolveFavoriteCoverUseCase,
private val shortcuts: ShortcutPublisher,
settings: SettingsRepository,
) : ViewModel() {

data class State(
Expand All @@ -49,6 +51,8 @@ class FavoritesViewModel @Inject constructor(
val connection: ConnectionState = ConnectionState.DISCONNECTED,
/** Favourites whose cover lookup has finished — see [coverPending]. */
val coversSettled: Set<Long> = emptySet(),
/** Whether a cover held somewhere other than the box may be loaded (§16). */
val allowExternalCovers: Boolean = false,
) {
/**
* Whether [favorite] is still waiting to hear whether it has artwork.
Expand Down Expand Up @@ -96,12 +100,14 @@ class FavoritesViewModel @Inject constructor(
},
player.connectionState,
coversSettled,
) { box, list, connection, settled ->
settings.settings.map { it.loadExternalCoverArt }.distinctUntilChanged(),
) { box, list, connection, settled, allowExternalCovers ->
State(
favorites = list,
activeBox = box,
connection = connection,
coversSettled = settled,
allowExternalCovers = allowExternalCovers,
)
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), State())

Expand Down
Loading
Loading