/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 Ġ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 . c ath ay bk and roi dex ercise . data Ċ Ċ // ĠGitHub Ġpage ĠAPI Ġis Ġ 1 Ġbased : Ġhttps :// developer . github . com / v 3 /# pagination Ċ Ċ import Ġcom . example . c ath ay bk and roi dex ercise . GITHUB _ START ING _ ID Ċ import Ġcom . example . c ath ay bk and roi dex ercise . PER _ PAGE _ SIZE Ċ import Ġcom . example . c ath ay bk and roi dex ercise . TOTAL _ USERS _ LIMIT Ċ import Ġcom . example . c ath ay bk and roi dex ercise . api . Github Service Ċ import Ġcom . example . c ath ay bk and roi dex ercise . model .* Ċ import Ġok io . IOException Ċ import Ġretrofit 2 . HttpException Ċ Ċ /** Ċ Ġ* ĠRepository Ġclass Ġthat Ġworks Ġwith Ġlocal Ġand Ġremote Ġdata Ġsources . Ċ Ġ*/ Ċ class ĠGithub UserList ( private Ġval Ġservice UserList : ĠGithub Service ) Ġ{ ĊĊĠĠĠ Ġ// Ġkeep Ġthe Ġlist Ġof Ġall Ġresults Ġreceived ĊĠĠĠ Ġprivate Ġval Ġin Memory Cache Ġ= Ġmutable ListOf < User >() ĊĊĠĠĠ Ġ// Ġkeep Ġthe Ġlast Ġuser Ġid . ĠWhen Ġthe Ġrequest Ġis Ġsuccessful , Ġupdate Ġthe Ġlast Ġid ĊĠĠĠ Ġprivate Ġvar Ġlast Since ID Ġ= ĠG ITHUB _ START ING _ ID ĊĊĠĠĠ Ġprivate Ġvar Ġtotal Users Count Ġ= Ġ 0 ĊĊĠĠĠ Ġ// Ġavoid Ġtriggering Ġmultiple Ġrequests Ġin Ġthe Ġsame Ġtime ĊĠĠĠ Ġprivate Ġvar Ġis Request InProgress Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSearch Ġrepositories Ġwhose Ġnames Ġmatch Ġthe Ġquery , Ġexposed Ġas Ġa Ġstream Ġof Ġdata Ġthat Ġwill Ġemit ĊĠĠĠĠ Ġ* Ġevery Ġtime Ġwe Ġget Ġmore Ġdata Ġfrom Ġthe Ġnetwork . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun ĠgetUser ListResult Stream (): ĠUser List Data Result Ġ{ ĊĊĠĠĠĠĠĠĠ Ġlast Since ID Ġ= ĠG ITHUB _ START ING _ ID ĊĠĠĠĠĠĠĠ Ġtotal Users Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġin Memory Cache . clear () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrequest And SaveData () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġrequest More (): ĠUser List Data Result Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( total Users Count Ġ>= ĠTOT AL _ USERS _ LIMIT ) Ġreturn ĠUser List Data Result . Info (" Up Ġto Ġlimit ") ĊĠĠĠĠĠĠĠ Ġif Ġ( is Request InProgress ) Ġreturn ĠUser List Data Result . Info (" Request ĠBus y ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrequest And SaveData () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġrequest And SaveData (): ĠUser List Data Result Ġ{ ĊĊĠĠĠĠĠĠĠ Ġis Request InProgress Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġresult : ĠUser List Data Result ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġservice UserList . search Users ( last Since ID , ĠPER _ PAGE _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Memory Cache . addAll ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrepos ByName Ġ= Ġsort Users ById () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Since ID Ġ= Ġrepos ByName . last (). id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Users Count Ġ= Ġrepos ByName . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠUser List Data Result . Success ( repos ByName ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠUser List Data Result . Error ( exception . message !! ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠHttp Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠUser List Data Result . Error ( exception . message !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis Request InProgress Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsort Users ById (): ĠList < User > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġfrom Ġthe Ġin Ġmemory Ġcache Ġselect Ġonly Ġthe Ġrepos Ġwhose Ġname Ġor Ġdescription Ġmatches ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġquery . ĠThen Ġorder Ġthe Ġresults . ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġemit Ġwill Ġbe Ġno Ġfunction Ġonce Ġemit Ġcache Ġwith Ġmutable List , Ġso Ġbe Ġcareful . ĊĠĠĠĠĠĠĠ Ġreturn Ġin Memory Cache . sorted With ( compare By < User > Ġ{ Ġit . id Ġ}) ĊĊĠĠĠ Ġ} Ċ } ĊĊ