package Ġkr . he uk hy eon . service _ locator . lifecycle čĊč Ċ import Ġandroid . app . Activity č Ċ import Ġandroid . app . Application č Ċ import Ġandroidx . annotation . Worker Thread č Ċ import Ġandroidx . fragment . app . Fragment č Ċ import Ġkr . he uk hy eon . service _ locator . initializer . Android Initializer č Ċ import Ġjava . lang . IllegalStateException č Ċ import Ġjava . util .* č Ċ import Ġkotlin . collections . HashMap č Ċ import Ġkotlin . coroutines . Continuation č Ċ import Ġkotlin . coroutines . resume č Ċ import Ġkotlin . coroutines . suspend Coroutine čĊč Ċ /** čĊ Ġ* Ġ[ Android Initializer ] Ġë ¥ ¼ Ġêµ¬íĺĦ íķľ Ġíģ´ëŀĺìĬ¤ ëĵ¤ ìĿĺ Ġ[ Android Initializer . start Initialize ] ĠìĿĺ ì ¡´ ìĦ± Ġì£¼ ìŀħ ĠìŀĳìĹħ ìĿ´ čĊ Ġ* ĠApplication čĊ Ġ* Ġ Ġ ã Ħ ´ ĠActivity čĊ Ġ* ĠĠĠĠĠ Ġ ã Ħ ´ ĠFragment čĊ Ġ* ĠĠ Ġë¡ľ ĠìĿ´ ìĸ´ ì§Ģ ëĬĶ ĠAndroid ĠLifecycle ĠTree ĠìĹĲ ĠëĶ°ëĿ¼ ĠìĪ ľ ì°¨ ìłģìľ¼ë¡ľ Ġì§Ħ íĸī ëĲ ł ìĪĺ ĠìŀĪ ê²Į Ġíķľëĭ¤ . čĊ Ġ*/ č Ċ class ĠInject Lifecycle Manager ( app : ĠApplication ) Ġ{ čĊčĊĠĠĠ Ġclass ĠState Ġ{ čĊĠĠĠĠĠĠĠ Ġvar Ġis Initialized Ġ= Ġfalse čĊĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= ĠLinkedList < Continuation < Unit >>() čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġval Ġstate Map Ġ= ĠHashMap < Android Initializer , ĠState >() čĊčĊĠĠĠ Ġprivate Ġval Ġfragment Manager Ġ= ĠFragment Lifecycle Manager ( state Map ) čĊĠĠĠ Ġprivate Ġval Ġactivity Manager = ĠActivity Lifecycle Manager ( state Map , Ġfragment Manager ) čĊčĊčĊĠĠĠ Ġinit Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( app Ġis ĠAndroid Initializer ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Map [ app ] Ġ= ĠState () čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġapp . register Activity Lifecycle Callbacks ( activity Manager ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠíĮĮ ëĿ¼ ë¯¸ íĦ° ë¡ľ ĠëĦ ĺ ìĸ´ ìĺ ¨ Ġê°Ŀì²´ ê°Ģ Ġ[ on Initialize ] Ġê°Ģ Ġíĺ¸ì¶ľ ëĲ ¬ ëĬĶ ì§Ģë¥¼ ĠíĻķìĿ¸ íķľëĭ¤ . čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġfun Ġis Initialized ( initializer : ĠAndroid Initializer ) Ġ: ĠBoolean Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġrequire NotNull ( state Map [ initializer ]). isInitialized čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ@ Worker Thread čĊĠĠĠ Ġsuspend Ġfun Ġawait Initializer Ready ( initializer : ĠAndroid Initializer ) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= ĠgetParent Initializer ( initializer ) Ġ?: Ġreturn čĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġrequire NotNull ( state Map [ parent ]) čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( state . isInitialized ) Ġreturn čĊčĊĠĠĠĠĠĠĠ Ġreturn Ġsuspend Coroutine Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . children . add ( it ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ@ Worker Thread čĊĠĠĠ Ġfun Ġon Initialize ( initializer : ĠAndroid Initializer ) Ġ{ čĊĠĠĠĠĠĠĠ Ġrequire NotNull ( state Map [ initializer ]). also Ġ{ Ġstate Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . isInitialized Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . children . forEach Ġ{ Ġit . resume ( Unit ) Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . children . clear () čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠApplication Ġ-> ĠMust ĠNull čĊĠĠĠĠ Ġ* ĠActivity Ġ-> ĠApplication čĊĠĠĠĠ Ġ* ĠFragment Ġ-> ĠParent ĠFragment Ġor ĠActivity čĊĠĠĠĠ Ġ* Ġif Ġreturn Ġnull , ĠAndroid Ġêµ¬ ì¡° ìĥģ Ġìĥģ ìľĦ Ġì»´ íı¬ ëĦ Į íĬ¸ ìĿ¸ Ġíģ´ëŀĺìĬ¤ ê°Ģ Ġ[ Android Initializer ] Ġë ¥ ¼ Ġë ¯¸ êµ¬ íĺĦ íķľ Ġê²½ìļ° čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġprivate Ġfun ĠgetParent Initializer ( initializer : ĠAndroid Initializer ) Ġ: ĠAndroid Initializer ? Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( initializer ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠActivity Ġ-> Ġinitializer . application Ġas ? ĠAndroid Initializer čĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFragment Ġ-> Ġinitializer . parent Fragment Ġas ? ĠAndroid Initializer Ġ?: Ġinitializer . activity Ġas ? ĠAndroid Initializer čĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠApplication Ġ-> Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Android Initializer Ġis ĠOnly ĠSupported ĠActivity , ĠFragment , ĠApplication ") čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġcompanion Ġobject Ġ{ čĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm Instance Ġ: ĠInject Lifecycle Manager ? Ġ= Ġnull čĊčĊĠĠĠĠĠĠĠ Ġfun Ġinitialize ( context : ĠApplication ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Instance Ġ= ĠInject Lifecycle Manager ( context ) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġinternal Ġfun ĠgetInstance () Ġ: ĠInject Lifecycle Manager Ġ{ čĊĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrequire NotNull ( m Instance ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ }