package Ġorg . step ic . d roid . core . present ers Ċ Ċ import Ġandroid . content . Context Ċ import Ġio . reactivex . Back pressure Strategy Ċ import Ġio . reactivex . Scheduler Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . functions . Bi Function Ċ import Ġio . reactivex . rx kotlin . Sing les . zip Ċ import Ġio . reactivex . rx kotlin . plus Assign Ċ import Ġio . reactivex . rx kotlin . subscribe By Ċ import Ġio . reactivex . subjects . Publish Subject Ċ import Ġorg . step ic . d roid . adaptive . ui . adapters . Adaptive Rating Adapter Ċ import Ġorg . step ic . d roid . adaptive . util . Rating Names Generator Ċ import Ġorg . step ic . d roid . core . present ers . contracts . Adaptive Rating View Ċ import Ġorg . step ic . d roid . di . qual ifiers . Background Scheduler Ċ import Ġorg . step ic . d roid . di . qual ifiers . Course Id Ċ import Ġorg . step ic . d roid . di . qual ifiers . Main Scheduler Ċ import Ġorg . step ic . d roid . preferences . Shared Preference Helper Ċ import Ġorg . step ik . android . domain . rating . repository . Rating Repository Ċ import Ġorg . step ik . android . domain . user . repository . UserRepository Ċ import Ġorg . step ik . android . model . adaptive . Rating Item Ċ import Ġretrofit 2 . HttpException Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠAdapt ive Rating Presenter Ċ @ Inject Ċ constructor ( ĊĠĠĠ Ġ@ Course Id ĊĠĠĠ Ġprivate Ġval Ġcourse Id : ĠLong , ĊĠĠĠ Ġprivate Ġval Ġrating Repository : ĠRating Repository , ĊĠĠĠ Ġ@ Background Scheduler ĊĠĠĠ Ġprivate Ġval Ġbackground Scheduler : ĠScheduler , ĊĠĠĠ Ġ@ Main Scheduler ĊĠĠĠ Ġprivate Ġval Ġmain Scheduler : ĠScheduler , ĊĠĠĠ Ġprivate Ġval Ġrating Names Generator : ĠRating Names Generator , ĊĠĠĠ Ġprivate Ġval Ġuser Repository : ĠUser Repository , ĊĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġshared Preference Helper : ĠShared Preference Helper Ċ ) Ġ: ĠPres enter Base < Adaptive Rating View >() Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠITE MS _ PER _ PAGE Ġ= Ġ 1 0 ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠR ATING _ PER IO DS Ġ= ĠarrayOf ( 1 , Ġ 7 , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġadapters Ġ= ĠR ATING _ PER IO DS . map Ġ{ ĠAdapt ive Rating Adapter ( context , Ġshared Preference Helper ) Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcomposite Disposable Ġ= ĠComposite Disposable () ĊĠĠĠ Ġprivate Ġval Ġretry Subject Ġ= ĠPublish Subject . create < Int >() ĊĊĠĠĠ Ġprivate Ġvar Ġerror : ĠThrowable ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġrating Period Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġperiods Loaded Ġ= Ġ 0 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Rating Periods () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Rating Periods () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= ĠBi Function < Any , ĠAny , ĠAny > Ġ{ Ġa , Ġ_ Ġ-> Ġa } ĊĊĠĠĠĠĠĠĠ ĠR ATING _ PER IO DS . forEach Indexed Ġ{ Ġpos , Ġperiod Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomposite Disposable Ġ+= Ġresolve Users ( rating Repository . get Rating ( course Id , ĠITE MS _ PER _ PAGE , Ġperiod )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( background Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( main Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do OnError ( this :: onError ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. retry When Ġ{ Ġx Ġ-> Ġx . zip With ( retry Subject . to Flow able ( Back pressure Strategy . BUFFER ), Ġleft ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe By ( this :: onError ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapters [ pos ]. set ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperiods Loaded ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonLoad Complete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresolve Users ( single : ĠSingle < List < Rating Item >> ): ĠSingle < List < Rating Item >> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsingle . flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ids Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter ( Rating Item :: isNot Fake ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map ( Rating Item :: user ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip ( user Repository . get Users ( user Ids ), ĠSingle . just ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġ( users , Ġitems ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . map Indexed Ġ{ Ġindex , Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġusers . find Ġ{ Ġit . id Ġ== Ġitem . user Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġuser ?. fullName Ġ?: Ġrating Names Generator . getName ( item . user ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrank Ġ= Ġif Ġ( item . rank Ġ== Ġ 0 ) Ġindex Ġ+ Ġ 1 Ġelse Ġitem . rank , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġchange Rating Period ( pos : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . rating Period Ġ= Ġpos ĊĠĠĠĠĠĠĠ Ġview ?. on Rating Adapter ( adapters [ pos ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġattach View ( view : ĠAdapt ive Rating View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . attach View ( view ) ĊĊĠĠĠĠĠĠĠ Ġview . on Rating Adapter ( adapters [ rating Period ]) ĊĠĠĠĠĠĠĠ Ġview . on Loading () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ?. let Ġ{ ĠonError ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonLoad Complete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonLoad Complete () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( periods Loaded Ġ== ĠR ATING _ PER IO DS . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. onComplete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonError ( throwable : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġerror Ġ= Ġthrowable ĊĠĠĠĠĠĠĠ Ġif Ġ( throwable Ġis ĠHttp Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. on Request Error () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. on Connectivity Error () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġretry () Ġ{ ĊĠĠĠĠĠĠĠ Ġerror Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġretry Subject . onNext ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdestroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġcomposite Disposable . dispose () ĊĠĠĠ Ġ} Ċ }