You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
5.8 KiB
179 lines
5.8 KiB
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<PlaylistTrack, PlaylistTracksAdapter.ViewHolder>() { |
|
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) |
|
} |
|
} |
|
}
|
|
|