/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* Ġ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 . kotlin coroutines . f akes Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġcom . example . android . kotlin coroutines . main . Main Network Ċ import Ġcom . example . android . kotlin coroutines . main . Title Ċ import Ġcom . example . android . kotlin coroutines . main . Title Dao Ċ import Ġkotlinx . coroutines . Comp letable Deferred Ċ import Ġkotlinx . coroutines . Timeout Cancellation Exception Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġkotlinx . coroutines . with Timeout Ċ import Ġokhttp 3 . Request Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Callback Ċ import Ġretrofit 2 . Response Ċ Ċ /** Ċ Ġ* ĠFake Ġ[ Title Dao ] Ġfor Ġuse Ġin Ġtests . Ċ Ġ*/ Ċ class ĠTitle Dao Fake ( initial Title : ĠString ) Ġ: ĠTitle Dao Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġchannel Ġis Ġa ĠCor outines Ġbased Ġimplementation Ġof Ġa Ġblocking Ġqueue . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWe 're Ġusing Ġit Ġhere Ġas Ġa Ġbuffer Ġof Ġinserted Ġelements . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġuses Ġa Ġchannel Ġinstead Ġof Ġa Ġlist Ġto Ġallow Ġmultiple Ġthreads Ġto Ġcall Ġinsert Title Ġand ĊĠĠĠĠ Ġ* Ġsynchronize Ġthe Ġresults Ġwith Ġthe Ġtest Ġthread . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġinserted For Next Ġ= ĠChannel < Title >( capacity Ġ= ĠChannel . BUFFER ED ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġinsert Title ( title : ĠTitle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinserted For Next . offer ( title ) ĊĠĠĠĠĠĠĠ Ġ_ title LiveData . value Ġ= Ġtitle ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ title LiveData Ġ= ĠMutable LiveData < Title ? >( Title ( initial Title )) ĊĊĠĠĠ Ġoverride Ġval Ġtitle LiveData : ĠLive Data < Title ?> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ title LiveData ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAssertion Ġthat Ġthe Ġnext Ġelement Ġinserted Ġhas Ġa Ġtitle Ġof Ġexpected ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġelement Ġwas Ġpreviously Ġinserted Ġand Ġis Ġcurrently Ġthe Ġmost Ġrecent Ġelement ĊĠĠĠĠ Ġ* Ġthis Ġassertion Ġwill Ġalso Ġmatch . ĠThis Ġallows Ġtests Ġto Ġavoid Ġsynchron izing Ġcalls Ġto Ġinsert ĊĠĠĠĠ Ġ* Ġwith Ġcalls Ġto Ġassert Next Insert . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġmultiple Ġitems Ġwere Ġinserted , Ġthis Ġwill Ġalways Ġmatch Ġthe Ġfirst Ġitem Ġthat Ġwas Ġnot ĊĠĠĠĠ Ġ* Ġpreviously Ġmatched . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġexpected Ġthe Ġvalue Ġto Ġmatch ĊĠĠĠĠ Ġ* Ġ@ param Ġtimeout Ġduration Ġto Ġwait Ġ( this Ġis Ġprovided Ġfor Ġinstrument ation Ġtests Ġthat Ġmay Ġrun Ġon ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmultiple Ġthreads ) ĊĠĠĠĠ Ġ* Ġ@ param Ġunit Ġtime unit ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġnext Ġvalue Ġthat Ġwas Ġinserted Ġinto Ġthis Ġdao , Ġor Ġnull Ġif Ġnone Ġfound ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnext Inserted OrNull ( timeout : ĠLong Ġ= Ġ 2 _ 0 0 0 ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwait Ġfor Ġthe Ġnext Ġinsertion Ġto Ġcomplete ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Timeout ( timeout ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġinserted For Next . receive (). title ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠTimeout Cancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠTesting ĠFake Ġimplementation Ġof ĠMain Network Ċ Ġ*/ Ċ class ĠMain Network Fake ( var Ġresult : ĠString ) Ġ: ĠMain Network Ġ{ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġfetch Next Title () Ġ= Ġresult Ġ// ĠTODO : Ġreplace Ġwith Ġ` result ` Ċ } Ċ Ċ /** Ċ Ġ* ĠTesting ĠFake Ġfor ĠMain Network Ġthat Ġlets Ġyou Ġcomplete Ġor Ġerror Ġall Ġcurrent Ġrequests Ċ Ġ*/ Ċ class ĠMain Network Comp letable Fake () Ġ: ĠMain Network Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġcomplet able Ġ= ĠComp letable Deferred < String >() ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġfetch Next Title () Ġ= Ġcomplet able . await () Ġ// ĠTODO : Ġreplace Ġwith Ġ` comp letable . await ()` ĊĊĠĠĠ Ġfun Ġsend Completion To All Current Requests ( result : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcomplet able . complete ( result ) ĊĠĠĠĠĠĠĠ Ġcomplet able Ġ= ĠComp letable Deferred () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Error To Current Requests ( throwable : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcomplet able . complete Exception ally ( throwable ) ĊĠĠĠĠĠĠĠ Ġcomplet able Ġ= ĠComp letable Deferred () ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ type alias ĠMake Compiler Happy For Starter Code Ġ= ĠFake Call For Ret rofit < String > Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġonly Ġexists Ġto Ġmake Ġthe Ġstarter Ġcode Ġcompile . ĠRemove Ġafter Ġrefactoring Ġretrofit Ġto Ġuse Ċ Ġ* Ġsuspend Ġfunctions . Ċ Ġ*/ Ċ class ĠFake Call For Ret rofit < T > Ġ: ĠCall < T > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġenqueue ( callback : ĠCallback < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġnothing ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Executed () Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġclone (): ĠCall < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Canceled () Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġfun Ġcancel () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġnothing ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġexecute (): ĠResponse < T > Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" Not Ġimplemented ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrequest (): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" Not Ġimplemented ") ĊĠĠĠ Ġ} Ċ Ċ }