package Ġfi . ri ista . common . poi . ui Ċ Ċ import Ġco . touch lab . state ly . ensure Never Frozen Ċ import Ġfi . ri ista . common . poi . Poi Context Ċ import Ġfi . ri ista . common . poi . model . Poi Location Ċ import Ġfi . ri ista . common . poi . model . Poi Location Group Ċ import Ġfi . ri ista . common . poi . model . Poi Location Id Ċ import Ġfi . ri ista . common . ui . controller . Controller With Load able Model Ċ import Ġfi . ri ista . common . ui . controller . Has Un re pro duc ible State Ċ import Ġfi . ri ista . common . ui . controller . ViewModel Load Status Ċ import Ġfi . ri ista . common . ui . intent . Intent Handler Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . serialization . Serializable Ċ Ċ class ĠPo i Controller ( ĊĠĠĠ Ġprivate Ġval Ġpo i Context : ĠPo i Context , ĊĠĠĠ Ġexternal Id : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġprivate Ġval Ġinitial Filter : ĠPo i Filter Ġ= ĠPo i Filter ( Poi Filter . Poi Filter Type . ALL ), Ċ ) Ġ: ĠController With Load able Model < Po is ViewModel >(), ĊĠĠĠ ĠIntent Handler < Poi Event Intent >, ĊĠĠĠ ĠHas Un re pro duc ible State < Poi Controller . State > Ġ{ ĊĊĠĠĠ Ġval Ġevent Dispatcher : ĠPo i EventDispatcher Ġ= ĠPo i Event To Intent Mapper ( intent Handler Ġ= Ġthis ) ĊĊĠĠĠ Ġvar Ġexternal Id : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġgiven Ġexternal Id Ġis Ġdifferent Ġthan Ġprevious Ġone , Ġthen Ġsets Ġa Ġnew Ġexternal Id ĊĠĠĠĠĠĠĠĠ Ġ* Ġand Ġmarks Ġthe Ġmodel Ġas Ġnot Ġloaded . ĠCall Ġload ViewModel Ġafterwards . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġfield ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Before External Id Change Ġ= Ġget Loaded ViewModel OrNull ()?. pois ?. filter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ViewModel ( ViewModel Load Status . Not Loaded ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . external Id Ġ= Ġexternal Id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġstate To Restore : ĠState ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġfilter Before External Id Change : ĠPo i Filter ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġensure Never Frozen () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Load ViewModel Flow ( refresh : ĠBoolean ): ĠFlow < ViewModel Load Status < Po is ViewModel >> Ġ= Ġflow Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate State To Restore () ĊĠĠĠĠĠĠĠ Ġemit ( ViewModel Load Status . Loading ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= Ġstate To Restore ?. poi Filter Ġ?: Ġfilter Before External Id Change Ġ?: Ġinitial Filter ĊĠĠĠĠĠĠĠ Ġfilter Before External Id Change Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġext Id Ġ= Ġexternal Id ĊĠĠĠĠĠĠĠ Ġif Ġ( ext Id . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewModel Load Status . Loaded ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPo is ViewModel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpo is Ġ= ĠPo i ViewModel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Ġ= Ġfilter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Po is Ġ= ĠlistOf (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Po is Ġ= ĠlistOf (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ flow ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlocation Group Context Ġ= Ġpo i Context . get Poi Location Group Context ( ext Id ) ĊĠĠĠĠĠĠĠ Ġlocation Group Context . fetch ( refresh ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( location Group Context . poi Location Groups Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( ViewModel Load Status . Load Failed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ flow ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġall Po is Ġ= Ġlocation Group Context . poi Location Groups Ġ?: ĠlistOf () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe 've Ġgot Ġthe Ġpo is Ġand Ġthus Ġstate Ġrest or ation Ġwas Ġdone Ġ( either Ġfrom ĊĠĠĠĠĠĠĠ Ġ// Ġprevious Ġvalues Ġor Ġfrom Ġun re pro duc ible Ġstate Ġset Ġfrom Ġoutside ). ĠClear Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġstate To Restore Ġin Ġorder Ġto ĠNOT Ġuse Ġsame Ġvalues Ġagain Ġwhen Ġrest oring . ĊĠĠĠĠĠĠĠ Ġclear State To Restore () ĊĊĠĠĠĠĠĠĠ Ġemit ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠViewModel Load Status . Loaded ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPo is ViewModel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpo is Ġ= ĠPo i ViewModel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Ġ= Ġfilter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Po is Ġ= Ġfilter Po is ( all Po is , Ġfilter ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Po is Ġ= Ġall Po is , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Intent ( intent : ĠPo i Event Intent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠviewModel Load Status Ġ= ĠviewModel Load Status . value ĊĠĠĠĠĠĠĠ Ġif Ġ( viewModel Load Status Ġ! is ĠViewModel Load Status . Loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnothing Ġcan Ġbe Ġdone Ġif Ġdata Ġhas Ġnot Ġbeen Ġloaded ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( intent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPo i Event Intent . Change Poi Filter Ġ-> Ġchange Filter Type ( viewModel Load Status . viewModel , Ġintent . poi Filter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Poi Location And Its Group ( poi Location Id : ĠPo i Location Id ): ĠPair < Poi Location Group , ĠPo i Location >? Ġ{ ĊĠĠĠĠĠĠĠ Ġget Loaded ViewModel OrNull ()?. pois ?. all Po is ?. forEach Ġ{ Ġpo i Location Group Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpo i Location Group . locations . forEach Ġ{ Ġpo i Location Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( poi Location . id Ġ== Ġpo i Location Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( poi Location Group , Ġpo i Location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġchange Filter Type ( ĊĠĠĠĠĠĠĠ ĠviewModel : ĠPo is ViewModel , ĊĠĠĠĠĠĠĠ Ġnew Filter : ĠPo i Filter , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġnothing Ġto Ġdo Ġif Ġthere Ġare Ġno Ġpo is ĊĠĠĠĠĠĠĠ Ġval Ġpo is Ġ= ĠviewModel . pois Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġupdate ViewModel ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠViewModel Load Status . Loaded ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpo is Ġ= Ġpo is . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Ġ= Ġnew Filter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Po is Ġ= Ġfilter Po is ( viewModel . pois . all Po is , Ġnew Filter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfilter Po is ( all Po is : ĠList < Poi Location Group >, Ġfilter : ĠPo i Filter ): ĠList < Poi Location Group > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġall Po is . filter Ġ{ Ġpo i Ġ-> Ġfilter . matches ( poi . type . value ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthis Ġfunction Ġbefore Ġupdating Ġview model Ġto Ġloading Ġstate ! ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate State To Restore () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġsince Ġthin Ġfunction Ġis Ġcalled Ġbefore Ġentering Ġthe Ġloading Ġstate Ġwe Ġcan Ġtry Ġto ĊĠĠĠĠĠĠĠ Ġ// Ġobtain Ġthe Ġcurrent Ġstate . ĠThis Ġway Ġwe Ġcan Ġrestore Ġfilter Ġif Ġwe 're Ġjust ĊĠĠĠĠĠĠĠ Ġ// Ġrefresh ing Ġthe Ġpo is Ġ( i . e . Ġview model Ġis Ġin Ġloaded Ġstate ). ĊĠĠĠĠĠĠĠ Ġval Ġcurrent State Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( viewModel Load Status . value Ġis ĠViewModel Load Status . Loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Un re pro duc ible State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( currentState Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate To Restore Ġ= Ġcurrent State ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear State To Restore () Ġ{ ĊĠĠĠĠĠĠĠ Ġstate To Restore Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Un re pro duc ible State (): ĠState ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠviewModel Load Status Ġ= ĠviewModel Load Status . value ĊĠĠĠĠĠĠĠ Ġif Ġ( viewModel Load Status Ġ! is ĠViewModel Load Status . Loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġstate Ġif Ġdata Ġhas Ġnot Ġbeen Ġloaded ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠviewModel Load Status . viewModel . pois ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState ( it . filter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrestore Un re pro duc ible State ( state : ĠState ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate To Restore Ġ= Ġstate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġdata Ġclass ĠState ( ĊĠĠĠĠĠĠĠ Ġval Ġpo i Filter : ĠPo i Filter , ĊĠĠĠ Ġ) Ċ } Ċ