That fuck shit the fascists are using
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}