diff --git a/app/src/main/java/audio/funkwhale/ffa/activities/MainActivity.kt b/app/src/main/java/audio/funkwhale/ffa/activities/MainActivity.kt index 7647e96..d8c916f 100644 --- a/app/src/main/java/audio/funkwhale/ffa/activities/MainActivity.kt +++ b/app/src/main/java/audio/funkwhale/ffa/activities/MainActivity.kt @@ -434,7 +434,7 @@ class MainActivity : AppCompatActivity() { .setListener(null) .start() - (binding.navHostFragment?.layoutParams as? ViewGroup.MarginLayoutParams)?.let { + (binding.navHostFragment.layoutParams as? ViewGroup.MarginLayoutParams)?.let { it.bottomMargin = it.bottomMargin * 2 } @@ -453,13 +453,13 @@ class MainActivity : AppCompatActivity() { val lic = this.layoutInflater.context - CoverArt.withContext(lic, maybeNormalizeUrl(track.album?.cover?.urls?.original)) + CoverArt.withContext(lic, maybeNormalizeUrl(track.cover())) .fit() .centerCrop() .into(binding.nowPlayingContainer?.nowPlayingCover) binding.nowPlayingContainer?.nowPlayingDetailsCover?.let { nowPlayingDetailsCover -> - CoverArt.withContext(lic, maybeNormalizeUrl(track.album?.cover())) + CoverArt.withContext(lic, maybeNormalizeUrl(track.cover())) .fit() .centerCrop() .transform(RoundedCornersTransformation(16, 0)) @@ -472,7 +472,7 @@ class MainActivity : AppCompatActivity() { windowManager.defaultDisplay.getMetrics(this) }.widthPixels - val backgroundCover = CoverArt.withContext(lic, maybeNormalizeUrl(track.album?.cover())) + val backgroundCover = CoverArt.withContext(lic, maybeNormalizeUrl(track.cover())) .get() .run { Bitmap.createScaledBitmap(this, width, width, false).toDrawable(resources) } .apply { diff --git a/app/src/main/java/audio/funkwhale/ffa/adapters/FavoritesAdapter.kt b/app/src/main/java/audio/funkwhale/ffa/adapters/FavoritesAdapter.kt index 332d474..041fab1 100644 --- a/app/src/main/java/audio/funkwhale/ffa/adapters/FavoritesAdapter.kt +++ b/app/src/main/java/audio/funkwhale/ffa/adapters/FavoritesAdapter.kt @@ -66,7 +66,7 @@ class FavoritesAdapter( override fun onBindViewHolder(holder: ViewHolder, position: Int) { val favorite = data[position] - CoverArt.withContext(layoutInflater.context, maybeNormalizeUrl(favorite.album?.cover())) + CoverArt.withContext(layoutInflater.context, maybeNormalizeUrl(favorite.cover())) .fit() .placeholder(R.drawable.cover) .transform(RoundedCornersTransformation(16, 0)) diff --git a/app/src/main/java/audio/funkwhale/ffa/adapters/PlaylistTracksAdapter.kt b/app/src/main/java/audio/funkwhale/ffa/adapters/PlaylistTracksAdapter.kt index 23552ad..1f0bdad 100644 --- a/app/src/main/java/audio/funkwhale/ffa/adapters/PlaylistTracksAdapter.kt +++ b/app/src/main/java/audio/funkwhale/ffa/adapters/PlaylistTracksAdapter.kt @@ -69,38 +69,38 @@ class PlaylistTracksAdapter( @SuppressLint("NewApi") override fun onBindViewHolder(holder: ViewHolder, position: Int) { - val track = data[position] + val playlistTrack = data[position] - CoverArt.withContext(layoutInflater.context, maybeNormalizeUrl(track.track.album?.cover())) + CoverArt.withContext(layoutInflater.context, maybeNormalizeUrl(playlistTrack.track.cover())) .fit() .placeholder(R.drawable.cover) .transform(RoundedCornersTransformation(16, 0)) .into(holder.cover) - holder.title.text = track.track.title - holder.artist.text = track.track.artist.name + holder.title.text = playlistTrack.track.title + holder.artist.text = playlistTrack.track.artist.name context?.let { holder.itemView.background = ContextCompat.getDrawable(context, R.drawable.ripple) } - if (track.track == currentTrack || track.track.current) { + if (playlistTrack.track == currentTrack || playlistTrack.track.current) { context?.let { holder.itemView.background = ContextCompat.getDrawable(context, R.drawable.current) } } context?.let { - when (track.track.favorite) { + when (playlistTrack.track.favorite) { true -> holder.favorite.setColorFilter(context.getColor(R.color.colorFavorite)) false -> holder.favorite.setColorFilter(context.getColor(R.color.colorSelected)) } holder.favorite.setOnClickListener { favoriteListener.let { - favoriteListener.onToggleFavorite(track.track.id, !track.track.favorite) + favoriteListener.onToggleFavorite(playlistTrack.track.id, !playlistTrack.track.favorite) - track.track.favorite = !track.track.favorite + playlistTrack.track.favorite = !playlistTrack.track.favorite notifyItemChanged(position) } } @@ -115,11 +115,11 @@ class PlaylistTracksAdapter( setOnMenuItemClickListener { when (it.itemId) { - R.id.track_add_to_queue -> CommandBus.send(Command.AddToQueue(listOf(track.track))) - R.id.track_play_next -> CommandBus.send(Command.PlayNext(track.track)) - R.id.queue_remove -> CommandBus.send(Command.RemoveFromQueue(track.track)) + R.id.track_add_to_queue -> CommandBus.send(Command.AddToQueue(listOf(playlistTrack.track))) + R.id.track_play_next -> CommandBus.send(Command.PlayNext(playlistTrack.track)) + R.id.queue_remove -> CommandBus.send(Command.RemoveFromQueue(playlistTrack.track)) R.id.track_remove_from_playlist -> playlistListener.onRemoveTrackFromPlaylist( - track.track, + playlistTrack.track, position ) } diff --git a/app/src/main/java/audio/funkwhale/ffa/adapters/TracksAdapter.kt b/app/src/main/java/audio/funkwhale/ffa/adapters/TracksAdapter.kt index fefd7a7..98688c6 100644 --- a/app/src/main/java/audio/funkwhale/ffa/adapters/TracksAdapter.kt +++ b/app/src/main/java/audio/funkwhale/ffa/adapters/TracksAdapter.kt @@ -70,7 +70,7 @@ class TracksAdapter( override fun onBindViewHolder(holder: ViewHolder, position: Int) { val track = data[position] - CoverArt.withContext(layoutInflater.context, maybeNormalizeUrl(track.album?.cover())) + CoverArt.withContext(layoutInflater.context, maybeNormalizeUrl(track.cover())) .fit() .transform(RoundedCornersTransformation(8, 0)) .into(holder.cover) diff --git a/app/src/main/java/audio/funkwhale/ffa/fragments/PlaylistTracksFragment.kt b/app/src/main/java/audio/funkwhale/ffa/fragments/PlaylistTracksFragment.kt index fb57d4c..3073486 100644 --- a/app/src/main/java/audio/funkwhale/ffa/fragments/PlaylistTracksFragment.kt +++ b/app/src/main/java/audio/funkwhale/ffa/fragments/PlaylistTracksFragment.kt @@ -145,31 +145,35 @@ class PlaylistTracksFragment : FFAFragment } override fun onDataFetched(data: List) { - data.map { it.track.album }.toSet().map { it?.cover() }.take(4).forEachIndexed { index, url -> - val imageView = when (index) { - 0 -> binding.coverTopLeft - 1 -> binding.coverTopRight - 2 -> binding.coverBottomLeft - 3 -> binding.coverBottomRight - else -> binding.coverTopLeft - } + data.map { it.track.album } + .toSet() + .map { it?.cover() } + .take(4) + .forEachIndexed { index, url -> + val imageView = when (index) { + 0 -> binding.coverTopLeft + 1 -> binding.coverTopRight + 2 -> binding.coverBottomLeft + 3 -> binding.coverBottomRight + else -> binding.coverTopLeft + } - val corner = when (index) { - 0 -> RoundedCornersTransformation.CornerType.TOP_LEFT - 1 -> RoundedCornersTransformation.CornerType.TOP_RIGHT - 2 -> RoundedCornersTransformation.CornerType.BOTTOM_LEFT - 3 -> RoundedCornersTransformation.CornerType.BOTTOM_RIGHT - else -> RoundedCornersTransformation.CornerType.TOP_LEFT - } + val corner = when (index) { + 0 -> RoundedCornersTransformation.CornerType.TOP_LEFT + 1 -> RoundedCornersTransformation.CornerType.TOP_RIGHT + 2 -> RoundedCornersTransformation.CornerType.BOTTOM_LEFT + 3 -> RoundedCornersTransformation.CornerType.BOTTOM_RIGHT + else -> RoundedCornersTransformation.CornerType.TOP_LEFT + } - lifecycleScope.launch(Main) { - CoverArt.withContext(layoutInflater.context, maybeNormalizeUrl(url)) - .fit() - .centerCrop() - .transform(RoundedCornersTransformation(16, 0, corner)) - .into(imageView) + lifecycleScope.launch(Main) { + CoverArt.withContext(layoutInflater.context, maybeNormalizeUrl(url)) + .fit() + .centerCrop() + .transform(RoundedCornersTransformation(16, 0, corner)) + .into(imageView) + } } - } } private fun watchEventBus() { diff --git a/app/src/main/java/audio/funkwhale/ffa/model/Album.kt b/app/src/main/java/audio/funkwhale/ffa/model/Album.kt index eb99bd7..cdd6c0d 100644 --- a/app/src/main/java/audio/funkwhale/ffa/model/Album.kt +++ b/app/src/main/java/audio/funkwhale/ffa/model/Album.kt @@ -8,7 +8,7 @@ data class Album( val id: Int, val artist: Artist, val title: String, - val cover: Covers?, + private val cover: Covers?, val release_date: String? ) : SearchResult, Parcelable { @Parcelize diff --git a/app/src/main/java/audio/funkwhale/ffa/model/Track.kt b/app/src/main/java/audio/funkwhale/ffa/model/Track.kt index a70b91d..e8ce382 100644 --- a/app/src/main/java/audio/funkwhale/ffa/model/Track.kt +++ b/app/src/main/java/audio/funkwhale/ffa/model/Track.kt @@ -10,6 +10,7 @@ import kotlinx.parcelize.Parcelize data class Track( val id: Int = 0, val title: String, + private val cover: Covers? , val artist: Artist, val album: Album?, val disc_number: Int = 0, @@ -18,6 +19,7 @@ data class Track( val copyright: String? = null, val license: String? = null ) : SearchResult, Parcelable { + @IgnoredOnParcel var current: Boolean = false @@ -35,6 +37,7 @@ data class Track( fun fromDownload(download: DownloadInfo): Track = Track( id = download.id, title = download.title, + cover = Covers(CoverUrls("")), artist = Artist(0, download.artist, listOf()), album = Album(0, Album.Artist(""), "", Covers(CoverUrls("")), ""), uploads = listOf(Upload(download.contentId, 0, 0)) @@ -71,7 +74,14 @@ data class Track( } } - override fun cover() = album?.cover?.urls?.original + override fun cover(): String? { + return if (cover?.urls?.original != null) { + cover.urls.original + } else { + album?.cover() + } + } + override fun title() = title override fun subtitle() = artist.name diff --git a/app/src/test/java/audio/funkwhale/ffa/model/TrackTest.kt b/app/src/test/java/audio/funkwhale/ffa/model/TrackTest.kt index b8eef86..dafc586 100644 --- a/app/src/test/java/audio/funkwhale/ffa/model/TrackTest.kt +++ b/app/src/test/java/audio/funkwhale/ffa/model/TrackTest.kt @@ -2,6 +2,7 @@ package audio.funkwhale.ffa.model import org.junit.Test import strikt.api.expectThat +import strikt.assertions.isEqualTo import strikt.assertions.isFalse import strikt.assertions.isTrue @@ -42,13 +43,33 @@ class TrackTest { expectThat(createTrackObject(albumTitle = null).matchesFilter("album")).isFalse() } + @Test + fun coverReturnsAlbumCoverIfNoTrackCoverExists() { + expectThat( + createTrackObject( + trackCover = null, + albumCover = Covers(CoverUrls("albumCover")) + ).cover() + ).isEqualTo("albumCover") + } + + @Test + fun coverReturnsTrackCoverIfTrackCoverExists() { + expectThat( + createTrackObject(trackCover = Covers(CoverUrls("trackCover"))).cover() + ).isEqualTo("trackCover") + } + private fun createTrackObject( trackTitle: String = "trackTitle", artistName: String = "artistName", - albumTitle: String? = "albumTitle" + albumTitle: String? = "albumTitle", + trackCover: Covers? = Covers(urls = CoverUrls(original = "trackCover")), + albumCover: Covers? = Covers(urls = CoverUrls(original = "albumCover")) ) = Track( id = 0, title = trackTitle, + cover = trackCover, artist = Artist(id = 0, name = artistName, albums = listOf()), album = if (albumTitle == null) @@ -57,7 +78,7 @@ class TrackTest { id = 0, title = albumTitle, artist = Album.Artist("albumArtist"), - cover = null, + cover = albumCover, release_date = null ) ) diff --git a/changes/changelog.d/138.feature b/changes/changelog.d/138.feature new file mode 100644 index 0000000..a480399 --- /dev/null +++ b/changes/changelog.d/138.feature @@ -0,0 +1 @@ +Use the track cover in an album track list if one is available