package Ġcom . tik nil . navigation . core Ċ Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . FragmentManager Ċ import Ġandroidx . lifecycle . Lifecycle Ċ import Ġkotlinx . coroutines . C ancellable Continuation Ċ import Ġkotlinx . coroutines . suspend C ancellable Coroutine Ċ Ċ class ĠS us pending Multi Stack Navigator ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnavigator : ĠMulti Stack Navigator Ċ ) Ġ: ĠS us pending Navigator Ġby ĠCommon Sus pending Navigator ( navigator ) Ġ{ ĊĊĠĠĠ Ġsuspend Ġfun Ġshow ( index : ĠInt ) Ġ= Ġsuspend C ancellable Coroutine < Fragment ?> Ġ{ Ġcontinuation Ġ-> ĊĠĠĠĠĠĠĠ Ġnavigator . stack Fragments [ navigator . active Index ]. do On Lifecycle Event ( Lifecycle . Event . ON _ RE SU ME ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġupcoming Stack Ġ= Ġnavigator . stack Fragments . get OrNull ( index )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġcontinuation . resume If Active ( null ) Ġ Ġ// Ġout Ġof Ġindex . ĠThrow Ġan Ġexception Ġmaybe ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġupcoming Stack . waitFor Child ( continu ation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigator . show ( index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġclear ( up To Tag : ĠString ?, Ġinclude Match : ĠBoolean ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS us pending Stack Navigator ( navigator . active Navigator ). clear ( up To Tag , Ġinclude Match ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see ĠMulti Stack Navigator . clear All ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġclear All () Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Clear All () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġinternal Clear All (): ĠFragment ? Ġ= Ġsuspend C ancellable Coroutine Ġ{ Ġcontinuation Ġ-> ĊĠĠĠĠĠĠĠ Ġ// ĠClear Ġall Ġuses ĠFragment Transaction . commit Now , Ġmake Ġsure Ġcalls Ġstart Ġon Ġthe ĠUI Ġthread ĊĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigator . clear All () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRoot Ġfunction Ġwill Ġbe Ġinvoked Ġfor Ġnewly Ġadded ĠStack Fragment , Ġwait Ġon Ġit 's Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigator . stack Fragments [ 0 ]. waitFor Child ( continu ation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠStack Fragment . waitFor Child ( continu ation : ĠC ancellable Continuation < Fragment ?> ) Ġ= Ġdo On Lifecycle Event ( Lifecycle . Event . ON _ RE SU ME ) Ġ{ ĊĠĠĠ Ġwhen Ġ( val Ġcurrent Ġ= Ġnavigator . current ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ Ġ// ĠRoot Ġhas Ġnot Ġbeen Ġshown Ġyet , Ġdefer Ġuntil Ġthe Ġfirst Ġfragment Ġshows ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Manager Ġ= Ġnavigator . fragment Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Manager . register Fragment Lifecycle Callbacks ( object Ġ: ĠFragment Manager . Fragment Lifecycle Callbacks () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Fragment Res umed ( fm : ĠFragment Manager , Ġf : ĠFragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume If Active ( f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Manager . unregister Fragment Lifecycle Callbacks ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcontinuation . resume If Active ( current ) ĊĠĠĠ Ġ} Ċ }