kotlin swipe listener

import android.content.Context
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.View
import androidx.core.view.GestureDetectorCompat
import kotlin.math.abs

class SwipeListener(context: Context, private val onSwipe: (SwipeDirection) -> Unit) : View.OnTouchListener {

    private val gestureDetector: GestureDetectorCompat

    init {
        gestureDetector = GestureDetectorCompat(context, GestureListener())
    }

    override fun onTouch(view: View?, event: MotionEvent?): Boolean {
        return gestureDetector.onTouchEvent(event)
    }

    private inner class GestureListener : GestureDetector.SimpleOnGestureListener() {

        private val SWIPE_THRESHOLD = 100
        private val SWIPE_VELOCITY_THRESHOLD = 100

        override fun onFling(
            e1: MotionEvent?,
            e2: MotionEvent?,
            velocityX: Float,
            velocityY: Float
        ): Boolean {
            val distanceX = e2?.x?.minus(e1?.x ?: 0f) ?: 0f
            val distanceY = e2?.y?.minus(e1?.y ?: 0f) ?: 0f

            if (abs(distanceX) > abs(distanceY) &&
                abs(distanceX) > SWIPE_THRESHOLD &&
                abs(velocityX) > SWIPE_VELOCITY_THRESHOLD
            ) {
                onSwipe.invoke(if (distanceX > 0) SwipeDirection.RIGHT else SwipeDirection.LEFT)
                return true
            } else if (abs(distanceY) > SWIPE_THRESHOLD &&
                abs(velocityY) > SWIPE_VELOCITY_THRESHOLD
            ) {
                onSwipe.invoke(if (distanceY > 0) SwipeDirection.DOWN else SwipeDirection.UP)
                return true
            }

            return false
        }
    }
}

enum class SwipeDirection {
    UP, DOWN, LEFT, RIGHT
}