Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 1.77 KB | None | 0 0
  1. object AnyFragmentScreenInjector {
  2.  
  3.     private var component: AnyComponent? = null
  4.  
  5.     fun create(): Fragment = if (component == null) {
  6.         val anyComponent = AnyComponent()
  7.         component = anyComponent
  8.         FragmentDestroyObserver(fragment) {
  9.             component = null
  10.         }
  11.         anyComponent.createFragment()
  12.     } else {
  13.         component.createFragment()
  14.     }
  15.    
  16.     fun inject(fragment: Fragment) {
  17.         if (component == null) {
  18.             component = AnyComponent() // create component
  19.             component.inject(fragment) // inject
  20.             FragmentDestroyObserver(fragment) {
  21.                 component = null
  22.             }
  23.         }
  24.     }
  25.  
  26.     private class FragmentDestroyObserver(
  27.         private val fragment: Fragment,
  28.         private val onDestroy: () -> Unit
  29.     ) : LifecycleObserver {
  30.  
  31.         init {
  32.             fragment.lifecycle.addObserver(this)
  33.         }
  34.  
  35.         @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
  36.         private fun onDestroy() = with(fragment) {
  37.             val activity = requireActivity()
  38.  
  39.             val isRealDestroy = when {
  40.                 activity.isChangingConfigurations -> false
  41.                 activity.isFinishing              -> true
  42.                 else                              -> isRealRemoving
  43.             }
  44.  
  45.             if (isRealDestroy) {
  46.                 onDestroy()
  47.             }
  48.         }
  49.  
  50.         private val Fragment.isRealRemoving: Boolean
  51.             get() = isRemoving || isAnyParentRemoving()
  52.  
  53.         private tailrec fun Fragment.isAnyParentRemoving(): Boolean {
  54.             val parent = parentFragment
  55.             return when {
  56.                 parent == null    -> false
  57.                 parent.isRemoving -> true
  58.                 else              -> parent.isAnyParentRemoving()
  59.             }
  60.         }
  61.     }
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement