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

123 lines
3.8 KiB
Kotlin
Raw Normal View History

2021-09-11 06:33:19 +00:00
package code.name.monkey.retromusic.adapter.base
import android.annotation.SuppressLint
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.appthemehelper.util.ATHUtil
2021-09-11 06:33:19 +00:00
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.interfaces.ICabCallback
2021-09-11 06:33:19 +00:00
import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.util.RetroColorUtil
import com.afollestad.materialcab.attached.AttachedCab
import com.afollestad.materialcab.attached.destroy
import com.afollestad.materialcab.attached.isActive
2021-09-11 06:33:19 +00:00
import java.util.*
abstract class AbsMultiSelectAdapter<V : RecyclerView.ViewHolder?, I>(
open val activity: FragmentActivity, private val ICabHolder: ICabHolder?, @MenuRes menuRes: Int
) : RecyclerView.Adapter<V>(), ICabCallback {
private var cab: AttachedCab? = null
2021-09-11 06:33:19 +00:00
private val checked: MutableList<I>
private var menuRes: Int
override fun onCabCreated(cab: AttachedCab, menu: Menu): Boolean {
activity.window.statusBarColor =
RetroColorUtil.shiftBackgroundColor(ATHUtil.resolveColor(activity, R.attr.colorSurface))
2021-09-11 06:33:19 +00:00
return true
}
2020-10-06 08:46:04 +00:00
override fun onCabFinished(cab: AttachedCab): Boolean {
2021-09-11 06:33:19 +00:00
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
override fun onCabItemClicked(item: MenuItem): Boolean {
if (item.itemId == R.id.action_multi_select_adapter_check_all) {
2021-09-11 06:33:19 +00:00
checkAll()
} else {
onMultipleItemAction(item, ArrayList(checked))
cab?.destroy()
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(i: I): String? {
return i.toString()
2021-09-11 06:33:19 +00:00
}
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()
}
@SuppressLint("StringFormatInvalid", "StringFormatMatches")
2021-09-11 06:33:19 +00:00
private fun updateCab() {
if (ICabHolder != null) {
if (cab == null || !cab!!.isActive()) {
2021-09-11 06:33:19 +00:00
cab = ICabHolder.openCab(menuRes, this)
}
val size = checked.size
when {
size <= 0 -> {
cab?.destroy()
2021-09-11 06:33:19 +00:00
}
size == 1 -> {
cab?.title(literal = getName(checked[0]))
2021-09-11 06:33:19 +00:00
}
else -> {
cab?.title(literal = 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
}
}