diff --git a/android/src/main/java/com/mattermost/pasteinputtext/PasteInputEditText.kt b/android/src/main/java/com/mattermost/pasteinputtext/PasteInputEditText.kt index 1794b53..33d5a85 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..176b963 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..b356228 --- /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 + } +}