2020-10-06 08:46:04 +00:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2020 Hemanth Savarla.
|
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
*/
|
2019-04-20 05:29:45 +00:00
|
|
|
package code.name.monkey.retromusic.adapter
|
2018-11-30 01:06:16 +00:00
|
|
|
|
2019-12-06 17:13:09 +00:00
|
|
|
import android.view.LayoutInflater
|
|
|
|
import android.view.View
|
|
|
|
import android.view.ViewGroup
|
2020-08-11 18:29:44 +00:00
|
|
|
import androidx.core.os.bundleOf
|
2020-10-17 20:02:58 +00:00
|
|
|
import androidx.core.view.isGone
|
2020-09-26 20:39:07 +00:00
|
|
|
import androidx.core.view.isInvisible
|
|
|
|
import androidx.core.view.isVisible
|
2020-08-11 18:29:44 +00:00
|
|
|
import androidx.fragment.app.FragmentActivity
|
|
|
|
import androidx.navigation.findNavController
|
2018-11-30 01:06:16 +00:00
|
|
|
import androidx.recyclerview.widget.RecyclerView
|
|
|
|
import code.name.monkey.appthemehelper.ThemeStore
|
2020-08-11 18:29:44 +00:00
|
|
|
import code.name.monkey.retromusic.*
|
2019-09-09 13:04:53 +00:00
|
|
|
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
|
2020-10-17 07:58:13 +00:00
|
|
|
import code.name.monkey.retromusic.db.PlaylistEntity
|
2020-09-26 20:39:07 +00:00
|
|
|
import code.name.monkey.retromusic.db.PlaylistWithSongs
|
2021-09-08 18:30:20 +00:00
|
|
|
import code.name.monkey.retromusic.glide.GlideApp
|
|
|
|
import code.name.monkey.retromusic.glide.RetroGlideExtension
|
2018-11-30 01:06:16 +00:00
|
|
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
|
|
|
import code.name.monkey.retromusic.helper.menu.SongMenuHelper
|
2020-02-25 13:15:23 +00:00
|
|
|
import code.name.monkey.retromusic.model.*
|
2020-01-28 18:35:50 +00:00
|
|
|
import code.name.monkey.retromusic.model.smartplaylist.AbsSmartPlaylist
|
2020-08-13 17:08:37 +00:00
|
|
|
import code.name.monkey.retromusic.repository.PlaylistSongsLoader
|
2019-12-06 17:13:09 +00:00
|
|
|
import code.name.monkey.retromusic.util.MusicUtil
|
2020-09-26 20:39:07 +00:00
|
|
|
import java.util.*
|
2018-11-30 01:06:16 +00:00
|
|
|
|
2019-09-09 13:04:53 +00:00
|
|
|
class SearchAdapter(
|
2020-08-11 18:29:44 +00:00
|
|
|
private val activity: FragmentActivity,
|
|
|
|
private var dataSet: List<Any>
|
2019-09-09 13:04:53 +00:00
|
|
|
) : RecyclerView.Adapter<SearchAdapter.ViewHolder>() {
|
2018-11-30 01:06:16 +00:00
|
|
|
|
2020-09-23 20:55:12 +00:00
|
|
|
fun swapDataSet(dataSet: List<Any>) {
|
2019-12-06 17:13:09 +00:00
|
|
|
this.dataSet = dataSet
|
|
|
|
notifyDataSetChanged()
|
|
|
|
}
|
2018-11-30 01:06:16 +00:00
|
|
|
|
2019-12-06 17:13:09 +00:00
|
|
|
override fun getItemViewType(position: Int): Int {
|
2020-08-11 18:29:44 +00:00
|
|
|
if (dataSet[position] is Album) return ALBUM
|
2021-09-08 18:30:20 +00:00
|
|
|
if (dataSet[position] is Artist) return if ((dataSet[position] as Artist).isAlbumArtist) ALBUM_ARTIST else ARTIST
|
2020-08-11 18:29:44 +00:00
|
|
|
if (dataSet[position] is Genre) return GENRE
|
2020-10-17 07:58:13 +00:00
|
|
|
if (dataSet[position] is PlaylistEntity) return PLAYLIST
|
2020-08-11 18:29:44 +00:00
|
|
|
return if (dataSet[position] is Song) SONG else HEADER
|
2019-12-06 17:13:09 +00:00
|
|
|
}
|
2018-11-30 01:06:16 +00:00
|
|
|
|
2019-12-06 17:13:09 +00:00
|
|
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
2020-01-17 17:19:06 +00:00
|
|
|
return if (viewType == HEADER) ViewHolder(
|
|
|
|
LayoutInflater.from(activity).inflate(
|
|
|
|
R.layout.sub_header,
|
|
|
|
parent,
|
|
|
|
false
|
|
|
|
), viewType
|
|
|
|
)
|
2021-09-08 18:30:20 +00:00
|
|
|
else if (viewType == ALBUM || viewType == ARTIST || viewType== ALBUM_ARTIST)
|
|
|
|
ViewHolder(
|
|
|
|
LayoutInflater.from(activity).inflate(
|
|
|
|
R.layout.item_list_big,
|
|
|
|
parent,
|
|
|
|
false
|
|
|
|
), viewType
|
|
|
|
)
|
2019-12-06 17:13:09 +00:00
|
|
|
else
|
2020-02-25 13:15:23 +00:00
|
|
|
ViewHolder(
|
|
|
|
LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false),
|
|
|
|
viewType
|
|
|
|
)
|
2019-12-06 17:13:09 +00:00
|
|
|
}
|
2018-11-30 01:06:16 +00:00
|
|
|
|
2019-12-06 17:13:09 +00:00
|
|
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
|
|
|
when (getItemViewType(position)) {
|
|
|
|
ALBUM -> {
|
2020-10-06 08:46:04 +00:00
|
|
|
holder.imageTextContainer?.isVisible = true
|
2020-09-26 20:39:07 +00:00
|
|
|
val album = dataSet[position] as Album
|
2019-12-06 17:13:09 +00:00
|
|
|
holder.title?.text = album.title
|
|
|
|
holder.text?.text = album.artistName
|
2021-09-08 18:30:20 +00:00
|
|
|
GlideApp.with(activity).asDrawable().albumCoverOptions(album.safeGetFirstSong()).load(RetroGlideExtension.getSongModel(album.safeGetFirstSong()))
|
|
|
|
.into(holder.image!!)
|
2019-12-06 17:13:09 +00:00
|
|
|
}
|
|
|
|
ARTIST -> {
|
2020-10-06 08:46:04 +00:00
|
|
|
holder.imageTextContainer?.isVisible = true
|
2020-09-26 20:39:07 +00:00
|
|
|
val artist = dataSet[position] as Artist
|
2019-12-06 17:13:09 +00:00
|
|
|
holder.title?.text = artist.name
|
|
|
|
holder.text?.text = MusicUtil.getArtistInfoString(activity, artist)
|
2021-09-08 18:30:20 +00:00
|
|
|
GlideApp.with(activity).asDrawable().artistImageOptions(artist).load(
|
|
|
|
RetroGlideExtension.getArtistModel(artist)).into(holder.image!!)
|
2019-12-06 17:13:09 +00:00
|
|
|
}
|
|
|
|
SONG -> {
|
2021-09-08 18:30:20 +00:00
|
|
|
holder.imageTextContainer?.isVisible = true
|
2020-09-26 20:39:07 +00:00
|
|
|
val song = dataSet[position] as Song
|
2019-12-06 17:13:09 +00:00
|
|
|
holder.title?.text = song.title
|
|
|
|
holder.text?.text = song.albumName
|
2021-09-08 18:30:20 +00:00
|
|
|
GlideApp.with(activity).asDrawable().songCoverOptions(song).load(RetroGlideExtension.getSongModel(song)).into(holder.image!!)
|
2019-12-06 17:13:09 +00:00
|
|
|
}
|
|
|
|
GENRE -> {
|
2020-09-26 20:39:07 +00:00
|
|
|
val genre = dataSet[position] as Genre
|
2019-12-06 17:13:09 +00:00
|
|
|
holder.title?.text = genre.name
|
2020-09-26 20:39:07 +00:00
|
|
|
holder.text?.text = String.format(
|
|
|
|
Locale.getDefault(),
|
|
|
|
"%d %s",
|
|
|
|
genre.songCount,
|
|
|
|
if (genre.songCount > 1) activity.getString(R.string.songs) else activity.getString(
|
|
|
|
R.string.song
|
|
|
|
)
|
|
|
|
)
|
2019-12-06 17:13:09 +00:00
|
|
|
}
|
2020-01-28 18:35:50 +00:00
|
|
|
PLAYLIST -> {
|
2020-10-17 07:58:13 +00:00
|
|
|
val playlist = dataSet[position] as PlaylistEntity
|
|
|
|
holder.title?.text = playlist.playlistName
|
|
|
|
//holder.text?.text = MusicUtil.playlistInfoString(activity, playlist.songs)
|
2020-01-28 18:35:50 +00:00
|
|
|
}
|
2021-09-08 18:30:20 +00:00
|
|
|
ALBUM_ARTIST -> {
|
|
|
|
holder.imageTextContainer?.isVisible = true
|
|
|
|
val artist = dataSet[position] as Artist
|
|
|
|
holder.title?.text = artist.name
|
|
|
|
holder.text?.text = MusicUtil.getArtistInfoString(activity, artist)
|
2021-09-26 12:14:42 +00:00
|
|
|
GlideApp.with(activity).asDrawable().artistImageOptions(artist).load(
|
|
|
|
RetroGlideExtension.getArtistModel(artist)).into(holder.image!!)
|
2021-09-08 18:30:20 +00:00
|
|
|
}
|
2019-12-06 17:13:09 +00:00
|
|
|
else -> {
|
2020-09-26 20:39:07 +00:00
|
|
|
holder.title?.text = dataSet[position].toString()
|
2019-12-06 17:13:09 +00:00
|
|
|
holder.title?.setTextColor(ThemeStore.accentColor(activity))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-11-30 01:06:16 +00:00
|
|
|
|
2019-12-06 17:13:09 +00:00
|
|
|
override fun getItemCount(): Int {
|
2020-08-11 18:29:44 +00:00
|
|
|
return dataSet.size
|
2019-12-06 17:13:09 +00:00
|
|
|
}
|
2018-11-30 01:06:16 +00:00
|
|
|
|
2019-12-06 17:13:09 +00:00
|
|
|
inner class ViewHolder(itemView: View, itemViewType: Int) : MediaEntryViewHolder(itemView) {
|
|
|
|
init {
|
|
|
|
itemView.setOnLongClickListener(null)
|
2020-09-26 20:39:07 +00:00
|
|
|
imageTextContainer?.isInvisible = true
|
2019-12-06 17:13:09 +00:00
|
|
|
if (itemViewType == SONG) {
|
2020-10-17 20:02:58 +00:00
|
|
|
imageTextContainer?.isGone = true
|
2019-12-06 17:13:09 +00:00
|
|
|
menu?.visibility = View.VISIBLE
|
|
|
|
menu?.setOnClickListener(object : SongMenuHelper.OnClickSongMenu(activity) {
|
|
|
|
override val song: Song
|
2020-08-11 18:29:44 +00:00
|
|
|
get() = dataSet[layoutPosition] as Song
|
2019-12-06 17:13:09 +00:00
|
|
|
})
|
|
|
|
} else {
|
|
|
|
menu?.visibility = View.GONE
|
|
|
|
}
|
2018-11-30 01:06:16 +00:00
|
|
|
|
2019-12-06 17:13:09 +00:00
|
|
|
when (itemViewType) {
|
|
|
|
ALBUM -> setImageTransitionName(activity.getString(R.string.transition_album_art))
|
|
|
|
ARTIST -> setImageTransitionName(activity.getString(R.string.transition_artist_image))
|
|
|
|
else -> {
|
|
|
|
val container = itemView.findViewById<View>(R.id.imageContainer)
|
|
|
|
container?.visibility = View.GONE
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-11-30 01:06:16 +00:00
|
|
|
|
2019-12-06 17:13:09 +00:00
|
|
|
override fun onClick(v: View?) {
|
2020-08-11 18:29:44 +00:00
|
|
|
val item = dataSet[layoutPosition]
|
2019-12-06 17:13:09 +00:00
|
|
|
when (itemViewType) {
|
|
|
|
ALBUM -> {
|
2020-08-11 18:29:44 +00:00
|
|
|
activity.findNavController(R.id.fragment_container).navigate(
|
|
|
|
R.id.albumDetailsFragment,
|
|
|
|
bundleOf(EXTRA_ALBUM_ID to (item as Album).id)
|
2020-01-17 17:19:06 +00:00
|
|
|
)
|
2019-12-06 17:13:09 +00:00
|
|
|
}
|
|
|
|
ARTIST -> {
|
2020-08-11 18:29:44 +00:00
|
|
|
activity.findNavController(R.id.fragment_container).navigate(
|
|
|
|
R.id.artistDetailsFragment,
|
|
|
|
bundleOf(EXTRA_ARTIST_ID to (item as Artist).id)
|
2020-01-17 17:19:06 +00:00
|
|
|
)
|
2019-12-06 17:13:09 +00:00
|
|
|
}
|
2021-09-08 18:30:20 +00:00
|
|
|
ALBUM_ARTIST ->{
|
|
|
|
activity.findNavController(R.id.fragment_container).navigate(
|
|
|
|
R.id.albumArtistDetailsFragment,
|
|
|
|
bundleOf(EXTRA_ARTIST_NAME to (item as Artist).name)
|
|
|
|
)
|
|
|
|
}
|
2019-12-06 17:13:09 +00:00
|
|
|
GENRE -> {
|
2020-08-11 18:29:44 +00:00
|
|
|
activity.findNavController(R.id.fragment_container).navigate(
|
|
|
|
R.id.genreDetailsFragment,
|
|
|
|
bundleOf(EXTRA_GENRE to (item as Genre))
|
|
|
|
)
|
2019-12-06 17:13:09 +00:00
|
|
|
}
|
2020-01-28 18:35:50 +00:00
|
|
|
PLAYLIST -> {
|
2020-08-11 18:29:44 +00:00
|
|
|
activity.findNavController(R.id.fragment_container).navigate(
|
2020-09-26 21:33:56 +00:00
|
|
|
R.id.playlistDetailsFragment,
|
|
|
|
bundleOf(EXTRA_PLAYLIST to (item as PlaylistWithSongs))
|
2020-08-11 18:29:44 +00:00
|
|
|
)
|
2020-01-28 18:35:50 +00:00
|
|
|
}
|
2019-12-06 17:13:09 +00:00
|
|
|
SONG -> {
|
2020-09-26 20:39:07 +00:00
|
|
|
val playList = mutableListOf<Song>()
|
2019-12-06 17:13:09 +00:00
|
|
|
playList.add(item as Song)
|
|
|
|
MusicPlayerRemote.openQueue(playList, 0, true)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-11-30 01:06:16 +00:00
|
|
|
|
2019-12-06 17:13:09 +00:00
|
|
|
companion object {
|
|
|
|
private const val HEADER = 0
|
|
|
|
private const val ALBUM = 1
|
|
|
|
private const val ARTIST = 2
|
|
|
|
private const val SONG = 3
|
|
|
|
private const val GENRE = 4
|
2020-01-28 18:35:50 +00:00
|
|
|
private const val PLAYLIST = 5
|
2021-09-08 18:30:20 +00:00
|
|
|
private const val ALBUM_ARTIST = 6
|
2019-12-06 17:13:09 +00:00
|
|
|
}
|
2018-11-30 01:06:16 +00:00
|
|
|
}
|