|
|
|
|
@ -6,8 +6,12 @@ import androidx.fragment.app.DialogFragment
|
|
|
|
|
import androidx.fragment.app.Fragment
|
|
|
|
|
import androidx.fragment.app.FragmentManager
|
|
|
|
|
import androidx.lifecycle.Lifecycle
|
|
|
|
|
import androidx.lifecycle.LifecycleOwner
|
|
|
|
|
import androidx.lifecycle.Observer
|
|
|
|
|
import androidx.lifecycle.coroutineScope
|
|
|
|
|
import java.io.Serializable
|
|
|
|
|
import kotlin.coroutines.resume
|
|
|
|
|
import kotlinx.coroutines.suspendCancellableCoroutine
|
|
|
|
|
|
|
|
|
|
inline fun <T : Fragment> T.withArgs(size: Int, block: Bundle.() -> Unit): T {
|
|
|
|
|
val b = Bundle(size)
|
|
|
|
|
@ -22,7 +26,7 @@ val Fragment.viewLifecycleScope
|
|
|
|
|
fun <T : Serializable> Fragment.serializableArgument(name: String): Lazy<T> {
|
|
|
|
|
return lazy(LazyThreadSafetyMode.NONE) {
|
|
|
|
|
@Suppress("UNCHECKED_CAST")
|
|
|
|
|
requireNotNull(arguments?.getSerializable(name)) {
|
|
|
|
|
requireNotNull(arguments?.getSerializableCompat(name)) {
|
|
|
|
|
"No argument $name passed into ${javaClass.simpleName}"
|
|
|
|
|
} as T
|
|
|
|
|
}
|
|
|
|
|
@ -41,3 +45,19 @@ fun DialogFragment.showAllowStateLoss(manager: FragmentManager, tag: String?) {
|
|
|
|
|
fun Fragment.addMenuProvider(provider: MenuProvider) {
|
|
|
|
|
requireActivity().addMenuProvider(provider, viewLifecycleOwner, Lifecycle.State.STARTED)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
suspend fun Fragment.awaitViewLifecycle(): LifecycleOwner = suspendCancellableCoroutine { cont ->
|
|
|
|
|
val liveData = viewLifecycleOwnerLiveData
|
|
|
|
|
val observer = object : Observer<LifecycleOwner> {
|
|
|
|
|
override fun onChanged(result: LifecycleOwner?) {
|
|
|
|
|
if (result != null) {
|
|
|
|
|
liveData.removeObserver(this)
|
|
|
|
|
cont.resume(result)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
liveData.observeForever(observer)
|
|
|
|
|
cont.invokeOnCancellation {
|
|
|
|
|
liveData.removeObserver(observer)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|