2021-11-23 20:38:26 +01:00
|
|
|
/*
|
|
|
|
* ArtistRowAdapter.kt
|
|
|
|
* Copyright (C) 2009-2021 Ultrasonic developers
|
|
|
|
*
|
|
|
|
* Distributed under terms of the GNU GPLv3 license.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package org.moire.ultrasonic.adapters
|
|
|
|
|
|
|
|
import android.view.LayoutInflater
|
|
|
|
import android.view.MenuItem
|
|
|
|
import android.view.View
|
|
|
|
import android.view.ViewGroup
|
|
|
|
import android.widget.ImageView
|
|
|
|
import android.widget.RelativeLayout
|
|
|
|
import android.widget.TextView
|
2021-11-26 17:03:33 +01:00
|
|
|
import androidx.core.view.isVisible
|
2021-11-23 20:38:26 +01:00
|
|
|
import androidx.recyclerview.widget.RecyclerView
|
|
|
|
import com.drakeet.multitype.ItemViewBinder
|
|
|
|
import org.koin.core.component.KoinComponent
|
|
|
|
import org.moire.ultrasonic.R
|
|
|
|
import org.moire.ultrasonic.domain.ArtistOrIndex
|
2021-12-08 17:51:31 +01:00
|
|
|
import org.moire.ultrasonic.domain.Identifiable
|
2021-11-23 20:38:26 +01:00
|
|
|
import org.moire.ultrasonic.imageloader.ImageLoader
|
|
|
|
import org.moire.ultrasonic.util.FileUtil
|
|
|
|
import org.moire.ultrasonic.util.Settings
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates a Row in a RecyclerView which contains the details of an Artist
|
|
|
|
*/
|
|
|
|
class ArtistRowBinder(
|
|
|
|
val onItemClick: (ArtistOrIndex) -> Unit,
|
|
|
|
val onContextMenuClick: (MenuItem, ArtistOrIndex) -> Boolean,
|
|
|
|
private val imageLoader: ImageLoader,
|
2021-11-26 17:03:33 +01:00
|
|
|
private val enableSections: Boolean = true
|
2021-12-08 17:51:31 +01:00
|
|
|
) : ItemViewBinder<ArtistOrIndex, ArtistRowBinder.ViewHolder>(),
|
|
|
|
KoinComponent,
|
|
|
|
Utils.SectionedBinder {
|
2021-11-23 20:38:26 +01:00
|
|
|
|
2021-11-27 00:51:41 +01:00
|
|
|
val layout = R.layout.list_item_artist
|
|
|
|
val contextMenuLayout = R.menu.context_menu_artist
|
2021-11-23 20:38:26 +01:00
|
|
|
|
|
|
|
override fun onBindViewHolder(holder: ViewHolder, item: ArtistOrIndex) {
|
|
|
|
holder.textView.text = item.name
|
2021-12-08 17:51:31 +01:00
|
|
|
holder.section.text = getSectionForDisplay(item)
|
2021-11-26 17:03:33 +01:00
|
|
|
holder.section.isVisible = enableSections
|
2021-11-23 20:38:26 +01:00
|
|
|
holder.layout.setOnClickListener { onItemClick(item) }
|
|
|
|
holder.layout.setOnLongClickListener {
|
2021-11-27 00:51:41 +01:00
|
|
|
val popup = Utils.createPopupMenu(holder.itemView, contextMenuLayout)
|
2021-11-23 20:38:26 +01:00
|
|
|
|
|
|
|
popup.setOnMenuItemClickListener { menuItem ->
|
|
|
|
onContextMenuClick(menuItem, item)
|
|
|
|
}
|
|
|
|
|
|
|
|
true
|
|
|
|
}
|
|
|
|
|
|
|
|
holder.coverArtId = item.coverArt
|
|
|
|
|
|
|
|
if (Settings.shouldShowArtistPicture) {
|
|
|
|
holder.coverArt.visibility = View.VISIBLE
|
|
|
|
val key = FileUtil.getArtistArtKey(item.name, false)
|
|
|
|
imageLoader.loadImage(
|
|
|
|
view = holder.coverArt,
|
|
|
|
id = holder.coverArtId,
|
|
|
|
key = key,
|
|
|
|
large = false,
|
|
|
|
size = 0,
|
|
|
|
defaultResourceId = R.drawable.ic_contact_picture
|
|
|
|
)
|
|
|
|
} else {
|
|
|
|
holder.coverArt.visibility = View.GONE
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-12-08 17:51:31 +01:00
|
|
|
override fun getSectionName(item: Identifiable): String {
|
|
|
|
val index = adapter.items.indexOf(item)
|
|
|
|
if (index == -1 || item !is ArtistOrIndex) return ""
|
|
|
|
|
|
|
|
return getSectionFromName(item.name ?: "")
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun getSectionForDisplay(item: ArtistOrIndex): String {
|
2021-11-23 20:38:26 +01:00
|
|
|
val index = adapter.items.indexOf(item)
|
|
|
|
|
|
|
|
if (index == -1) return " "
|
|
|
|
|
|
|
|
if (index == 0) return getSectionFromName(item.name ?: " ")
|
|
|
|
|
|
|
|
val previousItem = adapter.items[index - 1]
|
|
|
|
val previousSectionKey: String
|
|
|
|
|
|
|
|
if (previousItem is ArtistOrIndex) {
|
|
|
|
previousSectionKey = getSectionFromName(previousItem.name ?: " ")
|
|
|
|
} else {
|
|
|
|
previousSectionKey = " "
|
|
|
|
}
|
|
|
|
|
|
|
|
val currentSectionKey = getSectionFromName(item.name ?: "")
|
|
|
|
|
|
|
|
return if (previousSectionKey == currentSectionKey) "" else currentSectionKey
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun getSectionFromName(name: String): String {
|
2022-06-20 10:12:45 +02:00
|
|
|
if (name.isEmpty()) return SECTION_KEY_DEFAULT
|
|
|
|
val section = name.first().uppercaseChar()
|
|
|
|
if (!section.isLetter()) return SECTION_KEY_DEFAULT
|
2021-11-23 20:38:26 +01:00
|
|
|
return section.toString()
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates an instance of our ViewHolder class
|
|
|
|
*/
|
|
|
|
class ViewHolder(
|
|
|
|
itemView: View
|
|
|
|
) : RecyclerView.ViewHolder(itemView) {
|
|
|
|
var section: TextView = itemView.findViewById(R.id.row_section)
|
|
|
|
var textView: TextView = itemView.findViewById(R.id.row_artist_name)
|
2021-11-27 00:51:41 +01:00
|
|
|
var layout: RelativeLayout = itemView.findViewById(R.id.containing_layout)
|
|
|
|
var coverArt: ImageView = itemView.findViewById(R.id.coverart)
|
2021-11-23 20:38:26 +01:00
|
|
|
var coverArtId: String? = null
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onCreateViewHolder(inflater: LayoutInflater, parent: ViewGroup): ViewHolder {
|
|
|
|
return ViewHolder(inflater.inflate(layout, parent, false))
|
|
|
|
}
|
2022-06-20 10:12:45 +02:00
|
|
|
|
|
|
|
companion object {
|
|
|
|
const val SECTION_KEY_DEFAULT = "#"
|
|
|
|
}
|
2021-11-23 20:38:26 +01:00
|
|
|
}
|