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

271 lines
10 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
2019-12-01 11:28:57 +00:00
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
2020-08-13 08:24:36 +00:00
import android.widget.ImageView
2020-07-13 20:39:47 +00:00
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
2019-11-21 16:31:39 +00:00
import androidx.appcompat.widget.AppCompatTextView
2020-08-11 18:29:44 +00:00
import androidx.core.os.bundleOf
import androidx.navigation.findNavController
2020-08-11 21:31:09 +00:00
import androidx.navigation.fragment.FragmentNavigatorExtras
2019-12-01 11:28:57 +00:00
import androidx.recyclerview.widget.GridLayoutManager
2020-01-09 20:53:18 +00:00
import androidx.recyclerview.widget.LinearLayoutManager
2019-12-01 11:28:57 +00:00
import androidx.recyclerview.widget.RecyclerView
2020-07-13 20:39:47 +00:00
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ColorUtil
2020-08-13 08:24:36 +00:00
import code.name.monkey.retromusic.*
import code.name.monkey.retromusic.adapter.album.AlbumAdapter
2019-04-20 05:29:45 +00:00
import code.name.monkey.retromusic.adapter.artist.ArtistAdapter
import code.name.monkey.retromusic.adapter.song.SongAdapter
2020-08-13 08:24:36 +00:00
import code.name.monkey.retromusic.extensions.hide
2020-07-13 20:39:47 +00:00
import code.name.monkey.retromusic.glide.SongGlideRequest
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
import code.name.monkey.retromusic.interfaces.IArtistClickListener
2020-07-13 20:39:47 +00:00
import code.name.monkey.retromusic.model.*
2020-06-06 18:57:28 +00:00
import code.name.monkey.retromusic.util.PreferenceUtil
2020-07-13 20:39:47 +00:00
import com.bumptech.glide.Glide
import com.google.android.material.card.MaterialCardView
class HomeAdapter(
2020-08-11 18:29:44 +00:00
private val activity: AppCompatActivity
) : RecyclerView.Adapter<RecyclerView.ViewHolder>(), IArtistClickListener, IAlbumClickListener {
2020-02-17 11:20:08 +00:00
private var list = listOf<Home>()
2019-12-01 11:28:57 +00:00
override fun getItemViewType(position: Int): Int {
return list[position].homeSection
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
2020-08-21 17:07:10 +00:00
val layout =
LayoutInflater.from(activity).inflate(R.layout.section_recycler_view, parent, false)
2019-12-01 11:28:57 +00:00
return when (viewType) {
RECENT_ARTISTS, TOP_ARTISTS -> ArtistViewHolder(layout)
GENRES -> GenreViewHolder(layout)
FAVOURITES -> PlaylistViewHolder(layout)
2020-08-13 08:24:36 +00:00
TOP_ALBUMS, RECENT_ALBUMS -> AlbumViewHolder(layout)
2019-12-01 11:28:57 +00:00
else -> {
SuggestionsViewHolder(
2020-01-09 20:53:18 +00:00
LayoutInflater.from(activity).inflate(
R.layout.item_suggestions,
2020-01-09 20:53:18 +00:00
parent,
false
)
)
2019-12-01 11:28:57 +00:00
}
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
2020-08-13 08:24:36 +00:00
val home = list[position]
2019-12-01 11:28:57 +00:00
when (getItemViewType(position)) {
RECENT_ALBUMS -> {
val viewHolder = holder as AlbumViewHolder
2020-08-21 13:05:01 +00:00
viewHolder.bindView(home)
2020-08-13 08:24:36 +00:00
viewHolder.clickableArea.setOnClickListener {
activity.findNavController(R.id.fragment_container).navigate(
R.id.detailListFragment,
bundleOf("type" to RECENT_ALBUMS)
)
}
2019-12-01 11:28:57 +00:00
}
TOP_ALBUMS -> {
val viewHolder = holder as AlbumViewHolder
2020-08-21 13:05:01 +00:00
viewHolder.bindView(home)
2020-08-13 08:24:36 +00:00
viewHolder.clickableArea.setOnClickListener {
activity.findNavController(R.id.fragment_container).navigate(
R.id.detailListFragment,
bundleOf("type" to TOP_ALBUMS)
)
}
2019-12-01 11:28:57 +00:00
}
RECENT_ARTISTS -> {
val viewHolder = holder as ArtistViewHolder
2020-08-21 13:05:01 +00:00
viewHolder.bindView(home)
2020-08-13 08:24:36 +00:00
viewHolder.clickableArea.setOnClickListener {
activity.findNavController(R.id.fragment_container).navigate(
R.id.detailListFragment,
bundleOf("type" to RECENT_ARTISTS)
)
}
2019-12-01 11:28:57 +00:00
}
TOP_ARTISTS -> {
val viewHolder = holder as ArtistViewHolder
2020-08-21 13:05:01 +00:00
viewHolder.bindView(home)
2020-08-13 08:24:36 +00:00
viewHolder.clickableArea.setOnClickListener {
activity.findNavController(R.id.fragment_container).navigate(
R.id.detailListFragment,
bundleOf("type" to TOP_ARTISTS)
)
}
2019-12-01 11:28:57 +00:00
}
2020-07-13 20:39:47 +00:00
SUGGESTIONS -> {
val viewHolder = holder as SuggestionsViewHolder
2020-08-21 13:05:01 +00:00
viewHolder.bindView(home)
2019-12-01 11:28:57 +00:00
}
2020-07-14 13:46:16 +00:00
FAVOURITES -> {
val viewHolder = holder as PlaylistViewHolder
2020-08-21 13:05:01 +00:00
viewHolder.bindView(home)
2020-08-21 10:42:21 +00:00
viewHolder.clickableArea.setOnClickListener {
activity.findNavController(R.id.fragment_container).navigate(
R.id.detailListFragment,
bundleOf("type" to FAVOURITES)
)
}
2020-07-14 13:46:16 +00:00
}
GENRES -> {
val viewHolder = holder as GenreViewHolder
2020-08-21 13:05:01 +00:00
viewHolder.bind(home)
2020-08-13 08:24:36 +00:00
}
PLAYLISTS -> {
}
2019-12-01 11:28:57 +00:00
}
}
override fun getItemCount(): Int {
return list.size
}
2020-02-17 11:20:08 +00:00
fun swapData(sections: List<Home>) {
2019-12-01 11:28:57 +00:00
list = sections
notifyDataSetChanged()
}
2020-08-13 08:24:36 +00:00
private inner class AlbumViewHolder(view: View) : AbsHomeViewItem(view) {
2020-08-21 13:05:01 +00:00
fun bindView(home: Home) {
title.setText(home.titleRes)
2020-08-13 08:24:36 +00:00
recyclerView.apply {
2020-08-21 13:05:01 +00:00
adapter = albumAdapter(home.arrayList as List<Album>)
2020-08-13 08:24:36 +00:00
layoutManager = gridLayoutManager()
2019-12-01 11:28:57 +00:00
}
}
}
2020-08-13 08:24:36 +00:00
private inner class ArtistViewHolder(view: View) : AbsHomeViewItem(view) {
2020-08-21 13:05:01 +00:00
fun bindView(home: Home) {
title.setText(home.titleRes)
2020-08-13 08:24:36 +00:00
recyclerView.apply {
layoutManager = linearLayoutManager()
2020-08-21 13:05:01 +00:00
adapter = artistsAdapter(home.arrayList as List<Artist>)
2019-12-01 11:28:57 +00:00
}
2020-08-11 18:29:44 +00:00
}
2019-12-01 11:28:57 +00:00
}
2020-07-13 20:39:47 +00:00
private inner class SuggestionsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val images = listOf(
R.id.image1,
R.id.image2,
R.id.image3,
R.id.image4,
R.id.image5,
R.id.image6,
R.id.image7,
R.id.image8
)
2020-08-21 13:05:01 +00:00
fun bindView(home: Home) {
2020-07-13 20:39:47 +00:00
val color = ThemeStore.accentColor(activity)
itemView.findViewById<TextView>(R.id.message).setTextColor(color)
itemView.findViewById<MaterialCardView>(R.id.card6).apply {
2020-08-13 12:36:24 +00:00
setCardBackgroundColor(ColorUtil.withAlpha(color, 0.12f))
}
2020-08-13 12:36:24 +00:00
images.forEachIndexed { index, id ->
itemView.findViewById<View>(id).setOnClickListener {
2020-08-21 13:05:01 +00:00
MusicPlayerRemote.playNext(home.arrayList[index] as Song)
2020-07-13 20:39:47 +00:00
}
2020-08-21 13:05:01 +00:00
SongGlideRequest.Builder.from(Glide.with(activity), home.arrayList[index] as Song)
2020-08-13 12:36:24 +00:00
.asBitmap()
.build()
.into(itemView.findViewById(id))
}
2020-07-13 20:39:47 +00:00
}
}
2019-12-01 11:28:57 +00:00
private inner class PlaylistViewHolder(view: View) : AbsHomeViewItem(view) {
2020-08-21 13:05:01 +00:00
fun bindView(home: Home) {
title.setText(home.titleRes)
2020-08-13 08:24:36 +00:00
recyclerView.apply {
val songAdapter = SongAdapter(
activity,
2020-08-21 13:05:01 +00:00
home.arrayList as MutableList<Song>,
2020-08-13 08:24:36 +00:00
R.layout.item_album_card, null
)
layoutManager = linearLayoutManager()
adapter = songAdapter
2019-12-01 11:28:57 +00:00
}
}
}
private inner class GenreViewHolder(itemView: View) : AbsHomeViewItem(itemView) {
2020-08-21 13:05:01 +00:00
fun bind(home: Home) {
2020-08-13 08:24:36 +00:00
arrow.hide()
2020-08-21 13:05:01 +00:00
title.setText(home.titleRes)
2020-08-21 17:07:10 +00:00
val genreAdapter = GenreAdapter(
activity,
home.arrayList as List<Genre>,
R.layout.item_grid_genre
)
recyclerView.apply {
2020-08-13 08:24:36 +00:00
layoutManager = GridLayoutManager(activity, 3, GridLayoutManager.HORIZONTAL, false)
adapter = genreAdapter
}
}
}
2020-08-21 10:42:21 +00:00
open class AbsHomeViewItem(itemView: View) : RecyclerView.ViewHolder(itemView) {
2019-12-01 11:28:57 +00:00
val recyclerView: RecyclerView = itemView.findViewById(R.id.recyclerView)
val title: AppCompatTextView = itemView.findViewById(R.id.title)
2020-08-13 08:24:36 +00:00
val arrow: ImageView = itemView.findViewById(R.id.arrow)
val clickableArea: ViewGroup = itemView.findViewById(R.id.clickable_area)
}
fun artistsAdapter(artists: List<Artist>) =
ArtistAdapter(activity, artists, PreferenceUtil.homeArtistGridStyle, null, this)
2020-08-13 08:24:36 +00:00
fun albumAdapter(albums: List<Album>) =
AlbumAdapter(activity, albums, PreferenceUtil.homeAlbumGridStyle, null, this)
2020-08-13 08:24:36 +00:00
fun gridLayoutManager() = GridLayoutManager(activity, 1, GridLayoutManager.HORIZONTAL, false)
2020-08-13 08:24:36 +00:00
fun linearLayoutManager() = LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false)
override fun onArtist(artistId: Long, view: View) {
2020-08-13 08:24:36 +00:00
activity.findNavController(R.id.fragment_container).navigate(
R.id.artistDetailsFragment,
bundleOf(EXTRA_ARTIST_ID to artistId),
null,
FragmentNavigatorExtras(
view to "artist"
2020-08-13 08:24:36 +00:00
)
)
}
override fun onAlbumClick(albumId: Long, view: View) {
2020-08-13 08:24:36 +00:00
activity.findNavController(R.id.fragment_container).navigate(
R.id.albumDetailsFragment,
bundleOf(EXTRA_ALBUM_ID to albumId),
null,
FragmentNavigatorExtras(
view to "album"
2020-08-13 08:24:36 +00:00
)
)
2019-12-01 11:28:57 +00:00
}
2019-10-24 20:08:09 +00:00
}