package Ġcom . blank . github user . ui . search . source Ċ Ċ import Ġandroidx . paging . rx java 2 . Rx Paging Source Ċ import Ġcom . blank . github user . data . model . Search Users Response Ċ import Ġcom . blank . github user . data . model . User Ċ import Ġcom . blank . github user . data . repository . Github Repository Ċ import Ġcom . blank . github user . ui . search . Search ViewModel . Companion . NETWORK _ PAGE _ SIZE Ċ import Ġcom . blank . github user . utils . ERROR _ NO CONNECTION Ċ import Ġcom . blank . github user . utils . Network Helper Ċ import Ġio . reactivex . Single Ċ Ċ private Ġconst Ġval ĠUSER _ START ING _ PAGE _ INDEX Ġ= Ġ 1 Ċ Ċ class ĠSearch Source ( ĊĠĠĠ Ġprivate Ġval Ġgithub Repository : ĠGithub Repository , ĊĠĠĠ Ġprivate Ġval Ġnetwork Helper : ĠNetwork Helper , ĊĠĠĠ Ġprivate Ġval Ġq : ĠString Ċ ) Ġ: ĠRx Paging Source < Int , ĠUser >() Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġincomplete Result Ġ= Ġtrue ĊĠĠĠ Ġoverride Ġfun Ġload Single ( params : ĠLoad Params < Int >): ĠSingle < Load Result < Int , ĠUser >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġparams . key Ġ?: ĠUSER _ START ING _ PAGE _ INDEX ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( network Helper . is Network Connected ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġgithub Repository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Search Users ( q , Ġposition , ĠNET WORK _ PAGE _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġset Incomplete Result ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Iterable Ġ{ Ġit . items Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgithub Repository . fetch User By Username ( it . login ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Observable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġto Load Result ( it , Ġposition ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Return Ġ{ ĠLoad Result . Error ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> ĠSingle . just ( Load Result . Error ( Throwable ( ERROR _ NO CONNECTION ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Incomplete Result ( search Users Response : ĠSearch Users Response ): ĠSearch Users Response Ġ{ ĊĠĠĠĠĠĠĠ Ġincomplete Result Ġ= Ġsearch Users Response . in complete Results ĊĠĠĠĠĠĠĠ Ġreturn Ġsearch Users Response ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto Load Result ( ĊĠĠĠĠĠĠĠ Ġdata : ĠList < User >, ĊĠĠĠĠĠĠĠ Ġposition : ĠInt ĊĠĠĠ Ġ): ĠLoad Result < Int , ĠUser > Ġ= ĠLoad Result . Page ( ĊĠĠĠĠĠĠĠ Ġdata Ġ= Ġdata , ĊĠĠĠĠĠĠĠ Ġprev Key Ġ= Ġif Ġ( position Ġ== ĠUSER _ START ING _ PAGE _ INDEX ) Ġnull Ġelse Ġposition , ĊĠĠĠĠĠĠĠ Ġnext Key Ġ= Ġif Ġ( data . isEmpty () Ġ|| Ġ! in complete Result ) Ġnull Ġelse Ġposition . plus ( 1 ) ĊĠĠĠ Ġ) Ċ }