/* Ċ Ġ* ĠUnless Ġexplicitly Ġstated Ġotherwise Ġall Ġfiles Ġin Ġthis Ġrepository Ġare Ġlicensed Ġunder Ġthe ĠApache ĠLicense ĠVersion Ġ 2 . 0 . Ċ Ġ* ĠThis Ġproduct Ġincludes Ġsoftware Ġdeveloped Ġat ĠDat adog Ġ( https :// www . datadog hq . com /). Ċ Ġ* ĠCopyright Ġ 2 0 1 6 - Present ĠDat adog , ĠInc . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" Matching Declaration Name ") Ċ package Ġcom . datadog . android . compose Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . Disposable Effect Ċ import Ġandroidx . compose . runtime . Non Restart able Composable Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . remember Updated State Ċ import Ġandroidx . compose . ui . platform . Local Lifecycle Owner Ċ import Ġandroidx . lifecycle . Lifecycle Ċ import Ġandroidx . lifecycle . Lifecycle Event Observer Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . navigation . Nav Controller Ċ import Ġandroidx . navigation . Nav Destination Ċ import Ġcom . datadog . android . rum . Global R um Ċ import Ġcom . datadog . android . rum . R um Monitor Ċ import Ġcom . datadog . android . rum . tracking . Accept All Nav Dest inations Ċ import Ġcom . datadog . android . rum . tracking . Component Predicate Ċ Ċ internal Ġclass ĠCompose Navigation Observer ( ĊĠĠĠ Ġprivate Ġval Ġtrack Arguments : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġprivate Ġval Ġdestination Predicate : ĠComponent Predicate < Nav Destination > Ġ= ĊĠĠĠĠĠĠĠ ĠAccept All Nav Dest inations (), ĊĠĠĠ Ġprivate Ġval Ġnav Controller : ĠNav Controller , ĊĠĠĠ Ġprivate Ġval Ġr um Monitor : ĠR um Monitor Ġ= ĠGlobal R um . get () Ċ ) Ġ: ĠLifecycle Event Observer , ĠNav Controller . On Destination Changed Listener Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġon StateChanged ( source : ĠLifecycle Owner , Ġevent : ĠLifecycle . Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( event Ġ== ĠLifecycle . Event . ON _ RE SU ME ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġonce Ġlistener Ġis Ġadded , Ġit Ġwill Ġreceive Ġcurrent Ġdestination Ġif Ġavailable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller . add On Destination Changed Listener ( this ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( event Ġ== ĠLifecycle . Event . ON _ PAUSE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller . current Destination ?. route ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr um Monitor . stop View ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller . remove On Destination Changed Listener ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destination Changed ( ĊĠĠĠĠĠĠĠ Ġcontroller : ĠNav Controller , ĊĠĠĠĠĠĠĠ Ġdestination : ĠNav Destination , ĊĠĠĠĠĠĠĠ Ġarguments : ĠBundle ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( destination Predicate . accept ( destination )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination . route ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart View ( destination , Ġit , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġon Dispose () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġjust Ġa Ġsafe - guard Ġif ĠON _ PAUSE Ġwasn 't Ġcalled ĊĠĠĠĠĠĠĠ Ġnav Controller . remove On Destination Changed Listener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart View ( ĊĠĠĠĠĠĠĠ Ġnav Destination : ĠNav Destination , ĊĠĠĠĠĠĠĠ Ġroute : ĠString , ĊĠĠĠĠĠĠĠ Ġarguments : ĠBundle ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Name Ġ= Ġdestination Predicate . getView Name ( nav Destination ) Ġ?: Ġroute ĊĠĠĠĠĠĠĠ Ġr um Monitor . start View ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġroute , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġview Name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattributes Ġ= Ġif Ġ( track Arguments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠconvertTo R um Attributes ( arguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Map () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠconvertTo R um Attributes ( bundle : ĠBundle ?): ĠMap < String , ĠAny ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( bundle Ġ== Ġnull ) Ġreturn Ġempty Map () ĊĊĠĠĠĠĠĠĠ Ġval Ġattributes Ġ= Ġmutable Map Of < String , ĠAny ?> () ĊĊĠĠĠĠĠĠĠ Ġbundle . keySet (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattributes [" $ ARGUMENT _ TAG .$ it "] Ġ= Ġbundle . get ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġattributes ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠARG UMENT _ TAG : ĠString Ġ= Ġ" view . arguments " ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġside Ġeffect Ġwhich Ġshould Ġbe Ġused Ġto Ġtrack Ġview Ġnavigation Ġwith Ġthe ĠNavigation Ċ Ġ* Ġfor ĠCompose Ġsetup . Ċ Ġ* Ċ Ġ* Ġ@ param Ġnav Controller Ġ[ Nav Controller ] Ġto Ġwatch Ċ Ġ* Ġ@ param Ġtrack Arguments Ġwhether Ġto Ġtrack Ġnavigation Ġarguments Ċ Ġ* Ġ@ param Ġdestination Predicate Ġto Ġaccept Ġthe Ġ[ Nav Destination ] Ġthat Ġwill Ġbe Ġtaken Ġinto Ġaccount Ġas Ċ Ġ* Ġvalid ĠR UM ĠView Ġevents . Ċ Ġ*/ Ċ @ Experimental Tracking Api Ċ @ Composable Ċ @ Non Restart able Composable Ċ fun ĠNavigation View Tracking Effect ( ĊĠĠĠ Ġnav Controller : ĠNav Controller , ĊĠĠĠ Ġtrack Arguments : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġdestination Predicate : ĠComponent Predicate < Nav Destination > Ġ= ĠAccept All Nav Dest inations () Ċ ) Ġ{ ĊĊĠĠĠ Ġval Ġcurrent Track Arguments Ġby Ġremember Updated State ( newValue Ġ= Ġtrack Arguments ) ĊĠĠĠ Ġval Ġcurrent Destination Predicate Ġby Ġremember Updated State ( newValue Ġ= Ġdestination Predicate ) ĊĊĠĠĠ Ġval Ġlifecycle Owner Ġ= ĠLocal Lifecycle Owner . current ĊĠĠĠ ĠDis posable Effect ( lifecycle Owner , Ġnav Controller ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= ĠCompose Navigation Observer ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Track Arguments , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Destination Predicate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġlifecycle Owner . lifecycle . add Observer ( observer ) ĊĊĠĠĠĠĠĠĠ Ġon Dispose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Owner . lifecycle . remove Observer ( observer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Dispose () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ