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:
commit
a83cd24185
|
@ -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 {
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
)
|
||||
)
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Use the track cover in an album track list if one is available
|
Loading…
Reference in New Issue