package Ġorg . nek ob as u . core Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . annotation . Call Super Ċ import Ġandroidx . annotation . Id Res Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . Fragment Activity Ċ import Ġandroidx . fragment . app . FragmentManager Ċ import Ġandroidx . fragment . app . Fragment Transaction Ċ Ċ abstract Ġclass ĠScreen Stack Fragment Module < V Ġ: ĠScreen Stack ViewModel , ĠP Ġ: ĠParam >( ĊĠĠĠĠĠĠĠ Ġparam : ĠP , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfragment Creator : Ġ( Screen Update ) Ġ-> ĠFragment Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUi Modules . fragment From Module ( it . params ) ĊĠĠĠĠĠĠĠ Ġ} Ċ ) Ġ: ĠUi Module < List < Screen Update >, ĠV , ĠP >( param ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġact icity Context : ĠFragment Activity Ġby Ġlazy Ġ{ Ġcontext Ġas ĠFragment Activity Ġ} ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfragment Manager : ĠFragment Manager ĊĠĠĠ Ġprivate Ġvar Ġold Screen Update Stack : ĠList < Screen Update > Ġ= Ġempty List () ĊĠĠĠ Ġprivate Ġval Ġtask Tags Cache : ĠMutable Set < String > Ġ= Ġmutable Set Of () ĊĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfragment Manager Ġ= Ġact icity Context . support FragmentManager ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Init View ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Update ( view Update : ĠList < Screen Update >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( view Update . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġact icity Context . finish () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Fragments ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Stack Ġ= Ġview Update , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Stack Ġ= Ġold Screen Update Stack , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Creator Ġ= Ġfragment Creator ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġold Screen Update Stack Ġ= Ġview Update ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġshow Fragments ( new Stack : ĠList < Screen Update >, Ġold Stack : ĠList < Screen Update >, Ġfragment Creator : Ġ( Screen Update ) Ġ-> ĠFragment ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= Ġfragment Manager . beginTransaction (). apply Ġ{ Ġdis allow AddTo Back Stack () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Stack Tasks Ġ= Ġnew Stack . map Ġ{ Ġit . taskId Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Stack Tags Ġ= Ġnew Stack . map Ġ{ Ġit . tag () Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( screen Ġin Ġold Stack ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Fragment Ġ= ĠfindBy Tag ( screen . tag ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Fragment Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! new Stack Tags . contains ( screen . tag ()) Ġ&& Ġ(! screen . is Part Of AT ask () Ġ|| Ġ! new Stack Tasks . contains ( screen . taskId ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . remove ( existing Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . clean Up Task ( screen . taskId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! existing Fragment . is Detached ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . detach ( existing Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Screen Group ( screen ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( screen Ġin Ġnew Stack ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Fragment Ġ= ĠfindBy Tag ( screen . tag ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( screen Ġ== Ġnew Stack . last ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Fragment Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Fragment . is Detached ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . attach ( existing Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Result IfNeeded ( screen , Ġexisting Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Fragment Ġ= Ġfragment Creator ( screen ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . add ( main Container Id (), Ġnew Fragment , Ġscreen . tag ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Result IfNeeded ( screen , Ġnew Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Fragment Ġ!= Ġnull Ġ&& Ġ! existing Fragment . is Detached ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . detach ( existing Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtransaction . commit Now () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Screen Group ( screen Data : ĠScreen Update ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( screen Data . is Part Of AT ask ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask Tags Cache . add ( screen Data . tag ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠFragment Transaction . clean Up Task ( taskId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( taskId Ġ!= ĠST AND AL ONE _ TASK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask Tags Cache . filter Ġ{ Ġget TaskId From Tag ( it ) Ġ== ĠtaskId Ġ}. forEach Ġ{ Ġtag Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindBy Tag ( tag )?. let Ġ{ Ġremove ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask Tags Cache . removeAll Ġ{ Ġget TaskId From Tag ( it ) Ġ== ĠtaskId Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Result IfNeeded ( screen Update : ĠScreen Update , Ġfragment : ĠFragment ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( screen Update . params UpdatedBy Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Update . params UpdatedBy Request Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Request For Result Id Ġ= Ġscreen Update . last Request For Result Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Update . last Request For Result Id Ġ= ĠNO _ RESULT _ REQUEST ED ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinter Ui Contract Ġ= Ġfragment Ġas ĠInter Ui Contract ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinter Ui Contract . deliver Result ( Requested Result ( last Request For Result Id , Ġscreen Update . result )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinter Ui Contract . update Params ( param ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠfindBy Tag ( tag : ĠString ) Ġ= Ġfragment Manager . find Fragment By Tag ( tag ) ĊĊĠĠĠ Ġprivate Ġfun Ġget TaskId From Tag ( tag : ĠString ?) Ġ= Ġtag ?. substring After ("# ", ĠST AND AL ONE _ TASK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠST AND AL ONE _ TASK ĊĊĠĠĠ Ġ@ Id Res ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġmain Container Id (): ĠInt ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Press (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtop Fragment Ġ= Ġfragment Manager . fragments . last OrNull () ĊĠĠĠĠĠĠĠ Ġval Ġcustom Back Ġ= Ġ( top Fragment Ġas ? ĠBack Press Handling )?. on Back Press () Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ(! custom Back ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . on Back Press () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdeliver Result ( result : ĠRequest ed Result ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! super . deliver Result ( result )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Manager . fragments . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠInter Ui Contract Ġ&& Ġit . deliver Result ( result )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }