2021-09-11 06:33:19 +00:00
|
|
|
package code.name.monkey.retromusic.adapter.base
|
|
|
|
|
2021-09-11 11:22:47 +00:00
|
|
|
import android.graphics.Color
|
2021-09-11 06:33:19 +00:00
|
|
|
import android.view.Menu
|
|
|
|
import android.view.MenuItem
|
|
|
|
import androidx.annotation.MenuRes
|
2021-09-11 11:22:47 +00:00
|
|
|
import androidx.fragment.app.FragmentActivity
|
2021-09-11 06:33:19 +00:00
|
|
|
import androidx.recyclerview.widget.RecyclerView
|
|
|
|
import code.name.monkey.retromusic.R
|
2021-09-11 11:22:47 +00:00
|
|
|
import code.name.monkey.retromusic.extensions.surfaceColor
|
2021-09-11 06:33:19 +00:00
|
|
|
import code.name.monkey.retromusic.interfaces.ICabHolder
|
2021-09-11 11:22:47 +00:00
|
|
|
import code.name.monkey.retromusic.util.ColorAnimUtil
|
|
|
|
import code.name.monkey.retromusic.util.RetroColorUtil
|
2021-09-11 06:33:19 +00:00
|
|
|
import com.afollestad.materialcab.MaterialCab
|
|
|
|
import java.util.*
|
|
|
|
|
|
|
|
abstract class AbsMultiSelectAdapter<V : RecyclerView.ViewHolder?, I>(
|
2021-09-11 11:22:47 +00:00
|
|
|
open val activity: FragmentActivity, private val ICabHolder: ICabHolder?, @MenuRes menuRes: Int
|
2021-09-11 06:33:19 +00:00
|
|
|
) : RecyclerView.Adapter<V>(), MaterialCab.Callback {
|
|
|
|
private var cab: MaterialCab? = null
|
|
|
|
private val checked: MutableList<I>
|
|
|
|
private var menuRes: Int
|
|
|
|
override fun onCabCreated(materialCab: MaterialCab, menu: Menu): Boolean {
|
2021-09-11 11:22:47 +00:00
|
|
|
// Animate the color change
|
|
|
|
ColorAnimUtil.createColorAnimator(
|
|
|
|
activity.surfaceColor(),
|
|
|
|
RetroColorUtil.shiftBackgroundColor(activity.surfaceColor())
|
|
|
|
).apply {
|
|
|
|
addUpdateListener {
|
|
|
|
// Change color of status bar too
|
|
|
|
activity.window.statusBarColor = animatedValue as Int
|
|
|
|
materialCab.setBackgroundColor(animatedValue as Int)
|
|
|
|
}
|
|
|
|
start()
|
|
|
|
}
|
2021-09-11 06:33:19 +00:00
|
|
|
return true
|
|
|
|
}
|
2020-10-06 08:46:04 +00:00
|
|
|
|
2021-09-11 06:33:19 +00:00
|
|
|
override fun onCabFinished(materialCab: MaterialCab): Boolean {
|
|
|
|
clearChecked()
|
2021-09-11 11:22:47 +00:00
|
|
|
activity.window.statusBarColor = Color.TRANSPARENT
|
2021-09-11 06:33:19 +00:00
|
|
|
return true
|
2020-01-17 17:19:06 +00:00
|
|
|
}
|
2020-10-06 08:46:04 +00:00
|
|
|
|
2021-09-11 06:33:19 +00:00
|
|
|
override fun onCabItemClicked(menuItem: MenuItem): Boolean {
|
|
|
|
if (menuItem.itemId == R.id.action_multi_select_adapter_check_all) {
|
|
|
|
checkAll()
|
|
|
|
} else {
|
|
|
|
onMultipleItemAction(menuItem, ArrayList(checked))
|
2021-09-11 11:22:47 +00:00
|
|
|
cab?.finish()
|
2021-09-11 06:33:19 +00:00
|
|
|
clearChecked()
|
2018-07-27 13:07:33 +00:00
|
|
|
}
|
2021-09-11 06:33:19 +00:00
|
|
|
return true
|
2018-07-27 13:07:33 +00:00
|
|
|
}
|
|
|
|
|
2021-09-11 06:33:19 +00:00
|
|
|
private fun checkAll() {
|
|
|
|
if (ICabHolder != null) {
|
|
|
|
checked.clear()
|
|
|
|
for (i in 0 until itemCount) {
|
|
|
|
val identifier = getIdentifier(i)
|
|
|
|
if (identifier != null) {
|
|
|
|
checked.add(identifier)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
notifyDataSetChanged()
|
|
|
|
updateCab()
|
|
|
|
}
|
|
|
|
}
|
2020-01-17 17:19:06 +00:00
|
|
|
|
2021-09-11 06:33:19 +00:00
|
|
|
protected abstract fun getIdentifier(position: Int): I?
|
|
|
|
protected open fun getName(`object`: I): String? {
|
|
|
|
return `object`.toString()
|
|
|
|
}
|
2018-07-27 13:07:33 +00:00
|
|
|
|
2021-09-11 06:33:19 +00:00
|
|
|
protected fun isChecked(identifier: I): Boolean {
|
|
|
|
return checked.contains(identifier)
|
|
|
|
}
|
2018-07-27 13:07:33 +00:00
|
|
|
|
2021-09-11 06:33:19 +00:00
|
|
|
protected val isInQuickSelectMode: Boolean
|
|
|
|
get() = cab != null && cab!!.isActive
|
2018-07-27 13:07:33 +00:00
|
|
|
|
2021-09-11 06:37:52 +00:00
|
|
|
protected abstract fun onMultipleItemAction(menuItem: MenuItem, selection: List<I>)
|
2021-09-11 06:33:19 +00:00
|
|
|
protected fun setMultiSelectMenuRes(@MenuRes menuRes: Int) {
|
|
|
|
this.menuRes = menuRes
|
2020-10-06 08:46:04 +00:00
|
|
|
}
|
|
|
|
|
2021-09-11 06:33:19 +00:00
|
|
|
protected fun toggleChecked(position: Int): Boolean {
|
|
|
|
if (ICabHolder != null) {
|
|
|
|
val identifier = getIdentifier(position) ?: return false
|
|
|
|
if (!checked.remove(identifier)) {
|
|
|
|
checked.add(identifier)
|
|
|
|
}
|
|
|
|
notifyItemChanged(position)
|
|
|
|
updateCab()
|
|
|
|
return true
|
2021-09-08 18:30:20 +00:00
|
|
|
}
|
2021-09-11 06:33:19 +00:00
|
|
|
return false
|
|
|
|
}
|
2021-09-08 18:30:20 +00:00
|
|
|
|
2021-09-11 06:33:19 +00:00
|
|
|
private fun clearChecked() {
|
|
|
|
checked.clear()
|
|
|
|
notifyDataSetChanged()
|
|
|
|
}
|
2021-09-08 18:30:20 +00:00
|
|
|
|
2021-09-11 06:33:19 +00:00
|
|
|
private fun updateCab() {
|
|
|
|
if (ICabHolder != null) {
|
|
|
|
if (cab == null || !cab!!.isActive) {
|
|
|
|
cab = ICabHolder.openCab(menuRes, this)
|
|
|
|
}
|
|
|
|
val size = checked.size
|
|
|
|
when {
|
|
|
|
size <= 0 -> {
|
2021-09-11 11:22:47 +00:00
|
|
|
cab?.finish()
|
2021-09-11 06:33:19 +00:00
|
|
|
}
|
|
|
|
size == 1 -> {
|
2021-09-11 11:22:47 +00:00
|
|
|
cab?.setTitle(getName(checked[0]))
|
2021-09-11 06:33:19 +00:00
|
|
|
}
|
|
|
|
else -> {
|
2021-09-11 11:22:47 +00:00
|
|
|
cab?.setTitle(activity.getString(R.string.x_selected, size))
|
2021-09-11 06:33:19 +00:00
|
|
|
}
|
|
|
|
}
|
2021-09-08 18:30:20 +00:00
|
|
|
}
|
2018-07-27 13:07:33 +00:00
|
|
|
}
|
2021-09-08 18:30:20 +00:00
|
|
|
|
2021-09-11 06:33:19 +00:00
|
|
|
init {
|
|
|
|
checked = ArrayList()
|
|
|
|
this.menuRes = menuRes
|
|
|
|
}
|
|
|
|
}
|