From 6aea8a9b5fc6a44aa2c1a321672204ccf10d3f00 Mon Sep 17 00:00:00 2001 From: Rahul Garg Date: Sat, 12 Apr 2025 17:02:34 +0530 Subject: [PATCH 1/2] (fix) onSelectionChange is not triggered on android devices --- .../pasteinputtext/PasteInputEditText.kt | 14 +++++++++ .../pasteinputtext/PasteTextInputManager.kt | 31 +++++++++++++++++++ .../PasteTextInputSelectionChangeEvent.kt | 28 +++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 android/src/main/java/com/mattermost/pasteinputtext/PasteTextInputSelectionChangeEvent.kt diff --git a/android/src/main/java/com/mattermost/pasteinputtext/PasteInputEditText.kt b/android/src/main/java/com/mattermost/pasteinputtext/PasteInputEditText.kt index 1794b53..f497338 100644 --- a/android/src/main/java/com/mattermost/pasteinputtext/PasteInputEditText.kt +++ b/android/src/main/java/com/mattermost/pasteinputtext/PasteInputEditText.kt @@ -17,6 +17,20 @@ class PasteInputEditText(context: ThemedReactContext) : ReactEditText(context) { private lateinit var mOnPasteListener: IPasteInputListener private lateinit var mPasteEventDispatcher: EventDispatcher private var mDisabledCopyPaste: Boolean = false + private var mSelectionWatcher: SelectionWatcher? = null + + interface SelectionWatcher { + fun onSelectionChanged(selStart: Int, selEnd: Int) +} + +fun setSelectionWatcher(selectionWatcher: SelectionWatcher?) { + mSelectionWatcher = selectionWatcher +} + +override fun onSelectionChanged(selStart: Int, selEnd: Int) { + super.onSelectionChanged(selStart, selEnd) + mSelectionWatcher?.onSelectionChanged(selStart, selEnd) +} fun setDisableCopyPaste(disabled: Boolean) { this.mDisabledCopyPaste = disabled diff --git a/android/src/main/java/com/mattermost/pasteinputtext/PasteTextInputManager.kt b/android/src/main/java/com/mattermost/pasteinputtext/PasteTextInputManager.kt index 4ed2307..a919813 100644 --- a/android/src/main/java/com/mattermost/pasteinputtext/PasteTextInputManager.kt +++ b/android/src/main/java/com/mattermost/pasteinputtext/PasteTextInputManager.kt @@ -50,6 +50,20 @@ class PasteTextInputManager(context: ReactApplicationContext) : ReactTextInputMa val pasteInputEditText = editText as PasteInputEditText val eventDispatcher = getEventDispatcher(reactContext, editText) + + pasteInputEditText.setSelectionWatcher(object : PasteInputEditText.SelectionWatcher { + override fun onSelectionChanged(selStart: Int, selEnd: Int) { + eventDispatcher?.dispatchEvent( + PasteTextInputSelectionChangeEvent( + UIManagerHelper.getSurfaceId(reactContext), + pasteInputEditText.id, + selStart, + selEnd + ) + ) + } + }) + pasteInputEditText.setOnPasteListener(PasteInputListener(pasteInputEditText, reactContext.surfaceId), eventDispatcher) } @@ -63,6 +77,23 @@ class PasteTextInputManager(context: ReactApplicationContext) : ReactTextInputMa return map } + override fun getExportedCustomDirectEventTypeConstants(): MutableMap { + return MapBuilder.builder() + .put( + "onSelectionChange", + MapBuilder.of("registrationName", "onSelectionChange") + ) + .put( + "onContentSizeChange", + MapBuilder.of("registrationName", "onContentSizeChange") + ) + .put( + "onScroll", + MapBuilder.of("registrationName", "onScroll") + ) + .build() + } + companion object { const val NAME = "PasteTextInput" const val CACHE_DIR_NAME = "mmPasteInput" diff --git a/android/src/main/java/com/mattermost/pasteinputtext/PasteTextInputSelectionChangeEvent.kt b/android/src/main/java/com/mattermost/pasteinputtext/PasteTextInputSelectionChangeEvent.kt new file mode 100644 index 0000000..c50200f --- /dev/null +++ b/android/src/main/java/com/mattermost/pasteinputtext/PasteTextInputSelectionChangeEvent.kt @@ -0,0 +1,28 @@ +package com.mattermost.pasteinputtext + +import com.facebook.react.bridge.Arguments +import com.facebook.react.bridge.WritableMap +import com.facebook.react.uimanager.UIManagerHelper +import com.facebook.react.uimanager.events.Event + +class PasteTextInputSelectionChangeEvent( + surfaceId: Int, + viewId: Int, + private val mSelectionStart: Int, + private val mSelectionEnd: Int +) : Event(surfaceId, viewId) { + + override fun getEventName(): String = "onSelectionChange" + + override fun getCoalescingKey(): Short = 0 + + override fun getEventData(): WritableMap { + val eventData = Arguments.createMap() + eventData.putInt("target", viewTag) + val selection = Arguments.createMap() + selection.putInt("start", mSelectionStart) + selection.putInt("end", mSelectionEnd) + eventData.putMap("selection", selection) + return eventData + } +} \ No newline at end of file From dd48fab533a076700043ec6b3feaccf73db7bc24 Mon Sep 17 00:00:00 2001 From: Rahul Garg Date: Sat, 12 Apr 2025 18:15:17 +0530 Subject: [PATCH 2/2] (refactor) indentation --- .../pasteinputtext/PasteInputEditText.kt | 16 ++++++++-------- .../pasteinputtext/PasteTextInputManager.kt | 2 +- .../PasteTextInputSelectionChangeEvent.kt | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/android/src/main/java/com/mattermost/pasteinputtext/PasteInputEditText.kt b/android/src/main/java/com/mattermost/pasteinputtext/PasteInputEditText.kt index f497338..33d5a85 100644 --- a/android/src/main/java/com/mattermost/pasteinputtext/PasteInputEditText.kt +++ b/android/src/main/java/com/mattermost/pasteinputtext/PasteInputEditText.kt @@ -21,16 +21,16 @@ class PasteInputEditText(context: ThemedReactContext) : ReactEditText(context) { interface SelectionWatcher { fun onSelectionChanged(selStart: Int, selEnd: Int) -} + } -fun setSelectionWatcher(selectionWatcher: SelectionWatcher?) { - mSelectionWatcher = selectionWatcher -} + fun setSelectionWatcher(selectionWatcher: SelectionWatcher?) { + mSelectionWatcher = selectionWatcher + } -override fun onSelectionChanged(selStart: Int, selEnd: Int) { - super.onSelectionChanged(selStart, selEnd) - mSelectionWatcher?.onSelectionChanged(selStart, selEnd) -} + override fun onSelectionChanged(selStart: Int, selEnd: Int) { + super.onSelectionChanged(selStart, selEnd) + mSelectionWatcher?.onSelectionChanged(selStart, selEnd) + } fun setDisableCopyPaste(disabled: Boolean) { this.mDisabledCopyPaste = disabled diff --git a/android/src/main/java/com/mattermost/pasteinputtext/PasteTextInputManager.kt b/android/src/main/java/com/mattermost/pasteinputtext/PasteTextInputManager.kt index a919813..176b963 100644 --- a/android/src/main/java/com/mattermost/pasteinputtext/PasteTextInputManager.kt +++ b/android/src/main/java/com/mattermost/pasteinputtext/PasteTextInputManager.kt @@ -62,7 +62,7 @@ class PasteTextInputManager(context: ReactApplicationContext) : ReactTextInputMa ) ) } - }) + }) pasteInputEditText.setOnPasteListener(PasteInputListener(pasteInputEditText, reactContext.surfaceId), eventDispatcher) } diff --git a/android/src/main/java/com/mattermost/pasteinputtext/PasteTextInputSelectionChangeEvent.kt b/android/src/main/java/com/mattermost/pasteinputtext/PasteTextInputSelectionChangeEvent.kt index c50200f..b356228 100644 --- a/android/src/main/java/com/mattermost/pasteinputtext/PasteTextInputSelectionChangeEvent.kt +++ b/android/src/main/java/com/mattermost/pasteinputtext/PasteTextInputSelectionChangeEvent.kt @@ -25,4 +25,4 @@ class PasteTextInputSelectionChangeEvent( eventData.putMap("selection", selection) return eventData } -} \ No newline at end of file +}