revanced-integrations/app/src/main/java/app/revanced/integrations/youtube/swipecontrols/controller/gesture/PressToSwipeController.kt

79 lines
2.7 KiB
Kotlin

package app.revanced.integrations.youtube.swipecontrols.controller.gesture
import android.view.MotionEvent
import app.revanced.integrations.youtube.swipecontrols.SwipeControlsHostActivity
import app.revanced.integrations.youtube.swipecontrols.controller.gesture.core.BaseGestureController
import app.revanced.integrations.youtube.swipecontrols.controller.gesture.core.SwipeDetector
import app.revanced.integrations.youtube.swipecontrols.misc.contains
import app.revanced.integrations.youtube.swipecontrols.misc.toPoint
/**
* provides the press-to-swipe (PtS) swipe controls experience
*
* @param controller reference to the main swipe controller
*/
class PressToSwipeController(
private val controller: SwipeControlsHostActivity
) : BaseGestureController(controller) {
/**
* monitors if the user is currently in a swipe session.
*/
private var isInSwipeSession = false
override val shouldForceInterceptEvents: Boolean
get() = currentSwipe == SwipeDetector.SwipeDirection.VERTICAL && isInSwipeSession
override fun shouldDropMotion(motionEvent: MotionEvent): Boolean = false
override fun isInSwipeZone(motionEvent: MotionEvent): Boolean {
val inVolumeZone = if (controller.config.enableVolumeControls) {
(motionEvent.toPoint() in controller.zones.volume)
} else {
false
}
val inBrightnessZone = if (controller.config.enableBrightnessControl) {
(motionEvent.toPoint() in controller.zones.brightness)
} else {
false
}
return inVolumeZone || inBrightnessZone
}
override fun onUp(motionEvent: MotionEvent) {
super.onUp(motionEvent)
isInSwipeSession = false
}
override fun onLongPress(motionEvent: MotionEvent) {
// enter swipe session with feedback
isInSwipeSession = true
controller.overlay.onEnterSwipeSession()
// send GestureDetector a ACTION_CANCEL event so it will handle further events
motionEvent.action = MotionEvent.ACTION_CANCEL
detector.onTouchEvent(motionEvent)
}
override fun onSwipe(
from: MotionEvent,
to: MotionEvent,
distanceX: Double,
distanceY: Double
): Boolean {
// cancel if not in swipe session or vertical
if (!isInSwipeSession || currentSwipe != SwipeDetector.SwipeDirection.VERTICAL) return false
return when (from.toPoint()) {
in controller.zones.volume -> {
scrollVolume(distanceY)
true
}
in controller.zones.brightness -> {
scrollBrightness(distanceY)
true
}
else -> false
}
}
}