proton-mail-android/app/src/main/java/ch/protonmail/android/activities/messageDetails/body/MessageBodyTouchListener.kt

72 lines
2.5 KiB
Kotlin

/*
* Copyright (c) 2022 Proton AG
*
* This file is part of Proton Mail.
*
* Proton Mail is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Proton Mail is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Proton Mail. If not, see https://www.gnu.org/licenses/.
*/
package ch.protonmail.android.activities.messageDetails.body
import android.view.MotionEvent
import android.view.ScaleGestureDetector
import android.view.View
import android.view.ViewParent
import android.webkit.WebView
internal class MessageBodyTouchListener(
private val wvScrollView: ViewParent,
private val scaleDetector: ScaleGestureDetector,
private val scaledTouchSlop: Int
) : View.OnTouchListener {
private var mDownX = 0f
private var mDownY = 0f
override fun onTouch(v: View, motionEvent: MotionEvent): Boolean {
if (v is WebView) {
when (motionEvent.actionMasked) {
MotionEvent.ACTION_DOWN -> {
mDownX = motionEvent.rawX
mDownY = motionEvent.rawY
}
MotionEvent.ACTION_MOVE -> {
val deltaX = motionEvent.rawX - mDownX
val deltaY = motionEvent.rawY - mDownY
if (Math.abs(deltaX) > scaledTouchSlop && Math.abs(
deltaY
) < scaledTouchSlop || motionEvent.pointerCount > 1
) {
wvScrollView.requestDisallowInterceptTouchEvent(true)
}
}
MotionEvent.ACTION_UP -> {
mDownX = 0f
mDownY = 0f
wvScrollView.requestDisallowInterceptTouchEvent(false)
}
MotionEvent.ACTION_CANCEL -> {
mDownX = 0f
mDownY = 0f
wvScrollView.requestDisallowInterceptTouchEvent(false)
}
else -> {
// NO OP
}
}
}
scaleDetector.onTouchEvent(motionEvent)
return false
}
}