package Ġcom . github . quent in 7 b . android boilerplate . network . ret rofit . converter Ċ Ċ import Ġcom . github . quent in 7 b . android boilerplate . network . Network Response Ċ import Ġkotlinx . coroutines . Comp letable Deferred Ċ import Ġkotlinx . coroutines . Deferred Ċ import Ġretrofit 2 .* Ċ import Ġjava . lang . reflect . Parameterized Type Ċ import Ġjava . lang . reflect . Type Ċ Ċ /** Ċ Ġ* ĠMost ly Ġinspired Ġfrom Ġhttps :// github . com / J ake Wh art on / ret rofit 2 - kotlin - coroutines - adapter Ċ Ġ*/ Ċ class ĠNetwork Response Call Adapter Factory Ġprivate Ġconstructor () Ġ: ĠCall Adapter . Factory () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġ@ Jvm Name (" create ") ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġinvoke () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNetwork Response Call Adapter Factory () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ( ĊĠĠĠĠĠĠĠ ĠreturnType : ĠType , ĊĠĠĠĠĠĠĠ Ġannotations : ĠArray < out ĠAnnotation >, ĊĠĠĠĠĠĠĠ Ġretrofit : ĠRet rofit ĊĠĠĠ Ġ): ĠCall Adapter < *, Ġ* >? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Deferred :: class . java Ġ!= Ġget Raw Type ( returnType )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( returnType Ġ! is ĠParameter ized Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Deferred < Network Response > Ġreturn Ġtype Ġmust Ġbe Ġparameter ized Ġas ĠDeferred < Network Response < Foo >> Ġor ĠDeferred < Network Response < out ĠFoo >" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresponse Type Ġ= Ġget Parameter Upper Bound ( 0 , ĠreturnType ) ĊĠĠĠĠĠĠĠ Ġval Ġraw Deferred Type Ġ= Ġget Raw Type ( response Type ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( raw Deferred Type Ġ== ĠNetwork Response :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response Type Ġ! is ĠParameter ized Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Network Response Ġmust Ġbe Ġparameter ized Ġas ĠNetwork Response < Foo > Ġor ĠNetwork Response < out ĠFoo >" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNetwork Response Call Adapter < Any >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Parameter Upper Bound ( 0 , Ġresponse Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġjava . lang . IllegalStateException (" C ant Ġfind Ġan Ġadapter Ġthat Ġmatches Ġthe Ġoutput Ġ: Ġ$ raw Deferred Type ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠNetwork Response Call Adapter < T >( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġresponse Type : ĠType ĊĠĠĠ Ġ) Ġ: ĠCall Adapter < T , ĠDeferred < Network Response < T >>> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġresponse Type () Ġ= Ġresponse Type ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadapt ( call : ĠCall < T >): ĠDeferred < Network Response < T >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeferred Ġ= ĠComp letable Deferred < Network Response < T >>() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred . invoke On Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( deferred . is Cancelled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . enqueue ( object Ġ: ĠCallback < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < T >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred . complete ( Network Response . Error (- 1 , Ġt )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall < T >, Ġresponse : ĠResponse < T >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred . complete ( Network Response . Success ( response . body () !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred . complete ( Network Response . Error ( response . code (), ĠHttp Exception ( response ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdeferred ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }