PlayerAndroid/app/src/main/java/code/name/monkey/retromusic/adapter/SearchAdapter.kt

204 lines
7.9 KiB
Kotlin
Raw Normal View History

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
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.*
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
import code.name.monkey.retromusic.db.PlaylistWithSongs
2020-02-25 13:15:23 +00:00
import code.name.monkey.retromusic.glide.AlbumGlideRequest
2019-12-06 17:13:09 +00:00
import code.name.monkey.retromusic.glide.ArtistGlideRequest
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
import code.name.monkey.retromusic.repository.PlaylistSongsLoader
2019-12-06 17:13:09 +00:00
import code.name.monkey.retromusic.util.MusicUtil
import com.bumptech.glide.Glide
import java.util.*
2018-11-30 01:06:16 +00:00
class SearchAdapter(
2020-08-11 18:29:44 +00:00
private val activity: FragmentActivity,
private var dataSet: List<Any>
) : RecyclerView.Adapter<SearchAdapter.ViewHolder>() {
2018-11-30 01:06:16 +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
if (dataSet[position] is Artist) return ARTIST
if (dataSet[position] is Genre) return GENRE
if (dataSet[position] is PlaylistWithSongs) 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
)
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
val album = dataSet[position] as Album
2019-12-06 17:13:09 +00:00
holder.title?.text = album.title
holder.text?.text = album.artistName
2020-02-25 13:15:23 +00:00
AlbumGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong())
2020-09-05 15:52:10 +00:00
.checkIgnoreMediaStore().build().into(holder.image)
2019-12-06 17:13:09 +00:00
}
ARTIST -> {
2020-10-06 08:46:04 +00:00
holder.imageTextContainer?.isVisible = true
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)
ArtistGlideRequest.Builder.from(Glide.with(activity), artist).build()
2020-01-17 17:19:06 +00:00
.into(holder.image)
2019-12-06 17:13:09 +00:00
}
SONG -> {
val song = dataSet[position] as Song
2019-12-06 17:13:09 +00:00
holder.title?.text = song.title
holder.text?.text = song.albumName
}
GENRE -> {
val genre = dataSet[position] as Genre
2019-12-06 17:13:09 +00:00
holder.title?.text = genre.name
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 -> {
val playlist = dataSet[position] as PlaylistWithSongs
holder.title?.text = playlist.playlistEntity.playlistName
holder.text?.text = MusicUtil.playlistInfoString(activity, playlist.songs)
2020-01-28 18:35:50 +00:00
}
2019-12-06 17:13:09 +00:00
else -> {
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
private fun getSongs(playlist: Playlist): List<Song> {
val songs = mutableListOf<Song>()
2020-01-28 18:35:50 +00:00
if (playlist is AbsSmartPlaylist) {
songs.addAll(playlist.getSongs())
2020-01-28 18:35:50 +00:00
} else {
songs.addAll(PlaylistSongsLoader.getPlaylistSongList(activity, playlist.id))
}
return songs
}
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)
imageTextContainer?.isInvisible = true
2019-12-06 17:13:09 +00:00
if (itemViewType == SONG) {
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
}
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 -> {
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
2019-12-06 17:13:09 +00:00
}
2018-11-30 01:06:16 +00:00
}