Update list badges
parent
c2079ebca5
commit
15f37644c0
@ -0,0 +1,100 @@
|
|||||||
|
package org.koitharu.kotatsu.core.ui.widgets
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.os.Parcel
|
||||||
|
import android.os.Parcelable
|
||||||
|
import android.os.Parcelable.Creator
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import androidx.core.content.withStyledAttributes
|
||||||
|
import androidx.customview.view.AbsSavedState
|
||||||
|
import com.google.android.material.shape.MaterialShapeDrawable
|
||||||
|
import com.google.android.material.shape.ShapeAppearanceModel
|
||||||
|
import com.google.android.material.textview.MaterialTextView
|
||||||
|
import org.koitharu.kotatsu.R
|
||||||
|
|
||||||
|
class BadgeView @JvmOverloads constructor(
|
||||||
|
context: Context,
|
||||||
|
attrs: AttributeSet? = null
|
||||||
|
) : MaterialTextView(context, attrs, R.attr.badgeViewStyle) {
|
||||||
|
|
||||||
|
private var maxCharacterCount = Int.MAX_VALUE
|
||||||
|
|
||||||
|
var number: Int = 0
|
||||||
|
set(value) {
|
||||||
|
field = value
|
||||||
|
updateText()
|
||||||
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
context.withStyledAttributes(attrs, R.styleable.BadgeView) {
|
||||||
|
maxCharacterCount = getInt(R.styleable.BadgeView_maxCharacterCount, maxCharacterCount)
|
||||||
|
number = getInt(R.styleable.BadgeView_number, number)
|
||||||
|
val shape = ShapeAppearanceModel.builder(
|
||||||
|
context,
|
||||||
|
getResourceId(R.styleable.BadgeView_shapeAppearance, 0),
|
||||||
|
0,
|
||||||
|
).build()
|
||||||
|
background = MaterialShapeDrawable(shape).also { bg ->
|
||||||
|
bg.fillColor = getColorStateList(R.styleable.BadgeView_backgroundColor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onSaveInstanceState(): Parcelable? {
|
||||||
|
val superState = super.onSaveInstanceState() ?: return null
|
||||||
|
return SavedState(superState, number)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onRestoreInstanceState(state: Parcelable?) {
|
||||||
|
if (state is SavedState) {
|
||||||
|
super.onRestoreInstanceState(state.superState)
|
||||||
|
number = state.number
|
||||||
|
} else {
|
||||||
|
super.onRestoreInstanceState(state)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateText() {
|
||||||
|
if (number <= 0) {
|
||||||
|
text = null
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val numberString = number.toString()
|
||||||
|
text = if (numberString.length > maxCharacterCount) {
|
||||||
|
buildString(maxCharacterCount) {
|
||||||
|
repeat(maxCharacterCount - 1) { append('9') }
|
||||||
|
append('+')
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
numberString
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class SavedState : AbsSavedState {
|
||||||
|
|
||||||
|
val number: Int
|
||||||
|
|
||||||
|
constructor(superState: Parcelable, number: Int) : super(superState) {
|
||||||
|
this.number = number
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(source: Parcel, classLoader: ClassLoader?) : super(source, classLoader) {
|
||||||
|
number = source.readInt()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun writeToParcel(out: Parcel, flags: Int) {
|
||||||
|
super.writeToParcel(out, flags)
|
||||||
|
out.writeInt(number)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
@Suppress("unused")
|
||||||
|
@JvmField
|
||||||
|
val CREATOR: Creator<SavedState> = object : Creator<SavedState> {
|
||||||
|
override fun createFromParcel(`in`: Parcel) = SavedState(`in`, SavedState::class.java.classLoader)
|
||||||
|
|
||||||
|
override fun newArray(size: Int): Array<SavedState?> = arrayOfNulls(size)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue