/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 7 ĠF ab io ĠB erta Ċ Ġ* Ċ Ġ* Ġ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 Ġch . bert a . fab io . popular movies . features . grid . component Ċ Ċ import Ġch . bert a . fab io . popular movies . R Ċ import Ġch . bert a . fab io . popular movies . data . Get Movies Result Ċ import Ġch . bert a . fab io . popular movies . data . Movie Storage Ċ import Ġch . bert a . fab io . popular movies . data . Shared Prefs Ċ import Ġch . bert a . fab io . popular movies . features . grid . Sort Ċ import Ġch . bert a . fab io . popular movies . features . grid . Sort Option Ċ import Ġch . bert a . fab io . popular movies . features . grid . v dos . rows . Grid Row Load More ViewData Ċ import Ġch . bert a . fab io . popular movies . features . grid . v dos . rows . Grid Row Movie ViewData Ċ import Ġch . bert a . fab io . popular movies . features . grid . view . Selected Movie Ċ import Ġch . bert a . fab io . popular movies . format Long Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . rx kotlin . with Latest From Ċ Ċ type alias ĠGrid State Reducer Ġ= Ġ( Grid State ) Ġ-> ĠGrid State Ċ Ċ data Ġclass ĠPage With Sort ( val Ġpage : ĠInt , Ġval Ġsort : ĠSort ) Ċ Ċ fun Ġmodel ( ĊĠĠĠĠĠĠĠ Ġsort Options : ĠList < Sort >, ĊĠĠĠĠĠĠĠ ĠinitialState : ĠGrid State , ĊĠĠĠĠĠĠĠ Ġactions : ĠObservable < Grid Action >, ĊĠĠĠĠĠĠĠ Ġmovie Storage : ĠMovie Storage , ĊĠĠĠĠĠĠĠ Ġshared Prefs : ĠShared Prefs Ċ ): ĠObservable < Grid State > Ġ{ ĊĠĠĠ Ġval Ġsort Selections Ġ= Ġactions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. of Type ( Grid Action . Sort Selection :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . sort Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. share () ĊĊĠĠĠ Ġval Ġpage With Sort Selections Ġ= Ġactions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. of Type ( Grid Action . Load More :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Latest From ( sort Selections , Ġ{ Ġ( page ), Ġsort Ġ-> ĠPage With Sort ( page , Ġsort ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. share () ĊĊĠĠĠ Ġval Ġclear Transient Ġ= Ġactions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. of Type ( Grid Action . Transient Clear :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġclear Transient Reducer () Ġ} ĊĊĠĠĠ Ġval Ġmovies Ġ= Ġsort Selections ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġselection Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared Prefs . write Sort Pos ( sort Options . indexOf ( selection )). map Ġ{ Ġselection Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch Map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . option Ġ== ĠSort Option . SORT _ FA V OR ITE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Storage . getF av Movies (). map Ġ{ Ġmovies Reducer ( it , Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Storage . get On l Movies ( 1 , Ġit . option , Ġfalse ). map Ġ{ Ġmovies Reducer ( it , Ġfalse ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. start With ( sort Selection Reducer ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġload More Movies Ġ= Ġpage With Sort Selections . switch Map Ġ{ ĊĠĠĠĠĠĠĠ Ġmovie Storage . get On l Movies ( it . page , Ġit . sort . option , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map (:: movies On l More Reducer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start With ( load More Movies Reducer ( Grid Row Load More ViewData ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġrefresh Movies Ġ= Ġactions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. of Type ( Grid Action . Refresh Swipe :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Latest From ( page With Sort Selections , Ġ{ Ġ_, Ġp ws Ġ-> Ġp ws Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch Map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Storage . get On l Movies ( it . page , Ġit . sort . option , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġmovies Reducer ( it , Ġfalse ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start With ( refresh Movies Reducer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdelete Fav Movie Results Ġ= Ġactions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. of Type ( Grid Action . Movie Fav Deleted :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġdelete Fav Movie Result Reducer () Ġ} ĊĊĠĠĠ Ġval Ġmovie Selections Ġ= Ġactions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. of Type ( Grid Action . Movie Selection :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . selected Movie Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map (:: movie Selection Reducer ) ĊĊĠĠĠ Ġval Ġreduc ers Ġ= ĠlistOf ( clear Transient , Ġmovies , Ġload More Movies , Ġrefresh Movies , Ġdelete Fav Movie Results , Ġmovie Selections ) ĊĠĠĠ Ġreturn ĠObservable . merge ( reducers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. scan ( initialState , Ġ{ Ġstate , Ġreducer Ġ-> Ġreducer ( state ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. skip ( 1 ) Ġ// Ġskip Ġinitial Ġscan Ġemission ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct Until Changed () Ċ } Ċ Ċ private Ġfun Ġclear Transient Reducer (): ĠGrid State Reducer Ġ= Ġ{ ĊĠĠĠ Ġit . copy ( message Ġ= Ġnull , Ġselected Movie Ġ= Ġnull ) Ċ } Ċ Ċ private Ġfun Ġsort Selection Reducer ( sort : ĠSort ): ĠGrid State Reducer Ġ= Ġ{ ĊĠĠĠ Ġit . copy ( sort Ġ= Ġsort , Ġloading Ġ= Ġtrue ) Ċ } Ċ Ċ private Ġfun Ġrefresh Movies Reducer (): ĠGrid State Reducer Ġ= Ġ{ Ġit . copy ( refresh ing Ġ= Ġtrue ) Ġ} Ċ Ċ private Ġfun Ġload More Movies Reducer ( load More ViewData : ĠGrid Row Load More ViewData ): ĠGrid State Reducer Ġ= Ġ{ ĊĠĠĠ Ġit . copy ( loading More Ġ= Ġtrue , Ġmovies Ġ= Ġit . movies . plus ( load More ViewData )) Ċ } Ċ Ċ private Ġfun Ġmovies Reducer ( result : ĠGet Movies Result , Ġfrom Fav : ĠBoolean ): ĠGrid State Reducer Ġ= Ġ{ Ġstate Ġ-> ĊĠĠĠ Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠGet Movies Result . Failure Ġ-> Ġstate . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh ing Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovies Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= ĠR . string . sn ackbar _ movies _ load _ failed ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġis ĠGet Movies Result . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmovies Ġ= Ġresult . movies . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGrid Row Movie ViewData ( it . id , Ġit . title , Ġit . overview , Ġit . release Date . format Long (), Ġit . vote Average , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . poster , Ġit . backdrop , Ġfrom Fav ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovies Ġ= Ġmovies , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Ġ= Ġmovies . isEmpty (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading More Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġmovies On l More Reducer ( result : ĠGet Movies Result ): ĠGrid State Reducer Ġ= Ġ{ Ġstate Ġ-> ĊĠĠĠ Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠGet Movies Result . Failure Ġ-> Ġstate . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading More Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovies Ġ= Ġstate . movies . minus ( state . movies . last ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= ĠR . string . sn ackbar _ movies _ load _ failed ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġis ĠGet Movies Result . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmovies Ġ= Ġresult . movies . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGrid Row Movie ViewData ( it . id , Ġit . title , Ġit . overview , Ġit . release Date . format Long (), Ġit . vote Average , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . poster , Ġit . backdrop , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovies Ġ= Ġstate . movies . minus ( state . movies . last ()). plus ( movies ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading More Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġdelete Fav Movie Result Reducer (): ĠGrid State Reducer Ġ= Ġ{ ĊĠĠĠ Ġit . copy ( message Ġ= ĠR . string . sn ackbar _ movie _ removed _ from _ favorites ) Ċ } Ċ Ċ private Ġfun Ġmovie Selection Reducer ( selected Movie : ĠSelected Movie ): ĠGrid State Reducer Ġ= Ġ{ ĊĠĠĠ Ġit . copy ( selected Movie Ġ= Ġselected Movie ) Ċ } Ċ