package Ġcom . k ha led . weather app . feature . search . screen Ċ Ċ import Ġandroid . location . Location Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . k ha led . weather app . common . Base ViewModel Ċ import Ġcom . k ha led . weather app . feature . search . module . Mapper . to Weather Item View Ċ import Ġcom . k ha led . weather app . feature . search . module . use case . Get City Weather By Location UseCase Ċ import Ġcom . k ha led . weather app . feature . search . module . use case . Search City ByName UseCase Ċ import Ġcom . k ha led . weather app . feature . search . module . view . Weather Item View Ċ import Ġcom . k ha led . weather app . utils . Single Live Event Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ Ċ class ĠCity Search ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġsearch City ByName UseCase : ĠSearch City ByName UseCase , ĊĠĠĠ Ġprivate Ġval Ġget City Weather By Location UseCase : ĠGet City Weather By Location UseCase , Ċ ) Ġ: ĠBase ViewModel () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġjob : ĠJob ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcurrent Query Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar Ġcurrent Location : ĠLocation ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġis Weather City ByName Response Finished Ġ= Ġtrue ĊĠĠĠ Ġval Ġcity Weather Item View Ġ= ĠMutable LiveData < Weather Item View ?> () ĊĠĠĠ Ġval Ġdate View Ġ= ĠMutable LiveData < String >() ĊĠĠĠ Ġval Ġtime View Ġ= ĠMutable LiveData < String >() ĊĠĠĠ Ġval Ġshow Error View Ġ= ĠSingle Live Event < String >() ĊĊĠĠĠ Ġprivate Ġfun Ġget City ByName () Ġ{ ĊĠĠĠĠĠĠĠ Ġjob Ġ= Ġwrap Blocking Operation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch City ByName UseCase . invoke ( query Ġ= Ġcurrent Query ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error View . value Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcity Weather Item View . value Ġ= Ġit . data . to Weather Item View () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error View . value Ġ= Ġget ErrorMessage ( it ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Weather City ByName Response Finished Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Weather By Location ( location : ĠLocation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġjob Ġ= Ġwrap Blocking Operation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget City Weather By Location UseCase . invoke ( lat Ġ= Ġlocation . latitude , Ġlng Ġ= Ġlocation . longitude ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error View . value Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Query Ġ= Ġit . data . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcity Weather Item View . value Ġ= Ġit . data . to Weather Item View () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Location Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error View . value Ġ= Ġget ErrorMessage ( it ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Weather City ByName Response Finished Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Location Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon City Search ByName Changed ( query : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Formatted Ġ= Ġquery . trim () ĊĠĠĠĠĠĠĠ Ġif Ġ( current Query Ġ!= Ġquery Formatted ) Ġclear Data () ĊĠĠĠĠĠĠĠ Ġif Ġ( query Formatted . isEmpty () Ġ|| Ġcity Weather Item View . value ?. name Ġ== Ġquery Formatted ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( is Weather City ByName Response Finished . not ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġis Weather City ByName Response Finished Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġcurrent Query Ġ= Ġquery Formatted ĊĠĠĠĠĠĠĠ Ġget City ByName () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġjob ?. cancel () ĊĠĠĠĠĠĠĠ Ġcity Weather Item View . value Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġis Weather City ByName Response Finished Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġdate View . value Ġ= Ġget Date View () ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetTime View () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Date View (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsdf Ġ= ĠSimpleDateFormat (" EEE ĠM MM Ġdd , yyyy ", ĠLocale . EN GL ISH ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsdf . format ( Date ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun ĠgetTime View () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsdf Ġ= ĠSimpleDateFormat (" hh : mm ", ĠLocale . EN GL ISH ) ĊĠĠĠĠĠĠĠ Ġtime View . value Ġ= Ġsdf . format ( Date ()) ĊĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠ ĠgetTime View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Location Changed ( location : ĠLocation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Location Ġ= Ġlocation ĊĠĠĠĠĠĠĠ Ġget Weather By Location ( location ) ĊĊĠĠĠ Ġ} Ċ }