package Ġcom . guru . compose cookbook . ui . utils Ċ Ċ import Ġandroidx . paging . Paging Source Ċ import Ġandroidx . paging . Paging State Ċ import Ġretrofit 2 . HttpException Ċ import Ġjava . io . EOF Exception Ċ import Ġjava . io . IOException Ċ Ċ class ĠPage Num Source < Value Ġ: ĠAny >( private Ġval Ġload Page : Ġsuspend Ġ( pageNum : ĠInt , ĠpageSize : ĠInt ) Ġ-> ĠList < Value > ?) Ġ: ĊĠĠĠ ĠP aging Source < Int , ĠValue >() Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġload ( params : ĠLoad Params < Int >): ĠLoad Result < Int , ĠValue > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage Ġ= Ġparams . key Ġ?: Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// èİ·åıĸ ç½ĳç»ľ æķ°æį® ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġload Page ( page , Ġparams . load Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠLoad Result . Error ( EOF Exception (" No Ġmore Ġdata ! ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Result . Page ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// éľĢè¦ģ åĬłè½½ çļĦæķ°æį® ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġresult , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¦Ĥæŀľ åı¯ä»¥ å¾Ģ ä¸Ĭ åĬłè½½ æĽ´å¤ļ å°± è®¾ç½® è¯¥ åıĤæķ° ï¼Į åĲ¦åĪĻ ä¸į è®¾ç½® ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Key Ġ= Ġif Ġ( page Ġ== Ġ 1 ) Ġnull Ġelse Ġpage Ġ- Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// åĬłè½½ ä¸ĭ ä¸Ģ é¡µ çļĦ key Ġå¦Ĥæŀľ ä¼ł null å°± è¯´æĺİ åĪ° åºķ äºĨ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Key Ġ= Ġpage . plus ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIOException Ġfor Ġnetwork Ġfailures . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLoad Result . Error ( e ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠHttp Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHttp Exception Ġfor Ġany Ġnon - 2 xx ĠHTTP Ġstatus Ġcodes . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLoad Result . Error ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Refresh Key ( state : ĠP aging State < Int , ĠValue >): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTry Ġto Ġfind Ġthe Ġpage Ġkey Ġof Ġthe Ġclosest Ġpage Ġto Ġanchor Position , Ġfrom ĊĠĠĠĠĠĠĠ Ġ// Ġeither Ġthe Ġprev Key Ġor Ġthe Ġnext Key , Ġbut Ġyou Ġneed Ġto Ġhandle Ġnull ability ĊĠĠĠĠĠĠĠ Ġ// Ġhere : ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ* Ġprev Key Ġ== Ġnull Ġ-> Ġanchor Page Ġis Ġthe Ġfirst Ġpage . ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ* Ġnext Key Ġ== Ġnull Ġ-> Ġanchor Page Ġis Ġthe Ġlast Ġpage . ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ* Ġboth Ġprev Key Ġand Ġnext Key Ġnull Ġ-> Ġanchor Page Ġis Ġthe Ġinitial Ġpage , Ġso ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġjust Ġreturn Ġnull . ĊĠĠĠĠĠĠĠ Ġreturn Ġstate . anchor Position ?. let Ġ{ Ġanchor Position Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanchor Page Ġ= Ġstate . closest Page To Position ( anchor Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanchor Page ?. prev Key ?. plus ( 1 ) Ġ?: Ġanchor Page ?. next Key ?. minus ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }