/* * 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. * */ package code.name.monkey.retromusic.adapter import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.AppCompatTextView import androidx.core.os.bundleOf import androidx.navigation.findNavController import androidx.navigation.fragment.FragmentNavigatorExtras import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.retromusic.* import code.name.monkey.retromusic.adapter.album.AlbumAdapter import code.name.monkey.retromusic.adapter.artist.ArtistAdapter import code.name.monkey.retromusic.adapter.song.SongAdapter import code.name.monkey.retromusic.extensions.hide 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 import code.name.monkey.retromusic.model.* import code.name.monkey.retromusic.util.PreferenceUtil import com.bumptech.glide.Glide import com.google.android.material.card.MaterialCardView class HomeAdapter( private val activity: AppCompatActivity ) : RecyclerView.Adapter(), IArtistClickListener, IAlbumClickListener { private var list = listOf() override fun getItemViewType(position: Int): Int { 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) GENRES -> GenreViewHolder(layout) FAVOURITES -> PlaylistViewHolder(layout) TOP_ALBUMS, RECENT_ALBUMS -> AlbumViewHolder(layout) else -> { SuggestionsViewHolder( LayoutInflater.from(activity).inflate( R.layout.item_suggestions, parent, false ) ) } } } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { val home = list[position] when (getItemViewType(position)) { RECENT_ALBUMS -> { val viewHolder = holder as AlbumViewHolder viewHolder.bindView(home) viewHolder.clickableArea.setOnClickListener { activity.findNavController(R.id.fragment_container).navigate( R.id.detailListFragment, bundleOf("type" to RECENT_ALBUMS) ) } } TOP_ALBUMS -> { val viewHolder = holder as AlbumViewHolder viewHolder.bindView(home) viewHolder.clickableArea.setOnClickListener { activity.findNavController(R.id.fragment_container).navigate( R.id.detailListFragment, bundleOf("type" to TOP_ALBUMS) ) } } RECENT_ARTISTS -> { val viewHolder = holder as ArtistViewHolder viewHolder.bindView(home) viewHolder.clickableArea.setOnClickListener { activity.findNavController(R.id.fragment_container).navigate( R.id.detailListFragment, bundleOf("type" to RECENT_ARTISTS) ) } } TOP_ARTISTS -> { val viewHolder = holder as ArtistViewHolder viewHolder.bindView(home) viewHolder.clickableArea.setOnClickListener { activity.findNavController(R.id.fragment_container).navigate( R.id.detailListFragment, bundleOf("type" to TOP_ARTISTS) ) } } SUGGESTIONS -> { val viewHolder = holder as SuggestionsViewHolder viewHolder.bindView(home) } FAVOURITES -> { val viewHolder = holder as PlaylistViewHolder viewHolder.bindView(home) viewHolder.clickableArea.setOnClickListener { activity.findNavController(R.id.fragment_container).navigate( R.id.detailListFragment, bundleOf("type" to FAVOURITES) ) } } GENRES -> { val viewHolder = holder as GenreViewHolder viewHolder.bind(home) } PLAYLISTS -> { } } } override fun getItemCount(): Int { return list.size } fun swapData(sections: List) { list = sections notifyDataSetChanged() } private inner class AlbumViewHolder(view: View) : AbsHomeViewItem(view) { fun bindView(home: Home) { title.setText(home.titleRes) recyclerView.apply { adapter = albumAdapter(home.arrayList as List) layoutManager = gridLayoutManager() } } } private inner class ArtistViewHolder(view: View) : AbsHomeViewItem(view) { fun bindView(home: Home) { title.setText(home.titleRes) recyclerView.apply { layoutManager = linearLayoutManager() adapter = artistsAdapter(home.arrayList as List) } } } 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 ) fun bindView(home: Home) { val color = ThemeStore.accentColor(activity) itemView.findViewById(R.id.message).setTextColor(color) itemView.findViewById(R.id.card6).apply { setCardBackgroundColor(ColorUtil.withAlpha(color, 0.12f)) } images.forEachIndexed { index, id -> itemView.findViewById(id).setOnClickListener { MusicPlayerRemote.playNext(home.arrayList[index] as Song) } SongGlideRequest.Builder.from(Glide.with(activity), home.arrayList[index] as Song) .asBitmap() .build() .into(itemView.findViewById(id)) } } } private inner class PlaylistViewHolder(view: View) : AbsHomeViewItem(view) { fun bindView(home: Home) { title.setText(home.titleRes) recyclerView.apply { val songAdapter = SongAdapter( activity, home.arrayList as MutableList, R.layout.item_album_card, null ) layoutManager = linearLayoutManager() adapter = songAdapter } } } private inner class GenreViewHolder(itemView: View) : AbsHomeViewItem(itemView) { fun bind(home: Home) { arrow.hide() title.setText(home.titleRes) val genreAdapter = GenreAdapter( activity, home.arrayList as List, R.layout.item_grid_genre ) recyclerView.apply { layoutManager = GridLayoutManager(activity, 3, GridLayoutManager.HORIZONTAL, false) adapter = genreAdapter } } } open class AbsHomeViewItem(itemView: View) : RecyclerView.ViewHolder(itemView) { val recyclerView: RecyclerView = itemView.findViewById(R.id.recyclerView) val title: AppCompatTextView = itemView.findViewById(R.id.title) val arrow: ImageView = itemView.findViewById(R.id.arrow) val clickableArea: ViewGroup = itemView.findViewById(R.id.clickable_area) } fun artistsAdapter(artists: List) = ArtistAdapter(activity, artists, PreferenceUtil.homeArtistGridStyle, null, this) fun albumAdapter(albums: List) = AlbumAdapter(activity, albums, PreferenceUtil.homeAlbumGridStyle, null, this) fun gridLayoutManager() = GridLayoutManager(activity, 1, GridLayoutManager.HORIZONTAL, false) fun linearLayoutManager() = LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false) override fun onArtist(artistId: Long, view: View) { activity.findNavController(R.id.fragment_container).navigate( R.id.artistDetailsFragment, bundleOf(EXTRA_ARTIST_ID to artistId), null, FragmentNavigatorExtras( view to "artist" ) ) } override fun onAlbumClick(albumId: Long, view: View) { activity.findNavController(R.id.fragment_container).navigate( R.id.albumDetailsFragment, bundleOf(EXTRA_ALBUM_ID to albumId), null, FragmentNavigatorExtras( view to "album" ) ) } }