package Ġru . ant on ov . cats . navigator Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . Fragment Activity Ċ import Ġio . reactivex . subjects . Publish Subject Ċ import Ġru . ant on ov . cats . app . C ats Application Ċ import Ġru . ant on ov . cats . screens . cats . C ats Fragment Ċ import Ġru . mg ts . navigation . Forward Append Ċ import Ġru . ter r ak ok . c icer one . android . support . Support App Navigator Ċ import Ġru . ter r ak ok . c icer one . commands . Back To Ċ import Ġru . ter r ak ok . c icer one . commands . Command Ċ import Ġru . ter r ak ok . c icer one . commands . Forward Ċ import Ġru . ter r ak ok . c icer one . commands . Replace Ċ import Ġjava . io . Serializable Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . system . exit Process Ċ Ċ class ĠNavigator ( val Ġactivity : ĠFragment Activity , Ġprivate Ġval Ġcontainer Id : ĠInt ) Ġ: ĠSupport App Navigator ( activity , Ġcontainer Id ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġexit Click s Ġ= ĠPublish Subject . create < Unit >() ĊĠĠĠ Ġval Ġexit Dispose Ġ= Ġexit Click s ĊĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġshow System Message (" ÐĿ Ð°Ð¶ Ð¼ Ð¸ÑĤÐµ ĠÐµ Ñī Ñĳ ĠÑĢÐ°Ð· , ĠÑĩÑĤÐ¾Ð±Ñĭ ĠÐ²Ñĭ Ð¹ ÑĤÐ¸ ") Ġ} ĊĠĠĠĠĠĠĠ Ġ. buffer ( 2 0 0 0 , Ġ 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠ Ġ. filter { Ġit . size Ġ> Ġ 1 } ĊĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠC ats Application . app Component . inject ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexit () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// replace ( Replace ( HOME _ SCREEN , Ġnull )) ĊĠĠĠĠĠĠĠ Ġexit Click s . onNext ( Unit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow System Message ( message : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠToast . makeText ( activity , Ġmessage , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġcreate Fragment ( screen Key : ĠString ?, Ġdata : ĠAny ?) Ġ: ĠFragment ? Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" create Fragment Ġ" Ġ+ Ġscreen Key Ġ+ Ġ" Ġdata Ġ"+ Ġdata . toString ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( screen Key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC ats Fragment :: class . java . simple Name Ġ-> ĠC ats Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠC ats Fragment () ĊĠĠĠĠĠĠĠ Ġ}. apply Ġ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Bundle Ġ= Ġarguments ?. let Ġ{ it } Ġ?: ĠBundle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( data Ġas ? ĠSerializable )?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl Bundle . put Serializable ( data :: class . java . simple Name , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= Ġl Bundle ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġapply Command ( command : ĠCommand ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . apply Command ( command ) ĊĠĠĠĠĠĠĠ Ġif ( command Ġis ĠForward Append ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforward Append ( command ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġforward Append ( command : ĠForward Append ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= Ġcreate Fragment ( command . screen Key , Ġcommand . transition Data ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfragment Transaction Ġ= Ġactivity . support FragmentManager . beginTransaction () ĊĊĠĠĠĠĠĠĠ Ġsetup Fragment Transaction ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . support FragmentManager . find Fragment ById ( container Id ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Transaction ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( fragment Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Transaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( container Id , Ġfragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo Back Stack ( command . screen Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠTAG Ġ= ĠNavigator :: class . java . simple Name !! ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠHOME _ SCREEN Ġ= Ġ" home " ĊĠĠĠ Ġ} Ċ }