diff --git a/app/src/main/java/com/github/libretube/ui/interfaces/PlayerGestureOptions.kt b/app/src/main/java/com/github/libretube/ui/interfaces/PlayerGestureOptions.kt index ee6e60dd1..81602351a 100644 --- a/app/src/main/java/com/github/libretube/ui/interfaces/PlayerGestureOptions.kt +++ b/app/src/main/java/com/github/libretube/ui/interfaces/PlayerGestureOptions.kt @@ -15,4 +15,8 @@ interface PlayerGestureOptions { fun onSwipeRightScreen(distanceY: Float) fun onSwipeEnd() + + fun onZoom() + + fun onMinimize() } diff --git a/app/src/main/java/com/github/libretube/ui/views/CustomExoPlayerView.kt b/app/src/main/java/com/github/libretube/ui/views/CustomExoPlayerView.kt index ccb198f29..9b4ece133 100644 --- a/app/src/main/java/com/github/libretube/ui/views/CustomExoPlayerView.kt +++ b/app/src/main/java/com/github/libretube/ui/views/CustomExoPlayerView.kt @@ -492,4 +492,12 @@ internal class CustomExoPlayerView( gestureViewBinding.brightnessControlView.visibility = View.GONE gestureViewBinding.volumeControlView.visibility = View.GONE } + + override fun onZoom() { + resizeMode = AspectRatioFrameLayout.RESIZE_MODE_ZOOM + } + + override fun onMinimize() { + resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIT + } } diff --git a/app/src/main/java/com/github/libretube/util/PlayerGestureController.kt b/app/src/main/java/com/github/libretube/util/PlayerGestureController.kt index d647306b8..a90caa195 100644 --- a/app/src/main/java/com/github/libretube/util/PlayerGestureController.kt +++ b/app/src/main/java/com/github/libretube/util/PlayerGestureController.kt @@ -9,6 +9,7 @@ import android.os.Looper import android.os.SystemClock import android.view.GestureDetector import android.view.MotionEvent +import android.view.ScaleGestureDetector import android.view.View import com.github.libretube.ui.interfaces.PlayerGestureOptions import kotlin.math.abs @@ -24,11 +25,13 @@ class PlayerGestureController(context: Context, private val listner: PlayerGestu private val handler: Handler = Handler(Looper.getMainLooper()) private val gestureDetector: GestureDetector + private val scaleGestureDetector: ScaleGestureDetector private var isMoving = false var isEnabled = true init { gestureDetector = GestureDetector(context, GestureListener(), handler) + scaleGestureDetector = ScaleGestureDetector(context, ScaleGestureListener(), handler) } @SuppressLint("ClickableViewAccessibility") @@ -40,13 +43,35 @@ class PlayerGestureController(context: Context, private val listner: PlayerGestu // Event can be already consumed by some view which may lead to NPE. try { - gestureDetector.onTouchEvent(event) + val consumed = gestureDetector.onTouchEvent(event) + if (!consumed) scaleGestureDetector.onTouchEvent(event) } catch (_: Exception) { } // If orientation is landscape then allow `onScroll` to consume event and return true. return orientation == Configuration.ORIENTATION_LANDSCAPE } + private inner class ScaleGestureListener : ScaleGestureDetector.OnScaleGestureListener { + var scaleFactor: Float = 1f + + override fun onScale(detector: ScaleGestureDetector): Boolean { + scaleFactor *= detector.scaleFactor + return true + } + + override fun onScaleBegin(detector: ScaleGestureDetector): Boolean { + return true + } + + override fun onScaleEnd(detector: ScaleGestureDetector) { + when { + scaleFactor < 0.8 -> listner.onMinimize() + scaleFactor > 1.2 -> listner.onZoom() + } + scaleFactor = 1f + } + } + private inner class GestureListener : GestureDetector.SimpleOnGestureListener() { private var lastClick = 0L private var lastDoubleClick = 0L