package Ġcom . r vi anna ol ive ira . main . presentation Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġcom . r vi anna ol ive ira . base . Base ViewModel Ċ import Ġcom . r vi anna ol ive ira . base . Reporter Ċ import Ġcom . r vi anna ol ive ira . main . domain . Main Interactor Ċ import Ġcom . r vi anna ol ive ira . networking . domain . model . Item Ċ import Ġcom . r vi anna ol ive ira . networking . di . IO Scheduler Ċ import Ġcom . r vi anna ol ive ira . networking . di . Main Scheduler Ċ import Ġio . reactivex . Scheduler Ċ import Ġjavax . inject . Inject Ċ Ċ sealed Ġclass ĠItem List State ( val Ġshow Loading : ĠBoolean ) Ġ{ ĊĠĠĠ Ġobject ĠShow Success View Ġ: ĠItem List State ( false ) ĊĠĠĠ Ġobject ĠShow Error View Ġ: ĠItem List State ( false ) ĊĠĠĠ Ġobject ĠShow Loading Ġ: ĠItem List State ( true ) ĊĠĠĠ Ġobject ĠRemove Loading Ġ: ĠItem List State ( false ) ĊĠĠĠ Ġdata Ġclass ĠOpen Detail ( val Ġid Ġ: ĠString ) Ġ: ĠItem List State ( false ) Ċ } Ċ Ċ class ĠMain ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġinter actor : ĠMain Interactor , ĊĠĠĠ Ġ@ IO Scheduler Ġprivate Ġval Ġio Scheduler : ĠScheduler , ĊĠĠĠ Ġ@ Main Scheduler Ġprivate Ġval Ġmain Scheduler : ĠScheduler , ĊĠĠĠ Ġprivate Ġval Ġreporter : ĠReport er Ċ ) Ġ: ĠBase ViewModel () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġ_ state LiveData Ġ= ĠMutable LiveData < ItemList State >() ĊĠĠĠ Ġval Ġstate LiveData : ĠLive Data < ItemList State > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ state LiveData ĊĊĠĠĠ Ġprivate Ġval Ġ_ items LiveData Ġ= ĠMutable LiveData < List < Item >>() ĊĠĠĠ Ġval Ġitems LiveData : ĠLive Data < List < Item >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ items LiveData ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġload Items () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Items () Ġ{ ĊĠĠĠĠĠĠĠ Ġcomposite Disposable . clear () ĊĠĠĠĠĠĠĠ Ġcomposite Disposable . add ( inter actor . getItems () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Subscribe Ġ{ Ġ_ state LiveData . post Value ( ItemList State . Show Loading ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( io Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( main Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do Finally Ġ{ Ġ_ state LiveData . post Value ( ItemList State . Remove Loading ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ state LiveData . value Ġ= ĠItem List State . Show Success View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ items LiveData . value Ġ= Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ state LiveData . value Ġ= ĠItem List State . Show Error View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . log Error ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Last Item Visible ( last Item Visible : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġitems LiveData . value ?. size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take If Ġ{ Ġlast Item Visible Ġ== Ġit Ġ- Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ items LiveData . value Ġ= Ġinter actor . getItem Offset (_ items LiveData . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġopen Detail ( id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ state LiveData . value Ġ= ĠItem List State . Open Detail ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġretry () Ġ{ ĊĠĠĠĠĠĠĠ Ġload Items () ĊĠĠĠ Ġ} Ċ }