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

129 lines
4.0 KiB
Kotlin
Raw Normal View History

2021-09-11 06:33:19 +00:00
package code.name.monkey.retromusic.adapter.base
import android.graphics.Color
2021-09-11 06:33:19 +00:00
import android.view.Menu
import android.view.MenuItem
import androidx.annotation.MenuRes
import androidx.fragment.app.FragmentActivity
2021-09-11 06:33:19 +00:00
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.extensions.surfaceColor
2021-09-11 06:33:19 +00:00
import code.name.monkey.retromusic.interfaces.ICabHolder
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>(
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 {
// 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()
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))
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-11 06:33:19 +00:00
return false
}
2021-09-11 06:33:19 +00:00
private fun clearChecked() {
checked.clear()
notifyDataSetChanged()
}
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 -> {
cab?.finish()
2021-09-11 06:33:19 +00:00
}
size == 1 -> {
cab?.setTitle(getName(checked[0]))
2021-09-11 06:33:19 +00:00
}
else -> {
cab?.setTitle(activity.getString(R.string.x_selected, size))
2021-09-11 06:33:19 +00:00
}
}
}
2018-07-27 13:07:33 +00:00
}
2021-09-11 06:33:19 +00:00
init {
checked = ArrayList()
this.menuRes = menuRes
}
}