diff --git a/app/src/main/java/com/nextcloud/talk/fullscreenfile/FullScreenGestureListener.kt b/app/src/main/java/com/nextcloud/talk/fullscreenfile/FullScreenGestureListener.kt new file mode 100644 index 00000000000..1329b57d63d --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/fullscreenfile/FullScreenGestureListener.kt @@ -0,0 +1,42 @@ +/* + * Nextcloud Talk - Android Client + * + * SPDX-FileCopyrightText: 2025 Julius Linus + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package com.nextcloud.talk.fullscreenfile + +import android.content.Context +import android.view.GestureDetector +import android.view.MotionEvent +import android.view.ViewConfiguration +import kotlin.math.abs + +class FullScreenGestureListener(val context: Context, val callback: () -> Unit) : + GestureDetector.SimpleOnGestureListener() { + + private val viewConfig = ViewConfiguration.get(context) + private val minSwipeDistance = viewConfig.scaledTouchSlop + private val minSwipeVelocity = viewConfig.scaledMinimumFlingVelocity + + override fun onDown(event: MotionEvent): Boolean = true + + override fun onFling(e1: MotionEvent?, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean { + // Safety check for null start event + if (e1 == null) return false + + val deltaX = e2.x - e1.x + val deltaY = e2.y - e1.y + + if (abs(deltaY) > abs(deltaX)) { // Intended vertical swipe + + if (deltaY > minSwipeDistance && abs(velocityY) > minSwipeVelocity) { + callback() + return true + } + } + + return false + } +} diff --git a/app/src/main/java/com/nextcloud/talk/fullscreenfile/FullScreenImageActivity.kt b/app/src/main/java/com/nextcloud/talk/fullscreenfile/FullScreenImageActivity.kt index 0614d93b60e..e923f1e6c0c 100644 --- a/app/src/main/java/com/nextcloud/talk/fullscreenfile/FullScreenImageActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/fullscreenfile/FullScreenImageActivity.kt @@ -9,9 +9,11 @@ */ package com.nextcloud.talk.fullscreenfile +import android.annotation.SuppressLint import android.content.Intent import android.os.Bundle import android.util.Log +import android.view.GestureDetector import android.view.Menu import android.view.MenuItem import android.view.View @@ -43,6 +45,7 @@ class FullScreenImageActivity : AppCompatActivity() { private lateinit var windowInsetsController: WindowInsetsControllerCompat private lateinit var path: String private var showFullscreen = false + private lateinit var gestureDetector: GestureDetector override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_preview, menu) @@ -90,6 +93,7 @@ class FullScreenImageActivity : AppCompatActivity() { } } + @SuppressLint("ClickableViewAccessibility") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this) @@ -107,10 +111,23 @@ class FullScreenImageActivity : AppCompatActivity() { binding.photoView.setOnOutsidePhotoTapListener { toggleFullscreen() } + binding.gifView.setOnClickListener { toggleFullscreen() } + binding.photoView.setOnTouchListener { _, p1 -> + p1?.let { + gestureDetector.onTouchEvent(it) + } ?: false + } + + binding.gifView.setOnTouchListener { _, p1 -> + p1?.let { + gestureDetector.onTouchEvent(it) + } ?: false + } + // Enable enlarging the image more than default 3x maximumScale. // Medium scale adapted to make double-tap behaviour more consistent. binding.photoView.maximumScale = MAX_SCALE @@ -133,6 +150,13 @@ class FullScreenImageActivity : AppCompatActivity() { binding.photoView.visibility = View.VISIBLE displayImage(path) } + + gestureDetector = GestureDetector( + this, + FullScreenGestureListener(this) { + onBackPressedDispatcher.onBackPressed() + } + ) } private fun displayImage(path: String) { diff --git a/app/src/main/java/com/nextcloud/talk/fullscreenfile/FullScreenMediaActivity.kt b/app/src/main/java/com/nextcloud/talk/fullscreenfile/FullScreenMediaActivity.kt index 0bc48e0c8ae..258921f7673 100644 --- a/app/src/main/java/com/nextcloud/talk/fullscreenfile/FullScreenMediaActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/fullscreenfile/FullScreenMediaActivity.kt @@ -9,8 +9,10 @@ */ package com.nextcloud.talk.fullscreenfile +import android.annotation.SuppressLint import android.content.Intent import android.os.Bundle +import android.view.GestureDetector import android.view.Menu import android.view.MenuItem import android.view.ViewGroup.MarginLayoutParams @@ -52,6 +54,7 @@ class FullScreenMediaActivity : AppCompatActivity() { private var playWhenReadyState: Boolean = true private var playBackPosition: Long = 0L private lateinit var windowInsetsController: WindowInsetsControllerCompat + private lateinit var gestureDetector: GestureDetector override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_preview, menu) @@ -99,6 +102,7 @@ class FullScreenMediaActivity : AppCompatActivity() { } } + @SuppressLint("ClickableViewAccessibility") @OptIn(UnstableApi::class) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -122,6 +126,12 @@ class FullScreenMediaActivity : AppCompatActivity() { binding.playerView.controllerShowTimeoutMs = 0 } + binding.playerView.setOnTouchListener { _, p1 -> + p1?.let { + gestureDetector.onTouchEvent(it) + } ?: false + } + initWindowInsetsController() applyWindowInsets() @@ -134,6 +144,13 @@ class FullScreenMediaActivity : AppCompatActivity() { } } ) + + gestureDetector = GestureDetector( + this, + FullScreenGestureListener(this) { + onBackPressedDispatcher.onBackPressed() + } + ) } override fun onStart() {