package Ġcom . jar vis lin . drug stores . page . map Ċ Ċ import Ġandroid . location . Location Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġcom . google . android . gms . maps . model . LatLng Ċ import Ġcom . jar vis lin . domain . entity . Dr ug store Info Ċ import Ġcom . jar vis lin . domain . entity . Latest Data Saved Ċ import Ġcom . jar vis lin . domain . entity . Pro clamation Ċ import Ġcom . jar vis lin . domain . entity . Update Progress Ċ import Ġcom . jar vis lin . domain . inter actor . Dr ug store UseCase Ċ import Ġcom . jar vis lin . domain . inter actor . Pro clamation UseCase Ċ import Ġcom . jar vis lin . drug stores . extension . bind Ċ import Ġcom . jar vis lin . drug stores . base . Base ViewModel Ċ import Ġcom . jar vis lin . drug stores . data . remote . HttpException Ċ import Ġio . reactivex . Back pressure Strategy Ċ import Ġio . reactivex . Flow able Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . functions . Bi Function Ċ import Ġio . reactivex . rx kotlin . subscribe By Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġio . reactivex . subjects . Publish Subject Ċ import Ġorg . k oin . core . inject Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠMap ViewModel Ġ: ĠBase ViewModel () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġuse Case : ĠDr ug store UseCase Ġby Ġinject () ĊĠĠĠ Ġprivate Ġval Ġpro clamation UseCase : ĠPro clamation UseCase Ġby Ġinject () ĊĠĠĠ Ġval Ġdata Prepared Ġ= ĠMutable LiveData < Boolean >( false ) ĊĠĠĠ Ġval Ġdrug store Info Ġ= ĠMutable LiveData < List < Dr ug store Info >>( emptyList ()) ĊĠĠĠ Ġval Ġprogress Ġ= ĠMutable LiveData < Update Progress >() ĊĠĠĠ Ġval Ġauto Update Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġval Ġsearched Result Ġ= ĠMutable LiveData < List < Dr ug store Info >>() ĊĠĠĠ Ġval Ġstatus Bar Height Ġ= ĠMutable LiveData < Int >() ĊĠĠĠ Ġval Ġpro clam ations Ġ= ĠMutable LiveData < Pair < List < Pro clamation >, ĠBoolean >>() ĊĊĠĠĠ Ġfun Ġfetch Open Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsubject : ĠPublish Subject < Update Progress > Ġ= ĠPublish Subject . create () ĊĠĠĠĠĠĠĠ Ġsubject . to Flow able ( Back pressure Strategy . LATE ST ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. zip With ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFlow able . interval ( 6 0 0 , ĠTimeUnit . MILLISECONDS ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBi Function < Update Progress , ĠLong , ĠUpdate Progress > Ġ{ Ġprogress , Ġ_ Ġ-> Ġprogress Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe By ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Next Ġ= Ġ{ Ġprogress . post Value ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Ġ= Ġ{ ĠTim ber . e ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). bind ( this ) ĊĊĠĠĠĠĠĠĠ Ġuse Case . fetch Data ( subject ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe By ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonComplete Ġ= Ġ{ Ġdata Prepared . post Value ( true ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIOException Ġ-> Ġtoast Text . post Value (" çĦ¡ æ³ķ éĢ£ ç· ļ ï¼Į è«ĭ æª ¢ æŁ¥ ç¶² è·¯ çĭ Ģ æ³ ģ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHttp Exception Ġ-> Ġtoast Text . post Value (" éĢ£ ç· ļ éĮ ¯ èª ¤ ï¼Į è«ĭ ç¨ į å¾Į åĨį è© ¦ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtoast Text . post Value (" çĻ ¼ çĶŁ çķ ° å¸¸ ï¼Į è«ĭ èģ ¯ çµ ¡ ä½ľèĢħ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Prepared . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. bind ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfetch Near Dr ug store Info ( latitude : ĠDouble , Ġlongitude : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( data Prepared . value Ġ!= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfrom Ġon Ġcamera Ġid led ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġuse Case . find Near Dr ug store Info ( latitude , Ġlongitude ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġdrug store Info . post Value ( it ) Ġ}, Ġ{ ĠTim ber . e ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. bind ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Last Location ( location : ĠLocation ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlocation ?. let Ġ{ Ġuse Case . save Last Location ( it . latitude , Ġit . longitude ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetLast Location (): ĠLat Lng Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġuse Case . getLast Location (). run Ġ{ ĠLat Lng ( first , Ġsecond ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcount Down () Ġ{ ĊĠĠĠĠĠĠĠ ĠFlow able . interval ( 1 , Ġ 1 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . computation ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( 1 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Complete Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" count Ġdown Ġcomplete ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauto Update . post Value ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġ}, Ġ{ ĠTim ber . e ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. bind ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsearch Address ( keyword : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġuse Case . search Address ( keyword ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. delay ( 6 0 0 L , ĠTimeUnit . MILLISECONDS ) Ġ// Ġfor Ġshowing Ġprogress Ġbar ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġsearched Result . post Value ( it ) Ġ}, Ġ{ ĠTim ber . e ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. bind ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave StatusBar Height ( height : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstatus Bar Height . post Value ( height ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfetch Pro clam ations () Ġ{ ĊĠĠĠĠĠĠĠ Ġpro clamation UseCase . fetch Pro clam ations () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġpro clam ations . post Value ( it ) Ġ}, Ġ{ ĠTim ber . e ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. bind ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis First Launch (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġuse Case . is First Launch () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate First Launch () Ġ{ ĊĠĠĠĠĠĠĠ Ġuse Case . update First Launch () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck Rating Count () Ġ{ ĊĠĠĠĠĠĠĠ Ġuse Case . update Rating Count () ĊĠĠĠ Ġ} Ċ }