package Ġcom . open class rooms . re ale state manager . view model Ċ Ċ import Ġandroid . content . Context Ċ import Ġcom . google . android . gms . tasks . Task Ċ import Ġcom . google . android . gms . tasks . Tasks Ċ import Ġcom . open class rooms . re ale state manager . data . entity .* Ċ import Ġcom . open class rooms . re ale state manager . data . repository . Agent Repository Ċ import Ġcom . open class rooms . re ale state manager . data . repository . Currency Repository Ċ import Ġcom . open class rooms . re ale state manager . data . repository . Property Repository Ċ import Ġcom . open class rooms . re ale state manager . data . repository . SaveData Repository Ċ import Ġcom . open class rooms . re ale state manager . view . main Activity . Error Source MainActivity .* Ċ import Ġcom . open class rooms . re ale state manager . base . Base ViewModel Ċ import Ġcom . open class rooms . re ale state manager . base . Loading Content Error Ċ import Ġcom . open class rooms . re ale state manager . base . Real StateManager ViewModel Ċ import Ġcom . open class rooms . re ale state manager . view . main Activity . Error Source MainActivity Ċ import Ġcom . open class rooms . re ale state manager . view state . MainActivity Intent Ċ import Ġcom . open class rooms . re ale state manager . view state . MainActivity Result Ċ import Ġcom . open class rooms . re ale state manager . view state . MainActivity ViewState Ċ import Ġcom . open class rooms . re ale state manager . utils .* Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠMut w ak il - Mo ĠðŁ¤ © Ċ Ġ* ĠAndroid ĠEngineer , Ċ Ġ* ĠBr us se ls Ċ Ġ*/ Ċ class ĠMainActivity ViewModel ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġagent Repository : ĠAgent Repository , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcurrency Repository : ĠCurrency Repository , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġproperty Repository : ĠProperty Repository , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsave Data Repository : ĠSave Data Repository Ċ ) Ġ: ĠBase ViewModel < MainActivity ViewState >(), ĠReal StateManager ViewModel < MainActivity Intent , ĠMainActivity Result >{ ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent ViewState Ġ= ĠMainActivity ViewState () ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview State LD . value Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġnew Agents Ġ= Ġmutable ListOf < Agent >() ĊĠĠĠ Ġprivate Ġval Ġnew Property Ġ= Ġmutable ListOf < Property >() ĊĠĠĠ Ġprivate Ġval Ġnew A men ities Ġ= Ġmutable ListOf < A men ity >() ĊĠĠĠ Ġprivate Ġval Ġnew P ictures Ġ= Ġmutable ListOf < Picture >() ĊĠĠĠ Ġprivate Ġval Ġnew Addresses Ġ= Ġmutable ListOf < Address >() ĊĠĠĠ Ġprivate Ġvar Ġlatest Update : ĠDate ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsave Data Repository . last Update From Network ĊĠĠĠĠĠĠĠ Ġset ( value ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Data Repository . last Update From Network Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġprivate Ġvar Ġsearch Agents Job : ĠJob ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcreate Properties And Data Job : ĠJob ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġaction From Intent ( intent : ĠMainActivity Intent ){ ĊĠĠĠĠĠĠĠ Ġwhen ( intent ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMainActivity Intent . Open Add Property Activity Intent Ġ-> Ġon Open Add Property Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMainActivity Intent . Change Currency Intent Ġ-> Ġchange Currency () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMainActivity Intent . GetCurrent Currency Intent Ġ-> Ġemit Current Currency () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMainActivity Intent . Update Property From Network Ġ-> Ġdownload Latest Data From Network ( intent . context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġresult To ViewState ( result : ĠLoading Content Error < MainActivity Result > ){ ĊĠĠĠĠĠĠĠ Ġcurrent ViewState Ġ= Ġwhen Ġ( result ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLoading Content Error . Content Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( result . packet ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMainActivity Result . Open Add Property Result Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent ViewState . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Added Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisOpen Add Property Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Source Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisLoading Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMainActivity Result . Change Currency Result Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent ViewState . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Added Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisOpen Add Property Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency Ġ= Ġresult . packet . currency ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMainActivity Result . Update Data From Network Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent ViewState . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisOpen Add Property Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Source Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisLoading Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Added Ġ= Ġresult . packet . number Property Added ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLoading Content Error . Loading Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent ViewState . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Added Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisLoading Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Source Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisOpen Add Property Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLoading Content Error . Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( result . packet ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMainActivity Result . Open Add Property Result Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent ViewState . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Added Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisOpen Add Property Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Source Ġ= ĠNO _ AGENT _ IN _ DB , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisLoading Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMainActivity Result . Change Currency Result Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent ViewState . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Added Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisOpen Add Property Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMainActivity Result . Update Data From Network Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent ViewState . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Added Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisOpen Add Property Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Source Ġ= Ġresult . packet . error Source , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisLoading Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Open Add Property Request (){ ĊĠĠĠĠĠĠĠ Ġresult To ViewState ( Loading Content Error . Loading ()) ĊĠĠĠĠĠĠĠ Ġif ( search Agents Job ?. isActive Ġ== Ġtrue ) Ġsearch Agents Job ?. cancel () ĊĊĠĠĠĠĠĠĠ Ġsearch Agents Job Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġagents : ĠList < Agent >? Ġ= Ġagent Repository . getAll Agents () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult : ĠLoading Content Error < MainActivity Result > Ġ= Ġif ( agents Ġ== Ġnull Ġ|| Ġagents . isEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLoading Content Error . Error ( MainActivity Result . Open Add Property Result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLoading Content Error . Content ( MainActivity Result . Open Add Property Result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult To ViewState ( result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġchange Currency (){ ĊĠĠĠĠĠĠĠ Ġcurrency Repository . set Currency () ĊĠĠĠĠĠĠĠ Ġemit Current Currency () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġemit Current Currency (){ ĊĠĠĠĠĠĠĠ Ġval Ġcurrency Ġ= Ġcurrency Repository . currency . value !! ĊĠĠĠĠĠĠĠ Ġval Ġresult : ĠLoading Content Error < MainActivity Result > Ġ= ĠLoading Content Error . Content ( MainActivity Result . Change Currency Result ( currency )) ĊĊĠĠĠĠĠĠĠ Ġresult To ViewState ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdownload Latest Data From Network ( context : ĠContext ){ ĊĠĠĠĠĠĠĠ Ġresult To ViewState ( Loading Content Error . Loading ()) ĊĊĠĠĠĠĠĠĠ Ġproperty Repository . getAll Properties From Network ( latest Update ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task . is Successful ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . result ?. documents ?. forEach Ġ{ Ġdocument Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument . toObject ( Property :: class . java )?. let Ġ{ Ġnew Property . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetData And Agent ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġemit Result Network Request Failure ( ERROR _ FETCH ING _ NEW _ FROM _ NETWORK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetData And Agent ( context : ĠContext ){ ĊĠĠĠĠĠĠĠ Ġval Ġnetwork Operations Ġ= Ġmutable ListOf < Task <* >>() ĊĊĠĠĠĠĠĠĠ Ġvar Ġdata Empty Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġagents Ġ= Ġagent Repository . getAll Agents () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= Ġproperty Repository . getAll Properties () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Empty Ġ= Ġagents . isEmpty () Ġ&& Ġproperties . isEmpty () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlatest Update Ġ= Ġif ( data Empty ) Ġnull Ġelse Ġlatest Update ĊĊĠĠĠĠĠĠĠ Ġval Ġagents Download Ġ= Ġagent Repository . get Agents From Network ( latest Update ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . result ?. documents ?. forEach Ġ{ Ġdocument Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument . toObject ( Agent :: class . java )?. let Ġ{ new Agents . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnetwork Operations . add ( agents Download ) ĊĊĠĠĠĠĠĠĠ Ġnew Property . forEach Ġ{ property Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Id Ġ= Ġproperty . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġam en ities Download Ġ= Ġproperty Repository . get A men ities From Network ( property Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( task . is Successful ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . result ?. documents ?. forEach Ġ{ Ġdocument Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument . toObject ( A men ity :: class . java )?. let Ġ{ Ġnew A men ities . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Operations . add ( amen ities Download ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddress Download Ġ= Ġproperty Repository . getAddress From Network ( property Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( task . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . result ?. toObject ( Address :: class . java )?. let { Ġnew Addresses . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Operations . add ( address Download ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpictures Download Ġ= Ġproperty Repository . getP ictures From Network ( property Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ task Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( task . is Successful ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . result ?. documents ?. forEach Ġ{ Ġdocument Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument . toObject ( Picture :: class . java )?. let Ġ{ Ġnew P ictures . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Operations . add ( pictures Download ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠTasks . when All ( network Operations ). add On Complete Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it . is Successful ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetData From Storage ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġemit Result Network Request Failure ( ERROR _ FETCH ING _ NEW _ FROM _ NETWORK ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetData From Storage ( context : ĠContext ){ ĊĠĠĠĠĠĠĠ Ġval Ġstorage Operation Ġ= Ġmutable ListOf < Task <* >>() ĊĠĠĠĠĠĠĠ Ġnew Agents . forEach Ġ{ Ġagent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġagent . url Profile Picture ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp File Ġ= ĠfilePath To Internal Storage ( context , Ġagent . id , ĠType Image . AGENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpic Agent Download Ġ= Ġagent Repository . getReference Agent Picture ( agent . id ). getFile ( temp File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ Ġstorage Task Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġagent . url Profile Picture Ġ= Ġif ( storage Task . is Successful ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp File . absolute Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Operation . add ( pic Agent Download ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnew P ictures . forEach Ġ{ Ġpicture Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp File Picture Ġ= Ġcreate Image File In Ext Storage () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpicture Download Ġ= Ġproperty Repository . get Picture Storage Reference ( picture . id ). getFile ( temp File Picture ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener { Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( task . is Successful ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpicture . url Ġ= Ġtemp File Picture . absolute Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Picture To Gallery ( context , Ġtemp File Picture . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Operation . add ( picture Download ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpicture . thumbnail Url ?. let Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp File Thumbnail Ġ= ĠfilePath To Internal Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , Ġgenerate Name (), ĠType Image . PROPERTY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthumbnail Download Ġ= Ġproperty Repository . get Thumbnail Storage Reference ( picture . id ). getFile ( temp File Thumbnail ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener { Ġstorage Task Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpicture . thumbnail Url Ġ= Ġif ( storage Task . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp File Thumbnail . absolute Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Operation . add ( thumbnail Download ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnew Addresses . forEach Ġ{ Ġaddress Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp File Map Ġ= ĠfilePath To Internal Storage ( context , Ġaddress . property Id , ĠType Image . ICON _ MAP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Download Ġ= Ġproperty Repository . getMap Storage Reference ( address . property Id ). getFile ( temp File Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener { Ġtask Storage -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( task Storage . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress . map Icon Url Ġ= Ġtemp File Map . absolute Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Operation . add ( map Download ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠTasks . when All ( storage Operation ). add On Complete Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! it . is Successful ) Ġemit Result Network Request Failure ( ERROR _ DOWNLOAD ING _ I MAGES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate New Data In DB Loc ally () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Data Repository . last Update From Network Ġ= Ġto days Date ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġemit Result Network Request Failure ( error : ĠError Source MainActivity ){ ĊĠĠĠĠĠĠĠ Ġval Ġresult : ĠLoading Content Error < MainActivity Result > Ġ= ĠLoading Content Error . Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMainActivity Result . Update Data From Network ( error , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġresult To ViewState ( result ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate New Data In DB Loc ally (){ ĊĠĠĠĠĠĠĠ Ġif ( create Properties And Data Job ?. isActive Ġ== Ġtrue ) Ġcreate Properties And Data Job ?. cancel () ĊĠĠĠĠĠĠĠ Ġcreate Properties And Data Job Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġagent Repository . create All New Agents ( new Agents ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Repository . create Downloaded Data Loc ally ( new Property , Ġnew Addresses , Ġnew P ictures , Ġnew A men ities ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult : ĠLoading Content Error < MainActivity Result > Ġ= ĠLoading Content Error . Content ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMainActivity Result . Update Data From Network ( null , Ġnew Property . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult To ViewState ( result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }