package Ġio . pl ast ique . core . navigation Ċ Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroidx . lifecycle . Default Lifecycle Observer Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġtim ber . log . Tim ber Ċ Ċ interface ĠNavigator Ġ{ ĊĠĠĠ Ġfun Ġattach ( context : ĠNavigation Context ) ĊĊĠĠĠ Ġfun Ġnavigate To ( route : ĠRoute ) Ċ } Ċ Ċ abstract Ġclass ĠBase Navigator Ġ: ĠNavigator Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġnavigation Context : ĠNavigation Context ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġqueue Ġ= Ġmutable ListOf < Route >() ĊĠĠĠ Ġprivate Ġval Ġmain Thread Handler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĊĠĠĠ Ġoverride Ġfun Ġattach ( context : ĠNavigation Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( navigation Context Ġ== Ġnull ) Ġ{ Ġ" Already Ġattached Ġto ĠNavigation Context Ġ$ context " Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontext . lifecycle . add Observer ( object Ġ: ĠDefault Lifecycle Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart ( owner : ĠLifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Context Ġ= Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Pending Routes ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stop ( owner : ĠLifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Context Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Destroy ( owner : ĠLifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner . lifecycle . remove Observer ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnavigate To ( route : ĠRoute ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Looper . my Looper () Ġ!== ĠL ooper . get Main Looper ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Thread Handler . post Ġ{ Ġnavigate To ( route ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġnavigation Context ĊĠĠĠĠĠĠĠ Ġif Ġ( context Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( LOG _ TAG ). d (" Navig ating Ġto Ġ$ route ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . navigate To ( route ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenqueue ( route ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġenqueue ( route : ĠRoute ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( queue . size Ġ< ĠMAX _ QUEUE _ SIZE ) Ġ{ Ġ" Navigation Ġqueue Ġis Ġfull " Ġ} ĊĠĠĠĠĠĠĠ Ġqueue Ġ+= Ġroute ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Pending Routes ( navigation Context : ĠNavigation Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġqueue . forEach Ġ{ Ġroute Ġ-> Ġnavigation Context . navigate To ( route ) Ġ} ĊĠĠĠĠĠĠĠ Ġqueue . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLOG _ TAG Ġ= Ġ" Navigation " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ QUEUE _ SIZE Ġ= Ġ 5 ĊĠĠĠ Ġ} Ċ } Ċ