入れ子関係の Fragment で、親 Fragment ではなく最も祖先にあたるルートの Fragment を取得する

サッとドキュメントを見ていたところ多分なかったので requireParentFragment の実装を参考に自前で用意した。

https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java;l=1162-1183;drc=ff6e33e5915d8e253d1a6be79c7015ef61848522

/**
 * このフラグメントを含むルートフラグメントを返します。
 * [Fragment.requireParentFragment] を参考にした実装です。
 */
fun Fragment.requireRootFragment(): Fragment {
    fun findRootFragment(fragment: Fragment): Fragment {
        val parentFragment = fragment.parentFragment ?: return fragment
        return findRootFragment(parentFragment)
    }

    val parentFragment = parentFragment
        ?: if (context == null) {
            throw IllegalStateException("Fragment $this is not attached to any Fragment or host")
        } else {
            throw IllegalStateException("Fragment $this is not a child Fragment, it is directly attached to ${requireContext()}")
        }

    return findRootFragment(parentFragment)
}