package Ġio . kor ost ens ky i . che st nut . presentation . screen . home Ċ Ċ import Ġandroidx . paging . Paging Source Ċ import Ġandroidx . paging . Paging State Ċ import Ġio . kor ost ens ky i . che st nut . domain . inter actor . Movie Interactor Ċ import Ġio . kor ost ens ky i . che st nut . domain . model . Movie Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ Ċ class ĠMovie Paging Source ( ĊĠĠĠ Ġprivate Ġval Ġmovie Interactor : ĠMovie Interactor , ĊĠĠĠ Ġprivate Ġval ĠisLoading Flow : ĠMutable State Flow < Boolean > Ċ ) Ġ: ĠP aging Source < Int , ĠMovie >() Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget Refresh Key ( state : ĠP aging State < Int , ĠMovie >): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġanchor Position Ġ= Ġstate . anchor Position Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġpage Ġ= Ġstate . closest Page To Position ( anchor Position ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġpage . prev Key ?. plus ( 1 ) Ġ?: Ġpage . next Key ?. minus ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġload ( params : ĠLoad Params < Int >): ĠLoad Result < Int , ĠMovie > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Page Ġ= Ġparams . key Ġ?: Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠisLoading Flow . emit ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage Ġ= Ġmovie Interactor . retrieve Pop ular Movies ( next Page ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠisLoading Flow . emit ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Result . Page ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġpage . movies , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Key Ġ= Ġif Ġ( next Page Ġ== Ġ 1 ) Ġnull Ġelse Ġnext Page Ġ- Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Key Ġ= Ġif Ġ( next Page Ġ== Ġpage . total Pages ) Ġnull Ġelse Ġnext Page Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Result . Error ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ