package Ġcom . da im ler . mb c ark it . implementation Ċ Ċ import Ġcom . da im ler . mb c ark it . MB Car Kit Ċ import Ġcom . da im ler . mb c ark it . business . Send To Car Provider Ċ import Ġcom . da im ler . mb c ark it . business . Send To Car Service Ċ import Ġcom . da im ler . mb c ark it . business . model . send to car . Route Type Ċ import Ġcom . da im ler . mb c ark it . business . model . send to car . Send To Car Capabilities Ċ import Ġcom . da im ler . mb c ark it . business . model . send to car . Send To Car Capability Ċ import Ġcom . da im ler . mb c ark it . business . model . send to car . Send To Car Poi Ċ import Ġcom . da im ler . mb c ark it . business . model . send to car . Send To Car Precondition Ċ import Ġcom . da im ler . mb c ark it . business . model . send to car . Send To Car Route Ċ import Ġcom . da im ler . mb c ark it . business . model . send to car . has Un met Preconditions Ċ import Ġcom . da im ler . mb c ark it . implementation . exceptions . Send To Car Not Possible Error Ċ import Ġcom . da im ler . mb logger kit . MB Logger Kit Ċ import Ġcom . da im ler . mb network kit . networking . Request Error Ċ import Ġcom . da im ler . mb network kit . networking . ResponseError Ċ import Ġcom . da im ler . mb network kit . task . Future Task Ċ import Ġcom . da im ler . mb network kit . task . Task Object Ċ Ċ class ĠSDK Send To Car Service Ġinternal Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġs 2 c Provider : ĠSend To Car Provider Ċ ) Ġ: ĠSend To Car Service Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġis Bluetooth Enabled : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Capabilities ( ĊĠĠĠĠĠĠĠ Ġtoken : ĠString , ĊĠĠĠĠĠĠĠ Ġfin Or V in : ĠString ĊĠĠĠ Ġ): ĠFuture Task < Send To Car Capabilities , ĠResponse Error < out ĠRequest Error > ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeferred Task Ġ= ĠTask Object < Send To Car Capabilities , ĠResponse Error < out ĠRequest Error > ?> () ĊĠĠĠĠĠĠĠ Ġs 2 c Provider . fetch Capabilities ( token , Ġfin Or V in ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. onComplete Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred Task . complete ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSend To Car Capabilities ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . capabilities , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . pre conditions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred Task . fail ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdeferred Task . future Task () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsend Poi ( ĊĠĠĠĠĠĠĠ Ġtoken : ĠString , ĊĠĠĠĠĠĠĠ Ġfin Or V in : ĠString , ĊĠĠĠĠĠĠĠ Ġpo i : ĠSend To Car Poi ĊĠĠĠ Ġ): ĠFuture Task < Unit , ĠResponse Error < out ĠRequest Error > ?> Ġ{ ĊĠĠĠĠĠĠĠ ĠMB Logger Kit . d (" At tempting Ġto Ġsend ĠPO I Ġvia ĠS 2 C Ġto Ġcar Ġ#$ fin Or V in ") ĊĠĠĠĠĠĠĠ Ġval Ġdeferred Task Ġ= ĠTask Object < Unit , ĠResponse Error < out ĠRequest Error > ?> () ĊĠĠĠĠĠĠĠ Ġfetch Capabilities ( token , Ġfin Or V in ). onComplete Ġ{ Ġcar Capabilities Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! is Send Poi Possible For Preconditions ( car Capabilities ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMB Logger Kit . e (" PO I ĠS 2 C Ġimpossible Ġ-> Ġcapability Ġhas Ġun met Ġpre conditions : Ġ${ car Capabilities . pre conditions . join ToString (",") }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred Task . fail ( ResponseError . request Error ( Send To Car Not Possible Error . Preconditions ( car Capabilities . pre conditions ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Poi Sending Available ( car Capabilities ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMB Logger Kit . d (" PO I Ġsending Ġis Ġpossible , Ġattempting Ġto Ġsend ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetermine Send Mode For Poi ( car Capabilities , Ġtoken , Ġfin Or V in , Ġpo i )?. let Ġ{ Ġmode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmode . send Poi () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onComplete Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred Task . complete ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred Task . fail ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġdeferred Task . fail ( ResponseError . request Error ( Send To Car Not Possible Error . Bluetooth Not Configured )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMB Logger Kit . e (" PO I ĠS 2 C Ġimpossible Ġ-> Ġrequired Ġcapabilities Ġfor Ġroute Ġnot Ġpresent : Ġ${ car Capabilities . capabilities . join ToString (",") }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred Task . fail ( ResponseError . request Error ( Send To Car Not Possible Error . Capability )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred Task . fail ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdeferred Task . future Task () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Send Poi Possible For Preconditions ( car Capabilities : ĠSend To Car Capabilities ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! car Capabilities . has Un met Preconditions ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġallow ĠBluetooth Ġin Ġcase ĠMB Apps Ġalso Ġdoes Ġnot Ġwork ĊĠĠĠĠĠĠĠ Ġreturn Ġcar Capabilities . capabilities . contains ( Send To Car Capability . SINGLE _ PO I _ BL U ETO OTH ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcar Capabilities . pre conditions . contains ( Send To Car Precondition . MB APPS _ REGISTER _ USER ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcar Capabilities . pre conditions . contains ( Send To Car Precondition . MB APPS _ ENABLE _ MB APPS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ ĠM BC ar Kit . bluetooth Send To Car Service Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Bluetooth Enabled ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdetermine Send Mode For Poi ( ĊĠĠĠĠĠĠĠ Ġcar Capabilities : ĠSend To Car Capabilities , ĊĠĠĠĠĠĠĠ Ġtoken : ĠString , ĊĠĠĠĠĠĠĠ Ġfin Or V in : ĠString , ĊĠĠĠĠĠĠĠ Ġpo i : ĠSend To Car Poi ĊĠĠĠ Ġ): ĠPo i Send Mode ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( MB Car Kit . bluetooth Send To Car Service Ġ!= Ġnull Ġ&& Ġis Bluetooth Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMB Logger Kit . d (" Bluetooth ĠS 2 C ĠService Ġpresent , Ġattempt Ġsending Ġvia Ġbluetooth Ġfirst ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( car Capabilities . capabilities . contains ( Send To Car Capability . SINGLE _ PO I _ BL U ETO OTH )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMB Logger Kit . d (" Send ĠPO I Ġvia ĠBluetooth ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM BC ar Kit . bluetooth Send To Car Service ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPo i Send Mode . Bluetooth ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfin Or V in , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpo i , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM BC ar Kit . bluetooth Send To Car Service ?. is Bluetooth Connection Available ( fin Or V in ) Ġ== Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMB Logger Kit . d (" Car Ġdoes Ġnot Ġsupport ĠBluetooth ĠPO I , Ġsend Ġvia ĠB A ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPo i Send Mode . Network ( s 2 c Provider , Ġtoken , Ġfin Or V in , Ġpo i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMB Logger Kit . d (" No ĠBluetooth ĠS 2 C ĠService Ġpresent , Ġsend Ġvia ĠBE ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPo i Send Mode . Network ( s 2 c Provider , Ġtoken , Ġfin Or V in , Ġpo i ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsend Route ( ĊĠĠĠĠĠĠĠ Ġtoken : ĠString , ĊĠĠĠĠĠĠĠ Ġfin Or V in : ĠString , ĊĠĠĠĠĠĠĠ Ġroute : ĠSend To Car Route ĊĠĠĠ Ġ): ĠFuture Task < Unit , ĠResponse Error < out ĠRequest Error > ?> Ġ{ ĊĠĠĠĠĠĠĠ ĠMB Logger Kit . d (" At tempting Ġto Ġsend Ġroute Ġvia ĠS 2 C Ġto Ġcar Ġ#$ fin Or V in ") ĊĠĠĠĠĠĠĠ Ġval Ġdeferred Task Ġ= ĠTask Object < Unit , ĠResponse Error < out ĠRequest Error > ?> () ĊĠĠĠĠĠĠĠ Ġfetch Capabilities ( token , Ġfin Or V in ). onComplete Ġ{ Ġcar Capabilities Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcar Capabilities . has Un met Preconditions () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMB Logger Kit . e (" Route ĠS 2 C Ġimpossible Ġ-> Ġcapability Ġhas Ġun met Ġpre conditions : Ġ${ car Capabilities . pre conditions . join ToString (",") }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred Task . fail ( ResponseError . request Error ( Send To Car Not Possible Error . Preconditions ( car Capabilities . pre conditions ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Route Sending Available ( car Capabilities . capabilities , Ġroute . route Type ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMB Logger Kit . d (" Route Ġsending Ġis Ġpossible , Ġattempting Ġto Ġsend ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs 2 c Provider . send Route ( token , Ġfin Or V in , Ġroute ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onComplete Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred Task . complete ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMB Logger Kit . e (" Failed Ġto Ġsend Ġroute Ġto Ġcar Ġvia ĠBackend : Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred Task . fail ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMB Logger Kit . e (" Route ĠS 2 C Ġimpossible Ġ-> Ġrequired Ġcapabilities Ġfor Ġroute Ġnot Ġpresent : Ġ${ car Capabilities . capabilities . join ToString (",") }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred Task . fail ( ResponseError . request Error ( Send To Car Not Possible Error . Capability )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred Task . fail ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdeferred Task . future Task () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġenable Bluetooth ( isEnabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMB Logger Kit . d (" Bluetooth Ġenable ment Ġstate Ġchanged : Ġ$ isEnabled ") ĊĠĠĠĠĠĠĠ Ġis Bluetooth Enabled Ġ= Ġis Enabled ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Poi Sending Available ( car Capabilities : ĠSend To Car Capabilities ) Ġ= ĊĠĠĠĠĠĠĠ Ġcar Capabilities . capabilities . contains ( Send To Car Capability . SINGLE _ PO I _ BACKEND ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( is Bluetooth Enabled Ġ&& Ġcar Capabilities . capabilities . contains ( Send To Car Capability . SINGLE _ PO I _ BL U ETO OTH )) ĊĊĠĠĠ Ġprivate Ġfun Ġis Route Sending Available ( ĊĠĠĠĠĠĠĠ Ġcapabilities : ĠList < Send To Car Capability >, ĊĠĠĠĠĠĠĠ Ġroute Type : ĠRoute Type ĊĠĠĠ Ġ) Ġ= ĊĠĠĠĠĠĠĠ Ġroute Type Ġ== ĠRoute Type . STATIC _ ROUTE Ġ&& Ġcapabilities . contains ( Send To Car Capability . STATIC _ ROUTE _ BACKEND ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroute Type Ġ== ĠRoute Type . DYNAMIC _ ROUTE Ġ&& Ġcapabilities . contains ( Send To Car Capability . DYNAMIC _ ROUTE _ BACKEND ) Ċ } Ċ