hanggrian / socialview

Android TextView and EditText with hashtag, mention, and hyperlink support
http://hanggrian.com/socialview/
Apache License 2.0
323 stars 81 forks source link

Fix IndexOutOfBoundsException #55

Closed virengujariya closed 3 years ago

virengujariya commented 5 years ago

Prevent IndexOutOfBoundsException

virengujariya commented 5 years ago

@hendraanggrian @stasbar Can you please review this?

hanggrian commented 5 years ago

Hi there, my apologies for slow response. I'm currently out of town and didn't bring my computer with me to test this. I will be back tomorrow, and will certainly review this as I welcome any kind of contribution. Sorry again!

hanggrian commented 5 years ago

Hi @virengujariya, are you sure text.length() - 1 is necessary?

Here is a source code of SpannedStringKt of androidx-core. In there, the end parameter is SpannedString's length without - 1.

virengujariya commented 5 years ago

@hendraanggrian Sorry for delayed response but there are number of reports such as

Fatal Exception: java.lang.IndexOutOfBoundsException
charAt: 73 >= length 73
android.text.SpannableStringBuilder.charAt (SpannableStringBuilder.java:128)
android.text.CharSequenceCharacterIterator.current (CharSequenceCharacterIterator.java:58)
android.text.CharSequenceCharacterIterator.setIndex (CharSequenceCharacterIterator.java:83)
android.icu.text.RuleBasedBreakIterator.CISetIndex32 (RuleBasedBreakIterator.java:1126)
android.icu.text.RuleBasedBreakIterator.isBoundary (RuleBasedBreakIterator.java:503)
android.text.method.WordIterator.isBoundary (WordIterator.java:95)
android.widget.Editor$SelectionHandleView.positionAtCursorOffset (Editor.java:5467)
android.widget.Editor$HandleView.invalidate (Editor.java:4577)
android.widget.Editor$SelectionModifierCursorController.invalidateHandles (Editor.java:6145)
android.widget.Editor.invalidateHandlesAndActionMode (Editor.java:1985)
android.widget.TextView.spanChange (TextView.java:9958)
android.widget.TextView$ChangeWatcher.onSpanRemoved (TextView.java:12580)
android.text.SpannableStringBuilder.sendSpanRemoved (SpannableStringBuilder.java:1307)
android.text.SpannableStringBuilder.removeSpan (SpannableStringBuilder.java:505)
android.text.SpannableStringBuilder.removeSpan (SpannableStringBuilder.java:814)
android.text.SpannableStringBuilder.removeSpan (SpannableStringBuilder.java:802)
com.hendraanggrian.widget.a.a.a (SocialViewImpl.kt:196)
com.hendraanggrian.widget.a.a$f.onTextChanged (SocialViewImpl.kt:67)
android.widget.TextView.sendOnTextChanged (TextView.java:9786)
android.widget.TextView.handleTextChanged (TextView.java:9883)
android.widget.TextView$ChangeWatcher.onTextChanged (TextView.java:12541)
android.text.SpannableStringBuilder.sendTextChanged (SpannableStringBuilder.java:1278)
android.text.SpannableStringBuilder.replace (SpannableStringBuilder.java:590)
android.text.SpannableStringBuilder.delete (SpannableStringBuilder.java:234)
android.text.SpannableStringBuilder.delete (SpannableStringBuilder.java:41)
android.widget.TextView.deleteText_internal (TextView.java:12050)
android.widget.TextView.onTextContextMenuItem (TextView.java:11316)
android.widget.Editor$TextActionModeCallback.onActionItemClicked (Editor.java:4181)
com.android.internal.policy.DecorView$ActionModeCallback2Wrapper.onActionItemClicked (DecorView.java:2421)
com.android.internal.view.FloatingActionMode$3.onMenuItemSelected (FloatingActionMode.java:98)
com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected (MenuBuilder.java:776)
com.android.internal.view.menu.MenuItemImpl.invoke (MenuItemImpl.java:148)
com.android.internal.view.menu.MenuBuilder.performItemAction (MenuBuilder.java:923)
com.android.internal.view.menu.MenuBuilder.performItemAction (MenuBuilder.java:913)
com.android.internal.view.FloatingActionMode.lambda$setFloatingToolbar$0 (FloatingActionMode.java:123)
com.android.internal.view.-$$Lambda$FloatingActionMode$LU5MpPuKYDtwlFAuYhXYfzgLNLE.onMenuItemClick (Unknown Source:2)
com.android.internal.widget.FloatingToolbar$FloatingToolbarPopup$2.onClick (FloatingToolbar.java:443)
android.view.View.performClick (View.java:6669)
android.view.View.performClickInternal (View.java:6638)
android.view.View.access$3100 (View.java:789)
android.view.View$PerformClick.run (View.java:26145)
android.os.Handler.handleCallback (Handler.java:873)
android.os.Handler.dispatchMessage (Handler.java:99)
android.os.Looper.loop (Looper.java:193)
android.app.ActivityThread.main (ActivityThread.java:6863)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:537)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:858)
virengujariya commented 5 years ago

@hendraanggrian Finally I am able to reproduce this issue, Reproduction steps (On device Samsung Galaxy S8)

Let me know if you need more details. I am not sure if there is anything we can do to fix on our end. Maybe we can try handling IndexOutOfBoundsException

PS - I can modify pull request to swallow IndexOutOfBoundsException

hanggrian commented 3 years ago

I assume this is related to #68.