diff --git a/src/org/thoughtcrime/securesms/loki/views/WaveformSeekBar.kt b/src/org/thoughtcrime/securesms/loki/views/WaveformSeekBar.kt index 3870bad7fa..56ddb0f3c5 100644 --- a/src/org/thoughtcrime/securesms/loki/views/WaveformSeekBar.kt +++ b/src/org/thoughtcrime/securesms/loki/views/WaveformSeekBar.kt @@ -15,7 +15,7 @@ import android.view.animation.DecelerateInterpolator import androidx.core.math.MathUtils import network.loki.messenger.R import org.thoughtcrime.securesms.loki.utilities.audio.byteToNormalizedFloat -import java.lang.Math.abs +import kotlin.math.abs import kotlin.math.max import kotlin.math.min import kotlin.math.roundToInt @@ -111,7 +111,9 @@ class WaveformSeekBar : View { private var canvasWidth = 0 private var canvasHeight = 0 + private var touchDownX = 0f + private var touchDownProgress: Float = 0f private var scaledTouchSlop = ViewConfiguration.get(context).scaledTouchSlop constructor(context: Context) : this(context, null) @@ -185,47 +187,31 @@ class WaveformSeekBar : View { when (event.action) { MotionEvent.ACTION_DOWN -> { userSeeking = true - if (isParentScrolling()) { - touchDownX = event.x - } else { - updateProgress(event, false) - } + touchDownX = event.x + touchDownProgress = progress + updateProgress(event, false) } MotionEvent.ACTION_MOVE -> { + // Prevent any parent scrolling if the user scrolled more + // than scaledTouchSlop on horizontal axis. + if (abs(event.x - touchDownX) > scaledTouchSlop) { + parent.requestDisallowInterceptTouchEvent(true) + } updateProgress(event, false) } MotionEvent.ACTION_UP -> { userSeeking = false - if (abs(event.x - touchDownX) > scaledTouchSlop) { - updateProgress(event, true) - } + updateProgress(event, true) performClick() } MotionEvent.ACTION_CANCEL -> { + updateProgress(touchDownProgress, false) userSeeking = false } } return true } - private fun isParentScrolling(): Boolean { - var parent = parent as View - val root = rootView - - while (true) { - when { - parent.canScrollHorizontally(+1) -> return true - parent.canScrollHorizontally(-1) -> return true - parent.canScrollVertically(+1) -> return true - parent.canScrollVertically(-1) -> return true - } - - if (parent == root) return false - - parent = parent.parent as View - } - } - private fun updateProgress(event: MotionEvent, notify: Boolean) { updateProgress(event.x / getAvailableWidth(), notify) }