package Ġcom . h ich am . wc store app . android . ui . navigation Ċ Ċ import Ġandroidx . lifecycle . as Flow Ċ import Ġandroidx . navigation . Nav Controller Ċ import Ġandroidx . navigation . Nav Options Ċ import Ġandroidx . navigation . Nav Options Builder Ċ import Ġandroidx . navigation . nav Options Ċ import Ġcom . h ich am . wc store app . ui . Navigation Manager Ċ import Ġkotlinx . coroutines . flow .* Ċ Ċ class ĠAndroid Navigation Manager Ġ: ĠNavigation Manager Ġ{ ĊĠĠĠ Ġ// ĠWe Ġuse Ġa ĠState Flow Ġhere Ġto Ġallow ĠView Models Ġto Ġstart Ġob serving Ġnavigation Ġresults Ġbefore Ġthe Ġinitial Ġcomposition , ĊĠĠĠ Ġ// Ġand Ġstill Ġget Ġthe Ġnavigation Ġresult Ġlater ĊĠĠĠ Ġprivate Ġval Ġnav Controller Flow Ġ= ĠMutable State Flow < Nav Controller ? >( null ) ĊĊĠĠĠ Ġprivate Ġval Ġnavigation Commands Ġ= ĊĠĠĠĠĠĠĠ ĠMutable Shared Flow < Navigation Command >( extra Buffer Capacity Ġ= ĠInt . MAX _ VALUE ) ĊĊĊĠĠĠ Ġsuspend Ġfun Ġhandle Navigation Commands ( nav Controller : ĠNav Controller ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnavigation Commands ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Subscription Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Android Navigation Manager . nav Controller Flow . value Ġ= Ġnav Controller ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Completion Ġ{ Ġthis @ Android Navigation Manager . nav Controller Flow . value Ġ= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ Ġnav Controller . handle Navigation Command ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnavigate ( route : ĠString , Ġoptions Builder : Ġ( Nav Options Builder . () Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= Ġoptions Builder ?. let Ġ{ Ġnav Options ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġnavigation Commands . try Emit ( Navigation Command . Navigate To Route ( route , Ġoptions )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnavigate ( route : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnavigate ( route , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnavigate Up () Ġ{ ĊĠĠĠĠĠĠĠ Ġnavigation Commands . try Emit ( Navigation Command . Navigate Up ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpop Up To ( route : ĠString , Ġinclusive : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnavigation Commands . try Emit ( Navigation Command . Pop Up To Route ( route , Ġinclusive )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġnavigate Back With Result ( ĊĠĠĠĠĠĠĠ Ġkey : ĠString , ĊĠĠĠĠĠĠĠ Ġresult : ĠT , ĊĠĠĠĠĠĠĠ Ġdestination : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnavigation Commands . try Emit ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation Command . Navigate Up With Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġresult , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Ġ= Ġdestination ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġobserve Result ( key : ĠString , Ġroute : ĠString ? Ġ= Ġnull ): ĠFlow < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnav Controller Flow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Latest Ġ{ Ġnav Controller Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġback Stack Entry Ġ= Ġroute ?. let Ġ{ Ġnav Controller . get Back Stack Entry ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġnav Controller . current Back Stack Entry ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġback Stack Entry ?. saved State Handle ?. let Ġ{ Ġsaved State Handle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsaved State Handle . get LiveData < T ? >( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNull ify Ġthe Ġresult Ġto Ġavoid Ġres ub mit ting Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsaved State Handle . set ( key , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġempty Flow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠNav Controller . handle Navigation Command ( navigation Command : ĠNavigation Command ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( navigation Command ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNavigation Command . Navigate To Route Ġ-> Ġnavigate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Command . route , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Command . options ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation Command . Navigate Up Ġ-> Ġnavigate Up () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNavigation Command . Pop Up To Route Ġ-> Ġpop Back Stack ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Command . route , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Command . inclusive ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNavigation Command . Navigate Up With Result < *> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġback Stack Entry Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Command . destination ?. let Ġ{ Ġget Back Stack Entry ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġprevious Back Stack Entry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġback Stack Entry ?. saved State Handle ?. set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Command . key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Command . result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Command . destination ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpop Back Stack ( it , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate Up () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠNavigation Command Ġ{ ĊĠĠĠ Ġobject ĠNavigate Up Ġ: ĠNavigation Command () ĊĠĠĠ Ġdata Ġclass ĠNavigate To Route ( val Ġroute : ĠString , Ġval Ġoptions : ĠNav Options ? Ġ= Ġnull ) Ġ: ĊĠĠĠĠĠĠĠ ĠNavigation Command () ĊĊĠĠĠ Ġdata Ġclass ĠNavigate Up With Result < T >( ĊĠĠĠĠĠĠĠ Ġval Ġkey : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġresult : ĠT , ĊĠĠĠĠĠĠĠ Ġval Ġdestination : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ: ĠNavigation Command () ĊĊĠĠĠ Ġdata Ġclass ĠPop Up To Route ( val Ġroute : ĠString , Ġval Ġinclusive : ĠBoolean ) Ġ: ĠNavigation Command () Ċ }