Merge branch 'feature/138-track-cover' into 'develop'

Use track cover over album cover if present

Closes #138

See merge request funkwhale/funkwhale-android!296
This commit is contained in:
Ryan Harg 2023-01-11 12:41:05 +00:00
commit a83cd24185
9 changed files with 80 additions and 44 deletions

View File

@ -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 {

View File

@ -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))

View File

@ -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
)
}

View File

@ -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)

View File

@ -145,31 +145,35 @@ class PlaylistTracksFragment : FFAFragment<PlaylistTrack, PlaylistTracksAdapter>
}
override fun onDataFetched(data: List<PlaylistTrack>) {
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() {

View File

@ -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

View File

@ -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

View File

@ -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
)
)

View File

@ -0,0 +1 @@
Use the track cover in an album track list if one is available