package Ġcom . pn ue ma . android . four site . main screen . ui . view models Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . location . Location Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . Worker Thread Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġcom . pn ue ma . android . four site . api . F ours quare ServiceProvider Ċ import Ġcom . pn ue ma . android . four site . main screen . models . F ours quare Response Ċ import Ġcom . pn ue ma . android . four site . main screen . ui . models . Location Result Ċ import Ġcom . pn ue ma . android . four site . pers istance . F avorites Database Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Callback Ċ import Ġretrofit 2 . Response Ċ import Ġjava . util . concurrent . Executors Ċ Ċ class ĠMain Screen ViewModel Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG Ġ= Ġ" Main Screen ViewModel " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠERROR _ CODE _ RE TR IE VE Ġ= Ġ 5 0 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠERROR _ CODE _ NO _ CURRENT _ LOCATION Ġ= Ġ 5 0 1 ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġsearch Filter : ĠString Ġ= Ġ"" ĊĠĠĠ Ġvar Ġlocation Results : ĠMutable LiveData < ArrayList < Location Result >> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġvar Ġlocation Results Error : ĠMutable LiveData < Int > Ġ= ĠMutable LiveData () ĊĊĠĠĠ Ġinterface ĠLocation Favorite Changed Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Worker Thread ĊĠĠĠĠĠĠĠ Ġfun Ġon Favorite Changed Status () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Location Results ( query : ĠString , Ġcurrent Location : ĠLocation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( query . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Query Ġempty Ġso Ġno Ġrequest Ġwill Ġbe Ġmade ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Results . post Value ( ArrayList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcurrent LatLng Ġ= Ġcurrent Location . latitude . toString () Ġ+ Ġ"," Ġ+ Ġcurrent Location . longitude . toString () ĊĠĠĠĠĠĠĠ ĠF ours quare ServiceProvider . service . getLocation Results ( query Ġ= Ġquery , Ġlat lng Ġ= Ġcurrent LatLng ). enqueue ( object Ġ: ĠCallback < F ours quare Response > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < F ours quare Response >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( java Class . simple Name , Ġt . message Ġ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Results Error . post Value ( ERROR _ CODE _ RE TR IE VE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall < F ours quare Response >, Ġresponse : ĠResponse < F ours quare Response >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful Ġ&& Ġresponse . body () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Success : Ġ" Ġ+ Ġresponse . raw (). request (). url (). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// successful Ġresponse Ġso Ġparse Ġthe Ġresults Ġand Ġpost Ġthem Ġto Ġthe Ġawait ing Ġlive Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body ()?. let Ġ{ Ġf ours quare Response Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Results . post Value ( build Results ( f ours quare Response )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( call , ĠThrowable (" Un successful Ġrequest Ġfor Ġlocations : Ġ" Ġ+ Ġresponse . code ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Query ( query : ĠString , Ġcurrent Location : ĠLocation ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsearch Filter Ġ= Ġquery ĊĊĠĠĠĠĠĠĠ Ġrefresh ( current Location ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrefresh ( current Location : ĠLocation ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Location Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Results Error . post Value ( ERROR _ CODE _ NO _ CURRENT _ LOCATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġget Location Results ( search Filter , Ġcurrent Location ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck Location Results F avorites ( context : ĠContext , Ġlocations : ĠArrayList < Location Result >, Ġstatus Changed Listener : ĠLocation Favorite Changed ) Ġ{ ĊĠĠĠĠĠĠĠ ĠExec utors . new Single Thread Executor (). submit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocations . forEach Ġ{ Ġlocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . id ?. let Ġ{ id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF avorites Database . database ( context ). favorites Dao (). get Favorite ById ( id ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( it Ġ== Ġnull Ġ&& Ġlocation . is Favorite ) Ġ|| Ġ( it Ġ!= Ġnull Ġ&& Ġ! location . is Favorite )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . is Favorite Ġ= Ġ! location . is Favorite ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Changed Listener . on Favorite Changed Status () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuild Ġthe Ġlist Ġof Ġlocation Ġresults Ġsorted Ġby Ġdistance ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġempty Ġlist Ġof Ġno Ġresults Ġwere Ġfound Ġin Ġthe Ġresponse ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġbuild Results ( f ours quare Response : ĠF ours quare Response ): ĠArrayList < Location Result > Ġ{ ĊĠĠĠĠĠĠĠ Ġf ours quare Response . response ?. let Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults List Ġ= ĠArrayList < Location Result >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . ven ues . forEach Ġ{ Ġresults List . add ( Location Result ( it )) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠArrayList ( results List . sorted By Ġ{ Ġit . location Distance Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠArrayList () ĊĠĠĠ Ġ} Ċ }