WIP artist
This commit is contained in:
parent
3f3e26ea45
commit
455baf03df
30 changed files with 509 additions and 296 deletions
|
@ -29,7 +29,6 @@ import code.name.monkey.retromusic.dialogs.DeleteSongsDialog
|
||||||
import code.name.monkey.retromusic.extensions.show
|
import code.name.monkey.retromusic.extensions.show
|
||||||
import code.name.monkey.retromusic.glide.ArtistGlideRequest
|
import code.name.monkey.retromusic.glide.ArtistGlideRequest
|
||||||
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
|
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
|
||||||
import code.name.monkey.retromusic.glide.SongGlideRequest
|
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.helper.SortOrder.AlbumSongSortOrder
|
import code.name.monkey.retromusic.helper.SortOrder.AlbumSongSortOrder
|
||||||
import code.name.monkey.retromusic.misc.AppBarStateChangeListener
|
import code.name.monkey.retromusic.misc.AppBarStateChangeListener
|
||||||
|
@ -37,8 +36,6 @@ import code.name.monkey.retromusic.model.Album
|
||||||
import code.name.monkey.retromusic.model.Artist
|
import code.name.monkey.retromusic.model.Artist
|
||||||
import code.name.monkey.retromusic.mvp.presenter.AlbumDetailsPresenter
|
import code.name.monkey.retromusic.mvp.presenter.AlbumDetailsPresenter
|
||||||
import code.name.monkey.retromusic.mvp.presenter.AlbumDetailsView
|
import code.name.monkey.retromusic.mvp.presenter.AlbumDetailsView
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
|
||||||
import code.name.monkey.retromusic.util.NavigationUtil
|
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import code.name.monkey.retromusic.util.RetroUtil
|
import code.name.monkey.retromusic.util.RetroUtil
|
||||||
import com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
|
@ -51,6 +48,9 @@ import javax.inject.Inject
|
||||||
import android.util.Pair as UtilPair
|
import android.util.Pair as UtilPair
|
||||||
|
|
||||||
class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView {
|
class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView {
|
||||||
|
override fun showEmptyView() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private lateinit var simpleSongAdapter: SimpleSongAdapter
|
private lateinit var simpleSongAdapter: SimpleSongAdapter
|
||||||
private var disposable = CompositeDisposable()
|
private var disposable = CompositeDisposable()
|
||||||
|
@ -93,20 +93,20 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView {
|
||||||
|
|
||||||
artistImage.setOnClickListener {
|
artistImage.setOnClickListener {
|
||||||
val artistPairs = ActivityOptions.makeSceneTransitionAnimation(this, UtilPair.create(artistImage, getString(R.string.transition_artist_image)))
|
val artistPairs = ActivityOptions.makeSceneTransitionAnimation(this, UtilPair.create(artistImage, getString(R.string.transition_artist_image)))
|
||||||
NavigationUtil.goToArtistOptions(this, album.artistId, artistPairs)
|
//NavigationUtil.goToArtistOptions(this, album.artistId, artistPairs)
|
||||||
}
|
}
|
||||||
playAction.apply {
|
playAction.apply {
|
||||||
setOnClickListener { MusicPlayerRemote.openQueue(album.songs!!, 0, true) }
|
//setOnClickListener { MusicPlayerRemote.openQueue(album.songs!!, 0, true) }
|
||||||
}
|
}
|
||||||
shuffleAction.apply {
|
shuffleAction.apply {
|
||||||
setOnClickListener { MusicPlayerRemote.openAndShuffleQueue(album.songs!!, true) }
|
//setOnClickListener { MusicPlayerRemote.openAndShuffleQueue(album.songs!!, true) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
albumDetailsPresenter.attachView(this)
|
albumDetailsPresenter.attachView(this)
|
||||||
|
|
||||||
if (intent.extras!!.containsKey(EXTRA_ALBUM_ID)) {
|
if (intent.extras!!.containsKey(EXTRA_ALBUM_ID)) {
|
||||||
intent.extras?.getInt(EXTRA_ALBUM_ID)?.let { albumDetailsPresenter.loadAlbum(it) }
|
intent.extras?.getLong(EXTRA_ALBUM_ID)?.let { albumDetailsPresenter.loadAlbum(it) }
|
||||||
} else {
|
} else {
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
|
@ -171,18 +171,18 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView {
|
||||||
|
|
||||||
override fun album(album: Album) {
|
override fun album(album: Album) {
|
||||||
|
|
||||||
if (album.songs!!.isEmpty()) {
|
/*if (album.songs!!.isEmpty()) {
|
||||||
finish()
|
finish()
|
||||||
return
|
return
|
||||||
}
|
}*/
|
||||||
this.album = album
|
this.album = album
|
||||||
|
|
||||||
albumTitle.text = album.title
|
albumTitle.text = album.title
|
||||||
albumText.text = String.format("%s • %s • %s", album.artistName, MusicUtil.getYearString(album.year), MusicUtil.getReadableDurationString(MusicUtil.getTotalDuration(this, album.songs)))
|
//albumText.text = String.format("%s • %s • %s", album.artistName, MusicUtil.getYearString(album.year), MusicUtil.getReadableDurationString(MusicUtil.getTotalDuration(this, album.songs)))
|
||||||
|
|
||||||
loadAlbumCover()
|
loadAlbumCover()
|
||||||
simpleSongAdapter.swapDataSet(album.songs)
|
//simpleSongAdapter.swapDataSet(album.songs)
|
||||||
albumDetailsPresenter.loadMore(album.artistId)
|
//albumDetailsPresenter.loadMore(album.artistId)
|
||||||
}
|
}
|
||||||
|
|
||||||
private lateinit var artistImage: ImageView
|
private lateinit var artistImage: ImageView
|
||||||
|
@ -210,7 +210,7 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun loadAlbumCover() {
|
private fun loadAlbumCover() {
|
||||||
SongGlideRequest.Builder.from(Glide.with(this), album.safeGetFirstSong())
|
/*SongGlideRequest.Builder.from(Glide.with(this), album.safeGetFirstSong())
|
||||||
.checkIgnoreMediaStore(this)
|
.checkIgnoreMediaStore(this)
|
||||||
.generatePalette(this).build()
|
.generatePalette(this).build()
|
||||||
.dontAnimate()
|
.dontAnimate()
|
||||||
|
@ -218,7 +218,7 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView {
|
||||||
override fun onColorReady(color: Int) {
|
override fun onColorReady(color: Int) {
|
||||||
setColors(color)
|
setColors(color)
|
||||||
}
|
}
|
||||||
})
|
})*/
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun scheduleStartPostponedTransition(image: ImageView) {
|
private fun scheduleStartPostponedTransition(image: ImageView) {
|
||||||
|
@ -323,7 +323,7 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView {
|
||||||
|
|
||||||
private fun reload() {
|
private fun reload() {
|
||||||
if (intent.extras!!.containsKey(EXTRA_ALBUM_ID)) {
|
if (intent.extras!!.containsKey(EXTRA_ALBUM_ID)) {
|
||||||
intent.extras?.getInt(EXTRA_ALBUM_ID)?.let { albumDetailsPresenter.loadAlbum(it) }
|
intent.extras?.getLong(EXTRA_ALBUM_ID)?.let { albumDetailsPresenter.loadAlbum(it) }
|
||||||
} else {
|
} else {
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,9 @@ import code.name.monkey.retromusic.glide.ArtistGlideRequest
|
||||||
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
|
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.misc.AppBarStateChangeListener
|
import code.name.monkey.retromusic.misc.AppBarStateChangeListener
|
||||||
|
import code.name.monkey.retromusic.model.Album
|
||||||
import code.name.monkey.retromusic.model.Artist
|
import code.name.monkey.retromusic.model.Artist
|
||||||
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.mvp.presenter.ArtistDetailsPresenter
|
import code.name.monkey.retromusic.mvp.presenter.ArtistDetailsPresenter
|
||||||
import code.name.monkey.retromusic.mvp.presenter.ArtistDetailsView
|
import code.name.monkey.retromusic.mvp.presenter.ArtistDetailsView
|
||||||
import code.name.monkey.retromusic.rest.LastFMRestClient
|
import code.name.monkey.retromusic.rest.LastFMRestClient
|
||||||
|
@ -48,6 +50,7 @@ import kotlin.collections.ArrayList
|
||||||
|
|
||||||
class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailsView {
|
class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailsView {
|
||||||
|
|
||||||
|
|
||||||
private var biography: Spanned? = null
|
private var biography: Spanned? = null
|
||||||
private lateinit var artist: Artist
|
private lateinit var artist: Artist
|
||||||
private var lastFMRestClient: LastFMRestClient? = null
|
private var lastFMRestClient: LastFMRestClient? = null
|
||||||
|
@ -84,10 +87,10 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailsView {
|
||||||
setUpViews()
|
setUpViews()
|
||||||
|
|
||||||
playAction.apply {
|
playAction.apply {
|
||||||
setOnClickListener { MusicPlayerRemote.openQueue(artist.songs, 0, true) }
|
//setOnClickListener { MusicPlayerRemote.openQueue(artist.songs, 0, true) }
|
||||||
}
|
}
|
||||||
shuffleAction.apply {
|
shuffleAction.apply {
|
||||||
setOnClickListener { MusicPlayerRemote.openAndShuffleQueue(artist.songs, true) }
|
//setOnClickListener { MusicPlayerRemote.openAndShuffleQueue(artist.songs, true) }
|
||||||
}
|
}
|
||||||
|
|
||||||
biographyText.setOnClickListener {
|
biographyText.setOnClickListener {
|
||||||
|
@ -102,7 +105,7 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailsView {
|
||||||
artistDetailsPresenter.attachView(this)
|
artistDetailsPresenter.attachView(this)
|
||||||
|
|
||||||
if (intent.extras!!.containsKey(EXTRA_ARTIST_ID)) {
|
if (intent.extras!!.containsKey(EXTRA_ARTIST_ID)) {
|
||||||
intent.extras?.getInt(EXTRA_ARTIST_ID)?.let { artistDetailsPresenter.loadArtist(it) }
|
intent.extras?.getLong(EXTRA_ARTIST_ID)?.let { artistDetailsPresenter.loadArtist(it) }
|
||||||
} else {
|
} else {
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
|
@ -211,11 +214,19 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailsView {
|
||||||
loadBiography(artist.name)
|
loadBiography(artist.name)
|
||||||
}
|
}
|
||||||
artistTitle.text = artist.name
|
artistTitle.text = artist.name
|
||||||
text.text = String.format("%s • %s", MusicUtil.getArtistInfoString(this, artist), MusicUtil
|
text.text = String.format("%s", MusicUtil.getArtistInfoString(this, artist))
|
||||||
.getReadableDurationString(MusicUtil.getTotalDuration(this, artist.songs)))
|
|
||||||
|
|
||||||
songAdapter.swapDataSet(artist.songs)
|
artistDetailsPresenter.loadArtistSongs(artist.id)
|
||||||
albumAdapter.swapDataSet(artist.albums!!)
|
artistDetailsPresenter.loadArtistAlbums(artist.id)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun artistSong(songs: ArrayList<Song>) {
|
||||||
|
songAdapter.swapDataSet(songs)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun artistAlbums(albums: ArrayList<Album>) {
|
||||||
|
albumAdapter.swapDataSet(albums)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun loadBiography(name: String,
|
private fun loadBiography(name: String,
|
||||||
|
@ -280,7 +291,7 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailsView {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleSortOrderMenuItem(item: MenuItem): Boolean {
|
private fun handleSortOrderMenuItem(item: MenuItem): Boolean {
|
||||||
val songs = artist.songs
|
val songs = ArrayList<Song>()
|
||||||
when (item.itemId) {
|
when (item.itemId) {
|
||||||
android.R.id.home -> {
|
android.R.id.home -> {
|
||||||
super.onBackPressed()
|
super.onBackPressed()
|
||||||
|
@ -327,7 +338,7 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailsView {
|
||||||
|
|
||||||
private fun reload() {
|
private fun reload() {
|
||||||
if (intent.extras!!.containsKey(EXTRA_ARTIST_ID)) {
|
if (intent.extras!!.containsKey(EXTRA_ARTIST_ID)) {
|
||||||
intent.extras?.getInt(EXTRA_ARTIST_ID)?.let { artistDetailsPresenter.loadArtist(it) }
|
intent.extras?.getLong(EXTRA_ARTIST_ID)?.let { artistDetailsPresenter.loadArtist(it) }
|
||||||
} else {
|
} else {
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,8 +15,6 @@ import code.name.monkey.retromusic.fragments.mainactivity.home.BannerHomeFragmen
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.helper.SearchQueryHelper
|
import code.name.monkey.retromusic.helper.SearchQueryHelper
|
||||||
import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks
|
import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks
|
||||||
import code.name.monkey.retromusic.loaders.AlbumLoader
|
|
||||||
import code.name.monkey.retromusic.loaders.ArtistLoader
|
|
||||||
import code.name.monkey.retromusic.loaders.PlaylistSongsLoader
|
import code.name.monkey.retromusic.loaders.PlaylistSongsLoader
|
||||||
import code.name.monkey.retromusic.service.MusicService
|
import code.name.monkey.retromusic.service.MusicService
|
||||||
import code.name.monkey.retromusic.util.AppRater
|
import code.name.monkey.retromusic.util.AppRater
|
||||||
|
@ -154,14 +152,14 @@ class MainActivity : AbsSlidingMusicPanelActivity(), SharedPreferences.OnSharedP
|
||||||
val id = parseIdFromIntent(intent, "albumId", "album").toInt()
|
val id = parseIdFromIntent(intent, "albumId", "album").toInt()
|
||||||
if (id >= 0) {
|
if (id >= 0) {
|
||||||
val position = intent.getIntExtra("position", 0)
|
val position = intent.getIntExtra("position", 0)
|
||||||
MusicPlayerRemote.openQueue(AlbumLoader.getAlbum(this, id).songs!!, position, true)
|
//MusicPlayerRemote.openQueue(AlbumLoader.getAlbum(this, id).songs!!, position, true)
|
||||||
handled = true
|
handled = true
|
||||||
}
|
}
|
||||||
} else if (MediaStore.Audio.Artists.CONTENT_TYPE == mimeType) {
|
} else if (MediaStore.Audio.Artists.CONTENT_TYPE == mimeType) {
|
||||||
val id = parseIdFromIntent(intent, "artistId", "artist").toInt()
|
val id = parseIdFromIntent(intent, "artistId", "artist").toInt()
|
||||||
if (id >= 0) {
|
if (id >= 0) {
|
||||||
val position = intent.getIntExtra("position", 0)
|
val position = intent.getIntExtra("position", 0)
|
||||||
MusicPlayerRemote.openQueue(ArtistLoader.getArtist(this, id).songs, position, true)
|
//MusicPlayerRemote.openQueue(ArtistLoader.getArtist(this, id).songs, position, true)
|
||||||
handled = true
|
handled = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.extensions.appHandleColor
|
import code.name.monkey.retromusic.extensions.appHandleColor
|
||||||
import code.name.monkey.retromusic.glide.palette.BitmapPaletteTranscoder
|
import code.name.monkey.retromusic.glide.palette.BitmapPaletteTranscoder
|
||||||
import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
|
import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
|
||||||
import code.name.monkey.retromusic.loaders.AlbumLoader
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.rest.LastFMRestClient
|
import code.name.monkey.retromusic.rest.LastFMRestClient
|
||||||
import code.name.monkey.retromusic.rest.model.LastFmAlbum
|
import code.name.monkey.retromusic.rest.model.LastFmAlbum
|
||||||
import code.name.monkey.retromusic.util.ImageUtil
|
import code.name.monkey.retromusic.util.ImageUtil
|
||||||
|
@ -38,6 +38,7 @@ import io.reactivex.schedulers.Schedulers
|
||||||
import kotlinx.android.synthetic.main.activity_album_tag_editor.*
|
import kotlinx.android.synthetic.main.activity_album_tag_editor.*
|
||||||
import org.jaudiotagger.tag.FieldKey
|
import org.jaudiotagger.tag.FieldKey
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
import kotlin.collections.ArrayList
|
||||||
|
|
||||||
|
|
||||||
class AlbumTagEditorActivity : AbsTagEditorActivity(), TextWatcher {
|
class AlbumTagEditorActivity : AbsTagEditorActivity(), TextWatcher {
|
||||||
|
@ -228,7 +229,7 @@ class AlbumTagEditorActivity : AbsTagEditorActivity(), TextWatcher {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getSongPaths(): List<String> {
|
override fun getSongPaths(): List<String> {
|
||||||
val songs = AlbumLoader.getAlbum(this, id).songs
|
val songs = ArrayList<Song>()//AlbumLoader.getAlbum(this, id).songs
|
||||||
val paths = ArrayList<String>(songs!!.size)
|
val paths = ArrayList<String>(songs!!.size)
|
||||||
for (song in songs) {
|
for (song in songs) {
|
||||||
paths.add(song.data)
|
paths.add(song.data)
|
||||||
|
|
|
@ -10,14 +10,12 @@ import code.name.monkey.appthemehelper.ThemeStore
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
|
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
|
||||||
import code.name.monkey.retromusic.glide.ArtistGlideRequest
|
import code.name.monkey.retromusic.glide.ArtistGlideRequest
|
||||||
import code.name.monkey.retromusic.glide.SongGlideRequest
|
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.helper.menu.SongMenuHelper
|
import code.name.monkey.retromusic.helper.menu.SongMenuHelper
|
||||||
import code.name.monkey.retromusic.model.Album
|
import code.name.monkey.retromusic.model.Album
|
||||||
import code.name.monkey.retromusic.model.Artist
|
import code.name.monkey.retromusic.model.Artist
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
import code.name.monkey.retromusic.util.NavigationUtil
|
|
||||||
import com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
import android.util.Pair as UtilPair
|
import android.util.Pair as UtilPair
|
||||||
|
|
||||||
|
@ -47,9 +45,9 @@ class SearchAdapter(
|
||||||
val album = dataSet?.get(position) as Album
|
val album = dataSet?.get(position) as Album
|
||||||
holder.title?.text = album.title
|
holder.title?.text = album.title
|
||||||
holder.text?.text = album.artistName
|
holder.text?.text = album.artistName
|
||||||
SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong())
|
/*SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong())
|
||||||
.checkIgnoreMediaStore(activity).build()
|
.checkIgnoreMediaStore(activity).build()
|
||||||
.into(holder.image)
|
.into(holder.image)*/
|
||||||
}
|
}
|
||||||
ARTIST -> {
|
ARTIST -> {
|
||||||
val artist = dataSet?.get(position) as Artist
|
val artist = dataSet?.get(position) as Artist
|
||||||
|
@ -106,12 +104,12 @@ class SearchAdapter(
|
||||||
ALBUM -> {
|
ALBUM -> {
|
||||||
val options = ActivityOptions.makeSceneTransitionAnimation(activity,
|
val options = ActivityOptions.makeSceneTransitionAnimation(activity,
|
||||||
UtilPair.create(image, activity.getString(R.string.transition_album_art)))
|
UtilPair.create(image, activity.getString(R.string.transition_album_art)))
|
||||||
NavigationUtil.goToAlbumOptions(activity, (item as Album).id, options)
|
//NavigationUtil.goToAlbumOptions(activity, (item as Album).id, options)
|
||||||
}
|
}
|
||||||
ARTIST -> {
|
ARTIST -> {
|
||||||
val options = ActivityOptions.makeSceneTransitionAnimation(activity,
|
val options = ActivityOptions.makeSceneTransitionAnimation(activity,
|
||||||
UtilPair.create(image, activity.getString(R.string.transition_artist_image)))
|
UtilPair.create(image, activity.getString(R.string.transition_artist_image)))
|
||||||
NavigationUtil.goToArtistOptions(activity, (item as Artist).id, options)
|
//NavigationUtil.goToArtistOptions(activity, (item as Artist).id, options)
|
||||||
}
|
}
|
||||||
SONG -> {
|
SONG -> {
|
||||||
val playList = ArrayList<Song>()
|
val playList = ArrayList<Song>()
|
||||||
|
|
|
@ -2,7 +2,6 @@ package code.name.monkey.retromusic.adapter.album
|
||||||
|
|
||||||
import android.app.ActivityOptions
|
import android.app.ActivityOptions
|
||||||
import android.content.res.ColorStateList
|
import android.content.res.ColorStateList
|
||||||
import android.graphics.drawable.Drawable
|
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
@ -14,18 +13,13 @@ import code.name.monkey.appthemehelper.util.MaterialValueHelper
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
|
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
|
||||||
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
|
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
|
||||||
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
|
|
||||||
import code.name.monkey.retromusic.glide.SongGlideRequest
|
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
|
||||||
import code.name.monkey.retromusic.helper.SortOrder
|
import code.name.monkey.retromusic.helper.SortOrder
|
||||||
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
|
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
|
||||||
import code.name.monkey.retromusic.interfaces.CabHolder
|
import code.name.monkey.retromusic.interfaces.CabHolder
|
||||||
import code.name.monkey.retromusic.model.Album
|
import code.name.monkey.retromusic.model.Album
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
import code.name.monkey.retromusic.util.NavigationUtil
|
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import com.bumptech.glide.Glide
|
|
||||||
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
|
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
|
||||||
|
|
||||||
|
|
||||||
|
@ -91,7 +85,7 @@ open class AlbumAdapter(protected val activity: AppCompatActivity,
|
||||||
holder.text!!.text = getAlbumText(album)
|
holder.text!!.text = getAlbumText(album)
|
||||||
}
|
}
|
||||||
if (holder.playSongs != null) {
|
if (holder.playSongs != null) {
|
||||||
holder.playSongs!!.setOnClickListener { MusicPlayerRemote.openQueue(album.songs!!, 0, true) }
|
//holder.playSongs!!.setOnClickListener { MusicPlayerRemote.openQueue(album.songs!!, 0, true) }
|
||||||
}
|
}
|
||||||
loadAlbumCover(album, holder)
|
loadAlbumCover(album, holder)
|
||||||
}
|
}
|
||||||
|
@ -112,7 +106,7 @@ open class AlbumAdapter(protected val activity: AppCompatActivity,
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong())
|
/*SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong())
|
||||||
.checkIgnoreMediaStore(activity)
|
.checkIgnoreMediaStore(activity)
|
||||||
.generatePalette(activity).build()
|
.generatePalette(activity).build()
|
||||||
.into(object : RetroMusicColoredTarget(holder.image!!) {
|
.into(object : RetroMusicColoredTarget(holder.image!!) {
|
||||||
|
@ -124,7 +118,7 @@ open class AlbumAdapter(protected val activity: AppCompatActivity,
|
||||||
override fun onColorReady(color: Int) {
|
override fun onColorReady(color: Int) {
|
||||||
setColors(color, holder)
|
setColors(color, holder)
|
||||||
}
|
}
|
||||||
})
|
})*/
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getItemCount(): Int {
|
override fun getItemCount(): Int {
|
||||||
|
@ -151,7 +145,7 @@ open class AlbumAdapter(protected val activity: AppCompatActivity,
|
||||||
private fun getSongList(albums: List<Album>): ArrayList<Song> {
|
private fun getSongList(albums: List<Album>): ArrayList<Song> {
|
||||||
val songs = ArrayList<Song>()
|
val songs = ArrayList<Song>()
|
||||||
for (album in albums) {
|
for (album in albums) {
|
||||||
songs.addAll(album.songs!!)
|
//songs.addAll(album.songs!!)
|
||||||
}
|
}
|
||||||
return songs
|
return songs
|
||||||
}
|
}
|
||||||
|
@ -182,7 +176,7 @@ open class AlbumAdapter(protected val activity: AppCompatActivity,
|
||||||
toggleChecked(adapterPosition)
|
toggleChecked(adapterPosition)
|
||||||
} else {
|
} else {
|
||||||
val activityOptions = ActivityOptions.makeSceneTransitionAnimation(activity, image, activity.getString(R.string.transition_album_art))
|
val activityOptions = ActivityOptions.makeSceneTransitionAnimation(activity, image, activity.getString(R.string.transition_album_art))
|
||||||
NavigationUtil.goToAlbumOptions(activity, dataSet[adapterPosition].id, activityOptions)
|
//NavigationUtil.goToAlbumOptions(activity, dataSet[adapterPosition].id, activityOptions)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,13 +22,8 @@ import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
|
|
||||||
import code.name.monkey.retromusic.glide.SongGlideRequest
|
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
|
||||||
import code.name.monkey.retromusic.model.Album
|
import code.name.monkey.retromusic.model.Album
|
||||||
import code.name.monkey.retromusic.util.NavigationUtil
|
|
||||||
import code.name.monkey.retromusic.views.MetalRecyclerViewPager
|
import code.name.monkey.retromusic.views.MetalRecyclerViewPager
|
||||||
import com.bumptech.glide.Glide
|
|
||||||
|
|
||||||
class AlbumFullWidthAdapter(private val activity: Activity, private val dataSet: ArrayList<Album>, metrics: DisplayMetrics) :
|
class AlbumFullWidthAdapter(private val activity: Activity, private val dataSet: ArrayList<Album>, metrics: DisplayMetrics) :
|
||||||
MetalRecyclerViewPager.MetalAdapter<AlbumFullWidthAdapter.FullMetalViewHolder>(metrics) {
|
MetalRecyclerViewPager.MetalAdapter<AlbumFullWidthAdapter.FullMetalViewHolder>(metrics) {
|
||||||
|
@ -50,7 +45,7 @@ class AlbumFullWidthAdapter(private val activity: Activity, private val dataSet:
|
||||||
holder.text!!.text = getAlbumText(album)
|
holder.text!!.text = getAlbumText(album)
|
||||||
}
|
}
|
||||||
if (holder.playSongs != null) {
|
if (holder.playSongs != null) {
|
||||||
holder.playSongs!!.setOnClickListener { MusicPlayerRemote.openQueue(album.songs!!, 0, true) }
|
//holder.playSongs!!.setOnClickListener { MusicPlayerRemote.openQueue(album.songs!!, 0, true) }
|
||||||
}
|
}
|
||||||
loadAlbumCover(album, holder)
|
loadAlbumCover(album, holder)
|
||||||
}
|
}
|
||||||
|
@ -67,14 +62,14 @@ class AlbumFullWidthAdapter(private val activity: Activity, private val dataSet:
|
||||||
if (holder.image == null) {
|
if (holder.image == null) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong())
|
/*SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong())
|
||||||
.checkIgnoreMediaStore(activity)
|
.checkIgnoreMediaStore(activity)
|
||||||
.generatePalette(activity).build()
|
.generatePalette(activity).build()
|
||||||
.into(object : RetroMusicColoredTarget(holder.image!!) {
|
.into(object : RetroMusicColoredTarget(holder.image!!) {
|
||||||
override fun onColorReady(color: Int) {
|
override fun onColorReady(color: Int) {
|
||||||
|
|
||||||
}
|
}
|
||||||
})
|
})*/
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getItemCount(): Int {
|
override fun getItemCount(): Int {
|
||||||
|
@ -85,7 +80,7 @@ class AlbumFullWidthAdapter(private val activity: Activity, private val dataSet:
|
||||||
|
|
||||||
override fun onClick(v: View?) {
|
override fun onClick(v: View?) {
|
||||||
val activityOptions = ActivityOptions.makeSceneTransitionAnimation(activity, image, activity.getString(R.string.transition_album_art))
|
val activityOptions = ActivityOptions.makeSceneTransitionAnimation(activity, image, activity.getString(R.string.transition_album_art))
|
||||||
NavigationUtil.goToAlbumOptions(activity, dataSet[adapterPosition].id, activityOptions)
|
//NavigationUtil.goToAlbumOptions(activity, dataSet[adapterPosition].id, activityOptions)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,18 +1,14 @@
|
||||||
package code.name.monkey.retromusic.adapter.album
|
package code.name.monkey.retromusic.adapter.album
|
||||||
|
|
||||||
import android.graphics.drawable.Drawable
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import code.name.monkey.appthemehelper.util.ColorUtil
|
import code.name.monkey.appthemehelper.util.ColorUtil
|
||||||
import code.name.monkey.appthemehelper.util.MaterialValueHelper
|
import code.name.monkey.appthemehelper.util.MaterialValueHelper
|
||||||
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
|
|
||||||
import code.name.monkey.retromusic.glide.SongGlideRequest
|
|
||||||
import code.name.monkey.retromusic.helper.HorizontalAdapterHelper
|
import code.name.monkey.retromusic.helper.HorizontalAdapterHelper
|
||||||
import code.name.monkey.retromusic.interfaces.CabHolder
|
import code.name.monkey.retromusic.interfaces.CabHolder
|
||||||
import code.name.monkey.retromusic.model.Album
|
import code.name.monkey.retromusic.model.Album
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
import com.bumptech.glide.Glide
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
|
||||||
|
@ -43,7 +39,7 @@ class HorizontalAlbumAdapter(
|
||||||
override fun loadAlbumCover(album: Album, holder: ViewHolder) {
|
override fun loadAlbumCover(album: Album, holder: ViewHolder) {
|
||||||
if (holder.image == null) return
|
if (holder.image == null) return
|
||||||
|
|
||||||
SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong())
|
/*SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong())
|
||||||
.checkIgnoreMediaStore(activity)
|
.checkIgnoreMediaStore(activity)
|
||||||
.generatePalette(activity).build()
|
.generatePalette(activity).build()
|
||||||
.into(object : RetroMusicColoredTarget(holder.image!!) {
|
.into(object : RetroMusicColoredTarget(holder.image!!) {
|
||||||
|
@ -58,7 +54,7 @@ class HorizontalAlbumAdapter(
|
||||||
else
|
else
|
||||||
setColors(albumArtistFooterColor, holder)
|
setColors(albumArtistFooterColor, holder)
|
||||||
}
|
}
|
||||||
})
|
})*/
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getAlbumText(album: Album): String? {
|
override fun getAlbumText(album: Album): String? {
|
||||||
|
|
|
@ -113,7 +113,7 @@ class ArtistAdapter(val activity: AppCompatActivity,
|
||||||
private fun getSongList(artists: List<Artist>): ArrayList<Song> {
|
private fun getSongList(artists: List<Artist>): ArrayList<Song> {
|
||||||
val songs = ArrayList<Song>()
|
val songs = ArrayList<Song>()
|
||||||
for (artist in artists) {
|
for (artist in artists) {
|
||||||
songs.addAll(artist.songs) // maybe async in future?
|
//songs.addAll(artist.songs) // maybe async in future?
|
||||||
}
|
}
|
||||||
return songs
|
return songs
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,19 +14,13 @@ import code.name.monkey.retromusic.extensions.hide
|
||||||
import code.name.monkey.retromusic.extensions.show
|
import code.name.monkey.retromusic.extensions.show
|
||||||
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
|
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
|
||||||
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
|
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
|
||||||
import code.name.monkey.retromusic.glide.ArtistGlideRequest
|
|
||||||
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
|
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
|
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
|
||||||
import code.name.monkey.retromusic.loaders.ArtistLoader
|
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.model.lyrics.AbsSynchronizedLyrics
|
import code.name.monkey.retromusic.model.lyrics.AbsSynchronizedLyrics
|
||||||
import code.name.monkey.retromusic.model.lyrics.Lyrics
|
import code.name.monkey.retromusic.model.lyrics.Lyrics
|
||||||
import code.name.monkey.retromusic.util.NavigationUtil
|
import code.name.monkey.retromusic.util.NavigationUtil
|
||||||
import com.bumptech.glide.Glide
|
|
||||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
|
||||||
import io.reactivex.disposables.CompositeDisposable
|
import io.reactivex.disposables.CompositeDisposable
|
||||||
import io.reactivex.schedulers.Schedulers
|
|
||||||
import kotlinx.android.synthetic.main.fragment_full.*
|
import kotlinx.android.synthetic.main.fragment_full.*
|
||||||
|
|
||||||
class FullPlayerFragment : AbsPlayerFragment(), MusicProgressViewUpdateHelper.Callback {
|
class FullPlayerFragment : AbsPlayerFragment(), MusicProgressViewUpdateHelper.Callback {
|
||||||
|
@ -213,7 +207,7 @@ class FullPlayerFragment : AbsPlayerFragment(), MusicProgressViewUpdateHelper.Ca
|
||||||
private val compositeDisposable = CompositeDisposable()
|
private val compositeDisposable = CompositeDisposable()
|
||||||
|
|
||||||
private fun updateArtistImage() {
|
private fun updateArtistImage() {
|
||||||
compositeDisposable.addAll(ArtistLoader.getArtistFlowable(context!!, MusicPlayerRemote.currentSong.artistId)
|
/*compositeDisposable.addAll(ArtistLoader.getArtistFlowable(context!!, MusicPlayerRemote.currentSong.artistId)
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
.subscribe {
|
.subscribe {
|
||||||
|
@ -224,7 +218,7 @@ class FullPlayerFragment : AbsPlayerFragment(), MusicProgressViewUpdateHelper.Ca
|
||||||
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})*/
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onQueueChanged() {
|
override fun onQueueChanged() {
|
||||||
|
|
|
@ -44,10 +44,7 @@ public class AudioFileCoverUtils {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// If there are any exceptions, we ignore them and continue to the other fallback method
|
// If there are any exceptions, we ignore them and continue to the other fallback method
|
||||||
} catch (ReadOnlyFileException ignored) {
|
} catch (ReadOnlyFileException | InvalidAudioFrameException | TagException | IOException ignored) {
|
||||||
} catch (InvalidAudioFrameException ignored) {
|
|
||||||
} catch (TagException ignored) {
|
|
||||||
} catch (IOException ignored) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Method 2: look for album art in external files
|
// Method 2: look for album art in external files
|
||||||
|
|
|
@ -15,13 +15,12 @@
|
||||||
package code.name.monkey.retromusic.loaders
|
package code.name.monkey.retromusic.loaders
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.provider.MediaStore.Audio.AudioColumns
|
import android.database.Cursor
|
||||||
|
import android.provider.MediaStore
|
||||||
|
import code.name.monkey.retromusic.Constants
|
||||||
import code.name.monkey.retromusic.model.Album
|
import code.name.monkey.retromusic.model.Album
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import io.reactivex.Observable
|
|
||||||
import java.util.*
|
|
||||||
import kotlin.collections.ArrayList
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -29,7 +28,92 @@ import kotlin.collections.ArrayList
|
||||||
*/
|
*/
|
||||||
|
|
||||||
object AlbumLoader {
|
object AlbumLoader {
|
||||||
fun getAllAlbumsFlowable(
|
|
||||||
|
fun allAlbums(context: Context): ArrayList<Album> {
|
||||||
|
return getAlbumsForCursor(makeAlbumCursor(context, null, null))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getAlbumsForCursor(cursor: Cursor?): ArrayList<Album> {
|
||||||
|
val arrayList = ArrayList<Album>()
|
||||||
|
if (cursor != null && cursor.moveToFirst()) {
|
||||||
|
do {
|
||||||
|
arrayList.add(albumCursorImpl(cursor))
|
||||||
|
} while (cursor.moveToNext())
|
||||||
|
}
|
||||||
|
cursor?.close()
|
||||||
|
return arrayList
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun makeAlbumCursor(
|
||||||
|
context: Context,
|
||||||
|
selection: String?,
|
||||||
|
paramArrayOfString: Array<String>?
|
||||||
|
): Cursor? {
|
||||||
|
val albumSortOrder = PreferenceUtil.getInstance(context).albumSortOrder
|
||||||
|
return context.contentResolver.query(
|
||||||
|
MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
|
||||||
|
arrayOf("_id",
|
||||||
|
MediaStore.Audio.Albums.ALBUM,
|
||||||
|
MediaStore.Audio.Albums.ARTIST,
|
||||||
|
MediaStore.Audio.AudioColumns.ARTIST_ID,
|
||||||
|
MediaStore.Audio.Albums.NUMBER_OF_SONGS,
|
||||||
|
MediaStore.Audio.Albums.FIRST_YEAR),
|
||||||
|
selection,
|
||||||
|
paramArrayOfString,
|
||||||
|
albumSortOrder
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getAlbum(context: Context, id: Long): Album {
|
||||||
|
return getAlbum(makeAlbumCursor(context, "_id=?", arrayOf(id.toString())))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getAlbum(cursor: Cursor?): Album {
|
||||||
|
val album = Album()
|
||||||
|
if (cursor != null && cursor.moveToFirst()) {
|
||||||
|
albumCursorImpl(cursor)
|
||||||
|
}
|
||||||
|
cursor?.close()
|
||||||
|
return album
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun albumCursorImpl(cursor: Cursor): Album {
|
||||||
|
return Album(cursor.getLong(0),
|
||||||
|
cursor.getString(1),
|
||||||
|
cursor.getString(2),
|
||||||
|
cursor.getLong(3),
|
||||||
|
cursor.getInt(4),
|
||||||
|
cursor.getInt(5))
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getAlbums(context: Context, paramString: String, limit: Int): MutableList<Album> {
|
||||||
|
val result = getAlbumsForCursor(makeAlbumCursor(context, "album LIKE ?", arrayOf("$paramString%")))
|
||||||
|
if (result.size < limit) {
|
||||||
|
result.addAll(getAlbumsForCursor(makeAlbumCursor(context, "album LIKE ?", arrayOf("%_$paramString%"))))
|
||||||
|
}
|
||||||
|
return if (result.size < limit) result else result.subList(0, limit)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getAlbumSong(context: Context, albumId: Long): ArrayList<Song> {
|
||||||
|
val arrayList = ArrayList<Song>()
|
||||||
|
val cursor = makeAlbumSongsCursor(context, albumId)
|
||||||
|
if (cursor != null && cursor.moveToFirst()) {
|
||||||
|
do {
|
||||||
|
arrayList.add(SongLoader.getSong(cursor))
|
||||||
|
} while (cursor.moveToNext())
|
||||||
|
}
|
||||||
|
cursor?.close()
|
||||||
|
return arrayList
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun makeAlbumSongsCursor(context: Context, albumId: Long): Cursor? {
|
||||||
|
val sortOrder = PreferenceUtil.getInstance(context).albumSongSortOrder
|
||||||
|
val selection = "is_music=1 AND title != '' AND album_id=$albumId"
|
||||||
|
return context.contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
|
||||||
|
Constants.baseProjection, selection, null, sortOrder)
|
||||||
|
}
|
||||||
|
|
||||||
|
/*fun getAllAlbumsFlowable(
|
||||||
context: Context
|
context: Context
|
||||||
): Observable<ArrayList<Album>> {
|
): Observable<ArrayList<Album>> {
|
||||||
val songs = SongLoader.getSongsFlowable(
|
val songs = SongLoader.getSongsFlowable(
|
||||||
|
@ -81,10 +165,10 @@ object AlbumLoader {
|
||||||
getSongLoaderSortOrder(context)
|
getSongLoaderSortOrder(context)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
songs.subscribe { songs1 ->
|
*//*songs.subscribe { songs1 ->
|
||||||
e.onNext(Album(songs1))
|
e.onNext(Album(songs1))
|
||||||
e.onComplete()
|
e.onComplete()
|
||||||
}
|
}*//*
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,7 +182,7 @@ object AlbumLoader {
|
||||||
AudioColumns.ALBUM_ID + "=?",
|
AudioColumns.ALBUM_ID + "=?",
|
||||||
arrayOf(albumId.toString()),
|
arrayOf(albumId.toString()),
|
||||||
getSongLoaderSortOrder(context)))
|
getSongLoaderSortOrder(context)))
|
||||||
val album = Album(songs)
|
val album = Album( )
|
||||||
sortSongsByTrackNumber(album)
|
sortSongsByTrackNumber(album)
|
||||||
return album
|
return album
|
||||||
}
|
}
|
||||||
|
@ -111,7 +195,7 @@ object AlbumLoader {
|
||||||
songs?.subscribe { songs1 ->
|
songs?.subscribe { songs1 ->
|
||||||
for (song in songs1) {
|
for (song in songs1) {
|
||||||
getOrCreateAlbumFlowable(albums, song.albumId).subscribe { album ->
|
getOrCreateAlbumFlowable(albums, song.albumId).subscribe { album ->
|
||||||
album.songs!!.add(song)
|
//album.songs!!.add(song)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -192,5 +276,5 @@ object AlbumLoader {
|
||||||
private fun getSongLoaderSortOrder(context: Context): String {
|
private fun getSongLoaderSortOrder(context: Context): String {
|
||||||
return PreferenceUtil.getInstance(context).albumSortOrder + ", " +
|
return PreferenceUtil.getInstance(context).albumSortOrder + ", " +
|
||||||
PreferenceUtil.getInstance(context).albumDetailSongSortOrder
|
PreferenceUtil.getInstance(context).albumDetailSongSortOrder
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,11 +15,13 @@
|
||||||
package code.name.monkey.retromusic.loaders
|
package code.name.monkey.retromusic.loaders
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.provider.MediaStore.Audio.AudioColumns
|
import android.database.Cursor
|
||||||
|
import android.provider.MediaStore
|
||||||
|
import code.name.monkey.retromusic.Constants
|
||||||
import code.name.monkey.retromusic.model.Album
|
import code.name.monkey.retromusic.model.Album
|
||||||
import code.name.monkey.retromusic.model.Artist
|
import code.name.monkey.retromusic.model.Artist
|
||||||
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import io.reactivex.Observable
|
|
||||||
|
|
||||||
|
|
||||||
object ArtistLoader {
|
object ArtistLoader {
|
||||||
|
@ -30,30 +32,140 @@ object ArtistLoader {
|
||||||
PreferenceUtil.getInstance(context).artistDetailSongSortOrder
|
PreferenceUtil.getInstance(context).artistDetailSongSortOrder
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getAllArtistsFlowable(
|
|
||||||
context: Context
|
|
||||||
): Observable<ArrayList<Artist>> {
|
|
||||||
return Observable.create { e ->
|
|
||||||
SongLoader.getSongsFlowable(SongLoader.makeSongCursor(
|
|
||||||
context, null, null,
|
|
||||||
getSongLoaderSortOrder(context))
|
|
||||||
).subscribe { songs ->
|
|
||||||
e.onNext(splitIntoArtists(AlbumLoader.splitIntoAlbums(songs)))
|
|
||||||
e.onComplete()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getAllArtists(context: Context): ArrayList<Artist> {
|
fun getAllArtists(context: Context): ArrayList<Artist> {
|
||||||
val songs = SongLoader.getSongs(SongLoader.makeSongCursor(
|
return getArtistsForCursor(makeArtistCursor(context, null, null));
|
||||||
context,
|
|
||||||
null, null,
|
|
||||||
getSongLoaderSortOrder(context))
|
|
||||||
)
|
|
||||||
return splitIntoArtists(AlbumLoader.splitIntoAlbums(songs))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getArtistsFlowable(context: Context, query: String): Observable<ArrayList<Artist>> {
|
private fun getArtistsForCursor(cursor: Cursor?): java.util.ArrayList<Artist> {
|
||||||
|
val arrayList = ArrayList<Artist>()
|
||||||
|
if (cursor != null && cursor.moveToFirst()) {
|
||||||
|
do {
|
||||||
|
arrayList.add(Artist(cursor.getLong(0),
|
||||||
|
cursor.getString(1),
|
||||||
|
cursor.getLong(2),
|
||||||
|
cursor.getLong(3)))
|
||||||
|
} while (cursor.moveToNext())
|
||||||
|
}
|
||||||
|
cursor?.close()
|
||||||
|
return arrayList
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun getArtist(cursor: Cursor?): Artist {
|
||||||
|
var artist = Artist()
|
||||||
|
if (cursor != null) {
|
||||||
|
if (cursor.moveToFirst())
|
||||||
|
artist = Artist(cursor.getLong(0),
|
||||||
|
cursor.getString(1),
|
||||||
|
cursor.getLong(2),
|
||||||
|
cursor.getLong(3))
|
||||||
|
}
|
||||||
|
cursor?.close()
|
||||||
|
return artist
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getArtist(context: Context, id: Long): Artist {
|
||||||
|
return getArtist(makeArtistCursor(context, "_id=?", arrayOf(id.toString())))
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getArtists(context: Context, paramString: String, limit: Int): List<Artist> {
|
||||||
|
val result = getArtistsForCursor(makeArtistCursor(context, "artist LIKE ?", arrayOf("$paramString%")))
|
||||||
|
if (result.size < limit) {
|
||||||
|
result.addAll(getArtistsForCursor(makeArtistCursor(context, "artist LIKE ?", arrayOf("%_$paramString%"))))
|
||||||
|
}
|
||||||
|
return if (result.size < limit) result else result.subList(0, limit)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun artistSongs(context: Context, artistId: Long): ArrayList<Song> {
|
||||||
|
val arrayList = arrayListOf<Song>()
|
||||||
|
val cursor = makeArtistSongsCursor(context, artistId)
|
||||||
|
if (cursor != null && cursor.moveToFirst()) {
|
||||||
|
do {
|
||||||
|
arrayList.add(getSongFromCursorImpl(cursor))
|
||||||
|
} while (cursor.moveToNext())
|
||||||
|
}
|
||||||
|
cursor?.close()
|
||||||
|
return arrayList
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getSongFromCursorImpl(
|
||||||
|
cursor: Cursor
|
||||||
|
): Song {
|
||||||
|
val id = cursor.getInt(0)
|
||||||
|
val title = cursor.getString(1)
|
||||||
|
val trackNumber = cursor.getInt(2)
|
||||||
|
val year = cursor.getInt(3)
|
||||||
|
val duration = cursor.getLong(4)
|
||||||
|
val data = cursor.getString(5)
|
||||||
|
val dateModified = cursor.getLong(6)
|
||||||
|
val albumId = cursor.getInt(7)
|
||||||
|
val albumName = cursor.getString(8)
|
||||||
|
val artistId = cursor.getInt(9)
|
||||||
|
val artistName = cursor.getString(10)
|
||||||
|
val composer = cursor.getString(11)
|
||||||
|
|
||||||
|
return Song(id, title, trackNumber, year, duration, data, dateModified, albumId,
|
||||||
|
albumName ?: "", artistId, artistName, composer ?: "")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun artistAlbums(context: Context, artistId: Long): ArrayList<Album> {
|
||||||
|
val arrayList = ArrayList<Album>()
|
||||||
|
val cursor = makeArtistAlbumsCursor(context, artistId)
|
||||||
|
if (cursor != null && cursor.moveToFirst()) {
|
||||||
|
do {
|
||||||
|
arrayList.add(Album(
|
||||||
|
cursor.getLong(0),
|
||||||
|
cursor.getString(1),
|
||||||
|
cursor.getString(2),
|
||||||
|
artistId,
|
||||||
|
cursor.getInt(3),
|
||||||
|
cursor.getInt(4)))
|
||||||
|
} while (cursor.moveToNext())
|
||||||
|
}
|
||||||
|
cursor?.close()
|
||||||
|
return arrayList
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun makeArtistAlbumsCursor(context: Context, artistId: Long): Cursor? {
|
||||||
|
val sortOrder = PreferenceUtil.getInstance(context).artistAlbumSortOrder
|
||||||
|
return context.contentResolver.query(MediaStore.Audio.Artists.Albums.getContentUri("external", artistId),
|
||||||
|
arrayOf("_id",
|
||||||
|
MediaStore.Audio.Artists.Albums.ALBUM,
|
||||||
|
MediaStore.Audio.Artists.Albums.ARTIST,
|
||||||
|
MediaStore.Audio.Artists.Albums.NUMBER_OF_SONGS,
|
||||||
|
MediaStore.Audio.Artists.Albums.FIRST_YEAR),
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
sortOrder)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun makeArtistSongsCursor(context: Context, artistId: Long): Cursor? {
|
||||||
|
val sortOrder = PreferenceUtil.getInstance(context).artistSongSortOrder
|
||||||
|
val selection = "is_music=1 AND title != '' AND artist_id=$artistId"
|
||||||
|
return context.contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
|
||||||
|
Constants.baseProjection,
|
||||||
|
selection,
|
||||||
|
null,
|
||||||
|
sortOrder)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun makeArtistCursor(context: Context,
|
||||||
|
selection: String?,
|
||||||
|
selectionValues: Array<String>?
|
||||||
|
): Cursor? {
|
||||||
|
val sortOrder = PreferenceUtil.getInstance(context).artistSortOrder
|
||||||
|
return context.contentResolver.query(
|
||||||
|
MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
|
||||||
|
arrayOf("_id", "artist", "number_of_albums", "number_of_tracks"),
|
||||||
|
selection,
|
||||||
|
selectionValues,
|
||||||
|
sortOrder
|
||||||
|
)
|
||||||
|
}
|
||||||
|
/*fun getArtistsFlowable(context: Context, query: String): Observable<ArrayList<Artist>> {
|
||||||
return Observable.create { e ->
|
return Observable.create { e ->
|
||||||
SongLoader.getSongsFlowable(SongLoader.makeSongCursor(
|
SongLoader.getSongsFlowable(SongLoader.makeSongCursor(
|
||||||
context,
|
context,
|
||||||
|
@ -134,5 +246,19 @@ object ArtistLoader {
|
||||||
getSongLoaderSortOrder(context))
|
getSongLoaderSortOrder(context))
|
||||||
)
|
)
|
||||||
return Artist(AlbumLoader.splitIntoAlbums(songs))
|
return Artist(AlbumLoader.splitIntoAlbums(songs))
|
||||||
}
|
}*/
|
||||||
|
/*fun getAllArtistsFlowable(
|
||||||
|
context: Context
|
||||||
|
): Observable<ArrayList<Artist>> {
|
||||||
|
return Observable.create { e ->
|
||||||
|
SongLoader.getSongsFlowable(SongLoader.makeSongCursor(
|
||||||
|
context, null, null,
|
||||||
|
getSongLoaderSortOrder(context))
|
||||||
|
).subscribe { songs ->
|
||||||
|
e.onNext(splitIntoArtists(AlbumLoader.splitIntoAlbums(songs)))
|
||||||
|
e.onComplete()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,9 +21,6 @@ import code.name.monkey.retromusic.model.Album
|
||||||
import code.name.monkey.retromusic.model.Artist
|
import code.name.monkey.retromusic.model.Artist
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import io.reactivex.Observable
|
|
||||||
import java.util.*
|
|
||||||
import kotlin.collections.ArrayList
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by hemanths on 16/08/17.
|
* Created by hemanths on 16/08/17.
|
||||||
|
@ -31,11 +28,6 @@ import kotlin.collections.ArrayList
|
||||||
|
|
||||||
object LastAddedSongsLoader {
|
object LastAddedSongsLoader {
|
||||||
|
|
||||||
|
|
||||||
fun getLastAddedSongsFlowable(context: Context): Observable<ArrayList<Song>> {
|
|
||||||
return SongLoader.getSongsFlowable(makeLastAddedCursor(context))
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getLastAddedSongs(context: Context): ArrayList<Song> {
|
fun getLastAddedSongs(context: Context): ArrayList<Song> {
|
||||||
return SongLoader.getSongs(makeLastAddedCursor(context))
|
return SongLoader.getSongs(makeLastAddedCursor(context))
|
||||||
}
|
}
|
||||||
|
@ -51,21 +43,11 @@ object LastAddedSongsLoader {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun getLastAddedAlbumsFlowable(context: Context): Observable<ArrayList<Album>> {
|
|
||||||
return AlbumLoader.splitIntoAlbumsFlowable(getLastAddedSongsFlowable(context))
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
fun getLastAddedAlbums(context: Context): ArrayList<Album> {
|
fun getLastAddedAlbums(context: Context): ArrayList<Album> {
|
||||||
return AlbumLoader.splitIntoAlbums(getLastAddedSongs(context))
|
return arrayListOf<Album>()//AlbumLoader.splitIntoAlbums(getLastAddedSongs(context))
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
fun getLastAddedArtistsFlowable(context: Context): Observable<ArrayList<Artist>> {
|
|
||||||
return ArtistLoader.splitIntoArtists(getLastAddedAlbumsFlowable(context))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getLastAddedArtists(context: Context): ArrayList<Artist> {
|
fun getLastAddedArtists(context: Context): ArrayList<Artist> {
|
||||||
return ArtistLoader.splitIntoArtists(getLastAddedAlbums(context))
|
return ArrayList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,8 @@ package code.name.monkey.retromusic.loaders
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
|
import code.name.monkey.retromusic.model.Album
|
||||||
|
import code.name.monkey.retromusic.model.Artist
|
||||||
|
|
||||||
|
|
||||||
object SearchLoader {
|
object SearchLoader {
|
||||||
|
@ -28,13 +30,13 @@ object SearchLoader {
|
||||||
results.addAll(songs)
|
results.addAll(songs)
|
||||||
}
|
}
|
||||||
|
|
||||||
val artists = ArtistLoader.getArtists(context, it)
|
val artists = ArrayList<Artist>()
|
||||||
if (artists.isNotEmpty()) {
|
if (artists.isNotEmpty()) {
|
||||||
results.add(context.resources.getString(R.string.artists))
|
results.add(context.resources.getString(R.string.artists))
|
||||||
results.addAll(artists)
|
results.addAll(artists)
|
||||||
}
|
}
|
||||||
|
|
||||||
val albums = AlbumLoader.getAlbums(context, it)
|
val albums = arrayListOf<Album>()
|
||||||
if (albums.isNotEmpty()) {
|
if (albums.isNotEmpty()) {
|
||||||
results.add(context.resources.getString(R.string.albums))
|
results.add(context.resources.getString(R.string.albums))
|
||||||
results.addAll(albums)
|
results.addAll(albums)
|
||||||
|
|
|
@ -113,11 +113,10 @@ object SongLoader {
|
||||||
fun getSong(
|
fun getSong(
|
||||||
cursor: Cursor?
|
cursor: Cursor?
|
||||||
): Song {
|
): Song {
|
||||||
val song: Song
|
val song: Song = if (cursor != null && cursor.moveToFirst()) {
|
||||||
if (cursor != null && cursor.moveToFirst()) {
|
getSongFromCursorImpl(cursor)
|
||||||
song = getSongFromCursorImpl(cursor)
|
|
||||||
} else {
|
} else {
|
||||||
song = Song.emptySong
|
Song.emptySong
|
||||||
}
|
}
|
||||||
cursor?.close()
|
cursor?.close()
|
||||||
return song
|
return song
|
||||||
|
@ -140,7 +139,7 @@ object SongLoader {
|
||||||
fun suggestSongs(
|
fun suggestSongs(
|
||||||
context: Context
|
context: Context
|
||||||
): Observable<ArrayList<Song>> {
|
): Observable<ArrayList<Song>> {
|
||||||
return SongLoader.getAllSongsFlowable(context)
|
return getAllSongsFlowable(context)
|
||||||
.flatMap {
|
.flatMap {
|
||||||
val list = ArrayList<Song>()
|
val list = ArrayList<Song>()
|
||||||
ShuffleHelper.makeShuffleList(it, -1)
|
ShuffleHelper.makeShuffleList(it, -1)
|
||||||
|
|
|
@ -24,7 +24,6 @@ import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.providers.HistoryStore
|
import code.name.monkey.retromusic.providers.HistoryStore
|
||||||
import code.name.monkey.retromusic.providers.SongPlayCountStore
|
import code.name.monkey.retromusic.providers.SongPlayCountStore
|
||||||
import io.reactivex.Observable
|
import io.reactivex.Observable
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by hemanths on 16/08/17.
|
* Created by hemanths on 16/08/17.
|
||||||
|
@ -144,7 +143,7 @@ object TopAndRecentlyPlayedTracksLoader {
|
||||||
return Observable.create { e ->
|
return Observable.create { e ->
|
||||||
getTopTracksFlowable(context).subscribe { songs ->
|
getTopTracksFlowable(context).subscribe { songs ->
|
||||||
if (songs.size > 0) {
|
if (songs.size > 0) {
|
||||||
e.onNext(AlbumLoader.splitIntoAlbums(songs))
|
e.onNext( arrayListOf<Album>())
|
||||||
}
|
}
|
||||||
e.onComplete()
|
e.onComplete()
|
||||||
}
|
}
|
||||||
|
@ -154,15 +153,15 @@ object TopAndRecentlyPlayedTracksLoader {
|
||||||
fun getTopAlbums(
|
fun getTopAlbums(
|
||||||
context: Context
|
context: Context
|
||||||
): ArrayList<Album> {
|
): ArrayList<Album> {
|
||||||
arrayListOf<Album>()
|
|
||||||
return AlbumLoader.splitIntoAlbums(getTopTracks(context))
|
return arrayListOf<Album>()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getTopArtistsFlowable(context: Context): Observable<ArrayList<Artist>> {
|
fun getTopArtistsFlowable(context: Context): Observable<ArrayList<Artist>> {
|
||||||
return Observable.create { e ->
|
return Observable.create { e ->
|
||||||
getTopAlbumsFlowable(context).subscribe { albums ->
|
getTopAlbumsFlowable(context).subscribe { albums ->
|
||||||
if (albums.size > 0) {
|
if (albums.size > 0) {
|
||||||
e.onNext(ArtistLoader.splitIntoArtists(albums))
|
e.onNext(ArrayList())
|
||||||
}
|
}
|
||||||
e.onComplete()
|
e.onComplete()
|
||||||
}
|
}
|
||||||
|
@ -170,6 +169,6 @@ object TopAndRecentlyPlayedTracksLoader {
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getTopArtists(context: Context): ArrayList<Artist> {
|
fun getTopArtists(context: Context): ArrayList<Artist> {
|
||||||
return ArtistLoader.splitIntoArtists(getTopAlbums(context))
|
return ArrayList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,50 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.misc
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.text.TextUtils
|
|
||||||
import code.name.monkey.retromusic.R
|
|
||||||
import code.name.monkey.retromusic.loaders.AlbumLoader
|
|
||||||
import code.name.monkey.retromusic.loaders.ArtistLoader
|
|
||||||
import code.name.monkey.retromusic.loaders.SongLoader
|
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
internal class AsyncSearchResultLoader(context: Context, private val query: String) : WrappedAsyncTaskLoader<List<Any>>(context) {
|
|
||||||
|
|
||||||
override fun loadInBackground(): List<Any>? {
|
|
||||||
val results = ArrayList<Any>()
|
|
||||||
if (!TextUtils.isEmpty(query)) {
|
|
||||||
val songs = SongLoader.getSongs(context, query.trim { it <= ' ' })
|
|
||||||
if (!songs.isEmpty()) {
|
|
||||||
results.add(context.resources.getString(R.string.songs))
|
|
||||||
results.addAll(songs)
|
|
||||||
}
|
|
||||||
|
|
||||||
val artists = ArtistLoader.getArtists(context, query.trim { it <= ' ' })
|
|
||||||
if (!artists.isEmpty()) {
|
|
||||||
results.add(context.resources.getString(R.string.artists))
|
|
||||||
results.addAll(artists)
|
|
||||||
}
|
|
||||||
|
|
||||||
val albums = AlbumLoader.getAlbums(context, query.trim { it <= ' ' })
|
|
||||||
if (!albums.isEmpty()) {
|
|
||||||
results.add(context.resources.getString(R.string.albums))
|
|
||||||
results.addAll(albums)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return results
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -23,8 +23,6 @@ import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import io.reactivex.Observable;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
*/
|
*/
|
||||||
|
@ -41,9 +39,6 @@ public abstract class AbsCustomPlaylist extends Playlist {
|
||||||
super(in);
|
super(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
|
||||||
public abstract Observable<ArrayList<Song>> getSongsFlowable(@NotNull Context context);
|
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public abstract ArrayList<Song> getSongs(@NotNull Context context);
|
public abstract ArrayList<Song> getSongs(@NotNull Context context);
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,10 +14,8 @@
|
||||||
|
|
||||||
package code.name.monkey.retromusic.model
|
package code.name.monkey.retromusic.model
|
||||||
|
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
|
/*class Album {
|
||||||
class Album {
|
|
||||||
val songs: ArrayList<Song>?
|
val songs: ArrayList<Song>?
|
||||||
|
|
||||||
val id: Int
|
val id: Int
|
||||||
|
@ -52,4 +50,12 @@ class Album {
|
||||||
fun safeGetFirstSong(): Song {
|
fun safeGetFirstSong(): Song {
|
||||||
return if (songs!!.isEmpty()) Song.emptySong else songs[0]
|
return if (songs!!.isEmpty()) Song.emptySong else songs[0]
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
|
class Album(
|
||||||
|
val id: Long = -1,
|
||||||
|
val title: String = "",
|
||||||
|
val artistName: String = "",
|
||||||
|
val artistId: Long = -1,
|
||||||
|
val songCount: Int = -1,
|
||||||
|
val year: Int = -1)
|
||||||
|
|
|
@ -14,10 +14,8 @@
|
||||||
|
|
||||||
package code.name.monkey.retromusic.model
|
package code.name.monkey.retromusic.model
|
||||||
|
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
class Artist {
|
class Artist {
|
||||||
val albums: ArrayList<Album>?
|
val albums: ArrayList<Album>?
|
||||||
|
|
||||||
|
@ -69,3 +67,11 @@ class Artist {
|
||||||
const val UNKNOWN_ARTIST_DISPLAY_NAME = "Unknown Artist"
|
const val UNKNOWN_ARTIST_DISPLAY_NAME = "Unknown Artist"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
class Artist(
|
||||||
|
val id: Long = -1,
|
||||||
|
val name: String = "",
|
||||||
|
val albumCount: Long = -1,
|
||||||
|
val songCount: Long = -1)
|
|
@ -49,11 +49,6 @@ public class LastAddedPlaylist extends AbsSmartPlaylist {
|
||||||
super(in);
|
super(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public Observable<ArrayList<Song>> getSongsFlowable(@NotNull @NonNull Context context) {
|
|
||||||
return LastAddedSongsLoader.INSTANCE.getLastAddedSongsFlowable(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -14,19 +14,23 @@
|
||||||
|
|
||||||
package code.name.monkey.retromusic.mvp.presenter
|
package code.name.monkey.retromusic.mvp.presenter
|
||||||
|
|
||||||
|
import code.name.monkey.retromusic.Result
|
||||||
import code.name.monkey.retromusic.model.Album
|
import code.name.monkey.retromusic.model.Album
|
||||||
import code.name.monkey.retromusic.model.Artist
|
import code.name.monkey.retromusic.model.Artist
|
||||||
|
import code.name.monkey.retromusic.mvp.BaseView
|
||||||
import code.name.monkey.retromusic.mvp.Presenter
|
import code.name.monkey.retromusic.mvp.Presenter
|
||||||
import code.name.monkey.retromusic.mvp.PresenterImpl
|
import code.name.monkey.retromusic.mvp.PresenterImpl
|
||||||
import code.name.monkey.retromusic.providers.interfaces.Repository
|
import code.name.monkey.retromusic.providers.interfaces.Repository
|
||||||
import io.reactivex.disposables.CompositeDisposable
|
import io.reactivex.disposables.CompositeDisposable
|
||||||
|
import kotlinx.coroutines.*
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
import kotlin.coroutines.CoroutineContext
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by hemanths on 20/08/17.
|
* Created by hemanths on 20/08/17.
|
||||||
*/
|
*/
|
||||||
interface AlbumDetailsView {
|
interface AlbumDetailsView : BaseView {
|
||||||
fun album(album: Album)
|
fun album(album: Album)
|
||||||
|
|
||||||
fun complete()
|
fun complete()
|
||||||
|
@ -37,47 +41,64 @@ interface AlbumDetailsView {
|
||||||
}
|
}
|
||||||
|
|
||||||
interface AlbumDetailsPresenter : Presenter<AlbumDetailsView> {
|
interface AlbumDetailsPresenter : Presenter<AlbumDetailsView> {
|
||||||
fun loadAlbum(albumId: Int)
|
fun loadAlbum(albumId: Long)
|
||||||
|
|
||||||
fun loadMore(artistId: Int)
|
fun loadMore(artistId: Long)
|
||||||
|
|
||||||
class AlbumDetailsPresenterImpl @Inject constructor(
|
class AlbumDetailsPresenterImpl @Inject constructor(
|
||||||
private val repository: Repository
|
private val repository: Repository
|
||||||
) : PresenterImpl<AlbumDetailsView>(), AlbumDetailsPresenter {
|
) : PresenterImpl<AlbumDetailsView>(), AlbumDetailsPresenter, CoroutineScope {
|
||||||
|
|
||||||
|
private val job = Job()
|
||||||
private lateinit var album: Album
|
private lateinit var album: Album
|
||||||
private var disposable: CompositeDisposable = CompositeDisposable()
|
private var disposable: CompositeDisposable = CompositeDisposable()
|
||||||
override fun loadMore(artistId: Int) {
|
|
||||||
disposable += repository.getArtistByIdFlowable(artistId)
|
override val coroutineContext: CoroutineContext
|
||||||
.map {
|
get() = Dispatchers.IO + job
|
||||||
view?.loadArtistImage(it)
|
|
||||||
return@map it.albums
|
override fun loadMore(artistId: Long) {
|
||||||
}
|
/* disposable += repository.getArtistByIdFlowable(artistId)
|
||||||
.map {
|
.map {
|
||||||
it.filter { filterAlbum -> album.id != filterAlbum.id }
|
view?.loadArtistImage(it)
|
||||||
}
|
return@map it.albums
|
||||||
.subscribe({
|
}
|
||||||
if (it.isEmpty()) {
|
.map {
|
||||||
return@subscribe
|
it.filter { filterAlbum -> album.id != filterAlbum.id }
|
||||||
}
|
}
|
||||||
view?.moreAlbums(ArrayList(it))
|
.subscribe({
|
||||||
}, { t -> println(t) })
|
if (it.isEmpty()) {
|
||||||
|
return@subscribe
|
||||||
|
}
|
||||||
|
view?.moreAlbums(ArrayList(it))
|
||||||
|
}, { t -> println(t) })*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun loadAlbum(albumId: Int) {
|
override fun loadAlbum(albumId: Long) {
|
||||||
disposable += repository.getAlbumFlowable(albumId)
|
|
||||||
|
launch {
|
||||||
|
when (val result = repository.getAlbum(albumId)) {
|
||||||
|
is Result.Success -> withContext(Dispatchers.Main) {
|
||||||
|
view?.album(result.data)
|
||||||
|
}
|
||||||
|
is Result.Error -> withContext(Dispatchers.Main) {
|
||||||
|
view?.showEmptyView()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*disposable += repository.getAlbum(albumId)
|
||||||
.doOnComplete {
|
.doOnComplete {
|
||||||
view?.complete()
|
view?.complete()
|
||||||
}
|
}
|
||||||
.subscribe({
|
.subscribe({
|
||||||
album = it
|
album = it
|
||||||
view?.album(it)
|
view?.album(it)
|
||||||
}, { t -> println(t) })
|
}, { t -> println(t) })*/
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun detachView() {
|
override fun detachView() {
|
||||||
super.detachView()
|
super.detachView()
|
||||||
|
job.cancel()
|
||||||
disposable.dispose()
|
disposable.dispose()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,15 +14,20 @@
|
||||||
|
|
||||||
package code.name.monkey.retromusic.mvp.presenter
|
package code.name.monkey.retromusic.mvp.presenter
|
||||||
|
|
||||||
|
import code.name.monkey.retromusic.Result
|
||||||
|
import code.name.monkey.retromusic.model.Album
|
||||||
import code.name.monkey.retromusic.model.Artist
|
import code.name.monkey.retromusic.model.Artist
|
||||||
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.mvp.BaseView
|
import code.name.monkey.retromusic.mvp.BaseView
|
||||||
import code.name.monkey.retromusic.mvp.Presenter
|
import code.name.monkey.retromusic.mvp.Presenter
|
||||||
import code.name.monkey.retromusic.mvp.PresenterImpl
|
import code.name.monkey.retromusic.mvp.PresenterImpl
|
||||||
import code.name.monkey.retromusic.providers.interfaces.Repository
|
import code.name.monkey.retromusic.providers.interfaces.Repository
|
||||||
import code.name.monkey.retromusic.rest.model.LastFmArtist
|
import code.name.monkey.retromusic.rest.model.LastFmArtist
|
||||||
import io.reactivex.disposables.CompositeDisposable
|
import io.reactivex.disposables.CompositeDisposable
|
||||||
|
import kotlinx.coroutines.*
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
import kotlin.coroutines.CoroutineContext
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -30,13 +35,23 @@ import javax.inject.Inject
|
||||||
*/
|
*/
|
||||||
interface ArtistDetailsView : BaseView {
|
interface ArtistDetailsView : BaseView {
|
||||||
fun artist(artist: Artist)
|
fun artist(artist: Artist)
|
||||||
|
|
||||||
|
fun artistSong(songs: ArrayList<Song>)
|
||||||
|
|
||||||
|
fun artistAlbums(albums: ArrayList<Album>)
|
||||||
|
|
||||||
fun artistInfo(lastFmArtist: LastFmArtist?)
|
fun artistInfo(lastFmArtist: LastFmArtist?)
|
||||||
|
|
||||||
fun complete()
|
fun complete()
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ArtistDetailsPresenter : Presenter<ArtistDetailsView> {
|
interface ArtistDetailsPresenter : Presenter<ArtistDetailsView> {
|
||||||
|
|
||||||
fun loadArtist(artistId: Int)
|
fun loadArtist(artistId: Long)
|
||||||
|
|
||||||
|
fun loadArtistSongs(artistId: Long)
|
||||||
|
|
||||||
|
fun loadArtistAlbums(artistId: Long)
|
||||||
|
|
||||||
fun loadBiography(name: String,
|
fun loadBiography(name: String,
|
||||||
lang: String? = Locale.getDefault().language,
|
lang: String? = Locale.getDefault().language,
|
||||||
|
@ -44,7 +59,38 @@ interface ArtistDetailsPresenter : Presenter<ArtistDetailsView> {
|
||||||
|
|
||||||
class ArtistDetailsPresenterImpl @Inject constructor(
|
class ArtistDetailsPresenterImpl @Inject constructor(
|
||||||
private val repository: Repository
|
private val repository: Repository
|
||||||
) : PresenterImpl<ArtistDetailsView>(), ArtistDetailsPresenter {
|
) : PresenterImpl<ArtistDetailsView>(), ArtistDetailsPresenter, CoroutineScope {
|
||||||
|
|
||||||
|
override fun loadArtistAlbums(artistId: Long) {
|
||||||
|
launch {
|
||||||
|
when (val result = repository.getArtistAlbums(artistId)) {
|
||||||
|
is Result.Success -> withContext(Dispatchers.Main) {
|
||||||
|
view?.artistAlbums(result.data)
|
||||||
|
}
|
||||||
|
is Result.Error -> withContext(Dispatchers.Main) {
|
||||||
|
view?.showEmptyView()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun loadArtistSongs(artistId: Long) {
|
||||||
|
launch {
|
||||||
|
when (val result = repository.getArtistSongs(artistId)) {
|
||||||
|
is Result.Success -> withContext(Dispatchers.Main) {
|
||||||
|
view?.artistSong(result.data)
|
||||||
|
}
|
||||||
|
is Result.Error -> withContext(Dispatchers.Main) {
|
||||||
|
view?.showEmptyView()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override val coroutineContext: CoroutineContext
|
||||||
|
get() = Dispatchers.IO + job
|
||||||
|
|
||||||
|
private val job = Job()
|
||||||
|
|
||||||
override fun loadBiography(name: String,
|
override fun loadBiography(name: String,
|
||||||
lang: String?,
|
lang: String?,
|
||||||
|
@ -57,18 +103,23 @@ interface ArtistDetailsPresenter : Presenter<ArtistDetailsView> {
|
||||||
|
|
||||||
private var disposable = CompositeDisposable()
|
private var disposable = CompositeDisposable()
|
||||||
|
|
||||||
override fun loadArtist(artistId: Int) {
|
override fun loadArtist(artistId: Long) {
|
||||||
disposable += repository.getArtistByIdFlowable(artistId)
|
launch {
|
||||||
.doOnComplete {
|
when (val result = repository.getArtistById(artistId)) {
|
||||||
|
is Result.Success -> withContext(Dispatchers.Main) {
|
||||||
|
view?.artist(result.data)
|
||||||
view?.complete()
|
view?.complete()
|
||||||
}
|
}
|
||||||
.subscribe({
|
is Result.Error -> withContext(Dispatchers.Main) {
|
||||||
view?.artist(it)
|
view?.showEmptyView()
|
||||||
}, { t -> println(t) })
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun detachView() {
|
override fun detachView() {
|
||||||
super.detachView()
|
super.detachView()
|
||||||
|
job.cancel()
|
||||||
disposable.dispose()
|
disposable.dispose()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ class RepositoryImpl(private val context: Context) : Repository {
|
||||||
|
|
||||||
override suspend fun allAlbums(): Result<ArrayList<Album>> {
|
override suspend fun allAlbums(): Result<ArrayList<Album>> {
|
||||||
return try {
|
return try {
|
||||||
val albums = AlbumLoader.getAllAlbums(context)
|
val albums = AlbumLoader.allAlbums(context)
|
||||||
if (albums.isNotEmpty()) {
|
if (albums.isNotEmpty()) {
|
||||||
Success(albums)
|
Success(albums)
|
||||||
} else {
|
} else {
|
||||||
|
@ -230,6 +230,42 @@ class RepositoryImpl(private val context: Context) : Repository {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun getArtistById(artistId: Long): Result<Artist> {
|
||||||
|
return try {
|
||||||
|
val artist = ArtistLoader.getArtist(context, artistId)
|
||||||
|
Success(artist)
|
||||||
|
} catch (er: Exception) {
|
||||||
|
Error(er)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun getArtistSongs(artistId: Long): Result<ArrayList<Song>> {
|
||||||
|
return try {
|
||||||
|
val songs = ArtistLoader.artistSongs(context, artistId)
|
||||||
|
Success(songs)
|
||||||
|
} catch (er: Exception) {
|
||||||
|
Error(er)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun getArtistAlbums(artistId: Long): Result<ArrayList<Album>> {
|
||||||
|
return try {
|
||||||
|
val albums = ArtistLoader.artistAlbums(context, artistId)
|
||||||
|
Success(albums)
|
||||||
|
} catch (er: Exception) {
|
||||||
|
Error(er)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun getAlbum(albumId: Long): Result<Album> {
|
||||||
|
return try {
|
||||||
|
val album = AlbumLoader.getAlbum(context, albumId)
|
||||||
|
Success(album)
|
||||||
|
} catch (er: Exception) {
|
||||||
|
Error(er)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun artistInfoFloable(
|
override fun artistInfoFloable(
|
||||||
name: String,
|
name: String,
|
||||||
lang: String?,
|
lang: String?,
|
||||||
|
@ -247,17 +283,11 @@ class RepositoryImpl(private val context: Context) : Repository {
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getAlbumFlowable(albumId: Int): Observable<Album> {
|
/* override fun getAlbumFlowable(albumId: Int): Observable<Album> {
|
||||||
return AlbumLoader.getAlbumFlowable(context, albumId)
|
return AlbumLoader.getAlbumFlowable(context, albumId)
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
}
|
}*/
|
||||||
|
|
||||||
override fun getArtistByIdFlowable(artistId: Int): Observable<Artist> {
|
|
||||||
return ArtistLoader.getArtistFlowable(context, artistId)
|
|
||||||
.subscribeOn(Schedulers.io())
|
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getPlaylistSongsFlowable(playlist: Playlist): Observable<ArrayList<Song>> {
|
override fun getPlaylistSongsFlowable(playlist: Playlist): Observable<ArrayList<Song>> {
|
||||||
return PlaylistSongsLoader.getPlaylistSongListFlowable(context, playlist)
|
return PlaylistSongsLoader.getPlaylistSongListFlowable(context, playlist)
|
||||||
|
@ -288,15 +318,12 @@ class RepositoryImpl(private val context: Context) : Repository {
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
|
||||||
override val allAlbumsFlowable: Observable<ArrayList<Album>>
|
/*override val allAlbumsFlowable: Observable<ArrayList<Album>>
|
||||||
get() = AlbumLoader.getAllAlbumsFlowable(context)
|
get() = AlbumLoader.getAllAlbumsFlowable(context)
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())*/
|
||||||
|
|
||||||
|
|
||||||
override val recentAlbumsFlowable: Observable<ArrayList<Album>>
|
|
||||||
get() = LastAddedSongsLoader.getLastAddedAlbumsFlowable(context)
|
|
||||||
.subscribeOn(Schedulers.io())
|
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
|
||||||
|
|
||||||
override val topAlbumsFlowable: Observable<ArrayList<Album>>
|
override val topAlbumsFlowable: Observable<ArrayList<Album>>
|
||||||
get() = TopAndRecentlyPlayedTracksLoader.getTopAlbumsFlowable(context)
|
get() = TopAndRecentlyPlayedTracksLoader.getTopAlbumsFlowable(context)
|
||||||
|
@ -304,14 +331,8 @@ class RepositoryImpl(private val context: Context) : Repository {
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
|
||||||
override val allArtistsFlowable: Observable<ArrayList<Artist>>
|
override val allArtistsFlowable: Observable<ArrayList<Artist>>
|
||||||
get() = ArtistLoader.getAllArtistsFlowable(context)
|
get() = Observable.just(ArrayList())
|
||||||
.subscribeOn(Schedulers.io())
|
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
|
||||||
|
|
||||||
override val recentArtistsFlowable: Observable<ArrayList<Artist>>
|
|
||||||
get() = LastAddedSongsLoader.getLastAddedArtistsFlowable(context)
|
|
||||||
.subscribeOn(Schedulers.io())
|
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
|
||||||
|
|
||||||
override val topArtistsFlowable: Observable<ArrayList<Artist>>
|
override val topArtistsFlowable: Observable<ArrayList<Artist>>
|
||||||
get() = TopAndRecentlyPlayedTracksLoader.getTopArtistsFlowable(context)
|
get() = TopAndRecentlyPlayedTracksLoader.getTopArtistsFlowable(context)
|
||||||
|
@ -332,14 +353,4 @@ class RepositoryImpl(private val context: Context) : Repository {
|
||||||
override fun getSong(id: Int): Song {
|
override fun getSong(id: Int): Song {
|
||||||
return SongLoader.getSong(context, id)
|
return SongLoader.getSong(context, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getAlbum(albumId: Int): Album {
|
|
||||||
return AlbumLoader.getAlbum(context, albumId)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getArtistById(artistId: Long): Artist {
|
|
||||||
return ArtistLoader.getArtist(context, artistId.toInt())
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,19 +51,26 @@ interface Repository {
|
||||||
|
|
||||||
suspend fun favoritePlaylist(): Result<Home>
|
suspend fun favoritePlaylist(): Result<Home>
|
||||||
|
|
||||||
|
suspend fun getArtistById(artistId: Long): Result<Artist>
|
||||||
|
|
||||||
|
suspend fun getArtistSongs(artistId: Long): Result<ArrayList<Song>>
|
||||||
|
|
||||||
|
suspend fun getArtistAlbums(artistId: Long): Result<ArrayList<Album>>
|
||||||
|
|
||||||
|
suspend fun getAlbum(albumId: Long): Result<Album>
|
||||||
|
|
||||||
val allSongsFlowable: Observable<ArrayList<Song>>
|
val allSongsFlowable: Observable<ArrayList<Song>>
|
||||||
|
|
||||||
val suggestionSongsFlowable: Observable<ArrayList<Song>>
|
val suggestionSongsFlowable: Observable<ArrayList<Song>>
|
||||||
|
|
||||||
val allAlbumsFlowable: Observable<ArrayList<Album>>
|
//val allAlbumsFlowable: Observable<ArrayList<Album>>
|
||||||
|
|
||||||
|
|
||||||
val recentAlbumsFlowable: Observable<ArrayList<Album>>
|
|
||||||
|
|
||||||
val topAlbumsFlowable: Observable<ArrayList<Album>>
|
val topAlbumsFlowable: Observable<ArrayList<Album>>
|
||||||
|
|
||||||
val allArtistsFlowable: Observable<ArrayList<Artist>>
|
val allArtistsFlowable: Observable<ArrayList<Artist>>
|
||||||
|
|
||||||
val recentArtistsFlowable: Observable<ArrayList<Artist>>
|
|
||||||
|
|
||||||
val topArtistsFlowable: Observable<ArrayList<Artist>>
|
val topArtistsFlowable: Observable<ArrayList<Artist>>
|
||||||
|
|
||||||
|
@ -75,13 +82,10 @@ interface Repository {
|
||||||
|
|
||||||
fun getSong(id: Int): Song
|
fun getSong(id: Int): Song
|
||||||
|
|
||||||
fun getAlbumFlowable(albumId: Int): Observable<Album>
|
//fun getAlbumFlowable(albumId: Int): Observable<Album>
|
||||||
|
|
||||||
fun getAlbum(albumId: Int): Album
|
|
||||||
|
|
||||||
fun getArtistByIdFlowable(artistId: Int): Observable<Artist>
|
|
||||||
|
|
||||||
fun getArtistById(artistId: Long): Artist
|
|
||||||
|
|
||||||
fun getPlaylistSongsFlowable(playlist: Playlist): Observable<ArrayList<Song>>
|
fun getPlaylistSongsFlowable(playlist: Playlist): Observable<ArrayList<Song>>
|
||||||
|
|
||||||
|
|
|
@ -33,12 +33,10 @@ import java.util.List;
|
||||||
|
|
||||||
import code.name.monkey.retromusic.R;
|
import code.name.monkey.retromusic.R;
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote;
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote;
|
||||||
import code.name.monkey.retromusic.loaders.AlbumLoader;
|
|
||||||
import code.name.monkey.retromusic.loaders.ArtistLoader;
|
import code.name.monkey.retromusic.loaders.ArtistLoader;
|
||||||
import code.name.monkey.retromusic.loaders.PlaylistLoader;
|
import code.name.monkey.retromusic.loaders.PlaylistLoader;
|
||||||
import code.name.monkey.retromusic.loaders.PlaylistSongsLoader;
|
import code.name.monkey.retromusic.loaders.PlaylistSongsLoader;
|
||||||
import code.name.monkey.retromusic.loaders.SongLoader;
|
import code.name.monkey.retromusic.loaders.SongLoader;
|
||||||
import code.name.monkey.retromusic.model.Album;
|
|
||||||
import code.name.monkey.retromusic.model.Artist;
|
import code.name.monkey.retromusic.model.Artist;
|
||||||
import code.name.monkey.retromusic.model.Playlist;
|
import code.name.monkey.retromusic.model.Playlist;
|
||||||
import code.name.monkey.retromusic.model.Song;
|
import code.name.monkey.retromusic.model.Song;
|
||||||
|
@ -196,7 +194,7 @@ public class WearBrowserService extends MediaBrowserService {
|
||||||
switch (Integer.parseInt(Character.toString(parentId.charAt(0)))) {
|
switch (Integer.parseInt(Character.toString(parentId.charAt(0)))) {
|
||||||
case TYPE_ARTIST:
|
case TYPE_ARTIST:
|
||||||
List<Artist> artistList = ArtistLoader.INSTANCE.getAllArtists(mContext) ;
|
List<Artist> artistList = ArtistLoader.INSTANCE.getAllArtists(mContext) ;
|
||||||
for (Artist artist : artistList) {
|
/*for (Artist artist : artistList) {
|
||||||
String albumNmber = String.format("%d %s", artist.getAlbums().size(), artist.getAlbums().size() > 1 ? "Albums" : "Album");
|
String albumNmber = String.format("%d %s", artist.getAlbums().size(), artist.getAlbums().size() > 1 ? "Albums" : "Album");
|
||||||
String songCount = String.format("%d %s", artist.getSongs().size(), artist.getSongs().size() > 1 ? "Songs" : "Song");
|
String songCount = String.format("%d %s", artist.getSongs().size(), artist.getSongs().size() > 1 ? "Songs" : "Song");
|
||||||
fillMediaItems(mediaItems,
|
fillMediaItems(mediaItems,
|
||||||
|
@ -205,7 +203,7 @@ public class WearBrowserService extends MediaBrowserService {
|
||||||
albumNmber + " • " + songCount,
|
albumNmber + " • " + songCount,
|
||||||
Uri.parse("android.resource://code.name.monkey.retromusic/drawable/default_artist_art"),
|
Uri.parse("android.resource://code.name.monkey.retromusic/drawable/default_artist_art"),
|
||||||
MediaBrowser.MediaItem.FLAG_BROWSABLE);
|
MediaBrowser.MediaItem.FLAG_BROWSABLE);
|
||||||
}
|
}*/
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TYPE_ARTIST_SONG_ALBUMS:
|
case TYPE_ARTIST_SONG_ALBUMS:
|
||||||
|
@ -216,7 +214,7 @@ public class WearBrowserService extends MediaBrowserService {
|
||||||
Uri.parse("android.resource://code.name.monkey.retromusic/drawable/default_artist_art"),
|
Uri.parse("android.resource://code.name.monkey.retromusic/drawable/default_artist_art"),
|
||||||
MediaBrowser.MediaItem.FLAG_BROWSABLE);
|
MediaBrowser.MediaItem.FLAG_BROWSABLE);
|
||||||
|
|
||||||
List<Album> artistAlbums = ArtistLoader.INSTANCE.getArtist(mContext, Integer.parseInt(parentId.substring(1))).getAlbums(); //ArtistAlbumLoader.getAlbumsForArtist(mContext, Long.parseLong(parentId.substring(1)));
|
/*List<Album> artistAlbums = ArtistLoader.INSTANCE.getArtist(mContext, Integer.parseInt(parentId.substring(1))).getAlbums(); //ArtistAlbumLoader.getAlbumsForArtist(mContext, Long.parseLong(parentId.substring(1)));
|
||||||
for (Album album : artistAlbums) {
|
for (Album album : artistAlbums) {
|
||||||
String songCount = String.format("%d %s", album.getSongs().size(), album.getSongs().size() > 1 ? "Songs" : "Song");
|
String songCount = String.format("%d %s", album.getSongs().size(), album.getSongs().size() > 1 ? "Songs" : "Song");
|
||||||
fillMediaItems(mediaItems,
|
fillMediaItems(mediaItems,
|
||||||
|
@ -225,10 +223,10 @@ public class WearBrowserService extends MediaBrowserService {
|
||||||
songCount,
|
songCount,
|
||||||
Uri.parse("android.resource://code.name.monkey.retromusic/drawable/default_artist_art"),
|
Uri.parse("android.resource://code.name.monkey.retromusic/drawable/default_artist_art"),
|
||||||
MediaBrowser.MediaItem.FLAG_BROWSABLE);
|
MediaBrowser.MediaItem.FLAG_BROWSABLE);
|
||||||
}
|
}*/
|
||||||
break;
|
break;
|
||||||
case TYPE_ALBUM:
|
case TYPE_ALBUM:
|
||||||
List<Album> albumList = AlbumLoader.INSTANCE.getAllAlbums(mContext);
|
/*List<Album> albumList = AlbumLoader.INSTANCE.getAllAlbums(mContext);
|
||||||
for (Album album : albumList) {
|
for (Album album : albumList) {
|
||||||
fillMediaItems(mediaItems,
|
fillMediaItems(mediaItems,
|
||||||
Integer.toString(TYPE_ALBUM_SONGS) + Long.toString(album.getId()),
|
Integer.toString(TYPE_ALBUM_SONGS) + Long.toString(album.getId()),
|
||||||
|
@ -236,7 +234,7 @@ public class WearBrowserService extends MediaBrowserService {
|
||||||
album.getArtistName(),
|
album.getArtistName(),
|
||||||
RetroUtil.getAlbumArtUri(album.getId()),
|
RetroUtil.getAlbumArtUri(album.getId()),
|
||||||
MediaBrowser.MediaItem.FLAG_BROWSABLE);
|
MediaBrowser.MediaItem.FLAG_BROWSABLE);
|
||||||
}
|
}*/
|
||||||
break;
|
break;
|
||||||
case TYPE_SONG:
|
case TYPE_SONG:
|
||||||
List<Song> songList = SongLoader.INSTANCE.getAllSongs(mContext);
|
List<Song> songList = SongLoader.INSTANCE.getAllSongs(mContext);
|
||||||
|
@ -251,7 +249,7 @@ public class WearBrowserService extends MediaBrowserService {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TYPE_ALBUM_SONGS:
|
case TYPE_ALBUM_SONGS:
|
||||||
List<Song> albumSongList = AlbumLoader.INSTANCE.getAlbum(mContext, Integer.parseInt(parentId.substring(1))).getSongs();
|
/*List<Song> albumSongList = AlbumLoader.INSTANCE.getAlbum(mContext, Integer.parseInt(parentId.substring(1))).getSongs();
|
||||||
for (Song song : albumSongList) {
|
for (Song song : albumSongList) {
|
||||||
fillMediaItems(mediaItems,
|
fillMediaItems(mediaItems,
|
||||||
String.valueOf(song.getId()),
|
String.valueOf(song.getId()),
|
||||||
|
@ -259,10 +257,10 @@ public class WearBrowserService extends MediaBrowserService {
|
||||||
song.getAlbumName(),
|
song.getAlbumName(),
|
||||||
Uri.parse("android.resource://code.name.monkey.retromusic/drawable/default_album_art"),
|
Uri.parse("android.resource://code.name.monkey.retromusic/drawable/default_album_art"),
|
||||||
MediaBrowser.MediaItem.FLAG_PLAYABLE);
|
MediaBrowser.MediaItem.FLAG_PLAYABLE);
|
||||||
}
|
}*/
|
||||||
break;
|
break;
|
||||||
case TYPE_ARTIST_ALL_SONGS:
|
case TYPE_ARTIST_ALL_SONGS:
|
||||||
List<Song> artistSongs = ArtistLoader.INSTANCE.getArtist(mContext, Integer.parseInt(parentId.substring(1))).getSongs();
|
/*List<Song> artistSongs = ArtistLoader.INSTANCE.getArtist(mContext, Integer.parseInt(parentId.substring(1))).getSongs();
|
||||||
for (Song song : artistSongs) {
|
for (Song song : artistSongs) {
|
||||||
fillMediaItems(mediaItems,
|
fillMediaItems(mediaItems,
|
||||||
String.valueOf(song.getId()),
|
String.valueOf(song.getId()),
|
||||||
|
@ -270,7 +268,7 @@ public class WearBrowserService extends MediaBrowserService {
|
||||||
song.getAlbumName(),
|
song.getAlbumName(),
|
||||||
Uri.parse("android.resource://code.name.monkey.retromusic/drawable/default_album_art"),
|
Uri.parse("android.resource://code.name.monkey.retromusic/drawable/default_album_art"),
|
||||||
MediaBrowser.MediaItem.FLAG_PLAYABLE);
|
MediaBrowser.MediaItem.FLAG_PLAYABLE);
|
||||||
}
|
}*/
|
||||||
break;
|
break;
|
||||||
case TYPE_PLAYLIST:
|
case TYPE_PLAYLIST:
|
||||||
List<Playlist> playlistList = PlaylistLoader.INSTANCE.getAllPlaylists(mContext);
|
List<Playlist> playlistList = PlaylistLoader.INSTANCE.getAllPlaylists(mContext);
|
||||||
|
|
|
@ -114,8 +114,8 @@ public class MusicUtil {
|
||||||
@NonNull
|
@NonNull
|
||||||
public static String getArtistInfoString(@NonNull final Context context,
|
public static String getArtistInfoString(@NonNull final Context context,
|
||||||
@NonNull final Artist artist) {
|
@NonNull final Artist artist) {
|
||||||
int albumCount = artist.getAlbumCount();
|
long albumCount = artist.getAlbumCount();
|
||||||
int songCount = artist.getSongCount();
|
long songCount = artist.getSongCount();
|
||||||
String albumString = albumCount == 1 ? context.getResources().getString(R.string.album)
|
String albumString = albumCount == 1 ? context.getResources().getString(R.string.album)
|
||||||
: context.getResources().getString(R.string.albums);
|
: context.getResources().getString(R.string.albums);
|
||||||
String songString = songCount == 1 ? context.getResources().getString(R.string.song)
|
String songString = songCount == 1 ? context.getResources().getString(R.string.song)
|
||||||
|
@ -126,7 +126,7 @@ public class MusicUtil {
|
||||||
@NonNull
|
@NonNull
|
||||||
public static String getArtistInfoStringSmall(@NonNull final Context context,
|
public static String getArtistInfoStringSmall(@NonNull final Context context,
|
||||||
@NonNull final Artist artist) {
|
@NonNull final Artist artist) {
|
||||||
int songCount = artist.getSongCount();
|
long songCount = artist.getSongCount();
|
||||||
String songString = songCount == 1 ? context.getResources().getString(R.string.song)
|
String songString = songCount == 1 ? context.getResources().getString(R.string.song)
|
||||||
: context.getResources().getString(R.string.songs);
|
: context.getResources().getString(R.string.songs);
|
||||||
return songCount + " " + songString;
|
return songCount + " " + songString;
|
||||||
|
@ -435,9 +435,9 @@ public class MusicUtil {
|
||||||
if (TextUtils.isEmpty(artistName)) {
|
if (TextUtils.isEmpty(artistName)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (artistName.equals(Artist.UNKNOWN_ARTIST_DISPLAY_NAME)) {
|
/* if (artistName.equals(Artist.UNKNOWN_ARTIST_DISPLAY_NAME)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}*/
|
||||||
artistName = artistName.trim().toLowerCase();
|
artistName = artistName.trim().toLowerCase();
|
||||||
return artistName.equals("unknown") || artistName.equals("<unknown>");
|
return artistName.equals("unknown") || artistName.equals("<unknown>");
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,7 +70,7 @@ public class NavigationUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void goToArtistOptions(@NotNull AppCompatActivity activity,
|
public static void goToArtistOptions(@NotNull AppCompatActivity activity,
|
||||||
int artistId,
|
long artistId,
|
||||||
@NonNull ActivityOptions options) {
|
@NonNull ActivityOptions options) {
|
||||||
|
|
||||||
Intent intent = new Intent(activity, ArtistDetailActivity.class);
|
Intent intent = new Intent(activity, ArtistDetailActivity.class);
|
||||||
|
|
|
@ -245,7 +245,7 @@ public final class PreferenceUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
public final String getArtistAlbumSortOrder() {
|
public final String getArtistAlbumSortOrder() {
|
||||||
return mPreferences.getString(ARTIST_ALBUM_SORT_ORDER, SortOrder.ArtistAlbumSortOrder.ALBUM_YEAR);
|
return mPreferences.getString(ARTIST_ALBUM_SORT_ORDER, SortOrder.ArtistAlbumSortOrder.ALBUM_A_Z);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final String getAlbumSortOrder() {
|
public final String getAlbumSortOrder() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue