package com.github.apognu.otter.adapters import android.annotation.SuppressLint import android.content.Context import android.graphics.Color import android.graphics.Typeface import android.graphics.drawable.ColorDrawable import android.os.Build import android.view.* import androidx.appcompat.widget.PopupMenu import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView import com.github.apognu.otter.R import com.github.apognu.otter.fragments.FunkwhaleAdapter import com.github.apognu.otter.utils.* import com.squareup.picasso.Picasso import jp.wasabeef.picasso.transformations.RoundedCornersTransformation import kotlinx.android.synthetic.main.row_track.view.* import java.util.* class PlaylistTracksAdapter(private val context: Context?, val fromQueue: Boolean = false) : FunkwhaleAdapter() { private lateinit var touchHelper: ItemTouchHelper var currentTrack: Track? = null override fun getItemCount() = data.size override fun getItemId(position: Int): Long { return data[position].track.id.toLong() } override fun onAttachedToRecyclerView(recyclerView: RecyclerView) { super.onAttachedToRecyclerView(recyclerView) if (fromQueue) { touchHelper = ItemTouchHelper(TouchHelperCallback()).also { it.attachToRecyclerView(recyclerView) } } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(context).inflate(R.layout.row_track, parent, false) return ViewHolder(view, context).also { view.setOnClickListener(it) } } @SuppressLint("NewApi") override fun onBindViewHolder(holder: ViewHolder, position: Int) { val track = data[position] Picasso.get() .load(normalizeUrl(track.track.album.cover.original)) .fit() .placeholder(R.drawable.cover) .transform(RoundedCornersTransformation(16, 0)) .into(holder.cover) holder.title.text = track.track.title holder.artist.text = track.track.artist.name Build.VERSION_CODES.P.onApi( { holder.title.setTypeface(holder.title.typeface, Typeface.DEFAULT.weight) holder.artist.setTypeface(holder.artist.typeface, Typeface.DEFAULT.weight) }, { holder.title.setTypeface(holder.title.typeface, Typeface.NORMAL) holder.artist.setTypeface(holder.artist.typeface, Typeface.NORMAL) }) if (track.track == currentTrack || track.track.current) { holder.title.setTypeface(holder.title.typeface, Typeface.BOLD) holder.artist.setTypeface(holder.artist.typeface, Typeface.BOLD) } holder.actions.setOnClickListener { context?.let { context -> PopupMenu(context, holder.actions, Gravity.START, R.attr.actionOverflowMenuStyle, 0).apply { inflate(if (fromQueue) R.menu.row_queue else R.menu.row_track) setOnMenuItemClickListener { when (it.itemId) { R.id.track_add_to_queue -> CommandBus.send(Command.AddToQueue(listOf(track.track))) R.id.track_play_next -> CommandBus.send(Command.PlayNext(track.track)) R.id.queue_remove -> CommandBus.send(Command.RemoveFromQueue(track.track)) } true } show() } } } if (fromQueue) { holder.handle.visibility = View.VISIBLE holder.handle.setOnTouchListener { _, event -> if (event.actionMasked == MotionEvent.ACTION_DOWN) { touchHelper.startDrag(holder) } true } } } fun onItemMove(oldPosition: Int, newPosition: Int) { if (oldPosition < newPosition) { for (i in oldPosition.rangeTo(newPosition - 1)) { Collections.swap(data, i, i + 1) } } else { for (i in newPosition.downTo(oldPosition)) { Collections.swap(data, i, i - 1) } } notifyItemMoved(oldPosition, newPosition) CommandBus.send(Command.MoveFromQueue(oldPosition, newPosition)) } inner class ViewHolder(view: View, val context: Context?) : RecyclerView.ViewHolder(view), View.OnClickListener { val handle = view.handle val cover = view.cover val title = view.title val artist = view.artist val actions = view.actions override fun onClick(view: View?) { when (fromQueue) { true -> CommandBus.send(Command.PlayTrack(layoutPosition)) false -> { data.subList(layoutPosition, data.size).plus(data.subList(0, layoutPosition)).apply { CommandBus.send(Command.ReplaceQueue(this.map { it.track })) context.toast("All tracks were added to your queue") } } } } } inner class TouchHelperCallback : ItemTouchHelper.Callback() { override fun isLongPressDragEnabled() = false override fun isItemViewSwipeEnabled() = false override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) = makeMovementFlags(ItemTouchHelper.UP or ItemTouchHelper.DOWN, 0) override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean { onItemMove(viewHolder.adapterPosition, target.adapterPosition) return true } override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {} override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) { if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) { viewHolder?.itemView?.background = ColorDrawable(Color.argb(255, 100, 100, 100)) } super.onSelectedChanged(viewHolder, actionState) } override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { viewHolder.itemView.background = ColorDrawable(Color.TRANSPARENT) super.clearView(recyclerView, viewHolder) } } }