package Ġ` in `. ob vious . android . starter . login Ċ Ċ import Ġ` in `. ob vious . android . starter . login . Input ValidationError . Password Blank Ċ import Ġ` in `. ob vious . android . starter . login . Input ValidationError . Username Blank Ċ import Ġ` in `. ob vious . android . starter . login . database . Saving User Ċ import Ġ` in `. ob vious . android . starter . login . database . User Dao Ċ import Ġ` in `. ob vious . android . starter . login . http . HttpException Ċ import Ġ` in `. ob vious . android . starter . login . http . Login ApiService Ċ import Ġcom . spotify . mob ius . Connect able Ċ import Ġcom . spotify . mob ius . Connection Ċ import Ġcom . spotify . mob ius . functions . Consumer Ċ import Ġjava . io . IOException ĊĊ Ċ class ĠLogin Effect Handler ( ĊĠĠĠ Ġprivate Ġval Ġlogin ApiService : ĠLogin ApiService , ĊĠĠĠ Ġprivate Ġval Ġuser Dao : ĠUser Dao , ĊĠĠĠ Ġprivate Ġval Ġui Actions : ĠUi Actions Ċ ) Ġ: ĠConnect able < Login Effect , ĠLogin Event > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġconnect ( ĊĠĠĠĠĠĠĠ Ġevents : ĠConsumer < Login Event > ĊĠĠĠ Ġ): ĠConnection < Login Effect > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠConnection < Login Effect > Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġaccept ( effect : ĠLogin Effect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( effect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠValidate Input Ġ-> Ġvalidate Input ( effect , Ġevents ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLog In Ġ-> Ġlogin API ( effect , Ġevents ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSave User Ġ-> Ġsave Username ( effect , Ġevents ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠGo Home Ġ-> Ġui Actions . navigate To Home Screen () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNothing Ġto Ġdo Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Username ( effect : ĠSave User , Ġevents : ĠConsumer < Login Event >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġusername Ġ= Ġeffect . username ĊĊĠĠĠĠĠĠĠ Ġuser Dao . insert User ( Saving User ( 0 , Ġusername Ġ= Ġusername , Ġauth Token Ġ= Ġeffect . auth Token )) ĊĊĠĠĠĠĠĠĠ Ġevents . accept ( User Saved ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlogin API ( effect : ĠLog In , Ġevents : ĠConsumer < Login Event >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġusername Ġ= Ġeffect . username ĊĠĠĠĠĠĠĠ Ġval Ġpassword Ġ= Ġeffect . password ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġlogin ApiService . login ( username , Ġpassword ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents . accept ( Login Succeeded ( response . auth Token )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠHttp Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents . accept ( Incorrect Credentials Entered ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents . accept ( Request Failed With Network Error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Input ( ĊĠĠĠĠĠĠĠ Ġeffect : ĠValidate Input , ĊĠĠĠĠĠĠĠ Ġevents : ĠConsumer < Login Event > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġusername Ġ= Ġeffect . username ĊĠĠĠĠĠĠĠ Ġval Ġpassword Ġ= Ġeffect . password ĊĊĠĠĠĠĠĠĠ Ġval Ġvalidation Errors Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusername . isBlank () Ġ&& Ġpassword . isBlank () Ġ-> Ġset Of ( Username Blank , ĠPassword Blank ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusername . isBlank () Ġ-> Ġset Of ( Username Blank ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpassword . isBlank () Ġ-> Ġset Of ( Password Blank ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġempty Set () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġvalidation Event Ġ= Ġif Ġ( validation Errors . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠValidation Succeeded ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠValidation Failed ( validation Errors ) ĊĊĠĠĠĠĠĠĠ Ġevents . accept ( validation Event ) ĊĠĠĠ Ġ} Ċ } Ċ