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

174 lines
6.6 KiB
Kotlin
Raw Normal View History

2019-04-20 05:29:45 +00:00
package code.name.monkey.retromusic.adapter
import android.util.DisplayMetrics
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.IntDef
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.R
2019-04-20 05:29:45 +00:00
import code.name.monkey.retromusic.adapter.album.AlbumFullWidthAdapter
import code.name.monkey.retromusic.adapter.artist.ArtistAdapter
import code.name.monkey.retromusic.adapter.song.SongAdapter
2019-10-12 10:28:07 +00:00
import code.name.monkey.retromusic.extensions.show
2019-05-15 21:01:20 +00:00
import code.name.monkey.retromusic.loaders.PlaylistSongsLoader
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.model.Artist
2019-10-24 20:08:09 +00:00
import code.name.monkey.retromusic.model.Home
import code.name.monkey.retromusic.model.Playlist
import code.name.monkey.retromusic.util.PreferenceUtil
import com.google.android.material.textview.MaterialTextView
class HomeAdapter(
private val activity: AppCompatActivity,
2019-10-24 20:08:09 +00:00
private val displayMetrics: DisplayMetrics
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
2019-10-24 20:08:09 +00:00
private var list = ArrayList<Home>()
override fun getItemViewType(position: Int): Int {
2019-10-24 20:08:09 +00:00
return list[position].homeSection
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val layout = LayoutInflater.from(activity).inflate(R.layout.section_recycler_view, parent, false)
return when (viewType) {
RECENT_ARTISTS, TOP_ARTISTS -> ArtistViewHolder(layout)
2019-01-28 10:45:51 +00:00
PLAYLISTS -> PlaylistViewHolder(layout)
else -> {
AlbumViewHolder(LayoutInflater.from(activity).inflate(R.layout.metal_section_recycler_view, parent, false))
}
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
2019-10-24 20:08:09 +00:00
println("ViewType ${getItemViewType(position)}")
when (getItemViewType(position)) {
2019-10-12 08:13:33 +00:00
RECENT_ALBUMS -> {
val viewHolder = holder as AlbumViewHolder
2019-10-24 20:08:09 +00:00
viewHolder.bindView(list[position].arrayList.toAlbums(), R.string.recent_albums, R.string.recent_added_albums)
}
2019-10-12 08:13:33 +00:00
TOP_ALBUMS -> {
val viewHolder = holder as AlbumViewHolder
2019-10-24 20:08:09 +00:00
viewHolder.bindView(list[position].arrayList.toAlbums(), R.string.top_albums, R.string.most_played_albums)
2019-10-12 08:13:33 +00:00
}
RECENT_ARTISTS -> {
val viewHolder = holder as ArtistViewHolder
2019-10-24 20:08:09 +00:00
viewHolder.bindView(list[position].arrayList.toArtists(), R.string.recent_artists, R.string.recent_added_artists)
2019-10-12 08:13:33 +00:00
}
TOP_ARTISTS -> {
val viewHolder = holder as ArtistViewHolder
2019-10-24 20:08:09 +00:00
viewHolder.bindView(list[position].arrayList.toArtists(), R.string.top_artists, R.string.most_played_artists)
}
2019-01-28 10:45:51 +00:00
PLAYLISTS -> {
val viewHolder = holder as PlaylistViewHolder
2019-10-24 20:08:09 +00:00
viewHolder.bindView(list[position].arrayList as ArrayList<Playlist>, R.string.favorites, R.string.favorites_songs)
2019-01-28 10:45:51 +00:00
}
}
}
override fun getItemCount(): Int {
2019-10-24 20:08:09 +00:00
return list.size
}
fun swapData(sections: ArrayList<Home>) {
list = sections
notifyDataSetChanged()
2019-03-25 12:43:43 +00:00
}
companion object {
2019-10-12 08:13:33 +00:00
@IntDef(RECENT_ALBUMS, TOP_ALBUMS, RECENT_ARTISTS, TOP_ARTISTS, PLAYLISTS)
@Retention(AnnotationRetention.SOURCE)
annotation class HomeSection
2019-10-12 08:13:33 +00:00
const val RECENT_ALBUMS = 3
2019-04-15 02:44:48 +00:00
const val TOP_ALBUMS = 1
const val RECENT_ARTISTS = 2
2019-10-12 08:13:33 +00:00
const val TOP_ARTISTS = 0
const val PLAYLISTS = 4
}
2019-05-16 18:52:48 +00:00
private inner class AlbumViewHolder(view: View) : AbsHomeViewItem(view) {
2019-10-12 08:13:33 +00:00
fun bindView(list: ArrayList<Album>, titleRes: Int, subtitleRes: Int) {
2019-10-12 10:28:07 +00:00
if (list.isNotEmpty()) {
recyclerView.apply {
show()
adapter = AlbumFullWidthAdapter(activity, list, displayMetrics)
}
2019-10-24 20:08:09 +00:00
titleContainer.show()
2019-10-12 10:28:07 +00:00
title.text = activity.getString(titleRes)
text.text = activity.getString(subtitleRes)
}
}
2019-10-24 20:08:09 +00:00
}
2019-10-12 08:13:33 +00:00
inner class ArtistViewHolder(view: View) : AbsHomeViewItem(view) {
fun bindView(list: ArrayList<Artist>, titleRes: Int, subtitleRes: Int) {
2019-10-12 10:28:07 +00:00
if (list.isNotEmpty()) {
recyclerView.apply {
show()
layoutManager = GridLayoutManager(activity, 1, GridLayoutManager.HORIZONTAL, false)
val artistAdapter = ArtistAdapter(activity, list,
PreferenceUtil.getInstance(activity).getHomeGridStyle(activity), false, null)
adapter = artistAdapter
}
titleContainer.show()
title.text = activity.getString(titleRes)
text.text = activity.getString(subtitleRes)
}
}
}
2019-05-16 18:52:48 +00:00
private inner class PlaylistViewHolder(view: View) : AbsHomeViewItem(view) {
2019-10-12 08:13:33 +00:00
fun bindView(arrayList: ArrayList<Playlist>, titleRes: Int, subtitleRes: Int) {
if (arrayList.isNotEmpty()) {
val songs = PlaylistSongsLoader.getPlaylistSongList(activity, arrayList[0])
2019-10-12 10:28:07 +00:00
if (songs.isNotEmpty()) {
recyclerView.apply {
show()
val songAdapter = SongAdapter(activity, songs, R.layout.item_album_card, false, null)
layoutManager = GridLayoutManager(activity, 1, GridLayoutManager.HORIZONTAL, false)
adapter = songAdapter
}
titleContainer.show()
title.text = activity.getString(titleRes)
text.text = activity.getString(subtitleRes)
2019-10-12 08:13:33 +00:00
}
2019-01-28 10:45:51 +00:00
}
}
2019-05-16 18:52:48 +00:00
}
2019-01-28 10:45:51 +00:00
2019-10-12 08:13:33 +00:00
open inner class AbsHomeViewItem(itemView: View) : RecyclerView.ViewHolder(itemView) {
2019-05-16 18:52:48 +00:00
val recyclerView: RecyclerView = itemView.findViewById(R.id.recyclerView)
2019-10-12 10:28:07 +00:00
val titleContainer: View = itemView.findViewById(R.id.titleContainer)
val title: MaterialTextView = itemView.findViewById(R.id.title)
val text: MaterialTextView = itemView.findViewById(R.id.text)
2019-01-28 10:45:51 +00:00
}
2019-10-24 20:08:09 +00:00
}
private fun <E> ArrayList<E>.toAlbums(): ArrayList<Album> {
val arrayList = ArrayList<Album>()
for (x in this) {
arrayList.add(x as Album)
}
return arrayList;
}
private fun <E> ArrayList<E>.toArtists(): ArrayList<Artist> {
val arrayList = ArrayList<Artist>()
for (x in this) {
arrayList.add(x as Artist)
}
return arrayList;
}