/* Ċ Ġ* Ġ ĠCopyright Ġ 2 0 1 8 ĠAnd rea ĠB res olin Ċ Ġ* Ċ Ġ* Ġ Ġ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 Ġand re ab res olin . kotlin coroutine sex ample s . forecast . view Ċ Ċ import Ġand re ab res olin . kotlin coroutine sex ample s . R Ċ import Ġand re ab res olin . kotlin coroutine sex ample s . app . App Ċ import Ġand re ab res olin . kotlin coroutine sex ample s . app . model . City Ċ import Ġand re ab res olin . kotlin coroutine sex ample s . app . presenter . Sticky Continuation Ċ import Ġand re ab res olin . kotlin coroutine sex ample s . forecast . di . Forecast Module Ċ import Ġand re ab res olin . kotlin coroutine sex ample s . forecast . presenter . Forecast Presenter Ċ import Ġand re ab res olin . kotlin coroutine sex ample s . forecast . presenter . Forecast Presenter Impl Ċ import Ġand re ab res olin . kotlin coroutine sex ample s . forecast . presenter . Forecast Presenter Factory Ċ import Ġand re ab res olin . kotlin coroutine sex ample s . forecast . view . Forecast View . Error Dialog Response Ċ import Ġand re ab res olin . kotlin coroutine sex ample s . forecast . view . Forecast View . Error Dialog Response . CANCEL Ċ import Ġand re ab res olin . kotlin coroutine sex ample s . forecast . view . Forecast View . Error Dialog Response . RETRY Ċ import Ġandroid . arch . lifecycle . ViewModel Providers Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . DialogInterface Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . v 7 . app . AlertDialog Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġkotlinx . android . synt hetic . main . activity _ forecast .* Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠFore cast Activity Ġ: ĠAppCompatActivity (), ĠFore cast View Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCONTENT _ CHILD _ INDEX Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLO ADING _ CHILD _ INDEX Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠERROR _ CHILD _ INDEX Ġ= Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠC ITY _ EXTRA Ġ= Ġ" C ITY _ EXTRA " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDISPLAY ED _ CHILD _ STATE _ KEY Ġ= Ġ" DISPLAY ED _ CHILD _ STATE _ KEY " ĊĊĠĠĠĠĠĠĠ Ġfun Ġstart ( context : ĠContext , Ġcity : ĠCity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠFore cast Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( C ITY _ EXTRA , Ġcity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġpresenter Factory : ĠFore cast Presenter Factory ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpresenter : ĠFore cast Presenter < Forecast View > ĊĠĠĠ Ġprivate Ġval Ġopen Dialog s : ĠMutable List < AlertDialog > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ forecast ) ĊĊĠĠĠĠĠĠĠ Ġinject Dependencies () ĊĠĠĠĠĠĠĠ ĠsetUp Presenter () ĊĠĠĠĠĠĠĠ ĠsetUp Days Forecast List () ĊĊĠĠĠĠĠĠĠ Ġintent . get Parcelable Extra < City >( C ITY _ EXTRA )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠgetString ( R . string . forecast _ activity _ title , Ġit . city Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( presenter . forecast s . isEmpty () Ġ&& ĠsavedInstanceState Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Forecast s ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinject Dependencies () Ġ{ ĊĠĠĠĠĠĠĠ ĠApp . get (). getApp Component ()?. plus ( Forecast Module ()) ?. inject ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetUp Presenter () Ġ{ ĊĠĠĠĠĠĠĠ Ġpresenter Ġ= ĠViewModel Providers . of ( this , Ġpresenter Factory ). get ( Forecast Presenter Impl :: class . java ) ĊĠĠĠĠĠĠĠ Ġpresenter . attach View ( this , Ġlifecycle ) ĊĠĠĠĠĠĠĠ Ġlifecycle . add Observer ( presenter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetUp Days Forecast List () Ġ{ ĊĠĠĠĠĠĠĠ Ġdays Forecast List . adapter Ġ= ĠDays Forecast ListAdapter ( this , Ġpresenter . forecast s ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Forecast s ( city : ĠCity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpresenter . load Forecast s ( city ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġout State ?. put Int ( DISPLAY ED _ CHILD _ STATE _ KEY , Ġview Flip per . display ed Child ) ĊĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Restore InstanceState ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Restore InstanceState ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġview Flip per . display ed Child Ġ= ĠsavedInstanceState ?. getInt ( DISPLAY ED _ CHILD _ STATE _ KEY ) Ġ?: ĠCONTENT _ CHILD _ INDEX ĊĊĠĠĠĠĠĠĠ Ġintent . get Parcelable Extra < City >( C ITY _ EXTRA )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( presenter . forecast s . isEmpty () Ġ&& Ġview Flip per . display ed Child Ġ== ĠCONTENT _ CHILD _ INDEX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Forecast s ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġopen Dialog s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . dismiss () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdisplay Loading State () Ġ{ ĊĠĠĠĠĠĠĠ Ġview Flip per . display ed Child Ġ= ĠLO ADING _ CHILD _ INDEX ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdisplay Content State () Ġ{ ĊĠĠĠĠĠĠĠ Ġview Flip per . display ed Child Ġ= ĠCONTENT _ CHILD _ INDEX ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdisplay Error State () Ġ{ ĊĠĠĠĠĠĠĠ ĠerrorMessage Text . text Ġ= ĠgetString ( R . string . forecast _ retrie val _ error _ message ) ĊĠĠĠĠĠĠĠ Ġview Flip per . display ed Child Ġ= ĠERROR _ CHILD _ INDEX ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdisplay No Data State () Ġ{ ĊĠĠĠĠĠĠĠ ĠerrorMessage Text . text Ġ= ĠgetString ( R . string . forecast _ retrie val _ no _ data _ message ) ĊĠĠĠĠĠĠĠ Ġview Flip per . display ed Child Ġ= ĠERROR _ CHILD _ INDEX ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate All Forecast s () Ġ{ ĊĠĠĠĠĠĠĠ Ġdays Forecast List . adapter . notify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdisplay Load Forecast s Error With Retry ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation : ĠSt icky Continuation < Error Dialog Response >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplace : ĠString ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġdialog : ĠAlertDialog ĊĊĠĠĠĠĠĠĠ Ġdialog Ġ= ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . forecast _ retrie val _ error _ dialog _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( place Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . forecast _ retrie val _ error _ dialog _ message _ with _ retry , Ġplace ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . forecast _ retrie val _ error _ message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( R . string . retry _ dialog _ button , Ġ{ Ġdialog Interface : ĠDialog Interface , Ġ_: ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Interface . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( RETRY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( R . string . cancel _ dialog _ button , Ġ{ Ġdialog Interface : ĠDialog Interface , Ġ_: ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Interface . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( CANCEL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setOn Cancel Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( CANCEL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setOn Dismiss Listener Ġ{ Ġopen Dialog s . remove ( dialog ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĊĠĠĠĠĠĠĠ Ġopen Dialog s . add ( dialog ) ĊĊĠĠĠĠĠĠĠ Ġdialog . show () ĊĠĠĠ Ġ} Ċ } Ċ