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

Crash from unchecked cast #68

Closed cullub closed 2 years ago

cullub commented 2 years ago

From Play store analytics: com.gbros.tabslite.SongVersionFragment.onCreate

java.lang.RuntimeException: 
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3483)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3635)
  at android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:85)
  at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:135)
  at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:95)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2083)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loop (Looper.java:223)
  at android.app.ActivityThread.main (ActivityThread.java:7703)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:592)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1084)
Caused by: java.lang.ClassCastException: 
  at com.gbros.tabslite.SongVersionFragment.onCreate (SongVersionFragment.kt:44)
  at androidx.fragment.app.Fragment.performCreate (Fragment.java:2981)
  at androidx.fragment.app.FragmentStateManager.create (FragmentStateManager.java:474)
  at androidx.fragment.app.FragmentStateManager.moveToExpectedState (FragmentStateManager.java:257)
  at androidx.fragment.app.FragmentStore.moveToExpectedState (FragmentStore.java:121)
  at androidx.fragment.app.FragmentManager.moveToState (FragmentManager.java:1374)
  at androidx.fragment.app.FragmentManager.dispatchStateChange (FragmentManager.java:2841)
  at androidx.fragment.app.FragmentManager.dispatchCreate (FragmentManager.java:2773)
  at androidx.fragment.app.Fragment.restoreChildFragmentState (Fragment.java:1935)
  at androidx.fragment.app.Fragment.onCreate (Fragment.java:1911)
  at androidx.navigation.fragment.NavHostFragment.onCreate (NavHostFragment.kt:164)
  at androidx.fragment.app.Fragment.performCreate (Fragment.java:2981)
  at androidx.fragment.app.FragmentStateManager.create (FragmentStateManager.java:474)
  at androidx.fragment.app.FragmentStateManager.moveToExpectedState (FragmentStateManager.java:257)
  at androidx.fragment.app.FragmentStore.moveToExpectedState (FragmentStore.java:113)
  at androidx.fragment.app.FragmentManager.moveToState (FragmentManager.java:1374)
  at androidx.fragment.app.FragmentManager.dispatchStateChange (FragmentManager.java:2841)
  at androidx.fragment.app.FragmentManager.dispatchCreate (FragmentManager.java:2773)
  at androidx.fragment.app.FragmentController.dispatchCreate (FragmentController.java:251)
  at androidx.fragment.app.FragmentActivity.onCreate (FragmentActivity.java:252)
  at com.gbros.tabslite.HomeActivity.onCreate (HomeActivity.kt:22)
  at android.app.Activity.performCreate (Activity.java:8045)
  at android.app.Activity.performCreate (Activity.java:8029)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1309)
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3456)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3635)
  at android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:85)
  at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:135)
  at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:95)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2083)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loop (Looper.java:223)
  at android.app.ActivityThread.main (ActivityThread.java:7703)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:592)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1084)

Relevant code (SongVersionFragment.kt lines 35-51):

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let { it ->
            val rawVersionsList = it.getParcelableArray(ARG_SONG_VERSIONS) as Array<*>
            if (!rawVersionsList.isNullOrEmpty()) {  // if there are no versions of this song at all, don't try to cast to Array<TabBasic>
                // possible tab.type's: "Tab" (not 100% sure on this one), "Chords", "Official"
                // filter out "official" tabs -- the ones without nice chords and a "content" field.
                // also filter out tabs vs chords.  // todo: maybe implement tabs
                songVersions =
                    (rawVersionsList as Array<TabBasic>).filter { tab -> tab.type == "Chords" }  // this line
                songVersions =
                    songVersions.sortedWith(compareByDescending { it.votes }) 
            }
        }

        setHasOptionsMenu(true)
    }