package Ġcom . github . ro oney and shadow s . light bul b . application . activity . routing Ċ Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . Fragment Factory Ċ import Ġandroidx . fragment . app . FragmentManager Ċ import Ġandroidx . fragment . app . Fragment Transaction Ċ import Ġcom . github . ter r ak ok . c icer one .* Ċ import Ġcom . github . ter r ak ok . c icer one . android x . App Navigator Ċ import Ġcom . github . ter r ak ok . c icer one . android x . Fragment Screen Ċ import Ġcom . github . ro oney and shadow s . light bul b . application . R Ċ import Ġcom . github . ro oney and shadow s . light bul b . application . activity . Base Activity Ċ Ċ @ Suppress (" Can Be Primary Constructor Property ") Ċ open Ġclass ĠBase Application Router ( context Activity : ĠBase Activity , Ġfragment Container Id : ĠInt ) Ġ{ ĊĠĠĠ Ġprotected Ġval Ġcontext Activity : ĠBase Activity Ġ= Ġcontext Activity ĊĠĠĠ Ġprivate Ġval Ġfragment Container Id : ĠInt Ġ= Ġfragment Container Id ĊĠĠĠ Ġprivate Ġvar Ġc icer one : ĠC icer one < Router > Ġ= ĠC icer one . create () ĊĠĠĠ Ġprivate Ġval Ġrouter : ĠRouter ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġc icer one . router ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġc icer one . get Navigator Holder (). set Navigator ( setup Navigator ( context Activity )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġnavigate ( command : ĠNavigation Commands , Ġscreen : ĠScreen ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( command Ġ== ĠNavigation Commands . NAV IG ATE _ TO ) Ġrouter . navigate To ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Screen ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscreen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( command Ġ== ĠNavigation Commands . NAV IG ATE _ TO _ AND _ CLEAR _ BACK STACK ) Ġrouter . new Root Chain ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Screen ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscreen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( command Ġ== ĠNavigation Commands . BACK _ TO ) Ġrouter . back To ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Screen ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscreen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnew Chain ( var arg Ġscreens : ĠScreen ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchain Ġ= Ġconvert Scre ens (* screens ) ĊĠĠĠĠĠĠĠ Ġrouter . new Root Chain (* chain . to Typed Array ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Navigator () Ġ{ ĊĠĠĠĠĠĠĠ Ġc icer one . get Navigator Holder (). remove Navigator () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnavigate Back () Ġ{ ĊĠĠĠĠĠĠĠ Ġrouter . exit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Screen ( screen : ĠScreen ): ĠFragment Screen Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠFragment Screen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġscreen Key : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġscreen . getId () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Fragment ( factory : ĠFragment Factory ): ĠFragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġscreen . get Fragment (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Scre ens ( var arg Ġscreens : ĠScreen ): ĠArrayList < Fragment Screen > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconverted Ġ= ĠArrayList < Fragment Screen >() ĊĠĠĠĠĠĠĠ Ġscreens . iterator (). forEach Ġ{ Ġscreen Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconverted . add ( convert Screen ( screen )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġconverted ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Navigator ( context Activity : ĠBase Activity ): ĠNavigator Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠApp Navigator ( context Activity , Ġfragment Container Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġforward ( command : ĠForward ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Manager Ġ= Ġcontext Activity . support FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscreen Ġ= Ġcommand . screen Ġas ĠFragment Screen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Fragment Ġ= Ġfragment Manager . find Fragment ById ( fragment Container Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequested Fragment Ġ= Ġscreen . create Fragment ( fragment Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Fragment Ġ!= Ġnull Ġ&& Ġcurrent Fragment . java Class Ġ== Ġrequested Fragment . java Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Transaction Ġ= Ġfragment Manager . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Fragment Transaction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscreen , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Transaction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Fragment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequested Fragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Transaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo Back Stack ( screen . screen Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( fragment Container Id , Ġrequested Fragment , Ġscreen . screen Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsetup Fragment Transaction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscreen : ĠFragment Screen , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Transaction : ĠFragment Transaction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Fragment : ĠFragment ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Fragment : ĠFragment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . setup Fragment Transaction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscreen , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Transaction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Fragment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Fragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexists In Back stack Ġ= Ġfragment Manager . pop Back Stack Immediate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscreen . screen Key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFragment Manager . POP _ BACK _ STACK _ INCL USIVE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exists In Back stack ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Transaction . set Custom Animations ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . anim . enter _ from _ left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . anim . exit _ to _ right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . anim . enter _ from _ right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . anim . exit _ to _ left ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Transaction . set Custom Animations ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . anim . enter _ from _ right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . anim . exit _ to _ left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . anim . enter _ from _ left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . anim . exit _ to _ right ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply Commands ( commands : ĠArray < out ĠCommand >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . apply Commands ( commands ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Activity . support FragmentManager . execute Pending Transactions () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġclass ĠScreen () Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġfun ĠgetId (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis :: class . java . name ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġget Fragment (): ĠFragment ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠNavigation Commands Ġ{ ĊĠĠĠĠĠĠĠ ĠNAV IG ATE _ TO , ĠNAV IG ATE _ TO _ AND _ CLEAR _ BACK STACK , ĠBACK _ TO ĊĠĠĠ Ġ} Ċ }