Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- object AnyFragmentScreenInjector {
- private var component: AnyComponent? = null
- fun create(): Fragment = if (component == null) {
- val anyComponent = AnyComponent()
- component = anyComponent
- FragmentDestroyObserver(fragment) {
- component = null
- }
- anyComponent.createFragment()
- } else {
- component.createFragment()
- }
- fun inject(fragment: Fragment) {
- if (component == null) {
- component = AnyComponent() // create component
- component.inject(fragment) // inject
- FragmentDestroyObserver(fragment) {
- component = null
- }
- }
- }
- private class FragmentDestroyObserver(
- private val fragment: Fragment,
- private val onDestroy: () -> Unit
- ) : LifecycleObserver {
- init {
- fragment.lifecycle.addObserver(this)
- }
- @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
- private fun onDestroy() = with(fragment) {
- val activity = requireActivity()
- val isRealDestroy = when {
- activity.isChangingConfigurations -> false
- activity.isFinishing -> true
- else -> isRealRemoving
- }
- if (isRealDestroy) {
- onDestroy()
- }
- }
- private val Fragment.isRealRemoving: Boolean
- get() = isRemoving || isAnyParentRemoving()
- private tailrec fun Fragment.isAnyParentRemoving(): Boolean {
- val parent = parentFragment
- return when {
- parent == null -> false
- parent.isRemoving -> true
- else -> parent.isAnyParentRemoving()
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement