diff --git a/app/src/main/java/com/github/libretube/ui/extensions/ViewAnimations.kt b/app/src/main/java/com/github/libretube/ui/extensions/ViewAnimations.kt new file mode 100644 index 000000000..9cb78ba0e --- /dev/null +++ b/app/src/main/java/com/github/libretube/ui/extensions/ViewAnimations.kt @@ -0,0 +1,23 @@ +package com.github.libretube.ui.extensions + +import android.view.View + +/** + * This function animates a view in a downward direction by a specified amount. + * + * @param duration The duration of the animation in milliseconds. + * @param dy The distance to move the view along the Y-axis. + * @param onEnd An optional lambda function that is invoked when the animation ends. + */ +fun View.animateDown( + duration: Long, + dy: Float, + onEnd: () -> Unit = { } +) { + this + .animate() + .withEndAction { onEnd.invoke() } + .y(dy) + .setDuration(duration) + .start() +} \ No newline at end of file diff --git a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt index 17c1001a9..5d6aa1d48 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt @@ -97,6 +97,7 @@ import com.github.libretube.ui.base.BaseActivity import com.github.libretube.ui.dialogs.AddToPlaylistDialog import com.github.libretube.ui.dialogs.DownloadDialog import com.github.libretube.ui.dialogs.ShareDialog +import com.github.libretube.ui.extensions.animateDown import com.github.libretube.ui.extensions.setupSubscriptionButton import com.github.libretube.ui.interfaces.OnlinePlayerOptions import com.github.libretube.ui.listeners.SeekbarPreviewListener @@ -461,12 +462,18 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions { } }) - binding.playerMotionLayout.addSwipeUpListener { - if (this::streams.isInitialized && PlayerHelper.fullscreenGesturesEnabled) { - binding.player.hideController() - setFullscreen() + binding.playerMotionLayout + .addSwipeUpListener { + if (this::streams.isInitialized && PlayerHelper.fullscreenGesturesEnabled) { + binding.player.hideController() + setFullscreen() + } + } + .addSwipeDownListener { + if (viewModel.isMiniPlayerVisible.value == true) { + closeMiniPlayer() + } } - } binding.playerMotionLayout.progress = 1F binding.playerMotionLayout.transitionToStart() @@ -477,6 +484,16 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions { } } + private fun closeMiniPlayer() { + binding + .playerMotionLayout + .animateDown( + duration = 300L, + dy = 500F, + onEnd = ::killPlayerFragment, + ) + } + private fun onManualPlayerClose() { PlayingQueue.clear() BackgroundHelper.stopBackgroundPlay(requireContext()) diff --git a/app/src/main/java/com/github/libretube/ui/views/SingleViewTouchableMotionLayout.kt b/app/src/main/java/com/github/libretube/ui/views/SingleViewTouchableMotionLayout.kt index c25722a2a..f52f0787a 100644 --- a/app/src/main/java/com/github/libretube/ui/views/SingleViewTouchableMotionLayout.kt +++ b/app/src/main/java/com/github/libretube/ui/views/SingleViewTouchableMotionLayout.kt @@ -21,6 +21,7 @@ class SingleViewTouchableMotionLayout(context: Context, attributeSet: AttributeS private var touchStarted = false private val transitionListenerList = mutableListOf() private val swipeUpListener = mutableListOf<() -> Unit>() + private val swipeDownListener = mutableListOf<() -> Unit>() init { addTransitionListener(object : TransitionAdapter() { @@ -63,18 +64,29 @@ class SingleViewTouchableMotionLayout(context: Context, attributeSet: AttributeS distanceX: Float, distanceY: Float ): Boolean { - if (progress != 0F || distanceY < 30F) return false - swipeUpListener.forEach { - it.invoke() + + if (distanceY < -15F) { + swipeDownListener.forEach { it.invoke() } + return true } - return true + + if (progress == 0F && distanceY > 30F) { + swipeUpListener.forEach { it.invoke() } + return true + } + + return false } } - fun addSwipeUpListener(listener: () -> Unit) { + fun addSwipeUpListener(listener: () -> Unit) = apply { swipeUpListener.add(listener) } + fun addSwipeDownListener(listener: () -> Unit) = apply { + swipeDownListener.add(listener) + } + private val gestureDetector = GestureDetector(context, Listener()) @SuppressLint("ClickableViewAccessibility")