More-Than-Solitaire / Tabs-Lite

An ad-free open source guitar tablature application using an existing popular tabs database. Built for speed and simplicity.
Apache License 2.0
64 stars 4 forks source link

Opening certain tabs crashes app #60

Closed cullub closed 2 years ago

cullub commented 2 years ago

Opening certain tabs crashes the app. Example tab: Snowman by Sia version 3.

Crashlog:

java.lang.StringIndexOutOfBoundsException: 
  at java.lang.String.substring (String.java:2064)
  at java.lang.String.subSequence (String.java:2107)
  at com.gbros.tabslite.TabTextView.linify (TabTextView.kt:86)
  at com.gbros.tabslite.TabTextView.setTabContent (TabTextView.kt:72)
  at com.gbros.tabslite.TabDetailFragment$startGetData$1$$special$$inlined$doOnLayout$lambda$1.run (TabDetailFragment.kt:364)
  at android.os.Handler.handleCallback (Handler.java:938)
  at android.os.Handler.dispatchMessage (Handler.java:99)
  at android.os.Looper.loop (Looper.java:246)
  at android.app.ActivityThread.main (ActivityThread.java:8633)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:602)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1130)

Relevant code:

// takes a [tab] and breaks it into two lines (chord and lyric).  Adds chord processing and
// puts it in `tabLines`.
private fun linify(singleLyric: CharSequence){
    Log.v(LOG_NAME, "Breaking single line into chords/lyrics")
    var indexOfLineBreak = singleLyric.indexOf("\n")
    if (indexOfLineBreak == -1)  // in case of lines ending without a newline after.
        indexOfLineBreak = singleLyric.length
    val chords: CharSequence = singleLyric.subSequence(0, indexOfLineBreak).trimEnd()
    val lyrics: CharSequence = singleLyric.subSequence(indexOfLineBreak + 1, singleLyric.length).trimEnd()  // <-- line 86
    tabLines.add(Pair(processChords(chords), processChords(lyrics)))
}