/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 . example . android . code labs . paging . data Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . paging . Experimental Paging Api Ċ import Ġandroidx . paging . Load Type Ċ import Ġandroidx . paging . Paging State Ċ import Ġandroidx . paging . Remote Mediator Ċ import Ġandroidx . room . with Transaction Ċ import Ġcom . example . android . code labs . paging . api . Tw itch Service Ċ import Ġcom . example . android . code labs . paging . db . Remote Keys Ċ import Ġcom . example . android . code labs . paging . db . Tw itch Database Ċ import Ġcom . example . android . code labs . paging . model . Tw itch Item Ċ import Ġretrofit 2 . HttpException Ċ import Ġjava . io . IOException Ċ Ċ // ĠGitHub Ġpage ĠAPI Ġis Ġ 1 Ġbased : Ġhttps :// developer . github . com / v 3 /# pagination Ċ private Ġconst Ġval ĠG ITHUB _ START ING _ PAGE _ INDEX Ġ= Ġ 0 Ċ Ċ @ Opt In ( Experimental Paging Api :: class ) Ċ class ĠGithub Remote Mediator ( ĊĠĠĠ Ġprivate Ġval Ġservice : ĠTw itch Service , ĊĠĠĠ Ġprivate Ġval Ġtw itch Database : ĠTw itch Database Ċ ) Ġ: ĠRemote Mediator < Int , ĠTw itch Item >() Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġinitialize (): ĠInitialize Action Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠInitialize Action . LA UNCH _ INITIAL _ REFRESH ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġload ( load Type : ĠLoad Type , Ġstate : ĠP aging State < Int , ĠTw itch Item >): ĠMed iator Result Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġtw itch Cur s ors Ġ: ĠMutable List < String > Ġ= Ġarray ListOf ("", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ey Jz I joy MS wi ZCI 6 Z mF sc 2 Us In Qi OnR yd WV 9 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ey Jz Ijo 0 MS wi ZCI 6 Z mF sc 2 Us In Qi OnR yd WV 9 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ey Jz Ijo 2 MS wi ZCI 6 Z mF sc 2 Us In Qi OnR yd WV 9 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ey Jz Ijo 4 MS wi ZCI 6 Z mF sc 2 Us In Qi OnR yd WV 9 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ey Jz Ij ox M DE s Im Qi Om Zhb HN l LCJ 0 I jp 0 cn V lf Q ==", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ey Jz Ij ox Mj Es Im Qi Om Zhb HN l LCJ 0 I jp 0 cn V lf Q ==", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ey Jz Ij ox N DE s Im Qi Om Zhb HN l LCJ 0 I jp 0 cn V lf Q ==" ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpage Ġ= Ġwhen Ġ( load Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Type . REFRESH Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremote Keys Ġ= Ġget Remote Key Closest To Current Position ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremote Keys ?. next Key ?. minus ( 1 ) Ġ?: ĠG ITHUB _ START ING _ PAGE _ INDEX ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Type . PRE PEND Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremote Keys Ġ= Ġget Remote Key For First Item ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Key Ġ= Ġremote Keys ?. prev Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev Key Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMed iator Result . Success ( end Of Pagination Reached Ġ= Ġremote Keys Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Type . APPEND Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremote Keys Ġ= Ġget Remote Key For Last Item ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Key Ġ= Ġremote Keys ?. next Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Key Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMed iator Result . Success ( end Of Pagination Reached Ġ= Ġremote Keys Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi Response Ġ= Ġservice . search Repos ( if ( page Ġ< Ġ 7 ) Ġtw itch Cur s ors [ page ] Ġelse Ġtw itch Cur s ors [ 6 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtw itch _ items Ġ= Ġapi Response . data ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" RESULTS ĠOBJECT :", Ġtw itch _ items . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" P AG INATION ĠOBJECT :", Ġapi Response . pagination . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" CURRENT ĠPAGE ", Ġpage . toString ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Of Pagination Reached Ġ= Ġtw itch _ items . isEmpty () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw itch Database . with Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( load Type Ġ== ĠLoad Type . REFRESH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtw itch Database . remote Keys Dao (). clear Remote Keys () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtw itch Database . repos Dao (). clear Repos () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Key Ġ= Ġif Ġ( page Ġ== ĠG ITHUB _ START ING _ PAGE _ INDEX ) Ġnull Ġelse Ġpage Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Key Ġ= Ġif Ġ( end Of Pagination Reached ) Ġnull Ġelse Ġpage Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġtw itch _ items . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Keys ( repo Id Ġ= Ġit . id , Ġprev Key Ġ= Ġprev Key , Ġnext Key Ġ= Ġnext Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtw itch Database . remote Keys Dao (). insert All ( keys ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtw itch Database . repos Dao (). insert All ( twitch _ items ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMed iator Result . Success ( end Of Pagination Reached Ġ= Ġend Of Pagination Reached ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMed iator Result . Error ( exception ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠHttp Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMed iator Result . Error ( exception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Remote Key For Last Item ( state : ĠP aging State < Int , ĠTw itch Item >): ĠRemote Keys ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstate . pages . last OrNull () Ġ{ Ġit . data . isNotEmpty () Ġ} ?. data ?. last OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġrepo Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtw itch Database . remote Keys Dao (). remote Keys Repo Id ( repo . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Remote Key For First Item ( state : ĠP aging State < Int , ĠTw itch Item >): ĠRemote Keys ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstate . pages . first OrNull Ġ{ Ġit . data . isNotEmpty () Ġ} ?. data ?. first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġrepo Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtw itch Database . remote Keys Dao (). remote Keys Repo Id ( repo . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Remote Key Closest To Current Position ( ĊĠĠĠĠĠĠĠ Ġstate : ĠP aging State < Int , ĠTw itch Item > ĊĠĠĠ Ġ): ĠRemote Keys ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstate . anchor Position ?. let Ġ{ Ġposition Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . closest Item To Position ( position )?. id ?. let Ġ{ Ġrepo Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtw itch Database . remote Keys Dao (). remote Keys Repo Id ( repo Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ