168 lines
5.7 KiB
Kotlin
168 lines
5.7 KiB
Kotlin
/*
|
|
* Copyright (c) 2019 Hemanth Savarala.
|
|
*
|
|
* Licensed under the GNU General Public License v3
|
|
*
|
|
* This is free software: you can redistribute it and/or modify it under
|
|
* the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
|
|
*
|
|
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
* See the GNU General Public License for more details.
|
|
*/
|
|
|
|
package code.name.monkey.retromusic.repository
|
|
|
|
import android.provider.MediaStore.Audio.AudioColumns
|
|
import code.name.monkey.retromusic.ALBUM_ARTIST
|
|
import code.name.monkey.retromusic.helper.SortOrder
|
|
import code.name.monkey.retromusic.model.Album
|
|
import code.name.monkey.retromusic.model.Artist
|
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
|
|
|
interface ArtistRepository {
|
|
fun artists(): List<Artist>
|
|
|
|
fun albumArtists(): List<Artist>
|
|
|
|
fun albumArtists(query: String): List<Artist>
|
|
|
|
fun artists(query: String): List<Artist>
|
|
|
|
fun artist(artistId: Long): Artist
|
|
|
|
fun albumArtist(artistName: String): Artist
|
|
}
|
|
|
|
class RealArtistRepository(
|
|
private val songRepository: RealSongRepository,
|
|
private val albumRepository: RealAlbumRepository
|
|
) : ArtistRepository {
|
|
|
|
private fun getSongLoaderSortOrder(): String {
|
|
return PreferenceUtil.artistSortOrder + ", " +
|
|
PreferenceUtil.artistAlbumSortOrder + ", " +
|
|
PreferenceUtil.artistSongSortOrder
|
|
}
|
|
|
|
override fun artist(artistId: Long): Artist {
|
|
if (artistId == Artist.VARIOUS_ARTISTS_ID) {
|
|
// Get Various Artists
|
|
val songs = songRepository.songs(
|
|
songRepository.makeSongCursor(
|
|
null,
|
|
null,
|
|
getSongLoaderSortOrder()
|
|
)
|
|
)
|
|
val albums = albumRepository.splitIntoAlbums(songs)
|
|
.filter { it.albumArtist == Artist.VARIOUS_ARTISTS_DISPLAY_NAME }
|
|
return Artist(Artist.VARIOUS_ARTISTS_ID, albums)
|
|
}
|
|
|
|
val songs = songRepository.songs(
|
|
songRepository.makeSongCursor(
|
|
AudioColumns.ARTIST_ID + "=?",
|
|
arrayOf(artistId.toString()),
|
|
getSongLoaderSortOrder()
|
|
)
|
|
)
|
|
return Artist(artistId, albumRepository.splitIntoAlbums(songs))
|
|
}
|
|
|
|
override fun albumArtist(artistName: String): Artist {
|
|
if (artistName == Artist.VARIOUS_ARTISTS_DISPLAY_NAME) {
|
|
// Get Various Artists
|
|
val songs = songRepository.songs(
|
|
songRepository.makeSongCursor(
|
|
null,
|
|
null,
|
|
getSongLoaderSortOrder()
|
|
)
|
|
)
|
|
val albums = albumRepository.splitIntoAlbums(songs)
|
|
.filter { it.albumArtist == Artist.VARIOUS_ARTISTS_DISPLAY_NAME }
|
|
return Artist(Artist.VARIOUS_ARTISTS_ID, albums, true)
|
|
}
|
|
|
|
val songs = songRepository.songs(
|
|
songRepository.makeSongCursor(
|
|
"album_artist" + "=?",
|
|
arrayOf(artistName),
|
|
getSongLoaderSortOrder()
|
|
)
|
|
)
|
|
return Artist(artistName, albumRepository.splitIntoAlbums(songs), true)
|
|
}
|
|
|
|
override fun artists(): List<Artist> {
|
|
val songs = songRepository.songs(
|
|
songRepository.makeSongCursor(
|
|
null, null,
|
|
getSongLoaderSortOrder()
|
|
)
|
|
)
|
|
return splitIntoArtists(albumRepository.splitIntoAlbums(songs))
|
|
}
|
|
|
|
override fun albumArtists(): List<Artist> {
|
|
val songs = songRepository.songs(
|
|
songRepository.makeSongCursor(
|
|
null,
|
|
null,
|
|
"lower($ALBUM_ARTIST)" +
|
|
if (PreferenceUtil.artistSortOrder == SortOrder.ArtistSortOrder.ARTIST_A_Z) "" else " DESC"
|
|
)
|
|
)
|
|
return splitIntoAlbumArtists(albumRepository.splitIntoAlbums(songs))
|
|
}
|
|
|
|
override fun albumArtists(query: String): List<Artist> {
|
|
val songs = songRepository.songs(
|
|
songRepository.makeSongCursor(
|
|
"album_artist" + " LIKE ?",
|
|
arrayOf("%$query%"),
|
|
getSongLoaderSortOrder()
|
|
)
|
|
)
|
|
return splitIntoAlbumArtists(albumRepository.splitIntoAlbums(songs))
|
|
}
|
|
|
|
override fun artists(query: String): List<Artist> {
|
|
val songs = songRepository.songs(
|
|
songRepository.makeSongCursor(
|
|
AudioColumns.ARTIST + " LIKE ?",
|
|
arrayOf("%$query%"),
|
|
getSongLoaderSortOrder()
|
|
)
|
|
)
|
|
return splitIntoArtists(albumRepository.splitIntoAlbums(songs))
|
|
}
|
|
|
|
|
|
private fun splitIntoAlbumArtists(albums: List<Album>): List<Artist> {
|
|
return albums.groupBy { it.albumArtist }
|
|
.filter {
|
|
!it.key.isNullOrEmpty()
|
|
}
|
|
.map {
|
|
val currentAlbums = it.value
|
|
if (currentAlbums.isNotEmpty()) {
|
|
if (currentAlbums[0].albumArtist == Artist.VARIOUS_ARTISTS_DISPLAY_NAME) {
|
|
Artist(Artist.VARIOUS_ARTISTS_ID, currentAlbums, true)
|
|
} else {
|
|
Artist(currentAlbums[0].artistId, currentAlbums, true)
|
|
}
|
|
} else {
|
|
Artist.empty
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
fun splitIntoArtists(albums: List<Album>): List<Artist> {
|
|
return albums.groupBy { it.artistId }
|
|
.map { Artist(it.key, it.value) }
|
|
}
|
|
} |