package Ġla ure ny ew . dog food comparison app . present ers Ċ Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġkotlinx . coroutines .* Ċ import Ġla ure ny ew . dog food comparison app . contracts . Search Dog Food Contract Ċ import Ġla ure ny ew . dog food comparison app . models . Company Ċ import Ġla ure ny ew . dog food comparison app . models . Food Ref Ċ import Ġla ure ny ew . dog food comparison app . networking . commands . Get Company Price List Command Ċ import Ġla ure ny ew . dog food comparison app . networking . commands . Get Dog Food Command Ċ import Ġla ure ny ew . dog food comparison app . views . adapters . data . Company Price Data Wrapper Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ /** Ċ Ġ* Ġ@ author ĠLa uren ĠY ew Ċ Ġ* Ċ Ġ* ĠSearch ĠDog ĠFood ĠContract ĠPres enter Ġusing ĠKotlin ĠCor outines Ġfor Ġthreading Ċ Ġ*/ Ċ class ĠSearch Dog Food Cor outines Presenter Ġ: ĠSearch Dog Food Contract . Presenter , ĠCor outine Scope Ġ{ ĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġlateinit Ġvar Ġjob : ĠJob ĊĠĠĠ Ġprivate Ġvar Ġview Ref : ĠWeak Reference < Search Dog Food Contract . View >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġnetwork Call Delay : ĠLong Ġ= Ġ 0 L ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġvar Ġsearch Job : ĠJob ? Ġ= Ġnull ĊĊĠĠĠ Ġ// region ĠGet ters ĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġval Ġview : ĠSearch Dog Food Contract . View ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġview Ref ?. get () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLaunch Ġcor outines Ġon Ġa Ġbackground Ġpool Ġof Ġthreads ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠDispatch ers . Default Ġ+ Ġjob ĊĠĠĠ Ġ// endregion ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( view : ĠSearch Dog Food Contract . View , Ġdelay : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġjob Ġ= ĠJob () ĊĠĠĠĠĠĠĠ Ġview Ref Ġ= ĠWeak Reference ( view ) ĊĠĠĠĠĠĠĠ Ġnetwork Call Delay Ġ= Ġdelay ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġun Bind () Ġ{ ĊĠĠĠĠĠĠĠ Ġjob . cancel () ĊĠĠĠĠĠĠĠ Ġview Ref ?. clear () ĊĠĠĠĠĠĠĠ Ġview Ref Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSearch Ġfor Ġdog Ġfood Ġresults Ġusing ĠKotlin ĠCor outines ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Search ( search Term : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( search Term Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Only Ġone Ġsearch Ġshould Ġbe Ġrun Ġat Ġa Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Job ?. cancel () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Launch Ġcor outines Ġon ĠBackground Ġthread Ġpool ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Job Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġsearch Dog Food Company Prices ( search Term ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Send Ġupdates Ġback Ġto ĠUI Ġthread ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate View With SearchResults ( results ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( runtime Exception : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate View With SearchResults ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġruntime Exception . message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. on SearchResults Loaded ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// region ĠHelper ĠMethods ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCor outines Ġcall Ġto Ġget Ġdog Ġfood Ġresults Ġw / Ġnetwork Ġcalls ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( RuntimeException :: class ) ĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġsuspend Ġfun Ġsearch Dog Food Company Prices ( search Term : ĠString ): ĊĠĠĠĠĠĠĠĠĠĠĠ ĠList < Company Price Data Wrapper >? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdog Food Company Prices : ĠList < Company Price Data Wrapper >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ// Put Ġthese Ġdependent Ġcalls Ġin Ġthe Ġsame Ġscope ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdog Food Ġ= Ġget Dog Food ( search Term ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġdog Food ?. let Ġ{ Ġget Company Price List ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdog Food Company Prices Ġ= Ġparse SearchResults ( result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdog Food Company Prices ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCor outines Ġcall Ġto Ġupdate Ġthe Ġview Ġon Ġthe Ġmain Ġthread ĊĠĠĠĠ Ġ* Ġwith Ġresults ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġfun Ġupdate View With SearchResults ( ĊĠĠĠĠĠĠĠ Ġcompany Price Results : ĠList < Company Price Data Wrapper > ?, ĊĠĠĠĠĠĠĠ ĠerrorMessage : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġview ?. on SearchResults Loaded ( company Price Results ) ĊĠĠĠĠĠĠĠ ĠerrorMessage ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. on Search Failed ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMake Ġa Ġnetwork Ġcall Ġto Ġget Ġthe Ġdog Ġfood ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( RuntimeException :: class ) ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Dog Food ( brand Name : ĠString ): ĠFood Ref ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= ĠGet Dog Food Command ( network Call Delay ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcommand . execute ( brand Name ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . finish () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMake Ġa Ġnetwork Ġcall Ġto Ġget Ġthe Ġcompany Ġprice Ġlist ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( RuntimeException :: class ) ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Company Price List ( food Ref : ĠFood Ref ): ĠList < Company >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= ĠGet Company Price List Command ( network Call Delay ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcommand . execute ( food Ref ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . finish () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠParse Ġthe Ġsearch Ġresults Ġand Ġupdate ĠUI ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġprivate Ġfun Ġparse SearchResults ( company Price List : ĠList < Company >? ): ĠList < Company Price Data Wrapper >? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdata : ĠArrayList < Company Price Data Wrapper >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( company Price List Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompany Price List . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . add ( Company Price Data Wrapper ( it . id , Ġit . company Name , Ġit . price )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdata ĊĠĠĠ Ġ} Ċ // endregion Ċ }