Remove NoLeakThumbView

Remove the old NoLeakThumbView class, apparently I didnt remove it before?
This commit is contained in:
OxygenCobalt 2021-02-28 15:01:38 -07:00
parent 917540e626
commit abd5b3ca8d
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
2 changed files with 0 additions and 171 deletions

View file

@ -8,7 +8,6 @@ import android.util.AttributeSet
import androidx.annotation.RequiresApi
import androidx.appcompat.widget.AppCompatImageButton
import org.oxycblt.auxio.R
import org.oxycblt.auxio.logD
import org.oxycblt.auxio.ui.toAnimDrawable
/**

View file

@ -1,170 +0,0 @@
package org.oxycblt.auxio.recycler
import android.annotation.SuppressLint
import android.content.Context
import android.content.res.ColorStateList
import android.graphics.drawable.GradientDrawable
import android.os.Build
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.children
import androidx.core.view.isVisible
import androidx.core.widget.TextViewCompat
import androidx.dynamicanimation.animation.DynamicAnimation
import androidx.dynamicanimation.animation.SpringAnimation
import androidx.dynamicanimation.animation.SpringForce
import com.reddit.indicatorfastscroll.FastScrollItemIndicator
import com.reddit.indicatorfastscroll.FastScrollerView
import org.oxycblt.auxio.R
import org.oxycblt.auxio.ui.Accent
import org.oxycblt.auxio.ui.inflater
import org.oxycblt.auxio.ui.toColor
/**
* A semi-copy, semi-custom implementation of [com.reddit.indicatorfastscroll.FastScrollerThumbView]
* that fixes a memory leak that occurs from a bug fix they added.
* All credit goes to the authors of the fast scroll library.
*
* https://github.com/reddit/IndicatorFastScroll
* @author Reddit, OxygenCobalt
*/
class NoLeakThumbView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = R.attr.indicatorFastScrollerThumbStyle
) : ConstraintLayout(context, attrs, defStyleAttr),
FastScrollerView.ItemIndicatorSelectedCallback {
private val thumbColor = Accent.get().getStateList(context)
private val iconColor = R.color.background.toColor(context)
private val textAppearanceRes = R.style.TextAppearance_ThumbIndicator
private val textColor = R.color.background.toColor(context)
private val thumbView: ViewGroup
private val textView: TextView
private val iconView: ImageView
private val isSetup: Boolean get() = (fastScrollerView != null)
private var fastScrollerView: FastScrollerView? = null
private val thumbAnimation: SpringAnimation
init {
// --- VIEW SETUP ---
context.inflater.inflate(R.layout.fast_scroller_thumb_view, this, true)
thumbView = findViewById(R.id.fast_scroller_thumb)
textView = thumbView.findViewById(R.id.fast_scroller_thumb_text)
iconView = thumbView.findViewById(R.id.fast_scroller_thumb_icon)
// --- UI SETUP ---
isActivated = false
isVisible = false
thumbView.backgroundTintList = thumbColor
if (Build.VERSION.SDK_INT == 21) {
// Workaround for 21 background tint bug
(thumbView.background as GradientDrawable).apply {
mutate()
color = thumbColor
}
}
TextViewCompat.setTextAppearance(textView, textAppearanceRes)
textView.setTextColor(textColor)
iconView.imageTintList = ColorStateList.valueOf(iconColor)
thumbAnimation = SpringAnimation(thumbView, DynamicAnimation.TRANSLATION_Y).apply {
spring = SpringForce().apply {
dampingRatio = SpringForce.DAMPING_RATIO_NO_BOUNCY
}
}
}
/**
* Setup this view with a [FastScrollerView].
*/
@SuppressLint("ClickableViewAccessibility")
fun setupWithFastScroller(fastScrollerView: FastScrollerView) {
check(!isSetup) { "Only set this view's FastScrollerView once!" }
this.fastScrollerView = fastScrollerView
fastScrollerView.itemIndicatorSelectedCallbacks += this
// FastScrollerView's "onItemIndicatorTouched" [Which I would've used here] is internal,
// so instead I just use a setOnTouchListener to get the same-ish effect.
fastScrollerView.setOnTouchListener { _, event ->
fastScrollerView.onTouchEvent(event)
fastScrollerView.performClick()
isVisible = true
if (event.actionMasked == MotionEvent.ACTION_UP ||
event.actionMasked == MotionEvent.ACTION_CANCEL
) {
isActivated = false
return@setOnTouchListener true
}
isActivated = isPointerOnItem(fastScrollerView, event.y.toInt())
true
}
}
/**
* Hack so that I can detect when the pointer is on the FastScrollerView's items
* without using onItemIndicatorTouched (Which is internal)
* @author OxygenCobalt
*/
private fun isPointerOnItem(fastScrollerView: FastScrollerView, touchY: Int): Boolean {
fun View.containsY(y: Int) = y in (top until bottom)
var consumed = false
fastScrollerView.apply {
children.forEach { view ->
if (view.containsY(touchY)) {
consumed = true
return@forEach
}
}
}
return consumed
}
override fun onItemIndicatorSelected(
indicator: FastScrollItemIndicator,
indicatorCenterY: Int,
itemPosition: Int
) {
val thumbTargetY = indicatorCenterY.toFloat() - (thumbView.measuredHeight / 2)
thumbAnimation.animateToFinalPosition(thumbTargetY)
when (indicator) {
is FastScrollItemIndicator.Text -> {
textView.isVisible = true
iconView.isVisible = false
textView.text = indicator.text
}
is FastScrollItemIndicator.Icon -> {
textView.isVisible = false
iconView.isVisible = true
iconView.setImageResource(indicator.iconRes)
}
}
}
}