package Ġcom . mapbox . navigation . core . trip . session Ċ Ċ import Ġcom . mapbox . navigation . core . trip . model . eh . EH orizon Object Distance Info Ċ import Ġcom . mapbox . navigation . core . trip . model . eh . EH orizon Position Ċ import Ġcom . mapbox . navigation . core . trip . model . eh . map To EH orizon Object Distance Info Ċ import Ġcom . mapbox . navigation . core . trip . model . eh . map To EH orizon Object Enter Exit Info Ċ import Ġcom . mapbox . navigation . core . trip . model . eh . map To EH orizon Position Ċ import Ġcom . mapbox . navigation . navigator . internal . Map box Native Navigator Ċ import Ġcom . mapbox . navigation . utils . internal . Thread Controller Ċ import Ġcom . mapbox . navigation . utils . internal . if NonNull Ċ import Ġcom . mapbox . navigator . Electron ic H orizon Observer Ċ import Ġcom . mapbox . navigator . Electron ic H orizon Position Ċ import Ġcom . mapbox . navigator . Road Object Distance Info Ċ import Ġcom . mapbox . navigator . Road Object Enter Exit Info Ċ import Ġcom . mapbox . navigator . Road Objects Store Observer Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . util . HashMap Ċ import Ġjava . util . concurrent . Copy On Write Array Set Ċ Ċ internal Ġclass ĠEH orizon Subscription ManagerImpl ( ĊĠĠĠ Ġprivate Ġval Ġnavigator : ĠMap box Native Navigator Ċ ) Ġ: ĠEH orizon Subscription Manager Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġmain Job Controller Ġ= ĠThread Controller . get Main Scope And Root Job () ĊĠĠĠ Ġprivate Ġval Ġe H orizon Observer s Ġ= ĠCopy On Write Array Set < EH orizon Observer >() ĊĠĠĠ Ġprivate Ġvar Ġcurrent Position : ĠEH orizon Position ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcurrent Dist ances : ĠMap < String , ĠEH orizon Object Distance Info >? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġelectronic H orizon Observer Ġ= Ġobject Ġ: ĠElectron ic H orizon Observer () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Road Object Enter ( road Object Info : ĠRoad Object Enter Exit Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify All Observer s Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Road Object Enter ( road Object Info . map To EH orizon Object Enter Exit Info ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Road Object Exit ( road Object Info : ĠRoad Object Enter Exit Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify All Observer s Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Road Object Exit ( road Object Info . map To EH orizon Object Enter Exit Info ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Position Updated ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition : ĠElectron ic H orizon Position , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdistances : ĠHashMap < String , ĠRoad Object Distance Info > ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Job Controller . scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe H orizon Position Ġ= Ġposition . map To EH orizon Position () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe H orizon Dist ances Ġ= Ġmutable Map Of < String , ĠEH orizon Object Distance Info >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistances . forEach Ġ{ Ġ( objectId , Ġobject Distance Info ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe H orizon Dist ances [ objectId ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Distance Info . map To EH orizon Object Distance Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Ġ= Ġe H orizon Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Dist ances Ġ= Ġe H orizon Dist ances ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify All Observer s Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Position Updated ( e H orizon Position , Ġe H orizon Dist ances ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġroad Objects Store Observer Ġ= Ġobject Ġ: ĠRoad Objects Store Observer () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Road Object Added ( road ObjectId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify All Observer s Ġ{ Ġon Road Object Added ( road ObjectId ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Road Object Updated ( road ObjectId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify All Observer s Ġ{ Ġon Road Object Updated ( road ObjectId ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Road Object Removed ( road ObjectId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify All Observer s Ġ{ Ġon Road Object Removed ( road ObjectId ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnotify All Observer s ( action : Ġsuspend ĠEH orizon Observer . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmain Job Controller . scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe H orizon Observer s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . action () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġregister Observer ( observer : ĠEH orizon Observer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( e H orizon Observer s . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Navigator Observer s () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġe H orizon Observer s . add ( observer ) ĊĠĠĠĠĠĠĠ Ġif NonNull ( current Position , Ġcurrent Dist ances ) Ġ{ Ġposition , Ġdistances Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Position Updated ( position , Ġdistances ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġunregister Observer ( observer : ĠEH orizon Observer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe H orizon Observer s . remove ( observer ) ĊĠĠĠĠĠĠĠ Ġif Ġ( e H orizon Observer s . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Navigator Observer s () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġunregister All Observer s () Ġ{ ĊĠĠĠĠĠĠĠ Ġe H orizon Observer s . clear () ĊĠĠĠĠĠĠĠ Ġremove Navigator Observer s () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġdo Ġwe Ġneed Ġto Ġcache Ġmore Ġfield ? ĠEH orizon Objects ? ĊĠĠĠĠĠĠĠ Ġcurrent Dist ances Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcurrent Position Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Navigator Observer s () Ġ{ ĊĠĠĠĠĠĠĠ Ġnavigator . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Electron ic H orizon Observer ( electron ic H orizon Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Road Objects Store Observer ( road Objects Store Observer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Navigator Observer s () Ġ{ ĊĠĠĠĠĠĠĠ Ġnavigator . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Electron ic H orizon Observer ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Road Objects Store Observer ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ