package Ġorg . step ik . android . domain . course _ content . inter actor Ċ Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . rx kotlin . Sing les . zip Ċ import Ġorg . step ic . d roid . util . concat Ċ import Ġorg . step ic . d roid . util . get Prog resses Ċ import Ġorg . step ic . d roid . util . map To Long Array Ċ import Ġorg . step ik . android . domain . base . DataSource Type Ċ import Ġorg . step ik . android . domain . lesson . repository . Lesson Repository Ċ import Ġorg . step ik . android . domain . progress . repository . Progress Repository Ċ import Ġorg . step ik . android . domain . section . repository . Section Repository Ċ import Ġorg . step ik . android . domain . unit . repository . Unit Repository Ċ import Ġorg . step ik . android . model . Course Ċ import Ġorg . step ik . android . model . Section Ċ import Ġorg . step ik . android . model . Unit Ċ import Ġorg . step ik . android . presentation . course _ content . mapper . Course Content Item Mapper Ċ import Ġorg . step ik . android . view . course _ content . model . Course Content Item Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠCourse Content Interactor Ċ @ Inject Ċ constructor ( ĊĠĠĠ Ġprivate Ġval Ġcourse Observable Source : ĠObservable < Course >, ĊĠĠĠ Ġprivate Ġval Ġsection Repository : ĠSection Repository , ĊĠĠĠ Ġprivate Ġval Ġunit Repository : ĠUnit Repository , ĊĠĠĠ Ġprivate Ġval Ġlesson Repository : ĠLess on Repository , ĊĠĠĠ Ġprivate Ġval Ġprogress Repository : ĠProgress Repository , ĊĊĠĠĠ Ġprivate Ġval Ġcourse Content Item Mapper : ĠCourse Content Item Mapper Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġget Course Content ( should Skip Stored Value : ĠBoolean Ġ= Ġfalse ): ĠObservable < Pair < Course , ĠList < Course Content Item >>> Ġ= ĊĠĠĠĠĠĠĠ Ġcourse Observable Source ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. skip ( if Ġ( should Skip Stored Value ) Ġ 1 Ġelse Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch Map Ġ{ Ġcourse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Empty Sections ( course ) Ġconcat ĠgetContent ( course ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Empty Sections ( course : ĠCourse ): ĠObservable < Pair < Course , ĠList < Course Content Item >>> Ġ= ĊĠĠĠĠĠĠĠ ĠObservable . just ( course Ġto Ġempty List ()) ĊĊĠĠĠ Ġprivate Ġfun ĠgetContent ( course : ĠCourse ): ĠObservable < Pair < Course , ĠList < Course Content Item >>> Ġ= ĊĠĠĠĠĠĠĠ Ġget Sections Of Course ( course ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġpopulate Sections ( course , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Observable Ġ{ Ġitems Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSingle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. concat ( Single . just ( course Ġto Ġitems ), Ġload Units ( course , Ġitems )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Observable () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Sections Of Course ( course : ĠCourse ): ĠSingle < List < Section >> Ġ= ĊĠĠĠĠĠĠĠ Ġsection Repository ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Sections (* course . sections Ġ?: Ġlong ArrayOf (), Ġprimary Source Type Ġ= ĠDataSource Type . REMOTE ) ĊĊĠĠĠ Ġprivate Ġfun Ġpopulate Sections ( course : ĠCourse , Ġsections : ĠList < Section >): ĠSingle < List < Course Content Item >> Ġ= ĊĠĠĠĠĠĠĠ Ġprogress Repository ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Prog resses (* sections . get Prog resses ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġprog resses Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcourse Content Item Mapper . map Section sWith Empty Units ( course , Ġsections , Ġprog resses ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Units ( course : ĠCourse , Ġitems : ĠList < Course Content Item >): ĠSingle < Pair < Course , ĠList < Course Content Item >>> Ġ= ĊĠĠĠĠĠĠĠ ĠSingle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. just ( course Content Item Mapper . get Unit Place holders Ids ( items )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap (:: get Units ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġunits Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsection Items Ġ= Ġitems ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Course Content Item . Section Item >() ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopulate Units ( section Items , Ġunits ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġunit Items Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcourse Ġto Ġcourse Content Item Mapper . replace Unit Place holders ( items , Ġunit Items ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Units ( unit Ids : ĠLong Array ): ĠSingle < List < Unit >> Ġ= ĊĠĠĠĠĠĠĠ Ġunit Repository ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Units (* unit Ids , Ġprimary Source Type Ġ= ĠDataSource Type . REMOTE ) ĊĊĠĠĠ Ġprivate Ġfun Ġpopulate Units ( section Items : ĠList < Course Content Item . Section Item >, Ġunits : ĠList < Unit >): ĠSingle < List < Course Content Item . Unit Item >> Ġ= ĊĠĠĠĠĠĠĠ Ġzip ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Repository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Prog resses (* units . get Prog resses ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlesson Repository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Less ons (* units . map To Long Array ( Unit :: lesson ), Ġprimary Source Type Ġ= ĠDataSource Type . REMOTE ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( prog resses , Ġless ons ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcourse Content Item Mapper . map Units ( section Items , Ġunits , Ġless ons , Ġprog resses ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ }