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

185 lines
6.3 KiB
Kotlin
Raw Normal View History

2019-04-20 05:29:45 +00:00
package code.name.monkey.retromusic.adapter
2018-11-30 01:06:16 +00:00
import android.graphics.PorterDuff
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import code.name.monkey.appthemehelper.ThemeStore
2018-11-30 01:06:16 +00:00
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
2018-11-30 01:06:16 +00:00
import code.name.monkey.retromusic.glide.audiocover.AudioFileCover
import code.name.monkey.retromusic.interfaces.CabHolder
import code.name.monkey.retromusic.util.RetroUtil
import com.bumptech.glide.Glide
2018-11-30 01:06:16 +00:00
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.signature.MediaStoreSignature
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
import java.io.File
import java.text.DecimalFormat
import java.util.*
2019-09-22 18:56:40 +00:00
import kotlin.math.log10
import kotlin.math.pow
2018-11-30 01:06:16 +00:00
2018-12-12 20:59:07 +00:00
2019-09-03 16:02:10 +00:00
class SongFileAdapter(
private val activity: AppCompatActivity,
private var dataSet: List<File>?,
private val itemLayoutRes: Int,
private val callbacks: Callbacks?,
cabHolder: CabHolder?
) : AbsMultiSelectAdapter<SongFileAdapter.ViewHolder, File>(activity, cabHolder, code.name.monkey.retromusic.R.menu.menu_media_selection), FastScrollRecyclerView.SectionedAdapter {
2018-11-30 01:06:16 +00:00
init {
this.setHasStableIds(true)
}
override fun getItemViewType(position: Int): Int {
return if (dataSet!![position].isDirectory) FOLDER else FILE
}
override fun getItemId(position: Int): Long {
return dataSet!![position].hashCode().toLong()
}
fun swapDataSet(songFiles: List<File>) {
this.dataSet = songFiles
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false))
}
override fun onBindViewHolder(holder: ViewHolder, index: Int) {
val file = dataSet!![index]
holder.itemView.isActivated = isChecked(file)
if (holder.title != null) {
holder.title!!.text = getFileTitle(file)
}
if (holder.text != null) {
if (holder.itemViewType == FILE) {
holder.text!!.text = getFileText(file)
} else {
holder.text!!.visibility = View.GONE
}
}
if (holder.image != null) {
loadFileImage(file, holder)
}
}
private fun getFileTitle(file: File): String {
return file.name
}
private fun getFileText(file: File): String? {
return if (file.isDirectory) null else readableFileSize(file.length())
}
private fun loadFileImage(file: File, holder: ViewHolder) {
val iconColor = ATHUtil.resolveColor(activity, code.name.monkey.retromusic.R.attr.iconColor)
2018-11-30 01:06:16 +00:00
if (file.isDirectory) {
holder.image?.let {
it.setColorFilter(iconColor, PorterDuff.Mode.SRC_IN)
it.setImageResource(code.name.monkey.retromusic.R.drawable.ic_folder_white_24dp)
}
holder.imageTextContainer?.setCardBackgroundColor(ThemeStore.primaryColor(activity))
2018-11-30 01:06:16 +00:00
} else {
val error = RetroUtil.getTintedVectorDrawable(activity, code.name.monkey.retromusic.R.drawable.ic_file_music_white_24dp, iconColor)
Glide.with(activity)
2018-11-30 01:06:16 +00:00
.load(AudioFileCover(file.path))
.diskCacheStrategy(DiskCacheStrategy.NONE)
.error(error)
.placeholder(error)
.animate(android.R.anim.fade_in)
.signature(MediaStoreSignature("", file.lastModified(), 0))
.into(holder.image)
2018-11-30 01:06:16 +00:00
}
}
override fun getItemCount(): Int {
return dataSet!!.size
}
override fun getIdentifier(position: Int): File? {
return dataSet!![position]
}
override fun getName(`object`: File): String {
return getFileTitle(`object`)
}
override fun onMultipleItemAction(menuItem: MenuItem, selection: ArrayList<File>) {
if (callbacks == null) return
callbacks.onMultipleItemAction(menuItem, selection)
}
override fun getSectionName(position: Int): String {
return dataSet!![position].name[0].toString().toUpperCase()
}
interface Callbacks {
fun onFileSelected(file: File)
fun onFileMenuClicked(file: File, view: View)
fun onMultipleItemAction(item: MenuItem, files: ArrayList<File>)
}
inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) {
init {
if (menu != null && callbacks != null) {
menu!!.setOnClickListener { v ->
val position = adapterPosition
if (isPositionInRange(position)) {
callbacks.onFileMenuClicked(dataSet!![position], v)
}
}
}
2019-04-04 06:07:55 +00:00
if (imageTextContainer != null) {
imageTextContainer?.cardElevation = 0f
}
2018-11-30 01:06:16 +00:00
}
override fun onClick(v: View?) {
val position = adapterPosition
if (isPositionInRange(position)) {
if (isInQuickSelectMode) {
toggleChecked(position)
} else {
callbacks?.onFileSelected(dataSet!![position])
}
}
}
override fun onLongClick(v: View?): Boolean {
val position = adapterPosition
return isPositionInRange(position) && toggleChecked(position)
}
private fun isPositionInRange(position: Int): Boolean {
return position >= 0 && position < dataSet!!.size
}
}
companion object {
private const val FILE = 0
private const val FOLDER = 1
fun readableFileSize(size: Long): String {
2019-09-22 18:56:40 +00:00
if (size <= 0) return "$size B"
2018-11-30 01:06:16 +00:00
val units = arrayOf("B", "KB", "MB", "GB", "TB")
2019-09-22 18:56:40 +00:00
val digitGroups = (log10(size.toDouble()) / log10(1024.0)).toInt()
return DecimalFormat("#,##0.##").format(size / 1024.0.pow(digitGroups.toDouble())) + " " + units[digitGroups]
2018-11-30 01:06:16 +00:00
}
}
}