package Ġfi . k ro on . v ad ret . presentation . weather forecast Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Parcelable Ċ import Ġandroid . view . View Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . recyclerview . widget . Divider Item Decoration Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġfi . k ro on . v ad ret . R Ċ import Ġfi . k ro on . v ad ret . data . nom in at im . model . Local ity Ċ import Ġfi . k ro on . v ad ret . presentation . main . MainActivity Ċ import Ġfi . k ro on . v ad ret . presentation . weather forecast . autocomplete . Auto Complete Adapter Ċ import Ġfi . k ro on . v ad ret . presentation . weather forecast . autocomplete . Auto Complete Adapter Callback Ċ import Ġfi . k ro on . v ad ret . presentation . weather forecast . di . D agger Weather Forecast Component Ċ import Ġfi . k ro on . v ad ret . presentation . weather forecast . di . Weather Forecast Component Ċ import Ġfi . k ro on . v ad ret . util . extension . core Component Ċ import Ġfi . k ro on . v ad ret . util . extension . lazy Android Ċ import Ġfi . k ro on . v ad ret . util . extension . to G one Ċ import Ġfi . k ro on . v ad ret . util . extension . to In visible Ċ import Ġfi . k ro on . v ad ret . util . extension . to Visible Ċ import Ġkotlinx . android . synt hetic . main . weather _ forecast _ fragment . auto Complete RecyclerView Ċ import Ġkotlinx . android . synt hetic . main . weather _ forecast _ fragment . weather Forecast Loading ProgressBar Ċ import Ġkotlinx . android . synt hetic . main . weather _ forecast _ fragment . weather Forecast Location Search Button Ċ import Ġkotlinx . android . synt hetic . main . weather _ forecast _ fragment . weather Forecast RecyclerView Ċ import Ġkotlinx . android . synt hetic . main . weather _ forecast _ fragment . weather Forecast Refresh Ċ import Ġkotlinx . android . synt hetic . main . weather _ forecast _ fragment . weather Forecast Search View Ċ import Ġkotlinx . coroutines . Flow Preview Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . de bounce Ċ import Ġkotlinx . coroutines . flow . drop Ċ import Ġkotlinx . coroutines . flow . launch In Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . launch Ċ import Ġpermissions . dispatcher . Needs Permission Ċ import Ġpermissions . dispatcher . On Never Ask Again Ċ import Ġpermissions . dispatcher . On Permission Denied Ċ import Ġpermissions . dispatcher . Runtime Permissions Ċ import Ġru . ld ral igh ier i . cor bind . appcompat . query Text Change Events Ċ import Ġru . ld ral igh ier i . cor bind . swiper ef resh layout . ref res hes Ċ import Ġru . ld ral igh ier i . cor bind . view . click s Ċ import Ġtim ber . log . Tim ber Ċ Ċ @ Runtime Permissions Ċ class ĠWeather Forecast Fragment Ġ: ĠFragment ( R . layout . weather _ forecast _ fragment ) Ġ{ ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSTATE _ PAR CEL _ KEY : ĠString Ġ= Ġ" STATE _ PAR CEL _ KEY " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSC ROLL _ POSITION _ KEY : ĠString Ġ= Ġ" SCROLL _ POSITION _ KEY " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġis Config Change Or Process Death Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġstate Parcel : ĠWeather Forecast View . State Parcel ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġbundle : ĠBundle ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġre cyclerView Parcelable : ĠParcel able ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġcomponent : ĠWeather Forecast Component Ġby Ġlazy Android Ġ{ ĊĠĠĠĠĠĠĠ ĠD agger Weather Forecast Component ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. factory () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create ( context Ġ= Ġrequire Context (), Ġcore Component Ġ= Ġcore Component ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠWeather Forecast ViewModel Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġcomponent . provide Weather Forecast ViewModel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġweather Forecast Adapter : ĠWeather Forecast Adapter Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġcomponent . provide Weather Forecast Adapter () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġauto Complete Adapter : ĠAuto Complete Adapter Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠAuto Complete Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Ġ= Ġobject Ġ: ĠAuto Complete Adapter Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Auto Complete Item Clicked ( event : ĠWeather Forecast View . Event . On Auto Complete Item Clicked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . send ( event Ġ= Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġitem Decoration : ĠDiv ider Item Decoration Ġby Ġlazy Android Ġ{ ĊĠĠĠĠĠĠĠ ĠDiv ider Item Decoration ( require Context (), ĠRecyclerView . VERTICAL ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdrawable : ĠDrawable ? Ġby Ġlazy Android Ġ{ ĊĠĠĠĠĠĠĠ ĠContext Compat . get Drawable ( require Context (), ĠR . drawable . search _ item _ divider ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠTim ber . d (" ON ĠCREATE Ġ-- ĠWE ATHER ĠFORE CAST ") ĊĠĠĠĠĠĠĠ ĠsavedInstanceState ?. let Ġ{ Ġ_ bundle : ĠBundle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bundle Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" savedInstanceState Ġrestored : Ġ$_ bundle ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbundle Ġ= Ġ_ bundle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ ĠTim ber . d (" ON ĠVIEW ĠCRE ATED Ġ-- ĠWE ATHER ĠFORE CAST ") ĊĊĠĠĠĠĠĠĠ Ġlifecycle Scope ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. view State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect (:: render ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsetup RecyclerView () ĊĠĠĠĠĠĠĠ Ġsetup Events () ĊĊĠĠĠĠĠĠĠ ĠviewModel . send ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. Event ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. On View Initial ised ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Parcel Ġ= Ġbundle ?. get Parcelable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ PAR CEL _ KEY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < String >, ĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĠĠĠĠĠĠĠ Ġon Request Permissions Result ( request Code , Ġgrant Results ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ ĠTim ber . d (" ON ĠSTOP Ġ-- ĠWE ATHER ĠFORE CAST ") ĊĠĠĠĠĠĠĠ Ġis Config Change Or Process Death Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ ĠTim ber . d (" ON ĠDEST ROY ĠVIEW Ġ-- ĠWE ATHER ĠFORE CAST ") ĊĊĠĠĠĠĠĠĠ Ġre cyclerView Parcelable Ġ= Ġ( weather Forecast RecyclerView . layout Manager Ġas ĠLinearLayoutManager ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Save InstanceState () ĊĊĠĠĠĠĠĠĠ Ġweather Forecast RecyclerView . adapter Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġauto Complete RecyclerView . adapter Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġweather Forecast Search View . setOn Query Text Listener ( null ) ĊĊĠĠĠĠĠĠĠ Ġhide ActionBar Local ity Name () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ ĠTim ber . d (" ON ĠDEST ROY Ġ-- ĠWE ATHER ĠFORE CAST ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠĠĠĠĠ ĠTim ber . d (" ON ĠSAVE ĠINSTANCE ĠSTATE Ġ-- ĠWE ATHER ĠFORE CAST ") ĊĠĠĠĠĠĠĠ Ġout State . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Parcelable ( STATE _ PAR CEL _ KEY , Ġstate Parcel ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġre cyclerView Parcelable Ġis Ġavailable Ġ( as Ġin Ġnot Ġnull ) Ġit Ġgets Ġsaved ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġinto Ġthe Ġbundle . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġuser Ġnavig ates Ġaway Ġfrom Ġthe Ġapplication Ġthe Ġre cyclerView Parcelable Ġwill ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġbe Ġnull , Ġand Ġinstead Ġwe Ġsave Ġthe Ġscroll Ġposition Ġvia Ġ. on Saved InstanceState () ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Parcelable ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Parcelable ( SCROLL _ POSITION _ KEY , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġweather Forecast RecyclerView ?. layout Manager ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Parcelable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSC ROLL _ POSITION _ KEY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( this Ġas ĠLinearLayoutManager ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Save InstanceState () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ ĠTim ber . d (" ON ĠRES UME Ġ-- ĠWE ATHER ĠFORE CAST ") ĊĠĠĠĠĠĠĠ Ġif Ġ( is Config Change Or Process Death ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Events () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Config Change Or Process Death Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup RecyclerView () Ġ{ ĊĠĠĠĠĠĠĠ Ġweather Forecast RecyclerView . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġweather Forecast Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Fixed Size () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( Flow Preview :: class ) ĊĠĠĠ Ġprivate Ġfun Ġsetup Events () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġweather Forecast Search View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setOn Close Listener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . send ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. Event ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. On Search View Dis missed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġweather Forecast Location Search Button ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. click s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. send ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View . Event . On Search Button Toggle d ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. launch In ( view Lifecycle Owner . lifecycle Scope ) ĊĊĠĠĠĠĠĠĠ Ġweather Forecast Refresh ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. ref res hes () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . send ( Weather Forecast View . Event . On Sw ip ed To Refresh ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. launch In ( view Lifecycle Owner . lifecycle Scope ) ĊĊĠĠĠĠĠĠĠ Ġweather Forecast Search View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Text Change Events () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. de bounce ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. drop ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġsearch Event Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Event . is Submitted Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . send ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. Event ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. On Search Button Submitted ( search Event . query Text . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . send ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. Event ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. On Search TextChanged ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Event . query Text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. launch In ( view Lifecycle Owner . lifecycle Scope ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender ( view State : ĠWeather Forecast View . State ) Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( view State . render Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View . Render Event . Idle Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View . Render Event . Request Location Permission Ġ-> Ġon Request Location Permission () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View . Render Event . Start ProgressBar Effect Ġ-> Ġstart ProgressBar Effect () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View . Render Event . Stop ProgressBar Effect Ġ-> Ġstop ProgressBar Effect () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View . Render Event . Enable Search View Ġ-> Ġenable Search View () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View . Render Event . Restore Scroll Position Ġ-> Ġrestore Scroll Position () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠWeather Forecast View . Render Event . Disable Search View Ġ-> Ġdisable Search View ( view State . render Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠWeather Forecast View . Render Event . Display Auto Complete Ġ-> Ġdisplay Auto Complete List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State . render Event ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠWeather Forecast View . Render Event . Display Weather Forecast Ġ-> Ġdisplay Weather Forecast ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State . render Event ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠWeather Forecast View . Render Event . Display Error Ġ-> Ġrender Error ( view State . render Event . errorCode ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View . Render Event . Update State Parcel Ġ-> Ġupdate State Parcel ( view State ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart ProgressBar Effect () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" start ProgressBar Effect ") ĊĊĠĠĠĠĠĠĠ Ġweather Forecast Loading ProgressBar . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Visible () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . send ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. Event ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. On ProgressBar Effect Started ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop ProgressBar Effect () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" stop ProgressBar Effect ") ĊĊĠĠĠĠĠĠĠ Ġweather Forecast Loading ProgressBar . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto G one () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġweather Forecast Refresh . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Refresh ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . send ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. Event ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. On ProgressBar Effect Stopped ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisplay Auto Complete List ( render Event : ĠWeather Forecast View . Render Event . Display Auto Complete ) Ġ{ ĊĠĠĠĠĠĠĠ Ġauto Complete Adapter . update List ( render Event . new Filter edList ) ĊĠĠĠĠĠĠĠ Ġauto Complete RecyclerView . adapter ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Event . diff Result ?. dispatch Updates To ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrestore Scroll Position () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" restore Scroll Position ") ĊĠĠĠĠĠĠĠ Ġbundle ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( weather Forecast RecyclerView . layout Manager Ġas ĠLinearLayoutManager ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Restore InstanceState ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Parcelable ( SCROLL _ POSITION _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . send ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. Event ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. On Scroll Position Restore d ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate State Parcel ( state : ĠWeather Forecast View . State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Parcel Ġ= ĠWeather Forecast View . State Parcel ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Text Ġ= Ġstate . search Text , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Search Toggle d Ġ= Ġstate . is Search Toggle d , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforce Net Ġ= Ġstate . force Net , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Refresh ing Ġ= Ġstate . start Refresh ing , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Refresh ing Ġ= Ġstate . stop Refresh ing ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠTim ber . d (" update State Parcel : Ġ$ state Parcel ") ĊĊĠĠĠĠĠĠĠ ĠviewModel . send ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. Event ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. On State Parcel Updated ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisable Search View ( render Event : ĠWeather Forecast View . Render Event . Disable Search View ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" disable Search View ") ĊĊĠĠĠĠĠĠĠ Ġweather Forecast Location Search Button . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Visible () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġweather Forecast Search View . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto In visible () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Query ( render Event . text , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġauto Complete RecyclerView . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto In visible () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . send ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. Event ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. On Search View Dis missed ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġenable Search View () Ġ{ ĊĠĠĠĠĠĠĠ Ġauto Complete Adapter . clear List () ĊĊĠĠĠĠĠĠĠ Ġweather Forecast Search View . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Visible () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Focus able Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Icon ified Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Focus From Touch () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġauto Complete RecyclerView ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġauto Complete Adapter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( require Context (), ĠRecyclerView . VERTICAL , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawable ?. let Ġ{ Ġres : ĠDrawable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Decoration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Drawable ( res ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Item Decoration ( item Decoration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Fixed Size () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġweather Forecast Location Search Button . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisplay Weather Forecast ( render Event : ĠWeather Forecast View . Render Event . Display Weather Forecast ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" Rendering Ġweather Ġforecast Ġdata ") ĊĠĠĠĠĠĠĠ Ġweather Forecast Adapter . update List ( render Event . list ) ĊĠĠĠĠĠĠĠ Ġset ActionBar Local ity Name ( render Event . locality ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . send ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. Event ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. On Weather List Displayed ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Request Location Permission (): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġon Location Permission Granted With Permission Check () ĊĊĠĠĠ Ġ@ Needs Permission ( value Ġ= Ġ[ Manifest . permission . ACCESS _ F INE _ LOCATION ]) ĊĠĠĠ Ġfun Ġon Location Permission Granted () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. send ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. Event ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. On Location Permission Granted ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ On Permission Denied ( value Ġ= Ġ[ Manifest . permission . ACCESS _ F INE _ LOCATION ]) ĊĠĠĠ Ġfun Ġon Location Permission Denied () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. send ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. Event ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. On Location Permission Denied ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ On Never Ask Again ( value Ġ= Ġ[ Manifest . permission . ACCESS _ F INE _ LOCATION ]) ĊĠĠĠ Ġfun Ġon Location Permission Never Ask Again () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. send ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. Event ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. On Location Permission Denied Never Ask Again ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender Error ( errorCode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġsn ack ( errorCode ) ĊĠĠĠĠĠĠĠ ĠTim ber . e (" Rendering Ġerror Ġcode : Ġ${ getString ( errorCode )} ") ĊĠĠĠĠĠĠĠ ĠviewModel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. send ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Forecast View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. Event ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. On Failure Handled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide ActionBar Local ity Name () Ġ= ĊĠĠĠĠĠĠĠ Ġ( require Activity () Ġas ĠMainActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. hide Local ity ActionBar () ĊĊĠĠĠ Ġprivate Ġfun Ġset ActionBar Local ity Name ( locality : ĠLoc ality ) Ġ= ĊĠĠĠĠĠĠĠ Ġ( require Activity () Ġas ĠMainActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Local ity ActionBar ( locality ) Ċ }