Skip to content

Commit

Permalink
Add "play time" to artists and albums screens
Browse files Browse the repository at this point in the history
  • Loading branch information
Lurux committed Jul 22, 2023
1 parent 8136946 commit 60c5251
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,15 @@ enum class PlaylistSongSortType {
}

enum class ArtistSortType {
CREATE_DATE, NAME, SONG_COUNT
CREATE_DATE, NAME, SONG_COUNT, PLAY_TIME
}

enum class ArtistSongSortType {
CREATE_DATE, NAME, PLAY_TIME
}

enum class AlbumSortType {
CREATE_DATE, NAME, ARTIST, YEAR, SONG_COUNT, LENGTH
CREATE_DATE, NAME, ARTIST, YEAR, SONG_COUNT, LENGTH, PLAY_TIME
}

enum class PlaylistSortType {
Expand Down
37 changes: 37 additions & 0 deletions app/src/main/java/com/zionhuang/music/db/DatabaseDao.kt
Original file line number Diff line number Diff line change
Expand Up @@ -227,11 +227,34 @@ interface DatabaseDao {
@Query("SELECT *, (SELECT COUNT(1) FROM song_artist_map JOIN song ON song_artist_map.songId = song.id WHERE artistId = artist.id AND song.inLibrary IS NOT NULL) AS songCount FROM artist WHERE bookmarkedAt IS NOT NULL ORDER BY songCount")
fun artistsBySongCountAsc(): Flow<List<Artist>>

@Transaction
@Query(
"""
SELECT artist.*,
(SELECT COUNT(1)
FROM song_artist_map
JOIN song ON song_artist_map.songId = song.id
WHERE artistId = artist.id
AND song.inLibrary IS NOT NULL) AS songCount
FROM artist
JOIN(SELECT artistId, SUM(totalPlayTime) AS totalPlayTime
FROM song_artist_map
JOIN song
ON song_artist_map.songId = song.id
GROUP BY artistId
ORDER BY totalPlayTime)
ON artist.id = artistId
WHERE bookmarkedAt IS NOT NULL
"""
)
fun artistsByPlayTimeAsc(): Flow<List<Artist>>

fun artists(sortType: ArtistSortType, descending: Boolean) =
when (sortType) {
ArtistSortType.CREATE_DATE -> artistsByCreateDateAsc()
ArtistSortType.NAME -> artistsByNameAsc()
ArtistSortType.SONG_COUNT -> artistsBySongCountAsc()
ArtistSortType.PLAY_TIME -> artistsByPlayTimeAsc()
}.map { it.reversed(descending) }

@Query("SELECT * FROM artist WHERE id = :id")
Expand Down Expand Up @@ -261,6 +284,19 @@ interface DatabaseDao {
@Query("SELECT * FROM album ORDER BY duration")
fun albumsByLengthAsc(): Flow<List<Album>>

@Transaction
@Query(
"""
SELECT album.*
FROM album
JOIN song
ON song.albumId = album.id
GROUP BY album.id
ORDER BY SUM(song.totalPlayTime)
"""
)
fun albumsByPlayTimeAsc(): Flow<List<Album>>

fun albums(sortType: AlbumSortType, descending: Boolean) =
when (sortType) {
AlbumSortType.CREATE_DATE -> albumsByCreateDateAsc()
Expand All @@ -274,6 +310,7 @@ interface DatabaseDao {
AlbumSortType.YEAR -> albumsByYearAsc()
AlbumSortType.SONG_COUNT -> albumsBySongCountAsc()
AlbumSortType.LENGTH -> albumsByLengthAsc()
AlbumSortType.PLAY_TIME -> albumsByPlayTimeAsc()
}.map { it.reversed(descending) }

@Transaction
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ fun LibraryAlbumsScreen(
AlbumSortType.YEAR -> R.string.sort_by_year
AlbumSortType.SONG_COUNT -> R.string.sort_by_song_count
AlbumSortType.LENGTH -> R.string.sort_by_length
AlbumSortType.PLAY_TIME -> R.string.sort_by_play_time
}
},
trailingText = pluralStringResource(R.plurals.n_album, albums.size, albums.size)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ fun LibraryArtistsScreen(
ArtistSortType.CREATE_DATE -> R.string.sort_by_create_date
ArtistSortType.NAME -> R.string.sort_by_name
ArtistSortType.SONG_COUNT -> R.string.sort_by_song_count
ArtistSortType.PLAY_TIME -> R.string.sort_by_play_time
}
},
trailingText = pluralStringResource(R.plurals.n_artist, artists.size, artists.size)
Expand Down

0 comments on commit 60c5251

Please sign in to comment.