/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 Ġvm ad al in . com Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . step ango . block me . feature . characters . list . impl . data . datasource Ċ Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . paging . Page Key ed DataSource Ċ import Ġcom . step ango . block me . core . network . library . Network State Ċ import Ġcom . step ango . block me . feature . characters . core . api . domain . repository . Mar vel Repository Ċ import Ġcom . step ango . block me . feature . characters . list . impl . data . mapper . Character Item Mapper Ċ import Ġcom . step ango . block me . feature . characters . list . api . domain . model . I Character Item Ċ import Ġkotlinx . coroutines . Coroutine ExceptionHandler Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjavax . inject . Inject Ċ Ċ const Ġval ĠPAGE _ INIT _ ELEMENT S Ġ= Ġ 0 Ċ const Ġval ĠPAGE _ MAX _ ELEMENT S Ġ= Ġ 5 0 Ċ Ċ /** Ċ Ġ* ĠIncrement al Ġdata Ġloader Ġfor Ġpage - keyed Ġcontent , Ġwhere Ġrequests Ġreturn Ġkeys Ġfor Ġnext / previous Ċ Ġ* Ġpages . ĠOb t aining Ġpag inated Ġthe ĠMar vel Ġcharacters . Ċ Ġ* Ċ Ġ* Ġ@ see ĠPage Key ed DataSource Ċ Ġ*/ Ċ // ĠTODO Ġhttps :// github . com / format ools / forma / issues / 4 8 Ċ // ĠRewrite Ġon Ġclean Ġversion Ġwith Ġseparate ĠRepository Ġwith Ġlocal / remote Ġdatasource Ċ open Ġclass ĠCharacter Page DataSource Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġrepository : ĠMar vel Repository , ĊĠĠĠ Ġprivate Ġval Ġmapper : ĠCharacter Item Mapper Ċ ) Ġ: ĠPage Key ed DataSource < Int , ĠI Character Item >() Ġ{ ĊĊĠĠĠ Ġval Ġnetwork State Ġ= ĠMutable LiveData < Network State >() ĊĠĠĠ Ġprivate Ġvar Ġretry : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġload Initial ( ĊĠĠĠĠĠĠĠ Ġparams : ĠLoad Initial Params < Int >, ĊĠĠĠĠĠĠĠ Ġcallback : ĠLoad Initial Callback < Int , ĠI Character Item > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnetwork State . post Value ( Network State . Loading ()) ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġhttps :// github . com / format ools / forma / issues / 4 8 ĊĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġdo Ġthat !!! ĠUsing ĠGlobal Scope Ġhere Ġonly Ġfor Ġfirst Ġworking Ġversion ĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġit Ġfrom ĠUse Case Ġand Ġcalling Ġit Ġfrom ĠView ĠModel Ġscope ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Coroutine ExceptionHandler Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġretry Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Initial ( params , Ġcallback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork State . post Value ( Network State . Error ()) ĊĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġrepository . get Characters ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= ĠPAGE _ INIT _ ELEMENT S , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= ĠPAGE _ MAX _ ELEMENT S ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġmapper . map ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Result ( data , Ġnull , ĠPAGE _ MAX _ ELEMENT S ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork State . post Value ( Network State . Success ( isEmpty Response Ġ= Ġdata . isEmpty ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAppend Ġpage Ġwith Ġthe Ġkey Ġspecified Ġby Ġ[ Load Params . key ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġparams ĠParameters Ġfor Ġthe Ġload , Ġincluding Ġthe Ġkey Ġfor Ġthe Ġnew Ġpage , Ġand Ġrequested ĊĠĠĠĠ Ġ* Ġload Ġsize . ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback ĠCallback Ġthat Ġreceives Ġloaded Ġdata . ĊĠĠĠĠ Ġ* Ġ@ see ĠPage Key ed DataSource . load After ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġload After ( ĊĠĠĠĠĠĠĠ Ġparams : ĠLoad Params < Int >, ĊĠĠĠĠĠĠĠ Ġcallback : ĠLoad Callback < Int , ĠI Character Item > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnetwork State . post Value ( Network State . Loading ( true )) ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġhttps :// github . com / format ools / forma / issues / 4 8 ĊĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġdo Ġthat !!! ĠUsing ĠGlobal Scope Ġhere Ġonly Ġfor Ġfirst Ġworking Ġversion ĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġit Ġfrom ĠUse Case Ġand Ġcalling Ġit Ġfrom ĠView ĠModel Ġscope ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Coroutine ExceptionHandler Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġretry Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload After ( params , Ġcallback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork State . post Value ( Network State . Error ( true )) ĊĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġrepository . get Characters ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġparams . key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= ĠPAGE _ MAX _ ELEMENT S ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġmapper . map ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Result ( data , Ġparams . key Ġ+ ĠPAGE _ MAX _ ELEMENT S ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork State . post Value ( Network State . Success ( true , Ġdata . isEmpty ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPre pend Ġpage Ġwith Ġthe Ġkey Ġspecified Ġby Ġ[ Load Params . key ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġparams ĠParameters Ġfor Ġthe Ġload , Ġincluding Ġthe Ġkey Ġfor Ġthe Ġnew Ġpage , Ġand Ġrequested ĊĠĠĠĠ Ġ* Ġload Ġsize . ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback ĠCallback Ġthat Ġreceives Ġloaded Ġdata . ĊĠĠĠĠ Ġ* Ġ@ see ĠPage Key ed DataSource . load Before ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġload Before ( ĊĠĠĠĠĠĠĠ Ġparams : ĠLoad Params < Int >, ĊĠĠĠĠĠĠĠ Ġcallback : ĠLoad Callback < Int , ĠI Character Item > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIgnore d , Ġsince Ġwe Ġonly Ġever Ġappend Ġto Ġour Ġinitial Ġload ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠForce Ġretry Ġlast Ġfetch Ġoperation Ġin Ġcase Ġit Ġhas Ġever Ġbeen Ġpreviously Ġexecuted . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġretry () Ġ{ ĊĠĠĠĠĠĠĠ Ġretry ?. invoke () ĊĠĠĠ Ġ} Ċ } Ċ