package Ġcom . l ud ens . android App . navigation . router Ċ Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroidx . fragment . app . FragmentManager Ċ import Ġcom . l ud ens . android App . navigation . extensions . is On Back Stack Ċ import Ġcom . l ud ens . android App . navigation . extensions . peek Back Stack Ċ import Ġcom . l ud ens . android App . navigation . fragment . Back Propag ating Fragment Ċ import Ġcom . l ud ens . shared . navigation . Router Ċ Ċ private Ġconst Ġval ĠROUT ING _ ACTION _ TH RO TT LE _ WINDOW Ġ= Ġ 3 0 0 Ċ Ċ abstract Ġclass ĠClose able Router ( ĊĠĠĠ Ġprotected Ġval Ġfragment Manager : ĠFragment Manager , ĊĠĠĠ Ġprivate Ġval Ġclose able Router Context : ĠClose able Router Context Ċ ) Ġ: ĠRouter Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġmain Handler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĊĠĠĠ Ġprivate Ġvar Ġlast Action Stamp Ġ= Ġ 0 L ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġfragment Manager . add On Back Stack Changed Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Handler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Manager . peek Back Stack ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . name . isNull Or Blank () Ġ&& Ġit . name Ġ== Ġclose able Router Context . marked For Closing . last OrNull ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Manager . pop Back Stack Immediate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose able Router Context . marked For Closing . remove Last () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġremove All Marked For Closing Entries () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠDis patches Ġaction Ġon Ġmain Ġthread Ġby Ġposting Ġthe Ġaction . ĠIf Ġthe Ġcurrent Ġthread Ġis Ġmain Ġthread , Ġaction Ġis Ġexecuted Ġimmediately . Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġdispatch On MainThread ( action : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmain Handler . post ( action :: invoke ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġdispatch On MainThread Th rott led ( action : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdispatch On MainThread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . currentTimeMillis (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Action Stamp Ġ< Ġit Ġ- ĠROUT ING _ ACTION _ TH RO TT LE _ WINDOW ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Action Stamp Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġremove All Marked For Closing Entries () Ġ= Ġdispatch On MainThread Ġ{ Ġclose able Router Context . marked For Closing . clear () Ġ} ĊĊĠĠĠ Ġfun Ġmark For Closing ( back Stack Tag : ĠString ) Ġ= Ġdispatch On MainThread Ġ{ ĊĠĠĠĠĠĠĠ Ġfragment Manager . peek Back Stack ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . name Ġ== Ġback Stack Tag ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Manager . pop Back Stack Immediate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ dispatch On MainThread ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġremove All Marked For Closing Entries () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! fragment Manager . is On Back Stack ( back Stack Tag )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ dispatch On MainThread ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( close able Router Context . marked For Closing . any Ġ{ Ġit Ġ== Ġback Stack Tag Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ dispatch On MainThread ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġclose able Router Context . marked For Closing . add ( back Stack Tag ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġpropagate Back To Top Fragment ( fragment Manager : ĠFragment Manager ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcall If Present ( find Back Propag ating Fragment ( fragment Manager ), ĠBack Propag ating Fragment :: back ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcall If Present ( back Propag ating Fragment : ĠBack Propag ating Fragment ?, Ġfunction : Ġ( Back Propag ating Fragment ) Ġ-> ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġback Propag ating Fragment ?. let ( function :: invoke ) Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Back Propag ating Fragment ( fragment Manager : ĠFragment Manager ): ĠBack Propag ating Fragment ? Ġ= ĊĠĠĠĠĠĠĠ Ġfragment Manager . fragments . reversed (). first OrNull Ġ{ Ġit Ġis ĠBack Propag ating Fragment Ġ} Ġas ? ĠBack Propag ating Fragment Ċ } Ċ