package Ġcom . de mod o ce bo . test . data . repositories Ċ Ċ import Ġcom . de mod o ce bo . test . data . api . Do ce bo Demo Api Datasource Ċ import Ġcom . de mod o ce bo . test . data . api . models . Item Ċ import Ġcom . de mod o ce bo . test . ui . view . catalog . Sort Type Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . subjects . Behavior Subject Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton ĊĊ Ċ @ Singleton Ċ class ĠCatalog Repository Ġ@ Inject Ġconstructor ( do ce bo Demo Api : ĠDo ce bo Demo Api Datasource ){ ĊĊĠĠĠ Ġprivate Ġvar Ġm Do ce bo Demo Api Ġ: ĠDo ce bo Demo Api Datasource Ġ= Ġdo ce bo Demo Api ĊĊĠĠĠ Ġprivate Ġvar Ġtype : ĠBehavior Subject < String > Ġ= ĠBehavior Subject . create () ĊĠĠĠ Ġprivate Ġvar Ġname : ĠBehavior Subject < String > Ġ= ĠBehavior Subject . create () ĊĊĠĠĠ Ġprivate Ġvar Ġcount : ĠBehavior Subject < Int > Ġ= ĠBehavior Subject . create Default ( 0 ) ĊĠĠĠ Ġprivate Ġvar Ġpage : ĠBehavior Subject < Int > Ġ= ĠBehavior Subject . create Default ( 0 ) ĊĠĠĠ Ġprivate Ġvar Ġhas More Data : ĠBehavior Subject < Boolean > Ġ= ĠBehavior Subject . create Default ( true ) ĊĠĠĠ Ġprivate Ġvar Ġsort Type : ĠBehavior Subject < Sort Type > Ġ= ĠBehavior Subject . create Default ( Sort Type . NONE ) ĊĊĠĠĠ Ġinternal Ġvar Ġm Items Cached Ġ= Ġmutable ListOf < Item >() ĊĊĊĠĠĠ Ġfun Ġsave Search Par ames ( name : ĠString , Ġtype : ĠString ): ĠObservable < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObservable . from Callable Ġ{ Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġthis . count . onNext ( 0 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġthis . page . onNext ( 0 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġthis . hasMore Data . onNext ( true ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġthis . m Items Cached . clear () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġthis . type . onNext ( type ) Ġ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġthis . name . onNext ( name ) Ġ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfetch Catalog Items ( sort Type : ĠSort Type ): ĠObservable < Pair < Int , ĠList < Item >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObservable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. defer { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( this . sort Type . value Ġ!= Ġsort Type ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . from Callable Ġ{ Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġthis . count . onNext ( 0 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġthis . page . onNext ( 0 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġthis . hasMore Data . onNext ( true ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġthis . m Items Cached . clear () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġthis . sort Type . onNext ( sort Type ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch Map { call Catalog Api ( this . page . value Ġ?: Ġ 0 )} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( hasMore Data . value Ġ== Ġtrue ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġp Ġ= Ġthis . page . value ?. plus ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Catalog Api ( p Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . from Callable Ġ{ ĠPair ( count . value Ġ?: Ġ 0 , ĠArrayList < Item >()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcall Catalog Api ( p : ĠInt ) Ġ: ĠObservable < Pair < Int , ĠList < Item >> >{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Do ce bo Demo Api . catalog ( name . value Ġ?: Ġ"", Ġtype . value Ġ?: Ġ" all ", Ġp Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġthis . page . onNext ( it . data . current _ page ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġthis . count . onNext ( it . data . total _ count ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġthis . hasMore Data . onNext ( it . data . has _ more _ data ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġcatalog Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( this . sort Type . value ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSort Type . ASC Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlist Ġ= Ġcatalog . data . items . to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsorted List Ġ= Ġlist . sorted With ( compare By Ġ{ Ġit . item _ name Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( catalog . data . total _ count , Ġsorted List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSort Type . DESC Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlist Ġ= Ġcatalog . data . items . to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . sort With ( Comparator Ġ{ Ġo 1 , Ġo 2 Ġ-> Ġo 1 . item _ name . compareTo ( o 2 . item _ name )}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsorted List Ġ= Ġlist . sorted With ( compare By Descending Ġ{ Ġit . item _ name Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( catalog . data . total _ count , Ġsorted List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠPair ( catalog . data . total _ count , Ġcatalog . data . items ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġthis . m Items Cached . addAll ( it . second ) Ġ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ