package Ġcom . da im ler . mb c ark it . implementation Ċ Ċ import Ġcom . da im ler . mb c ark it . business . Service Activation State Processor Ċ import Ġcom . da im ler . mb c ark it . business . Service Cache Ċ import Ġcom . da im ler . mb c ark it . business . Service Service Ċ import Ġcom . da im ler . mb c ark it . business . model . services . Service Ċ import Ġcom . da im ler . mb c ark it . business . model . services . Service Filter Ċ import Ġcom . da im ler . mb c ark it . business . model . services . Service Group Ċ import Ġcom . da im ler . mb c ark it . business . model . services . Service Group Option Ċ import Ġcom . da im ler . mb c ark it . business . model . services . Service Status Ċ import Ġcom . da im ler . mb c ark it . business . model . services . Service Status Des ire Ċ 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 Ċ Ċ internal Ġclass ĠCached Service Service ( ĊĠĠĠ Ġprivate Ġval Ġservice : ĠService Service , ĊĠĠĠ Ġprivate Ġval Ġcache : ĠService Cache , ĊĠĠĠ Ġprivate Ġval Ġstate Processor : ĠService Activation State Processor Ċ ) Ġ: ĠService Service Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Services ( ĊĠĠĠĠĠĠĠ Ġjwt Token : ĠString , ĊĠĠĠĠĠĠĠ Ġvin : ĠString , ĊĠĠĠĠĠĠĠ Ġgroup By : ĠService Group Option , ĊĠĠĠĠĠĠĠ Ġlocale : ĠString ?, ĊĠĠĠĠĠĠĠ Ġcheck Preconditions : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġfilter : ĠService Filter ĊĠĠĠ Ġ): ĠFuture Task < List < Service Group >, ĠResponse Error < out ĠRequest Error > ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask Object < List < Service Group >, ĠResponse Error < out ĠRequest Error > ?> () ĊĠĠĠĠĠĠĠ Ġservice . fetch Services ( jwt Token , Ġvin , Ġgroup By , Ġlocale , Ġcheck Preconditions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. onComplete Ġ{ Ġgroups Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservices Ġ= Ġgroups . flatMap Ġ{ Ġit . services Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate All Services ( vin , Ġservices , Ġcheck Preconditions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . complete ( groups ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache . load Services ( vin )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . complete ( group Services ( it , Ġgroup By )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġtask . fail ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtask . future Task () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Services ( ĊĠĠĠĠĠĠĠ Ġjwt Token : ĠString , ĊĠĠĠĠĠĠĠ Ġvin : ĠString , ĊĠĠĠĠĠĠĠ Ġids : ĠList < Int >, ĊĠĠĠĠĠĠĠ Ġgroup By : ĠService Group Option , ĊĠĠĠĠĠĠĠ Ġlocale : ĠString ?, ĊĠĠĠĠĠĠĠ Ġcheck Preconditions : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġfilter : ĠService Filter ĊĠĠĠ Ġ): ĠFuture Task < List < Service Group >, ĠResponse Error < out ĠRequest Error > ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask Object < List < Service Group >, ĠResponse Error < out ĠRequest Error > ?> () ĊĠĠĠĠĠĠĠ Ġservice . fetch Services ( jwt Token , Ġvin , Ġids , Ġgroup By , Ġlocale , Ġcheck Preconditions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. onComplete Ġ{ Ġgroups Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservices Ġ= Ġgroups . flatMap Ġ{ Ġit . services Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache . update Services ( vin , Ġservices , Ġcheck Preconditions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . complete ( groups ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache . load Services ById ( vin , Ġids )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . complete ( group Services ( it , Ġgroup By )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġtask . fail ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtask . future Task () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrequest Service Update ( ĊĠĠĠĠĠĠĠ Ġjwt Token : ĠString , ĊĠĠĠĠĠĠĠ Ġvin : ĠString , ĊĠĠĠĠĠĠĠ Ġdes ires : ĠList < Service Status Des ire > ĊĠĠĠ Ġ): ĠFuture Task < Unit , ĠResponse Error < out ĠRequest Error > ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask Object < Unit , ĠResponse Error < out ĠRequest Error > ?> () ĊĠĠĠĠĠĠĠ Ġservice . request Service Update ( jwt Token , Ġvin , Ġdes ires ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. onComplete Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Pending States ( vin , Ġdes ires ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . complete ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . fail ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtask . future Task () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġactivate All Services ( ĊĠĠĠĠĠĠĠ Ġjwt Token : ĠString , ĊĠĠĠĠĠĠĠ Ġvin : ĠString ĊĠĠĠ Ġ): ĠFuture Task < Unit , ĠResponse Error < out ĠRequest Error > ?> Ġ= ĊĠĠĠĠĠĠĠ Ġservice . activate All Services ( jwt Token , Ġvin ) ĊĊĠĠĠ Ġprivate Ġfun Ġupdate All Services ( fin Or V in : ĠString , Ġservices : ĠList < Service >, Ġcheck Preconditions : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcache . load Services ( fin Or V in )?. let Ġ{ Ġcached Services Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġservices Ġthat Ġare Ġnot Ġavailable Ġin Ġthe Ġgiven Ġlist . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Removed Services ( fin Or V in , Ġcached Services , Ġservices ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠProcess Ġactivation Ġstates Ġand Ġupdate . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache . update Services ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfin Or V in , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Processor . process Activation States ( cached Services , Ġservices ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Preconditions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġcache . update Services ( fin Or V in , Ġservices , Ġcheck Preconditions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelete Removed Services ( fin Or V in : ĠString , Ġcached Services : ĠList < Service >, Ġnew Services : ĠList < Service >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġcached Ġservices Ġthat Ġare Ġnot Ġreceived Ġvia Ġthe ĠAPI Ġand Ġdelete Ġthem . ĊĠĠĠĠĠĠĠ Ġcached Services . filter Ġ{ Ġcached Service Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Services . find Ġ{ Ġcached Service . id Ġ== Ġit . id Ġ} Ġ== Ġnull ĊĠĠĠĠĠĠĠ Ġ}. take If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . isNotEmpty () ĊĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache . delete Services ( fin Or V in , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgroup Services ( services : ĠList < Service >, Ġgroup By : ĠService Group Option ): ĠList < Service Group > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( groupBy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠService Group Option . NONE Ġ-> ĠlistOf ( Service Group ("", Ġservices )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠService Group Option . CATEGORY Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservices . groupBy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . category Name . or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠService Group ( it . key , Ġit . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠUpdates Ġthe Ġactivation Ġstates Ġof Ġcached Ġservices Ġbased Ġon Ġthe Ġdes ires . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Pending States ( fin Or V in : ĠString , Ġdes ires : ĠList < Service Status Des ire >) Ġ{ ĊĠĠĠĠĠĠĠ Ġcache . load Services ById ( fin Or V in , Ġdes ires . map Ġ{ Ġit . service Id Ġ}) ?. take If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . isNotEmpty () ĊĠĠĠĠĠĠĠ Ġ} ?. map NotNull Ġ{ Ġcached Service Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdes ires . find Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . service Id Ġ== Ġcached Service . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Activation State By Des ire ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMB Logger Kit . d (" Changing Ġactivation Ġstate Ġfor Ġ${ cached Service . id } Ġto Ġ$ it .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Service . copy ( activation Status Ġ= Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache . update Services ( fin Or V in , Ġit , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Activation State By Des ire ( des ire : ĠService Status Des ire ) Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( des ire . activate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠService Status . ACTIV ATION _ PENDING ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠService Status . DE ACTIV ATION _ PENDING ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ