diff --git a/app/src/main/kotlin/pe/aioo/openmoa/view/keyboardview/ArrowView.kt b/app/src/main/kotlin/pe/aioo/openmoa/view/keyboardview/ArrowView.kt index 67d6b6a..c1825e9 100644 --- a/app/src/main/kotlin/pe/aioo/openmoa/view/keyboardview/ArrowView.kt +++ b/app/src/main/kotlin/pe/aioo/openmoa/view/keyboardview/ArrowView.kt @@ -32,6 +32,11 @@ class ArrowView : ConstraintLayout { private lateinit var binding: ArrowViewBinding private var isSelecting = false + private var upKeyListener: RepeatKeyTouchListener? = null + private var downKeyListener: RepeatKeyTouchListener? = null + private var leftKeyListener: RepeatKeyTouchListener? = null + private var rightKeyListener: RepeatKeyTouchListener? = null + private var backspaceKeyListener: RepeatKeyTouchListener? = null private fun init() { inflate(context, R.layout.arrow_view, this) @@ -64,13 +69,12 @@ class ArrowView : ConstraintLayout { copyKey.setOnTouchListener( SimpleKeyTouchListener(context, SpecialKeyMessage(SpecialKey.COPY)) ) - upKey.setOnTouchListener( - FunctionalKeyTouchListener(context) { - SpecialKeyMessage( - if (isSelecting) SpecialKey.SELECT_ARROW_UP else SpecialKey.ARROW_UP - ) - } - ) + upKeyListener = RepeatKeyTouchListener(context) { + SpecialKeyMessage( + if (isSelecting) SpecialKey.SELECT_ARROW_UP else SpecialKey.ARROW_UP + ) + } + upKey.setOnTouchListener(upKeyListener) cutKey.setOnTouchListener( SimpleKeyTouchListener(context, SpecialKeyMessage(SpecialKey.CUT)) ) @@ -87,26 +91,24 @@ class ArrowView : ConstraintLayout { selectAllKey.setOnTouchListener( SimpleKeyTouchListener(context, SpecialKeyMessage(SpecialKey.SELECT_ALL)) ) - leftKey.setOnTouchListener( - FunctionalKeyTouchListener(context) { - SpecialKeyMessage( - if (isSelecting) SpecialKey.SELECT_ARROW_LEFT else SpecialKey.ARROW_LEFT - ) - } - ) + leftKeyListener = RepeatKeyTouchListener(context) { + SpecialKeyMessage( + if (isSelecting) SpecialKey.SELECT_ARROW_LEFT else SpecialKey.ARROW_LEFT + ) + } + leftKey.setOnTouchListener(leftKeyListener) areaSelectKey.setOnTouchListener( FunctionalKeyTouchListener(context) { setSelectingOrToggleSelecting() null } ) - rightKey.setOnTouchListener( - FunctionalKeyTouchListener(context) { - SpecialKeyMessage( - if (isSelecting) SpecialKey.SELECT_ARROW_RIGHT else SpecialKey.ARROW_RIGHT - ) - } - ) + rightKeyListener = RepeatKeyTouchListener(context) { + SpecialKeyMessage( + if (isSelecting) SpecialKey.SELECT_ARROW_RIGHT else SpecialKey.ARROW_RIGHT + ) + } + rightKey.setOnTouchListener(rightKeyListener) endKey.setOnTouchListener( FunctionalKeyTouchListener(context) { SpecialKeyMessage( @@ -117,19 +119,18 @@ class ArrowView : ConstraintLayout { deleteKey.setOnTouchListener( SimpleKeyTouchListener(context, SpecialKeyMessage(SpecialKey.DELETE)) ) - downKey.setOnTouchListener( - FunctionalKeyTouchListener(context) { - SpecialKeyMessage( - if (isSelecting) SpecialKey.SELECT_ARROW_DOWN else SpecialKey.ARROW_DOWN - ) - } - ) + downKeyListener = RepeatKeyTouchListener(context) { + SpecialKeyMessage( + if (isSelecting) SpecialKey.SELECT_ARROW_DOWN else SpecialKey.ARROW_DOWN + ) + } + downKey.setOnTouchListener(downKeyListener) pasteKey.setOnTouchListener( SimpleKeyTouchListener(context, SpecialKeyMessage(SpecialKey.PASTE)) ) - backspaceKey.setOnTouchListener( + backspaceKeyListener = RepeatKeyTouchListener(context, SpecialKeyMessage(SpecialKey.BACKSPACE)) - ) + backspaceKey.setOnTouchListener(backspaceKeyListener) languageKey.setOnTouchListener( SimpleKeyTouchListener(context, SpecialKeyMessage(SpecialKey.LANGUAGE)) ) @@ -145,4 +146,13 @@ class ArrowView : ConstraintLayout { } } + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + upKeyListener?.endTimer() + downKeyListener?.endTimer() + leftKeyListener?.endTimer() + rightKeyListener?.endTimer() + backspaceKeyListener?.endTimer() + } + } \ No newline at end of file diff --git a/app/src/main/kotlin/pe/aioo/openmoa/view/keytouchlistener/RepeatKeyTouchListener.kt b/app/src/main/kotlin/pe/aioo/openmoa/view/keytouchlistener/RepeatKeyTouchListener.kt index a8943e3..6834c01 100644 --- a/app/src/main/kotlin/pe/aioo/openmoa/view/keytouchlistener/RepeatKeyTouchListener.kt +++ b/app/src/main/kotlin/pe/aioo/openmoa/view/keytouchlistener/RepeatKeyTouchListener.kt @@ -9,26 +9,31 @@ import java.util.Timer class RepeatKeyTouchListener( context: Context, - private val key: BaseKeyMessage, + private val keyProvider: () -> BaseKeyMessage?, ) : BaseKeyTouchListener(context) { + constructor(context: Context, key: BaseKeyMessage) : this(context, { key }) + + @Volatile private var elapsed = 0L - private lateinit var timer: Timer + private var timer: Timer? = null private fun startTimer() { + endTimer() elapsed = 0L - sendKeyMessage(key) + keyProvider()?.let { sendKeyMessage(it) } timer = kotlin.concurrent.timer(period = config.longPressRepeatTime) { elapsed += config.longPressRepeatTime if (elapsed >= config.longPressThresholdTime) { - sendKeyMessage(key) + keyProvider()?.let { sendKeyMessage(it) } } } } - private fun endTimer() { - timer.cancel() - elapsed = 0 + fun endTimer() { + timer?.cancel() + timer = null + elapsed = 0L } @SuppressLint("ClickableViewAccessibility")