/**************************************************************** ************************ ****** Ċ Copyright Ġ( C ) Ġ 2 0 2 1 ĠNor bert ĠTr uch sess Ġnor bert . tr uch sess @ t - online . de Ċ Ċ This Ġprogram Ġis Ġfree Ġsoftware : Ġyou Ġcan Ġredistribute Ġit Ġand / or Ġmodify Ċ it Ġunder Ġthe Ġterms Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġas Ġpublished Ġby Ċ the ĠFree ĠSoftware ĠFoundation , Ġeither Ġversion Ġ 3 Ġof Ġthe ĠLicense , Ġor Ċ ( at Ġyour Ġoption ) Ġany Ġlater Ġversion . Ċ Ċ This Ġprogram Ġis Ġdistributed Ġin Ġthe Ġhope Ġthat Ġit Ġwill Ġbe Ġuseful , Ċ but ĠWITHOUT ĠANY ĠWARRANTY ; Ġwithout Ġeven Ġthe Ġimplied Ġwarranty Ġof Ċ MER CHANTABILITY Ġor ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE . Ġ ĠSee Ġthe Ċ GNU ĠGeneral ĠPublic ĠLicense Ġfor Ġmore Ġdetails . Ċ Ċ You Ġshould Ġhave Ġreceived Ġa Ġcopy Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ċ along Ġwith Ġthis Ġprogram . Ġ ĠIf Ġnot , Ġsee Ġ< http :// www . gnu . org / licenses />. Ċ Ġ***************************************************************** ************************ *****/ Ċ Ċ package Ġme . h uf man . android aut oid rive . ev planning Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Handler Ċ import Ġme . h uf man . android aut oid rive . AppSettings Ċ import Ġme . h uf man . android aut oid rive . Mutable AppSettings Receiver Ċ import Ġme . h uf man . android aut oid rive . car app . ev planning . Position Ċ import Ġme . h uf man . android aut oid rive . ev planning . iter nio . Pl anning Ċ import Ġme . h uf man . android aut oid rive . ev planning . iter nio . dto . Destination Ċ import Ġme . h uf man . android aut oid rive . ev planning . iter nio . dto . Plan Request Ċ import Ġme . h uf man . android aut oid rive . ev planning . iter nio . entity .* Ċ import Ġme . h uf man . android aut oid rive . ev planning . Preference Utils . Companion . json To Ignore Ch arg ers Ċ import Ġme . h uf man . android aut oid rive . ev planning . Preference Utils . Companion . json To Network Preferences Ċ import Ġme . h uf man . android aut oid rive . ev planning . iter nio . Get Ch arger Args Ċ import Ġme . h uf man . android aut oid rive . ev planning . iter nio . dto . Network Ċ import Ġme . h uf man . android aut oid rive . phone ui . view models . EV Pl anning Data ViewModel Ċ Ċ interface ĠRouting Data Listener Ġ{ Ċ ĉ fun Ġon Routing Data Changed ( routing Data : ĠRouting Data ) Ċ ĉ fun Ġon Plan Changed ( plan : ĠPlan ?) Ċ ĉ fun Ġon Next Ch arger Plan Changed ( plan : ĠPlan ?) Ċ ĉ fun Ġon Pl anning Triggered () Ċ ĉ fun Ġon Pl anning Error ( msg : ĠString ) Ċ ĉ fun Ġon Ignored Ch arg ers Changed ( ch arg ers : ĠMap < Long , Ch arger Route Data ?> ) Ċ ĉ fun Ġon Network Preferences Changed ( preferences : ĠMap < Long , Network Preference Data >) Ċ } Ċ Ċ class ĠRouting Service ( Ċĉ ĉ private Ġval Ġplanning : ĠPl anning , Ċĉ ĉ private Ġval Ġrouting Data Listener : ĠRouting Data Listener Ċ ) Ġ{ ĊĊ ĉ var Ġhandler : ĠHandler ? Ġ= Ġnull ĊĊ ĉ private Ġvar Ġapp Settings : ĠMutable AppSettings Receiver ? Ġ= Ġnull Ċ ĉ private Ġvar Ġrouting InProgress Ġ= Ġfalse Ċ ĉ private Ġvar Ġcar Data Ġ= ĠCar Data () ĊĊ ĉ private Ġvar Ġignore Ch arg ers : ĠSet < Long >? Ġ= Ġnull Ċĉ ĉ set ( value ) Ġ{ Ċĉĉ ĉ if Ġ( check Changed For Re plan ( field , Ġvalue )) Ġ{ Ċĉĉĉ ĉ field Ġ= Ġvalue Ċĉĉĉ ĉ check Ignored Ch arger Details () Ċĉĉĉ ĉ notify Ignore Ch arg ers Changed () Ċĉĉ ĉ } Ċĉ ĉ } ĊĊ ĉ private Ġval Ġch arger Route Data Ġ= Ġmutable Map Of < Long , ĠCh arger Route Data >() ĊĊ ĉ private Ġvar Ġnetwork Preferences : ĠMap < Long , ĠNetwork Preference >? Ġ= Ġnull Ċĉ ĉ set ( value ) Ġ{ Ċĉĉ ĉ if Ġ( check Changed For Re plan ( field , Ġvalue )) Ġ{ Ċĉĉĉ ĉ field Ġ= Ġvalue Ċĉĉĉ ĉ check Network Preferences Details () Ċĉĉĉ ĉ notify Network Preferences Changed () Ċĉĉ ĉ } Ċĉ ĉ } ĊĊ ĉ private Ġvar Ġnetwork Details : ĠMap < Long , ĠNetwork >? Ġ= Ġnull Ċĉ ĉ set ( value ) Ġ{ Ċĉĉ ĉ field Ġ= Ġvalue Ċĉĉ ĉ notify Network Preferences Changed () Ċĉ ĉ } ĊĊ ĉ private Ġvar Ġmax Speed : ĠDouble ? Ġ= Ġnull Ċĉ ĉ set ( value ) Ġ{ Ċĉĉ ĉ if Ġ( check Changed For Re plan ( field , Ġvalue )) Ġ{ Ċĉĉĉ ĉ field Ġ= Ġvalue Ċĉĉ ĉ } Ċĉ ĉ } ĊĊ ĉ private Ġvar Ġreference Consumption : ĠInt ? Ġ= Ġnull Ċĉ ĉ set ( value ) Ġ{ Ċĉĉ ĉ if Ġ( check Changed For Re plan ( field , Ġvalue )) Ġ{ Ċĉĉĉ ĉ field Ġ= Ġvalue Ċĉĉ ĉ } Ċĉ ĉ } ĊĊ ĉ private Ġvar Ġmin S oc Ch arger : ĠDouble ? Ġ= Ġnull Ċĉ ĉ set ( value ) Ġ{ Ċĉĉ ĉ if Ġ( check Changed For Re plan ( field , Ġvalue )) Ġ{ Ċĉĉĉ ĉ field Ġ= Ġvalue Ċĉĉ ĉ } Ċĉ ĉ } ĊĊ ĉ private Ġvar Ġmin S oc Destination : ĠDouble ? Ġ= Ġnull Ċĉ ĉ set ( value ) Ġ{ Ċĉĉ ĉ if Ġ( check Changed For Re plan ( field , Ġvalue )) Ġ{ Ċĉĉĉ ĉ field Ġ= Ġvalue Ċĉĉ ĉ } Ċĉ ĉ } ĊĊ ĉ private Ġvar Ġshould Re plan Ġ= Ġfalse ĊĊ ĉ private Ġvar Ġcar Model Ġ= Ġ" bm w : i 3 : 1 9 : 3 8 : other " ĊĊ ĉ private Ġfun Ġreset Pl anning () Ġ{ Ċĉ ĉ plan Result Ġ= Ġnull Ċĉ ĉ error Ġ= Ġnull Ċ ĉ } ĊĊ ĉ fun Ġplan New () Ġ{ Ċĉ ĉ trigger Pl anning ( find _ al ts Ġ= Ġtrue ) Ċ ĉ } ĊĊ ĉ fun Ġplan New Next () Ġ{ Ċĉ ĉ trigger Pl anning ( plan _ uuid Ġ= Ġplan Result ?. result ?. plan _ uuid ) Ċ ĉ } ĊĊ ĉ fun Ġplan Alternate Next () Ġ{ Ċĉ ĉ trigger Pl anning ( find _ next _ ch arger _ al ts Ġ= Ġtrue , Ġplan _ uuid Ġ= Ġplan Result ?. result ?. plan _ uuid ) Ċ ĉ } ĊĊ ĉ fun Ġon Car Data Changed ( data : ĠCar Data ) Ġ{ Ċĉ ĉ if Ġ( routing InProgress ) Ġreturn Ċĉ ĉ val Ġprevious Ġ= Ġcar Data Ċĉ ĉ car Data Ġ= Ġdata ĊĊĉ ĉ if Ġ( is Drive Mode Enabled ()) Ġ{ Ċĉĉ ĉ max Speed Ġ= Ġwhen Ġ( car Data . d riving Mode ) Ġ{ Ċĉĉĉ ĉ D riving Mode . COM F ORT Ġ-> Ġget App Setting Double ( AppSettings . KEYS . EV PLAN NING _ MAX SPEED _ COM F ORT ) Ċĉĉĉ ĉ D riving Mode . E CO PRO Ġ-> Ġget App Setting Double ( AppSettings . KEYS . EV PLAN NING _ MAX SPEED _ E CO _ PRO ) Ċĉĉĉ ĉ D riving Mode . E CO PRO _ PLUS Ġ-> Ġget App Setting Double ( AppSettings . KEYS . EV PLAN NING _ MAX SPEED _ E CO _ PRO _ PLUS ) Ċĉĉĉ ĉ D riving Mode . SP ORT Ġ-> Ġget App Setting Double ( AppSettings . KEYS . EV PLAN NING _ MAX SPEED _ SP ORT ) Ċĉĉĉ ĉ else Ġ-> Ġnull Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ val Ġprevious Dest inations Ġ= Ġset Of ( Ċĉĉ ĉ previous . next Destination , Ċĉĉ ĉ previous . final Destination , Ċĉ ĉ ). filter Ġ{ Ġit . isValid () Ġ} Ċĉ ĉ val Ġnew Destination Infos Ġ= Ġset Of ( Ċĉĉ ĉ Destination Info ( car Data . next Destination , Ġcar Data . next Destination Details ), Ċĉĉ ĉ Destination Info ( car Data . final Destination , Ġcar Data . final Destination Details ), Ċĉ ĉ ). filter Ġ{ Ġit . position . isValid () Ġ} ĊĊĉ ĉ val Ġroutes Ġ= Ġplan Result ?. result ?. routes ĊĊĉ ĉ if Ġ( new Destination Infos . isEmpty ()) Ġ{ Ċĉĉ ĉ if Ġ( previous Dest inations . isNotEmpty ()) Ġ{ Ċĉĉĉ ĉ reset Pl anning () Ċĉĉ ĉ } Ġ// Ġelse Ġignore Ġif Ġboth Ġare Ġempty Ċĉ ĉ } Ġelse Ġ{ Ġ// Ġnew Ġis Ġnot Ġempty Ċĉĉ ĉ if Ġ( routes Ġ== Ġnull ) Ġ{ Ċĉĉĉ ĉ // Ġno Ġpre existing Ġrouting Ġresult : Ċĉĉĉ ĉ should Re plan Ġ= Ġtrue Ċĉĉ ĉ } Ġelse Ġif Ġ( new Destination Infos . last (). position Ġ!= Ġprevious Dest inations . last OrNull ()) Ġ{ Ċĉĉĉ ĉ // ĠTODO : Ġsuggest Ġre plan Ġif Ġnext Destination Ġdoes Ġnot Ġmatch Ġany Ġexisting Ġway point Ċĉĉĉ ĉ // Ġfinal Ġdestination Ġhas Ġchanged : Ċĉĉĉ ĉ should Re plan Ġ= Ġtrue Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ val Ġroute Data Ġ= Ġroutes ?. let Ġ{ Ġroutes List Ġ-> Ċĉĉ ĉ Route Data . of ( car Data . position , Ġcar Data . soc , Ġnew Destination Infos , Ġroutes List ) Ċĉĉĉ ĉ . also Ġ{ Ġroute DataList Ġ-> Ċĉĉĉĉ ĉ // Ġnone Ġof Ġthe Ġnew Ġdest inations Ġmatches Ġan Ġexisting Ġroute point Ġ-> Ġre plan Ċĉĉĉĉ ĉ should Re plan Ġ= Ċĉĉĉĉĉ ĉ should Re plan Ġ|| Ġroute DataList . all Ġ{ Ġit . waypoint Index Infos . isEmpty () Ġ} ĊĊĉĉĉĉ ĉ should Re plan Ġ= Ġshould Re plan Ġ|| Ġroute DataList . filter Ġ{ Ċĉĉĉĉĉ ĉ it . position Route Data Ġ!= Ġnull Ġ&& Ġ( Ġit . position Route Data . distance Ġ== Ġnull Ġ|| Ċĉĉĉĉĉĉĉ ĉ it . position Route Data . distance Ġ< ĠRoute Data . MAX _ STEP _ OFFSET Ġ) Ċĉĉĉĉ ĉ }. let Ġ{ Ċĉĉĉĉĉ ĉ it . isEmpty () Ġ|| Ġ// no Ġroute Ġis Ġclose Ġ-> Ġre plan Ċĉĉĉĉĉĉĉ ĉ it . filter Ġ{ Ġroute Data Ġ-> Ċĉĉĉĉĉĉĉĉ ĉ route Data . soc _ ar iv Ġ!= Ġnull Ġ&& Ċĉĉĉĉĉĉĉĉĉĉ ĉ route Data . position Route Data !!. step Index Ġ!= Ġnull Ċĉĉĉĉĉĉĉ ĉ }. let Ġ{ Ġroute DataList Ġ-> Ċĉĉĉĉĉĉĉĉ ĉ route DataList . isNotEmpty () Ġ&& Ġ// Ġthere Ġare Ġclose Ġroutes Ġand Ġfor Ġall Ġof Ġthem Ġthe Ġsoc _ ar iv Ġis Ġlower Ġthen Ġthe Ġminimum Ġ-> Ġre plan Ċĉĉĉĉĉĉĉĉĉĉ ĉ route DataList . all Ġ{ Ġroute Data Ġ-> Ċĉĉĉĉĉĉĉĉĉĉĉ ĉ if Ġ( route Data . waypoint Index Infos . last OrNull () Ċĉĉĉĉĉĉĉĉĉĉĉĉĉ ĉ ?. index ?. equals ( route Data . position Route Data !!. step Index !! Ġ+ Ġ 1 ) Ġ== Ġtrue Ċĉĉĉĉĉĉĉĉĉĉĉ ĉ ) Ġ{ Ċĉĉĉĉĉĉĉĉĉĉĉĉ ĉ min S oc Destination Ċĉĉĉĉĉĉĉĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉĉĉĉĉĉĉĉ ĉ min S oc Ch arger Ċĉĉĉĉĉĉĉĉĉĉĉ ĉ } ?. let Ġ{ Ġmin S oc Ġ-> Ċĉĉĉĉĉĉĉĉĉĉĉĉ ĉ route Data . soc _ ar iv !! Ġ< Ġmin S oc Ċĉĉĉĉĉĉĉĉĉĉĉ ĉ } Ġ?: Ġ( route Data . soc _ ar iv !! Ġ< Ġ 0 . 0 ) Ċĉĉĉĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ routing Data Listener . on Routing Data Changed ( Ċĉĉ ĉ Routing Data ( Ċĉĉĉ ĉ car Data , Ċĉĉĉ ĉ route Data , Ċĉĉĉ ĉ should Re plan , Ċĉĉ ĉ ) Ċĉ ĉ ) ĊĊĉ ĉ if Ġ( should Re plan Ġ&& Ġis Re plan Enabled ()) Ġ{ Ċĉĉ ĉ plan New () Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġcheck Changed For Re plan ( old : ĠAny ?, Ġnew : ĠAny ?): ĠBoolean Ġ{ Ċĉ ĉ if Ġ( old ?. equals ( new ) Ġ?: Ġ( new Ġ== Ġnull )) Ġ{ Ċĉĉ ĉ return Ġfalse Ċĉ ĉ } Ċĉ ĉ should Re plan Ġ= Ġtrue Ċĉ ĉ return Ġtrue Ċ ĉ } ĊĊ ĉ fun ĠonCreate ( context : ĠContext , Ġhandler : ĠHandler ) Ġ{ Ċĉ ĉ this . handler Ġ= Ġhandler Ċĉ ĉ app Settings Ġ= ĠMutable AppSettings Receiver ( context , Ġhandler ) Ċĉ ĉ app Settings ?. callback Ġ= Ġthis :: on AppSettings Changed Ċ ĉ } ĊĊ ĉ fun Ġon Destroy ( context : ĠContext ) Ġ{ Ċĉ ĉ app Settings ?. callback Ġ= Ġnull Ċĉ ĉ handler Ġ= Ġnull Ċ ĉ } ĊĊ ĉ fun Ġis Re plan Enabled () Ġ= Ġget App Setting Boolean ( AppSettings . KEYS . EV PLAN NING _ AUTO _ RE PLAN ) ĊĊ ĉ fun Ġis Drive Mode Enabled () Ġ= Ċĉ ĉ getApp Setting Boolean ( AppSettings . KEYS . EV PLAN NING _ MAX SPEED _ DRIVE MODE _ ENABLE ) ĊĊ ĉ private Ġfun Ġget App Setting Boolean ( setting : ĠApp Settings . KEYS ): ĠBoolean Ġ{ Ċĉ ĉ return Ġapp Settings ?. get ( setting )?. to Boolean () Ġ== Ġtrue Ċ ĉ } ĊĊ ĉ private Ġfun Ġget App Setting Double ( setting : ĠApp Settings . KEYS ): ĠDouble ? Ġ{ Ċĉ ĉ return Ġtry Ġ{ Ċĉĉ ĉ app Settings ?. get ( setting )?. toDouble () Ċĉ ĉ } Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ Ċĉĉ ĉ null Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ private Ġfun Ġget App Setting Int ( setting : ĠApp Settings . KEYS ): ĠInt ? Ġ{ Ċĉ ĉ return Ġtry Ġ{ Ċĉĉ ĉ app Settings ?. get ( setting )?. toInt () Ċĉ ĉ } Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ Ċĉĉ ĉ null Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġon AppSettings Changed () Ġ{ Ċĉ ĉ if Ġ(! is Drive Mode Enabled ()) Ġ{ Ċĉĉ ĉ max Speed Ġ= Ġget App Setting Double ( AppSettings . KEYS . EV PLAN NING _ MAX SPEED ) Ċĉ ĉ } Ċĉ ĉ reference Consumption Ġ= Ġget App Setting Int ( AppSettings . KEYS . EV PLAN NING _ REFERENCE _ CON SU MP TION ) Ċĉ ĉ min S oc Ch arger Ġ= Ġget App Setting Double ( AppSettings . KEYS . EV PLAN NING _ MIN _ SOC _ CHAR GER ) Ċĉ ĉ min S oc Destination Ġ= Ġget App Setting Double ( AppSettings . KEYS . EV PLAN NING _ MIN _ SOC _ FINAL ) Ċĉ ĉ ignore Ch arg ers Ġ= Ġapp Settings ?. get ( AppSettings . KEYS . EV PLAN NING _ IGNORE _ CHAR GER S )?. let Ġ{ Ċĉĉ ĉ json To Ignore Ch arg ers ( it ) Ċĉ ĉ } Ċĉ ĉ network Preferences Ġ= Ġapp Settings ?. get ( AppSettings . KEYS . EV PLAN NING _ NETWORK _ PREFER ENCES )?. let Ġ{ Ċĉĉ ĉ json To Network Preferences ( it ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ private Ġvar Ġerror : ĠString ? Ġ= Ġnull Ċĉ ĉ set ( value ) Ġ{ Ċĉĉ ĉ field Ġ= Ġvalue Ċĉĉ ĉ if Ġ( value Ġ!= Ġnull ) Ġ{ Ċĉĉĉ ĉ routing Data Listener . on Pl anning Error ( value ) Ċĉĉ ĉ } Ċĉĉ ĉ EV Pl anning Data ViewModel . setError ( value Ġ?: Ġ" no Ġerror ") Ċĉ ĉ } ĊĊ ĉ private Ġvar Ġplan Result : ĠPlan Result ? Ġ= Ġnull Ċĉ ĉ set ( value ) Ġ{ Ċĉĉ ĉ field Ġ= Ġvalue Ċĉĉ ĉ handler ?. post Ġ{ Ċĉĉĉ ĉ update Ignored Ch arger Route Data () Ċĉĉ ĉ } Ċĉĉ ĉ routing Data Listener . on Plan Changed ( value ?. result ) Ċĉ ĉ } ĊĊ ĉ private Ġvar Ġnext Ch arger Result : ĠPlan Result ? Ġ= Ġnull Ċĉ ĉ set ( value ) Ġ{ Ċĉĉ ĉ field Ġ= Ġvalue Ċĉĉ ĉ routing Data Listener . onNext Ch arger Plan Changed ( value ?. result ) Ċĉ ĉ } ĊĊ ĉ private Ġfun Ġtrigger Pl anning ( Ċĉ ĉ find _ al ts : ĠBoolean ? Ġ= Ġnull , Ċĉ ĉ find _ next _ ch arger _ al ts : ĠBoolean ? Ġ= Ġnull , Ċĉ ĉ plan _ uuid : ĠString ? Ġ= Ġnull Ċ ĉ ) Ġ{ Ċĉ ĉ // TODO Ġremove , Ġonly Ġfor Ġdebugging : Ċĉ ĉ EV Pl anning Data ViewModel . setMax Speed ( max Speed ) Ċĉ ĉ set Of ( Ċĉĉ ĉ car Data . position , Ċĉĉ ĉ car Data . next Destination , Ċĉĉ ĉ car Data . final Destination Ċĉ ĉ ). filter Ġ{ Ġit . isValid () Ġ} Ċĉĉ ĉ . take If Ġ{ Ġit . size Ġ> Ġ 1 Ġ} Ċĉĉ ĉ ?. map Indexed Ġ{ Ġindex , Ġit Ġ-> Ċĉĉĉ ĉ Destination ( Ċĉĉĉĉ ĉ it . latitude , Ċĉĉĉĉ ĉ it . longitude , Ċĉĉĉĉ ĉ is _ my _ pos Ġ= Ġif Ġ( index Ġ== Ġ 0 ) Ġtrue Ġelse Ġnull Ċĉĉĉ ĉ ) Ċĉĉ ĉ } Ċĉĉ ĉ ?. let Ġ{ Ġdest inations Ġ-> Ċĉĉĉ ĉ routing InProgress Ġ= Ġtrue Ċĉĉĉ ĉ routing Data Listener . on Pl anning Triggered () Ċĉĉĉ ĉ should Re plan Ġ= Ġfalse Ċĉĉĉ ĉ planning . plan ( Ċĉĉĉĉ ĉ Plan Request ( Ċĉĉĉĉĉ ĉ car _ model Ġ= Ġcar Model , Ċĉĉĉĉĉ ĉ dest inations Ġ= Ġdest inations , Ċĉĉĉĉĉ ĉ initial _ soc _ perc Ġ= Ġcar Data . soc , Ċĉĉĉĉĉ ĉ ch arger _ soc _ perc Ġ= Ġmin S oc Ch arger , Ċĉĉĉĉĉ ĉ arrival _ soc _ perc Ġ= Ġmin S oc Destination , Ċĉĉĉĉĉ ĉ max _ speed Ġ= Ġmax Speed , Ċĉĉĉĉĉ ĉ ref _ cons umption Ġ= Ġreference Consumption , Ċĉĉĉĉĉ ĉ outside _ temp Ġ= Ġcar Data . external Temperature . toDouble (), Ċĉĉĉĉĉ ĉ find _ al ts Ġ= Ġfind _ al ts , Ċĉĉĉĉĉ ĉ find _ next _ ch arger _ al ts Ġ= Ġfind _ next _ ch arger _ al ts , Ċĉĉĉĉĉ ĉ network _ preferences Ġ= Ġnetwork Preferences ?. map Ġ{ Ċĉĉĉĉĉĉ ĉ it . key . toString () Ġto Ġit . value . value Ċĉĉĉĉĉ ĉ } ?. toMap (), Ċĉĉĉĉĉ ĉ exclude _ ids Ġ= Ġthis . ignore Ch arg ers ?. toList (), Ċĉĉĉĉĉ ĉ plan _ uuid Ġ= Ġplan _ uuid Ċĉĉĉĉ ĉ ), Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ if Ġ( find _ next _ ch arger _ al ts Ġ== Ġtrue ) Ġ{ Ċĉĉĉĉĉĉ ĉ handler ?. post Ġ{ Ċĉĉĉĉĉĉĉ ĉ error Ġ= Ġnull Ċĉĉĉĉĉĉĉ ĉ next Ch arger Result Ġ= Ġit Ċĉĉĉĉĉĉĉ ĉ routing InProgress Ġ= Ġfalse Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉĉ ĉ handler ?. post Ġ{ Ċĉĉĉĉĉĉĉ ĉ error Ġ= Ġnull Ċĉĉĉĉĉĉĉ ĉ next Ch arger Result Ġ= Ġnull Ċĉĉĉĉĉĉĉ ĉ plan Result Ġ= Ġit Ċĉĉĉĉĉĉĉ ĉ routing InProgress Ġ= Ġfalse Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ }, Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ handler ?. post Ġ{ Ċĉĉĉĉĉĉ ĉ error Ġ= Ġit Ċĉĉĉĉĉĉ ĉ routing InProgress Ġ= Ġfalse Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ }) Ċĉĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġupdate Ignored Ch arger Route Data () Ġ{ Ċĉ ĉ plan Result ?. result ?. routes ?. also Ġ{ Ġroutes Ġ-> Ċĉĉ ĉ ch arger Route Data . values . forEach Ġ{ Ċĉĉĉ ĉ it . update Position Route Data ( routes ) Ċĉĉ ĉ } Ċĉ ĉ } Ġ?: Ġrun Ġ{ Ċĉĉ ĉ ch arger Route Data . values . forEach Ġ{ Ċĉĉĉ ĉ it . position Route Data Ġ= Ġnull Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ notify Ignore Ch arg ers Changed () Ċ ĉ } ĊĊ ĉ fun Ġcheck Ignored Ch arger Details () Ġ{ Ċĉ ĉ var Ġchanged Ġ= Ġfalse Ċĉ ĉ ignore Ch arg ers Ċĉĉ ĉ ?. subtract ( ch arger Route Data . keys ) Ċĉĉ ĉ ?. forEach Ġ{ Ġid Ġ-> Ċĉĉĉ ĉ plan Result ?. result ?. routes ?. let Ġ{ Ġroutes Ġ-> Ċĉĉĉĉ ĉ routes Ċĉĉĉĉĉ ĉ . as Sequence () Ċĉĉĉĉĉ ĉ . map Ġ{ Ġroute Ġ-> Ċĉĉĉĉĉĉ ĉ route . steps ?. as Sequence () Ċĉĉĉĉĉĉĉ ĉ ?. filter Ġ{ Ġit . ch arger ?. id Ġ== Ġid Ġ} Ċĉĉĉĉĉĉĉ ĉ ?. map Ġ{ Ġit . ch arger Ġ} Ċĉĉĉĉĉĉĉ ĉ ?. first OrNull () Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ . first OrNull () Ċĉĉĉĉĉ ĉ ?. let Ġ{ Ġch arger Ġ-> Ċĉĉĉĉĉĉ ĉ ch arger Route Data [ id ] Ġ= ĠCh arger Route Data . of ( ch arger , Ġroutes ) Ċĉĉĉĉĉĉ ĉ changed Ġ= Ġtrue Ċĉĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĊĉ ĉ ignore Ch arg ers Ċĉĉ ĉ ?. subtract ( ch arger Route Data . keys ) Ċĉĉ ĉ ?. let Ġ{ Ċĉĉĉ ĉ if Ġ( it . isNotEmpty ()) Ġ{ Ċĉĉĉĉ ĉ load Ch arger Details ( it ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĊĉ ĉ ch arger Route Data . keys . subtract ( ignore Ch arg ers Ġ?: Ġempty Set ()). forEach Ġ{ Ċĉĉ ĉ ch arger Route Data . remove ( it ) Ċĉĉ ĉ changed Ġ= Ġtrue Ċĉ ĉ } ĊĊĉ ĉ if Ġ( changed ) Ġ{ Ċĉĉ ĉ notify Ignore Ch arg ers Changed () Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġload Ch arger Details ( ids : ĠSet < Long >) Ġ{ Ċĉ ĉ planning . get Ch arg ers ( Ċĉĉ ĉ Get Ch arger Args ( Ċĉĉĉ ĉ ids Ġ= Ġids . toList () Ċĉĉ ĉ ), Ċĉĉ ĉ { Ċĉĉĉ ĉ handler ?. post Ġ{ Ċĉĉĉĉ ĉ error Ġ= Ġnull Ċĉĉĉĉ ĉ it . result ?. as Sequence ()?. filter Ġ{ Ċĉĉĉĉĉ ĉ it . id Ġ!= Ġnull Ġ&& Ġignore Ch arg ers ?. contains ( it . id ) Ġ?: Ġfalse Ċĉĉĉĉ ĉ } ?. forEach Ġ{ Ċĉĉĉĉĉ ĉ ch arger Route Data [ it . id !! ] Ġ= ĠCh arger Route Data . of ( Ċĉĉĉĉĉĉ ĉ Ch arger . of ( it ), Ċĉĉĉĉĉĉ ĉ plan Result ?. result ?. routes Ċĉĉĉĉĉ ĉ ) Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ notify Ignore Ch arg ers Changed () Ċĉĉĉ ĉ } Ċĉĉ ĉ }, Ċĉĉ ĉ { Ċĉĉĉ ĉ handler ?. post Ġ{ Ċĉĉĉĉ ĉ error Ġ= Ġit Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ ) Ċ ĉ } ĊĊ ĉ fun Ġcheck Network Preferences Details () Ġ{ Ċĉ ĉ if Ġ( network Details Ġ== Ġnull ) Ġ{ Ċĉĉ ĉ load Network Details () Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġload Network Details () Ġ{ Ċĉ ĉ planning . get Networks ( Ċĉĉ ĉ { Ċĉĉĉ ĉ handler ?. post Ġ{ Ċĉĉĉĉ ĉ error Ġ= Ġnull Ċĉĉĉĉ ĉ network Details Ġ= Ġit . result Ċĉĉĉĉĉ ĉ ?. as Sequence () Ċĉĉĉĉĉ ĉ ?. filter Ġ{ Ċĉĉĉĉĉĉ ĉ it . id Ġ!= Ġnull Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ ?. map Ġ{ Ġit . id !! Ġto Ġit Ġ} Ċĉĉĉĉĉ ĉ ?. toMap () Ċĉĉĉ ĉ } Ċĉĉ ĉ }, Ċĉĉ ĉ { Ċĉĉĉ ĉ handler ?. post Ġ{ Ċĉĉĉĉ ĉ error Ġ= Ġit Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ ) Ċ ĉ } ĊĊ ĉ fun Ġnotify Ignore Ch arg ers Changed () Ġ{ Ċĉ ĉ ( ignore Ch arg ers Ċĉĉ ĉ ?. map Ġ{ Ċĉĉĉ ĉ it Ġto Ġch arger Route Data [ it ] Ċĉĉ ĉ } Ċĉĉ ĉ ?. toMap () Ċĉĉ ĉ ?: Ġempty Map ()) Ċĉĉ ĉ . let Ġ{ Ġrouting Data Listener . on Ignored Ch arg ers Changed ( it ) Ġ} Ċ ĉ } ĊĊ ĉ fun Ġnotify Network Preferences Changed () Ġ{ Ċĉ ĉ ( network Preferences Ċĉĉ ĉ ?. as Sequence () Ċĉĉ ĉ ?. map NotNull Ġ{ Ġentry Ġ-> Ċĉĉĉ ĉ network Details ?. get ( entry . key )?. let Ġ{ Ġnetwork Ġ-> Ċĉĉĉĉ ĉ entry . key Ġto ĠNetwork Preference Data ( network , Ġentry . value ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ ?. toMap () Ċĉĉ ĉ ?: Ġempty Map ()) Ċĉĉ ĉ . let Ġ{ Ġrouting Data Listener . on Network Preferences Changed ( it ) Ġ} Ċ ĉ } Ċ } Ċ