diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/VideoPlayerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/VideoPlayerActivity.kt index 3dd255b34..b25d98b0c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/VideoPlayerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/VideoPlayerActivity.kt @@ -5,7 +5,6 @@ import android.content.Intent import android.content.pm.ActivityInfo import android.content.res.Configuration import android.graphics.Color -import android.graphics.Matrix import android.graphics.Point import android.graphics.SurfaceTexture import android.graphics.drawable.ColorDrawable @@ -43,27 +42,18 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen private var mScreenWidth = 0 private var mCurrTime = 0 private var mDuration = 0 - private var mSaveScale = 1f - private var mRight = 0f - private var mBottom = 0f - private var mLastTouchX = 0f - private var mLastTouchY = 0f private var mDragThreshold = 0f private var mTouchDownX = 0f private var mTouchDownY = 0f private var mTouchDownTime = 0L private var mProgressAtDown = 0L private var mCloseDownThreshold = 100f - private var mCurrZoomMode = ZOOM_MODE_NONE private var mUri: Uri? = null private var mExoPlayer: SimpleExoPlayer? = null private var mVideoSize = Point(0, 0) private var mTimerHandler = Handler() private var mPlayWhenReadyHandler = Handler() - private var mScaleDetector: ScaleGestureDetector? = null - private var mMatrices = FloatArray(9) - private val mMatrix = Matrix() private var mIgnoreCloseDown = false @@ -168,6 +158,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen video_curr_time.setOnClickListener { skip(false) } video_duration.setOnClickListener { skip(true) } video_toggle_play_pause.setOnClickListener { togglePlayPause() } + video_surface_frame.setOnClickListener { toggleFullscreen() } video_next_file.beVisibleIf(intent.getBooleanExtra(SHOW_NEXT_ITEM, false)) video_next_file.setOnClickListener { handleNextFile() } @@ -175,14 +166,9 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen video_prev_file.beVisibleIf(intent.getBooleanExtra(SHOW_PREV_ITEM, false)) video_prev_file.setOnClickListener { handlePrevFile() } - video_player_holder.setOnTouchListener { view, event -> + video_surface_frame.setOnTouchListener { view, event -> handleEvent(event) - true - } - - video_surface.setOnTouchListener { view, event -> - handleEventWithZooming(event) - true + false } initExoPlayer() @@ -208,7 +194,6 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen } mDragThreshold = DRAG_THRESHOLD * resources.displayMetrics.density - mScaleDetector = ScaleGestureDetector(applicationContext, ScaleListener()) } private fun initExoPlayer() { @@ -510,7 +495,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen val diffX = event.x - mTouchDownX val diffY = event.y - mTouchDownY - if (mIsDragged || (Math.abs(diffX) > mDragThreshold && Math.abs(diffX) > Math.abs(diffY))) { + if (mIsDragged || (Math.abs(diffX) > mDragThreshold && Math.abs(diffX) > Math.abs(diffY)) && video_surface_frame.controller.state.zoom == 1f) { if (!mIsDragged) { arrayOf(video_curr_time, video_seekbar, video_duration).forEach { it.animate().alpha(1f).start() @@ -549,10 +534,6 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen if (!mIsPlaying) { togglePlayPause() } - } else { - if (Math.abs(diffX) < CLICK_MAX_DISTANCE && Math.abs(diffY) < CLICK_MAX_DISTANCE && System.currentTimeMillis() - mTouchDownTime < CLICK_MAX_DURATION) { - toggleFullscreen() - } } mIsDragged = false } @@ -627,150 +608,4 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen } override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture?, width: Int, height: Int) {} - - private fun handleEventWithZooming(event: MotionEvent) { - mScaleDetector?.onTouchEvent(event) - - mMatrix.getValues(mMatrices) - val x = mMatrices[Matrix.MTRANS_X] - val y = mMatrices[Matrix.MTRANS_Y] - - when (event.actionMasked) { - MotionEvent.ACTION_DOWN -> { - mTouchDownTime = System.currentTimeMillis() - mCurrZoomMode = ZOOM_MODE_DRAG - mLastTouchX = event.x - mLastTouchY = event.y - - mTouchDownX = event.x - mTouchDownY = event.y - mProgressAtDown = mExoPlayer!!.currentPosition - } - MotionEvent.ACTION_UP -> { - mCurrZoomMode = ZOOM_MODE_NONE - val diffX = mTouchDownX - event.x - val diffY = mTouchDownY - event.y - - val downGestureDuration = System.currentTimeMillis() - mTouchDownTime - if (!mIgnoreCloseDown && Math.abs(diffY) > Math.abs(diffX) && diffY < -mCloseDownThreshold && downGestureDuration < MAX_CLOSE_DOWN_GESTURE_DURATION && mSaveScale == 1f) { - supportFinishAfterTransition() - } - mIgnoreCloseDown = false - - if (mIsDragged) { - if (mIsFullscreen) { - arrayOf(video_curr_time, video_seekbar, video_duration).forEach { - it.animate().alpha(0f).start() - } - } - - if (!mIsPlaying) { - togglePlayPause() - } - } else { - if (Math.abs(diffX) < CLICK_MAX_DISTANCE && Math.abs(diffY) < CLICK_MAX_DISTANCE && System.currentTimeMillis() - mTouchDownTime < CLICK_MAX_DURATION) { - toggleFullscreen() - } - } - - mIsDragged = false - } - MotionEvent.ACTION_POINTER_DOWN -> { - mLastTouchX = event.x - mLastTouchY = event.y - mCurrZoomMode = ZOOM_MODE_ZOOM - mIgnoreCloseDown = true - } - MotionEvent.ACTION_MOVE -> { - val diffX = event.x - mTouchDownX - val diffY = event.y - mTouchDownY - if (mSaveScale == 1f && (mIsDragged || (Math.abs(diffX) > mDragThreshold && Math.abs(diffX) > Math.abs(diffY)))) { - if (!mIsDragged) { - arrayOf(video_curr_time, video_seekbar, video_duration).forEach { - it.animate().alpha(1f).start() - } - } - mIgnoreCloseDown = true - mIsDragged = true - var percent = ((diffX / mScreenWidth) * 100).toInt() - percent = Math.min(100, Math.max(-100, percent)) - - val skipLength = (mDuration * 1000f) * (percent / 100f) - var newProgress = mProgressAtDown + skipLength - newProgress = Math.max(Math.min(mExoPlayer!!.duration.toFloat(), newProgress), 0f) - val newSeconds = (newProgress / 1000).toInt() - setPosition(newSeconds) - resetPlayWhenReady() - } else if (mCurrZoomMode == ZOOM_MODE_ZOOM || mCurrZoomMode == ZOOM_MODE_DRAG && mSaveScale > MIN_VIDEO_ZOOM_SCALE) { - var deltaX = event.x - mLastTouchX - var deltaY = event.y - mLastTouchY - if (y + deltaY > 0) { - deltaY = -y - } else if (y + deltaY < -mBottom) { - deltaY = -(y + mBottom) - } - - if (x + deltaX > 0) { - deltaX = -x - } else if (x + deltaX < -mRight) { - deltaX = -(x + mRight) - } - - mMatrix.postTranslate(deltaX, deltaY) - mLastTouchX = event.x - mLastTouchY = event.y - } - } - MotionEvent.ACTION_POINTER_UP -> { - mCurrZoomMode = ZOOM_MODE_NONE - } - } - - video_surface.setTransform(mMatrix) - video_surface.invalidate() - } - - // taken from https://github.com/Manuiq/ZoomableTextureView - private inner class ScaleListener : ScaleGestureDetector.SimpleOnScaleGestureListener() { - override fun onScaleBegin(detector: ScaleGestureDetector): Boolean { - mCurrZoomMode = ZOOM_MODE_ZOOM - return true - } - - override fun onScale(detector: ScaleGestureDetector): Boolean { - val width = video_surface.width - val height = video_surface.height - if (width <= 0 || height <= 0) { - return true - } - - var scaleFactor = detector.scaleFactor - val origScale = mSaveScale - mSaveScale *= scaleFactor - - if (mSaveScale > MAX_VIDEO_ZOOM_SCALE) { - mSaveScale = MAX_VIDEO_ZOOM_SCALE - scaleFactor = MAX_VIDEO_ZOOM_SCALE / origScale - } else if (mSaveScale < MIN_VIDEO_ZOOM_SCALE) { - mSaveScale = MIN_VIDEO_ZOOM_SCALE - scaleFactor = MIN_VIDEO_ZOOM_SCALE / origScale - } - - mRight = width * mSaveScale - width - mBottom = height * mSaveScale - height - mMatrix.postScale(scaleFactor, scaleFactor, detector.focusX, detector.focusY) - if (scaleFactor < 1) { - mMatrix.getValues(mMatrices) - val y = mMatrices[Matrix.MTRANS_Y] - if (scaleFactor < 1) { - if (y < -mBottom) { - mMatrix.postTranslate(0f, -(y + mBottom)) - } else if (y > 0) { - mMatrix.postTranslate(0f, -y) - } - } - } - return true - } - } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/VideoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/VideoFragment.kt index b8c0ea5da..e7f790e7c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/VideoFragment.kt @@ -115,11 +115,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S false } - video_surface.setOnTouchListener { view, event -> - handleEvent(event) - false - } - video_surface_frame.setOnTouchListener { view, event -> handleEvent(event) false diff --git a/app/src/main/res/layout/activity_video_player.xml b/app/src/main/res/layout/activity_video_player.xml index a87ee4cc5..934a92a92 100644 --- a/app/src/main/res/layout/activity_video_player.xml +++ b/app/src/main/res/layout/activity_video_player.xml @@ -12,11 +12,18 @@ android:layout_height="@dimen/default_status_action_height" android:background="@drawable/gradient_background_flipped"/> - + + + + +