|
|
|
|
@ -1,12 +1,19 @@
|
|
|
|
|
package org.koitharu.kotatsu.base.ui.widgets
|
|
|
|
|
|
|
|
|
|
import android.content.Context
|
|
|
|
|
import android.os.Parcel
|
|
|
|
|
import android.os.Parcelable
|
|
|
|
|
import android.os.Parcelable.Creator
|
|
|
|
|
import android.util.AttributeSet
|
|
|
|
|
import android.widget.Checkable
|
|
|
|
|
import androidx.annotation.AttrRes
|
|
|
|
|
import androidx.appcompat.widget.AppCompatImageView
|
|
|
|
|
import androidx.core.os.ParcelCompat
|
|
|
|
|
|
|
|
|
|
class CheckableImageView @JvmOverloads constructor(
|
|
|
|
|
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
|
|
|
|
|
context: Context,
|
|
|
|
|
attrs: AttributeSet? = null,
|
|
|
|
|
@AttrRes defStyleAttr: Int = 0,
|
|
|
|
|
) : AppCompatImageView(context, attrs, defStyleAttr), Checkable {
|
|
|
|
|
|
|
|
|
|
private var isCheckedInternal = false
|
|
|
|
|
@ -14,20 +21,6 @@ class CheckableImageView @JvmOverloads constructor(
|
|
|
|
|
|
|
|
|
|
var onCheckedChangeListener: OnCheckedChangeListener? = null
|
|
|
|
|
|
|
|
|
|
init {
|
|
|
|
|
setOnClickListener {
|
|
|
|
|
toggle()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun setOnCheckedChangeListener(listener: (Boolean) -> Unit) {
|
|
|
|
|
onCheckedChangeListener = object : OnCheckedChangeListener {
|
|
|
|
|
override fun onCheckedChanged(view: CheckableImageView, isChecked: Boolean) {
|
|
|
|
|
listener(isChecked)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun isChecked() = isCheckedInternal
|
|
|
|
|
|
|
|
|
|
override fun toggle() {
|
|
|
|
|
@ -49,18 +42,54 @@ class CheckableImageView @JvmOverloads constructor(
|
|
|
|
|
override fun onCreateDrawableState(extraSpace: Int): IntArray {
|
|
|
|
|
val state = super.onCreateDrawableState(extraSpace + 1)
|
|
|
|
|
if (isCheckedInternal) {
|
|
|
|
|
mergeDrawableStates(state, CHECKED_STATE_SET)
|
|
|
|
|
mergeDrawableStates(state, intArrayOf(android.R.attr.state_checked))
|
|
|
|
|
}
|
|
|
|
|
return state
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onSaveInstanceState(): Parcelable? {
|
|
|
|
|
val superState = super.onSaveInstanceState() ?: return null
|
|
|
|
|
return SavedState(superState, isChecked)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onRestoreInstanceState(state: Parcelable?) {
|
|
|
|
|
if (state is SavedState) {
|
|
|
|
|
super.onRestoreInstanceState(state.superState)
|
|
|
|
|
isChecked = state.isChecked
|
|
|
|
|
} else {
|
|
|
|
|
super.onRestoreInstanceState(state)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun interface OnCheckedChangeListener {
|
|
|
|
|
|
|
|
|
|
fun onCheckedChanged(view: CheckableImageView, isChecked: Boolean)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private companion object {
|
|
|
|
|
private class SavedState : BaseSavedState {
|
|
|
|
|
|
|
|
|
|
val isChecked: Boolean
|
|
|
|
|
|
|
|
|
|
constructor(superState: Parcelable, checked: Boolean) : super(superState) {
|
|
|
|
|
isChecked = checked
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
constructor(source: Parcel) : super(source) {
|
|
|
|
|
isChecked = ParcelCompat.readBoolean(source)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private val CHECKED_STATE_SET = intArrayOf(android.R.attr.state_checked)
|
|
|
|
|
override fun writeToParcel(out: Parcel, flags: Int) {
|
|
|
|
|
super.writeToParcel(out, flags)
|
|
|
|
|
ParcelCompat.writeBoolean(out, isChecked)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
|
@JvmField
|
|
|
|
|
val CREATOR: Creator<SavedState> = object : Creator<SavedState> {
|
|
|
|
|
override fun createFromParcel(`in`: Parcel) = SavedState(`in`)
|
|
|
|
|
|
|
|
|
|
override fun newArray(size: Int): Array<SavedState?> = arrayOfNulls(size)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|