/** Ċ Ġ* Ġ ĠDesign ed Ġand Ġdeveloped Ġby ĠK ola ĠE mi ola Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ */ Ċ package Ġcom . k ola emi ola . near by restaurant . ui Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . location . Address Ċ import Ġandroid . location . Geo coder Ċ import Ġandroid . location . Location Ċ import Ġandroidx . h ilt . lifecycle . ViewModel Inject Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . google . android . gms . location . Location Request Ċ import Ġcom . k ola emi ola . domain . model . Ven ues QueryParams Ċ import Ġcom . k ola emi ola . domain . use case . Get Restaurant UseCase Ċ import Ġcom . k ola emi ola . near by restaurant . mapper . to App Model Ċ import Ġcom . k ola emi ola . near by restaurant . model . state . Restaurant ViewState Ċ import Ġcom . k ola emi ola . near by restaurant . model . Venue Ċ import Ġcom . k ola emi ola . near by restaurant . recent _ venue . Cached Venue Repo Ċ import Ġcom . k ola emi ola . near by restaurant . ui . view _ extensions . f used Location Flow Ċ import Ġcom . k ola emi ola . near by restaurant . util . Success Ċ import Ġkotlinx . coroutines . flow . catch Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . onStart Ċ import Ġkotlinx . coroutines . launch Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util . Locale Ċ import Ġkotlin . collections . ArrayList Ċ import Ġkotlin . collections . List Ċ import Ġkotlin . collections . isNotEmpty Ċ import Ġkotlin . collections . map Ċ Ċ class ĠMain ViewModel Ġ@ ViewModel Inject Ġconstructor ( ĊĠ Ġprivate Ġval Ġget Restaurant UseCase : ĠGet Restaurant UseCase , ĊĠ Ġprivate Ġval Ġcached Venue Repo : ĠCached Venue Repo , ĊĠ Ġapplication : ĠApplication Ċ ) Ġ: ĠAndroid ViewModel ( application ) Ġ{ ĊĊĠ Ġprivate Ġval Ġ_ search Restaurant State Ġ= ĠMutable LiveData < Restaurant ViewState >() ĊĠ Ġval Ġsearch Restaurant State : ĠLive Data < Restaurant ViewState > Ġ= Ġ_ search Restaurant State ĊĊĠ Ġprivate Ġval Ġ_ users Last Location Ġ= ĠMutable LiveData < Location >() ĊĠ Ġval Ġusers Location : ĠLive Data < Location > Ġ= Ġ_ users Last Location ĊĊĠ Ġprivate Ġval Ġrecent Cached List Ġ= ĠArrayList < Venue >() ĊĠ Ġinit Ġ{ ĊĠĠĠ Ġ_ search Restaurant State . value Ġ= ĊĠĠĠĠĠ ĠRest aurant ViewState () ĊĠ Ġ} ĊĊĠ Ġfun Ġget Rest aurants ( lat Long : ĠString , Ġradius : ĠInt , Ġlimit : ĠInt ) Ġ{ ĊĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠ Ġval Ġnear Ġ= Ġget City Name ( application Ġ= Ġget Application ()) ĊĠĠĠĠĠ Ġval Ġven ues QueryParams Ġ= ĠV en ues QueryParams ( lat Long , Ġnear , Ġradius , Ġlimit ) ĊĠĠĠĠĠ Ġget Restaurant UseCase ( ven ues QueryParams ). onStart Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ search Restaurant State . value Ġ= Ġ_ search Restaurant State . value ?. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ}. catch Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ search Restaurant State . value Ġ= Ġ_ search Restaurant State . value ?. copy ( ĊĠĠĠĠĠĠĠĠĠ Ġloading Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġit . message ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠ Ġ}. collect Ġ{ Ġresults Ġ-> ĊĠĠĠĠĠĠĠ Ġ_ search Restaurant State . value Ġ= Ġ_ search Restaurant State . value ?. copy ( ĊĠĠĠĠĠĠĠĠĠ Ġloading Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠ Ġven ues Ġ= Ġresults . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . to App Model ( it . location Model . to App Model ()) ĊĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" ven ues Ġfetched Ġsuccessfully : Ġ$ it Ġ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġlocation Request ( location Request : ĠLocation Request ) Ġ{ ĊĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠ Ġf used Location Flow ( ĊĠĠĠĠĠĠĠ Ġlocation Request , ĊĠĠĠĠĠĠĠ Ġget Application () ĊĠĠĠĠĠ Ġ). collect Ġ{ Ġlocation Ġ-> ĊĠĠĠĠĠĠĠ Ġ_ users Last Location . value Ġ= Ġlocation ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ// ĠFor Ġscrolling Ġto Ġmarker Ġposition Ġbased Ġon Ġplace Ġof Ġinterest Ġresults ĊĠ Ġprivate Ġval Ġ_ current Marker Position Ġ= ĠMutable LiveData < Int >() ĊĠ Ġval Ġcurrent Marker Position : ĠLive Data < Int > Ġget () Ġ= Ġ_ current Marker Position ĊĊĠ Ġfun ĠsetCurrent Marker Position ( place Index : ĠInt ) Ġ{ ĊĠĠĠ Ġ_ current Marker Position . value Ġ= Ġplace Index ĊĠ Ġ} ĊĊĠ Ġ// ĠFor Ġscrolling Ġto Ġrestaurant Ġindex Ġbased Ġon Ġmarker Ġclicked ĊĠ Ġprivate Ġval Ġ_ current Place Index Ġ= ĠMutable LiveData < Int >() ĊĠ Ġval Ġcurrent Place Index : ĠLive Data < Int > Ġget () Ġ= Ġ_ current Place Index ĊĠ Ġfun Ġselect Place On Restaurant List ( place Index : ĠInt ) Ġ{ ĊĠĠĠ Ġ_ current Place Index . value Ġ= Ġplace Index ĊĠ Ġ} ĊĊĠ Ġ// Ġcache Ġregion ĊĠ Ġfun Ġget Recent Checked () Ġ{ ĊĠĠĠ Ġwhen Ġ( val Ġcached Ven ues Ġ= Ġcached Venue Repo . get Cached Venue ()) Ġ{ ĊĠĠĠĠĠ Ġis ĠSuccess Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġrecent Cached List . clear () ĊĠĠĠĠĠĠĠ Ġrecent Cached List . addAll ( cached Ven ues . data ) ĊĠĠĠĠĠĠĠ Ġif Ġ( recent Cached List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ_ search Restaurant State . value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ search Restaurant State . value ?. copy ( ven ues Initial Ġ= Ġcached Ven ues . data , Ġloading Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġvar Ġ_ add Recent Check Data Ġ= ĠMutable LiveData < Boolean >() ĊĠ Ġval Ġadd Recent Check Data : ĠLive Data < Boolean > ĊĠĠĠ Ġget () Ġ= Ġ_ add Recent Check Data ĊĊĠ Ġfun Ġupdate Recent Check ( ven ues : ĠList < Venue >) Ġ{ ĊĠĠĠ Ġcached Venue Repo . update Cache Venue ( ven ues Ġ= Ġven ues ) Ġ{ Ġupdate Completed Ġ-> ĊĠĠĠĠĠ Ġ_ add Recent Check Data . value Ġ= Ġupdate Completed ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġclear Cache () Ġ{ ĊĠĠĠ Ġcached Venue Repo . clear Cache Venue Ġ{} ĊĠ Ġ} ĊĊĠ Ġ/** * ĊĠĠ Ġ* Ġtemp , ĠTODO Ġclean Ġup Ġgetting Ġcity Ġname ĊĠĠ Ġ* ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġget City Name ( application : ĠApplication ): ĠString Ġ{ ĊĠĠĠ Ġval Ġlocation Ġ= Ġ_ users Last Location . value ĊĠĠĠ Ġval Ġgeo coder Ġ= ĠGeo coder ( application . application Context , ĠLocale . getDefault ()) ĊĠĠĠ Ġval Ġaddresses : ĠList < Address > Ġ= ĊĠĠĠĠĠ Ġgeo coder . get From Location ( location !!. latitude , Ġlocation . longitude , Ġ 1 ) ĊĠĠĠ Ġreturn Ġaddresses [ 0 ]. locality ĊĠ Ġ} Ċ } Ċ