package Ġtech . ro ony x . android _ starter . repository . dataSource Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . paging . Position al DataSource Ċ import Ġkotlinx . coroutines .* Ċ import Ġtech . ro ony x . android _ starter . common . Network State Ċ Ċ abstract Ġclass ĠPosition al Network State DataSource < T >( ĊĠĠĠ Ġprivate Ġval Ġcoroutine Scope : ĠCor outine Scope Ċ ) Ġ: ĠPosition al DataSource < T >() Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠinitialState Ġ= ĠMutable LiveData < Network State >() ĊĠĠĠ Ġprivate Ġval Ġloading State Ġ= ĠMutable LiveData < Network State >() ĊĊĠĠĠ Ġval ĠinitialState LiveData : ĠLive Data < Network State > Ġget () Ġ= ĠinitialState ĊĠĠĠ Ġval Ġloading State LiveData : ĠLive Data < Network State > Ġget () Ġ= Ġloading State ĊĊĠĠĠ Ġprivate Ġvar Ġretry Action : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġjob : ĠJob ? Ġ= Ġnull ĊĊĠĠĠ Ġabstract Ġsuspend Ġfun Ġfetch Data ( start At : ĠInt , Ġlimit : ĠInt ): ĠList < T > ĊĊĠĠĠ Ġoverride Ġfun Ġload Initial ( params : ĠLoad Initial Params , Ġcallback : ĠLoad Initial Callback < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġjob Ġ= Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠinitialState . post Value ( Network State . Loading ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Data ( params . requested Start Position , Ġparams . requested Load Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. fold ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinitialState . post Value ( Network State . Success ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretry Action Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Result ( it , Ġparams . requested Start Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinitialState . post Value ( Network State . Error ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretry Action Ġ= Ġ{ Ġload Initial ( params , Ġcallback ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Failure ", Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload Range ( params : ĠLoad Range Params , Ġcallback : ĠLoad Range Callback < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( params . start Position Ġ< Ġparams . load Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Result ( emptyList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġjob Ġ= Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading State . post Value ( Network State . Loading ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Data ( params . start Position , Ġparams . load Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. fold ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading State . post Value ( Network State . Success ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretry Action Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Result ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading State . post Value ( Network State . Error ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretry Action Ġ= Ġ{ Ġload Range ( params , Ġcallback ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Failure ", Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġretry Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( job ?. isActive Ġ== Ġfalse ) Ġretry Action ?. invoke () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinvalidate () Ġ{ ĊĠĠĠĠĠĠĠ Ġjob ?. cancel () ĊĠĠĠĠĠĠĠ Ġsuper . invalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Network State DataSource " ĊĠĠĠ Ġ} Ċ }