diff --git a/app/src/main/java/org/cocos2dx/lib/Cocos2dxGLSurfaceView.kt b/app/src/main/java/org/cocos2dx/lib/Cocos2dxGLSurfaceView.kt index 93bd501..5f90add 100644 --- a/app/src/main/java/org/cocos2dx/lib/Cocos2dxGLSurfaceView.kt +++ b/app/src/main/java/org/cocos2dx/lib/Cocos2dxGLSurfaceView.kt @@ -37,7 +37,7 @@ fun inputTypeForFlags(i: Int): Int { } if ((i and BaseRobTopActivity.KEYBOARD_INPUT_MULTILINE) != 0) { - InputType.TYPE_TEXT_FLAG_MULTI_LINE or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or InputType.TYPE_CLASS_TEXT + return InputType.TYPE_TEXT_FLAG_MULTI_LINE or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or InputType.TYPE_CLASS_TEXT } return InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS or InputType.TYPE_CLASS_TEXT diff --git a/app/src/main/java/org/cocos2dx/lib/Cocos2dxTextInputWrapper.kt b/app/src/main/java/org/cocos2dx/lib/Cocos2dxTextInputWrapper.kt index 6fab41d..b2e3b80 100644 --- a/app/src/main/java/org/cocos2dx/lib/Cocos2dxTextInputWrapper.kt +++ b/app/src/main/java/org/cocos2dx/lib/Cocos2dxTextInputWrapper.kt @@ -5,8 +5,10 @@ import android.text.TextWatcher import android.widget.TextView.OnEditorActionListener import android.text.Editable import android.view.KeyEvent +import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager import android.widget.TextView +import com.customRobTop.JniToCpp class Cocos2dxTextInputWrapper(private val cocos2dxGLSurfaceView: Cocos2dxGLSurfaceView) : TextWatcher, OnEditorActionListener { private var originText: String? = null @@ -19,21 +21,33 @@ class Cocos2dxTextInputWrapper(private val cocos2dxGLSurfaceView: Cocos2dxGLSurf this.originText = originText } - override fun afterTextChanged(s: Editable) { - if (!isFullScreenEdit) { - var nModified = s.length - text!!.length - if (nModified > 0) { - cocos2dxGLSurfaceView.insertText( - s.subSequence(text!!.length, s.length).toString() - ) - } else { - while (nModified < 0) { - cocos2dxGLSurfaceView.deleteBackward() - nModified++ - } - } - text = s.toString() + override fun afterTextChanged(editable: Editable) { + if (isFullScreenEdit) { + return } + + val cText = text ?: return + + val str = editable.toString() + val unchanged = str.commonPrefixWith(cText) + + var unchangedUntil = unchanged.length + if (unchangedUntil > 0 && unchangedUntil < str.length && Character.isLowSurrogate(unchanged.last())) { + unchangedUntil-- + } + + val codePointLength = cText.codePointCount(unchangedUntil, cText.length) + repeat(codePointLength) { + cocos2dxGLSurfaceView.deleteBackward() + } + + if (unchangedUntil < str.length) { + cocos2dxGLSurfaceView.insertText( + str.substring(unchangedUntil) + ) + } + + text = str } override fun beforeTextChanged( @@ -47,22 +61,44 @@ class Cocos2dxTextInputWrapper(private val cocos2dxGLSurfaceView: Cocos2dxGLSurf override fun onTextChanged(pCharSequence: CharSequence, start: Int, before: Int, count: Int) {} override fun onEditorAction(textView: TextView, actionID: Int, keyEvent: KeyEvent?): Boolean { - if (cocos2dxGLSurfaceView.cocos2dxEditText == textView && isFullScreenEdit) { - for (i in originText!!.length downTo 1) { - cocos2dxGLSurfaceView.deleteBackward() - } + val fullscreenIme = cocos2dxGLSurfaceView.cocos2dxEditText == textView && isFullScreenEdit + if (fullscreenIme) { var text = textView.text.toString() - if (!text.endsWith('\n')) { - text += '\n' - } + if (originText != text) { + if (cocos2dxGLSurfaceView.sendNewCocosEvents) { + cocos2dxGLSurfaceView.queueEvent { + JniToCpp.textInputCaretToEnd() + } + } - cocos2dxGLSurfaceView.insertText(text) + for (i in originText!!.length downTo 1) { + cocos2dxGLSurfaceView.deleteBackward() + } + + // this bit was removed in 2.209, and I don't know if it's important on previous versions + if (!cocos2dxGLSurfaceView.sendNewCocosEvents) { + if (!text.endsWith('\n')) { + text += '\n' + } + } + + cocos2dxGLSurfaceView.insertText(text) + } } - if (actionID != 6) { - return false + + if (fullscreenIme || actionID == EditorInfo.IME_ACTION_DONE) { + if (cocos2dxGLSurfaceView.sendNewCocosEvents) { + cocos2dxGLSurfaceView.queueEvent { + JniToCpp.textInputDone() + } + } } - cocos2dxGLSurfaceView.requestFocus() - Cocos2dxGLSurfaceView.closeIMEKeyboard() + + if (actionID == EditorInfo.IME_ACTION_DONE) { + cocos2dxGLSurfaceView.requestFocus() + Cocos2dxGLSurfaceView.closeIMEKeyboard() + } + return false } } \ No newline at end of file