package Ġcom . zj . cf . managers Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . annotation . Id Res Ċ import Ġandroidx . annotation . Ui Thread Ċ import Ġandroidx . fragment . app . FragmentManager Ċ import Ġcom . zj . cf . FM Store Ċ import Ġcom . zj . cf . FM Store . getSimple Id Ċ import Ġcom . zj . cf . annotations . Constr ain Mode .* Ċ import Ġcom . zj . cf . fragments . Constr ain Fragment Ċ import Ġcom . zj . cf . unit ive . Proxy Manager Ċ import Ġjava . util .* Ċ import Ġkotlin . math . max Ċ Ċ internal Ġabstract Ġclass ĠCon str ain FragmentManager ( manager Id : ĠString , Ġmanager : ĠFragment Manager , Ġ@ Id Res Ġcontainer Id : ĠInt , Ġval Ġclear When Empty Stack : Ġ() Ġ-> ĠBoolean ) Ġ: ĠFragment Helper < Constr ain Fragment >( manager Id , Ġmanager , Ġcontainer Id ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġstack : ĠStack < Proxy Manager <* >> ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ== Ġnull ) Ġfield Ġ= ĠStack (); return Ġfield ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġfun ĠgetCurrent Stack Size (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstack ?. size Ġ?: Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġfun Ġset Back Stack ( back ed : ĠProxy Manager <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġstack ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent : ĠProxy Manager < *> Ġ= Ġit . pop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġstack ?. indexOf Last Ġ{ Ġpx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Simple Id ( px . id ). first Ġ== Ġget Simple Id ( back ed . id ). first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . push ( back ed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . push ( current ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġit . last Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġ( it . last Index Ġ- Ġindex )). forEach Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack ?. pop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . push ( current ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġfun Ġstart Fragment ( proxy : ĠProxy Manager <* >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġfollow ( proxy : ĠProxy Manager <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack ?. push ( proxy ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġclear Stack ( proxy : ĠProxy Manager <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack ?. removeAll Elements (); Ġstack ?. push ( proxy ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġstack ( proxy : ĠProxy Manager <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Stack Index Ġ= Ġstack ?. indexOf Last Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Simple Id ( v . id ). first Ġ== Ġget Simple Id ( proxy . id ). first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Stack Index Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack ?. push ( proxy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Index Ġ= Ġmax ( first Stack Index , Ġstack ?. last Index Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( max Index Ġ== Ġfirst Stack Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack ?. removeAll Elements (); stack ?. push ( proxy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 .. ( max Index Ġ- Ġfirst Stack Index )). forEach Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġstack ?. pop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p ?. back Mode Ġ== ĠCONST _ ONLY _ ON CE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Fragment ById ( p . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack ?. push ( proxy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( proxy . launch Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSTACK Ġ-> Ġstack ( proxy ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFOL LOW Ġ-> Ġfollow ( proxy ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCLEAR _ BACK _ STACK Ġ-> Ġclear Stack ( proxy ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsync Frag ( false , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsync Frag ( is Back : ĠBoolean , Ġbundle : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! stack . isNull OrEmpty ()) Ġstack ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . peek ()?. let Ġ{ Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġf rg Ġ= Ġget Fragment ById ( it . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f rg Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf rg Ġ= Ġit . m Fragment Class . newInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf rg . set Proxy ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Back ) Ġf rg . on Post Value ( it . bundle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Fragment ( f rg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf rg . set Proxy ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Back ) Ġf rg ?. on Fragment Result ( bundle ) Ġelse Ġf rg ?. on Post Value ( it . bundle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Fragment ( it . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġfun Ġfinish Fragment ( id : ĠString , Ġon Finished : Ġ(( isEmpty Stack : ĠBoolean , Ġclear When Empty Stack : ĠBoolean ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( stack ?. peek ()?. id Ġ!= Ġid ) Ġon Finished ?. invoke ( false , Ġtrue ); Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack ?. pop ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Home Ġ|| Ġstack . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack ?. clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFM Store . check Is Constr ain Parent ( manager Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( clear When Empty Stack ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Fragment ById ( it . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Fragments () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmid Ġ= Ġit . getManager Id () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFM Store . getManager By Level ( mid , Ġ- 1 )?. let Ġ{ Ġlast Manager Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Manager . getCurrent Fragment ()?. resume Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFM Store . remove Manager ( mid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Finished ?. invoke ( true , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack ?. push ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Finished ?. invoke ( false , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . back Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCONST _ ONLY _ ON CE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Fragment ById ( it . id ) Ġ{ Ġon Finished ?. invoke ( false , Ġfalse ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCONST _ LAST ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide Fragment ( it . id ) Ġ{ Ġon Finished ?. invoke ( false , Ġfalse ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}; sync Frag ( true , Ġit . getResult Bundle ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġfun Ġclear Stack () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( stack ?. isNotEmpty () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcur Ġ= Ġstack ?. pop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( stack ?. isNotEmpty () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack ?. pop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack ?. push ( cur ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }