package Ġcom . tom cl aw . n imp as . screen . form Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġcom . av ito . kon veyor . adapter . Adapter Presenter Ċ import Ġcom . av ito . kon veyor . data _ source . List DataSource Ċ import Ġcom . tom cl aw . n imp as . screen . form . adapter . Form Event Ċ import Ġcom . tom cl aw . n imp as . screen . form . adapter . Form Item Ċ import Ġcom . tom cl aw . n imp as . screen . form . converter . Field Converter Ċ import Ġcom . tom cl aw . n imp as . screen . form . converter . Template Converter Ċ import Ġcom . tom cl aw . n imp as . screen . form . plugin . Form Plugin Ċ import Ġcom . tom cl aw . n imp as . templates . Template Ċ import Ġcom . tom cl aw . n imp as . util . Schedulers Factory Ċ import Ġdagger . Lazy Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . rx kotlin . plus Assign ĊĊ Ċ interface ĠForm Presenter Ġ{ ĊĊĠĠĠ Ġfun Ġattach View ( view : ĠForm View ) ĊĊĠĠĠ Ġfun Ġdetach View () ĊĊĠĠĠ Ġfun Ġattach Router ( router : ĠForm Router ) ĊĊĠĠĠ Ġfun Ġdetach Router () ĊĊĠĠĠ Ġfun Ġsave State (): ĠBundle ĊĊĠĠĠ Ġfun Ġon Back Pressed () ĊĊĠĠĠ Ġinterface ĠForm Router Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġleave Screen ( changed : ĠBoolean ) ĊĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ @ Suppress (" Sus pic ious Collection Re assignment ") Ċ class ĠForm Presenter Impl ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtemplate Id : ĠLong , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfields : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġinter actor : ĠForm Interactor , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġadapter Presenter : ĠLazy < Adapter Presenter >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtemplate Converter : ĠTemplate Converter , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfield Converter : ĠField Converter , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġevents : ĠObservable < Form Event >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġplugins : ĠSet < Form Plugin >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġs chedulers : ĠS chedulers Factory , ĊĠĠĠĠĠĠĠ Ġstate : ĠBundle ? Ċ ) Ġ: ĠForm Presenter Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġview : ĠForm View ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġrouter : ĠForm Presenter . Form Router ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġsubscriptions Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġprivate Ġvar Ġnavigation : ĠSet < Long > Ġ= Ġstate ?. getLong Array ( KEY _ NAV IG ATION )?. to Mutable Set () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġmutable Set Of ( template Id ) ĊĠĠĠ Ġprivate Ġvar Ġtemplate : ĠTemplate ? Ġ= Ġstate ?. get Parcelable ( KEY _ TEMPLATE ) ĊĠĠĠ Ġprivate Ġvar Ġitems : ĠList < Form Item >? Ġ= Ġstate ?. get Parcelable ArrayList ( KEY _ ITEMS ) ĊĊĠĠĠ Ġoverride Ġfun Ġattach View ( view : ĠForm View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . view Ġ= Ġview ĊĊĠĠĠĠĠĠĠ Ġsubscriptions Ġ+= Ġview . navigation Click s (). subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Back Pressed () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsubscriptions Ġ+= Ġevents . subscribe Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠForm Event . Action Clicked Ġ-> Ġnavigate ( event . item . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠForm Event . Button Clicked Ġ-> Ġexecute ( event . item . action ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġitems ?. let Ġ{ Ġon Ready ( it ) Ġ} Ġ?: Ġload Template () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnavigate ( id : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnavigation Ġ+= Ġid ĊĠĠĠĠĠĠĠ Ġload Template () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute ( action : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġplugins . filter Ġ{ Ġit . action Ġ== Ġaction Ġ}. forEach Ġ{ Ġrun Plugin Operation ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun Plugin Operation ( plugin : ĠForm Plugin ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= Ġtemplate Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġitems Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġsubscriptions Ġ+= Ġplugin . operation ( template , Ġitems ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( schedul ers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Subscribe Ġ{ Ġview ?. show Progress () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do After Terminate Ġ{ Ġview ?. show Content () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġon Completed () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠonError ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdetach View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsubscriptions . clear () ĊĠĠĠĠĠĠĠ Ġthis . view Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġattach Router ( router : ĠForm Presenter . Form Router ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . router Ġ= Ġrouter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdetach Router () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . router Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsave State () Ġ= ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġput Long Array ( KEY _ NAV IG ATION , Ġnavigation . to Long Array ()) ĊĠĠĠĠĠĠĠ Ġput Parcelable ( KEY _ TEMPLATE , Ġtemplate ) ĊĠĠĠĠĠĠĠ Ġput Parcelable ArrayList ( KEY _ ITEMS , Ġitems ?. let Ġ{ ĠArrayList ( items . or Empty ()) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Template () Ġ{ ĊĠĠĠĠĠĠĠ Ġsubscriptions Ġ+= Ġinter actor . get Template ( navigation . last ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( schedul ers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Subscribe Ġ{ Ġview ?. show Progress () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do After Terminate Ġ{ Ġview ?. show Content () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġon Loaded ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠonError ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Loaded ( template : ĠTemplate ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . template Ġ= Ġtemplate ĊĠĠĠĠĠĠĠ Ġsubscriptions Ġ+= ĠSingle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create < List < Form Item >> Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Ġ== Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( IllegalStateException (" Template Ġnot Ġfound ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ create ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate . nested Ġ!= Ġnull Ġ-> Ġtemplate . nested . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġtemplate Converter . convert ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate . fields Ġ!= Ġnull Ġ-> Ġtemplate . fields . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġfield Converter . convert ( it , Ġfields ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( IllegalStateException (" Template Ġhas Ġno Ġneither Ġnested Ġitems Ġnor Ġfields ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ create ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . on Success ( items ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( schedul ers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( schedul ers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġon Ready ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠonError ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Ready ( items : ĠList < Form Item >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . items Ġ= Ġitems ĊĠĠĠĠĠĠĠ Ġval ĠdataSource Ġ= ĠList DataSource ( items ) ĊĠĠĠĠĠĠĠ Ġadapter Presenter . get (). on DataSource Changed ( dataSource ) ĊĠĠĠĠĠĠĠ Ġview ?. content Updated () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Completed () Ġ{ ĊĠĠĠĠĠĠĠ Ġrouter ?. leave Screen ( changed Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonError ( it : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow Ġit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġnavigation Ġ-= Ġnavigation . last () ĊĠĠĠĠĠĠĠ Ġif Ġ( navigation . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Template () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrouter ?. leave Screen ( changed Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget GroupId () Ġ= Ġnavigation . last OrNull () Ġ?: ĠID _ ROOT Ċ Ċ } Ċ Ċ private Ġconst Ġval ĠKEY _ NAV IG ATION Ġ= Ġ" navigation " Ċ private Ġconst Ġval ĠKEY _ TEMPLATE Ġ= Ġ" template " Ċ private Ġconst Ġval ĠKEY _ ITEMS Ġ= Ġ" items " Ċ