package Ġcom . pod cre ep . ui Ċ Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . view . ViewGroup Ċ import Ġcom . pod cre ep . util . Event Ċ import Ġjava . util . Stack Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* Ġ[ Screen Stack ] Ġis Ġused Ġto Ġmanage Ġa Ġstack Ġof Ġ[ Screen ] s . ĠThe Ġstack Ġshows Ġit 's Ċ Ġ* Ġcorresponding Ġview Ġin Ġthe Ġ[ ViewGroup ] Ġthat Ġthe Ġstack Ġis Ġcreated Ġwith . Ċ Ġ*/ Ċ class ĠScreen Stack ( ĊĠĠĠ Ġactivity : ĠAppCompatActivity , ĊĠĠĠ Ġprivate Ġval Ġcontainer : ĠViewGroup ) Ġ{ ĊĠ Ġprivate Ġval Ġscreens Ġ= ĠStack < Screen Holder >() ĊĠ Ġprivate Ġval Ġcontext Ġ= ĠScreen Context ( activity , Ġthis , Ġcontainer ) ĊĊĠ Ġdata Ġclass ĠScreen Updated Event Ġ( val Ġprev : ĠScreen ?, Ġval Ġcurrent : ĠScreen ?) ĊĠ Ġval Ġscreen Updated Ġ= ĠEvent < Screen Updated Event >() ĊĊĠ Ġfun Ġ< S : ĠScreen > Ġregister ( ĊĠĠĠĠĠ Ġcls : ĠK Class < S >, ĊĠĠĠĠĠ Ġcreator : Ġ( Screen Context , Ġparams : ĠArray < Any > ?) Ġ-> ĠScreen ) Ġ{ ĊĠĠĠ Ġcontext . register Screen ( cls , Ġcreator ) ĊĠ Ġ} ĊĊĠ Ġinline Ġfun Ġ< re ified ĠS : ĠScreen > Ġregister ( ĊĠĠĠĠĠ Ġno inline Ġcreator : Ġ( Screen Context , Ġparams : ĠArray < Any > ?) Ġ-> ĠScreen ) Ġ{ ĊĠĠĠ Ġregister ( S :: class , Ġcreator ) ĊĠ Ġ} ĊĊĠ Ġval Ġtop : ĠScreen ? ĊĠĠĠ Ġget () Ġ= Ġif Ġ( screens . empty ()) Ġnull Ġelse Ġscreens . peek (). screen ĊĊĠ Ġ/** ĠThe Ġnumber Ġof Ġscreens Ġdeep Ġin Ġthe Ġhierarchy Ġwe Ġare . Ġ*/ ĊĠ Ġval Ġdepth : ĠInt ĊĠĠĠ Ġget () Ġ= Ġscreens . size ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠPush Ġthe Ġgiven Ġ[ Screen ] Ġonto Ġthe Ġstack . ĠThe Ġcurrently Ġvisible Ġscreen Ġ( if Ġany ) Ġwill ĊĠĠ Ġ* Ġbecome Ġhidden Ġ( though Ġnot Ġdestroyed ). ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġscreen ĠThe Ġ[ Screen ] Ġto Ġpush . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġpush ( screen : ĠScreen , Ġshared Views : ĠShared Views ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġval Ġprev Ġ= Ġtop ĊĊĠĠĠ Ġif Ġ( screen . options . is Root Screen ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠIf Ġthe Ġscreen Ġis Ġmeant Ġto Ġbe Ġa Ġroot Ġscreen , Ġpop Ġeverything Ġfirst . ĊĠĠĠĠĠ Ġwhile Ġ(! screens . empty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġpop Internal () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġif Ġ(! screens . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġ// ĠThis Ġscreen Ġis Ġnow Ġgoing Ġto Ġbe Ġshown Ġon Ġtop Ġof Ġthe Ġcurrent Ġtop . ĊĠĠĠĠĠ Ġval Ġtop Ġ= Ġscreens . peek () ĊĠĠĠĠĠ Ġtop . screen . on Hide () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġscreens . push ( Screen Holder ( screen , Ġshared Views )) ĊĠĠĠ Ġscreen . onCreate ( context , Ġcontainer ) ĊĠĠĠ Ġscreen . perform Show ( shared Views ) ĊĊĠĠĠ Ġscreen Updated ( Screen Updated Event ( prev , Ġscreen )) ĊĠ Ġ} ĊĊĠ Ġ/** ĠInternal Ġpop , Ġdoes Ġnot Ġfire Ġscreens Updated . Ġ*/ ĊĠ Ġprivate Ġfun Ġpop Internal () Ġ{ ĊĠĠĠ Ġvar Ġscreen Holder : ĠScreen Holder Ġ= Ġscreens . pop () Ġ?: Ġreturn ĊĊĠĠĠ Ġscreen Holder . screen . on Hide () ĊĠĠĠ Ġscreen Holder . screen . on Destroy () ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠPop Ġthe Ġtop - most Ġ[ Screen ] Ġfrom Ġthe Ġstack . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthere 's Ġanother Ġ[ Screen ] Ġdisplaying , Ġor Ġfalse Ġif Ġwe Ġpop ped Ġthe Ġlast ĊĠĠ Ġ* Ġ[ Screen ]. ĊĠĠ Ġ*/ ĊĠ Ġfun Ġpop (): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġprev Ġ= Ġscreens . peek ()?. screen ĊĠĠĠ Ġpop Internal () ĊĠĠĠ Ġif Ġ(! screens . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġscreen Holder Ġ= Ġscreens . peek () ĊĠĠĠĠĠ Ġscreen Holder . screen . perform Show ( screen Holder . shared Views ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġscreen Updated ( Screen Updated Event ( prev , Ġtop )) ĊĠĠĠ Ġreturn Ġtop Ġ!= Ġnull ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠPop Ġall Ġscreen Ġfrom Ġthe Ġstack , Ġreturn Ġto Ġblank Ġ" home ". ĊĠĠ Ġ*/ ĊĠ Ġfun Ġhome () Ġ{ ĊĠĠĠ Ġval Ġprev Ġ= Ġscreens . peek ()?. screen ĊĠĠĠ Ġwhile Ġ(! screens . empty ()) Ġ{ ĊĠĠĠĠĠ Ġpop Internal () ĊĠĠĠ Ġ} ĊĠĠĠ Ġcontainer . removeAll Views () ĊĠĠĠ Ġscreen Updated ( Screen Updated Event ( prev , Ġtop )) ĊĠ Ġ} ĊĊĠ Ġ/** ĠContains Ġinfo Ġwe Ġneed Ġabout Ġa Ġ[ Screen ] Ġwhile Ġit 's Ġon Ġthe Ġstack . Ġ Ġ*/ ĊĠ Ġprivate Ġclass ĠScreen Holder ( val Ġscreen : ĠScreen , Ġval Ġshared Views : ĠShared Views ?) Ċ } Ċ