That fuck shit the fascists are using
at master 105 lines 2.8 kB view raw
1package org.tm.archive.components 2 3import android.annotation.SuppressLint 4import android.content.Context 5import android.util.AttributeSet 6import android.view.MotionEvent 7import android.view.animation.DecelerateInterpolator 8import androidx.appcompat.widget.AppCompatTextView 9import org.tm.archive.R 10 11class PlaybackSpeedToggleTextView @JvmOverloads constructor( 12 context: Context, 13 attrs: AttributeSet? = null, 14 defStyleAttr: Int = 0 15) : AppCompatTextView(context, attrs, defStyleAttr) { 16 17 private val speeds: IntArray = context.resources.getIntArray(R.array.PlaybackSpeedToggleTextView__speeds) 18 private val labels: Array<String> = context.resources.getStringArray(R.array.PlaybackSpeedToggleTextView__speed_labels) 19 private var currentSpeedIndex = 0 20 private var requestedSpeed: Float? = null 21 22 var playbackSpeedListener: PlaybackSpeedListener? = null 23 24 init { 25 text = getCurrentLabel() 26 super.setOnClickListener { 27 currentSpeedIndex = getNextSpeedIndex() 28 text = getCurrentLabel() 29 requestedSpeed = getCurrentSpeed() 30 31 playbackSpeedListener?.onPlaybackSpeedChanged(getCurrentSpeed()) 32 } 33 34 isClickable = false 35 } 36 37 @SuppressLint("ClickableViewAccessibility") 38 override fun onTouchEvent(event: MotionEvent?): Boolean { 39 if (isClickable) { 40 when (event?.action) { 41 MotionEvent.ACTION_DOWN -> zoomIn() 42 MotionEvent.ACTION_UP -> zoomOut() 43 MotionEvent.ACTION_CANCEL -> zoomOut() 44 } 45 } 46 47 return super.onTouchEvent(event) 48 } 49 50 fun clearRequestedSpeed() { 51 requestedSpeed = null 52 } 53 54 fun setCurrentSpeed(speed: Float) { 55 if (speed == getCurrentSpeed() || (requestedSpeed != null && requestedSpeed != speed)) { 56 if (requestedSpeed == speed) { 57 requestedSpeed = null 58 } 59 60 return 61 } 62 63 requestedSpeed = null 64 65 val outOf100 = (speed * 100).toInt() 66 val index = speeds.indexOf(outOf100) 67 68 if (index != -1) { 69 currentSpeedIndex = index 70 text = getCurrentLabel() 71 } else { 72 throw IllegalArgumentException("Invalid Speed $speed") 73 } 74 } 75 76 private fun getNextSpeedIndex(): Int = (currentSpeedIndex + 1) % speeds.size 77 78 private fun getCurrentSpeed(): Float = speeds[currentSpeedIndex] / 100f 79 80 private fun getCurrentLabel(): String = labels[currentSpeedIndex] 81 82 private fun zoomIn() { 83 animate() 84 .setInterpolator(DecelerateInterpolator()) 85 .setDuration(150L) 86 .scaleX(1.2f) 87 .scaleY(1.2f) 88 } 89 90 private fun zoomOut() { 91 animate() 92 .setInterpolator(DecelerateInterpolator()) 93 .setDuration(150L) 94 .scaleX(1f) 95 .scaleY(1f) 96 } 97 98 override fun setOnClickListener(l: OnClickListener?) { 99 throw UnsupportedOperationException() 100 } 101 102 interface PlaybackSpeedListener { 103 fun onPlaybackSpeedChanged(speed: Float) 104 } 105}