package Ġcom . example . sched io app . network Ċ Ċ import Ġandroid . util . Log Ċ import Ġcom . jak ew h art on . ret rofit 2 . adapter . kotlin . coroutines . Coroutine Call Adapter Factory Ċ import Ġcom . jak ew h art on . ret rofit 2 . converter . kotlin x . serialization . as Converter Factory Ċ import Ġkotlinx . coroutines . Deferred Ċ import Ġokhttp 3 . MediaType . Companion . to MediaType Ċ import Ġokhttp 3 . logging . Http Logging Interceptor Ċ import Ġretrofit 2 . Ret rofit Ċ import Ġjava . lang . Exception Ċ import Ġkotlinx . serialization . K Serializer Ċ import Ġkotlinx . serialization . builtins . List Serializer Ċ import Ġkotlinx . serialization . descriptors .* Ċ import Ġkotlinx . serialization . encoding .* Ċ import Ġkotlinx . serialization . json .* Ċ import Ġokhttp 3 .* Ċ import Ġokhttp 3 . ResponseBody . Companion . to ResponseBody Ċ import Ġretrofit 2 . http .* Ċ import Ġjava . io . IOException Ċ import Ġtim ber . log . Tim ber Ċ Ċ private Ġconst Ġval ĠBASE _ URL Ġ= Ġ" https :// localhost : 4 4 3 4 2 / api /" Ċ Ċ private Ġval Ġlogger Ġ= ĠHttp Logging Interceptor () ĊĠĠĠ Ġ. apply Ġ{ Ġlevel Ġ= ĠHttp Logging Interceptor . Level . BODY Ġ} Ċ Ċ val Ġclient Ġ= ĠOk HttpClient . Builder () ĊĠĠĠ Ġ. add Interceptor ( http Interceptor ()) ĊĠĠĠ Ġ. build () Ċ Ċ val ĠcontentType Ġ= Ġ" application / json ". to MediaType () Ċ val Ġconverter Factory Ġ= ĠJson . as Converter Factory ( contentType ) Ċ Ċ private Ġval Ġretrofit Ġ= ĠRet rofit . Builder () ĊĠĠĠ Ġ. add Converter Factory ( converter Factory ) ĊĠĠĠ Ġ. add Call Adapter Factory ( Coroutine Call Adapter Factory ()) ĊĠĠĠ Ġ. baseUrl ( BASE _ URL ) ĊĠĠĠ Ġ. client ( client ) ĊĠĠĠ Ġ. build () Ċ Ċ /** Ċ Ġ* ĠThe ĠAPI Ġservice , Ġcontaining ĠGET , ĠPOST Ġand ĠDELETE Ġcalls Ċ Ġ*/ Ċ interface ĠProject ApiService Ġ{ ĊĠĠĠ Ġ// Ġhttps :// auth 0 . com / docs / security / tokens / access - tokens ĊĠĠĠ Ġ// Ġ@ Headers (" Authorization : ĠBearer Ġ") ĊĠĠĠ Ġ@ GET (" projects ") ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun ĠgetAll Projects Async (): ĠDeferred < Api Project Container > ĊĊĠĠĠ Ġ@ POST (" projects ") ĊĠĠĠ Ġfun Ġput Project (@ Body Ġproject : ĠApi Project ): ĠDeferred < Api Project > ĊĠĠĠ Ġ// Ġhttps :// www . youtube . com / watch ? v = m 3 yj 7 Ja TT PI ĊĠĠĠ Ġ// Ġhttps :// material . io / components / radio - buttons / android # using - date - pick ers ĊĠĠĠ Ġ// Ġhttps :// www . youtube . com / watch ? v = qc D lc IT N qn E ĊĊĠĠĠ Ġ@ DELETE (" projects /{ id }") ĊĠĠĠ Ġfun Ġdelete Project (@ Path (" id ") Ġid : ĠInt ): ĠDeferred < Api Project > Ċ Ċ } Ċ Ċ /** Ċ Ġ* ĠObject Ġwhere in Ġthe ĠAPI Ġproject Ġservice Ġis Ġcreated , Ġtaking Ġlazy Ġloading Ġinto Ġaccount Ċ Ġ* Ġ@ constructor Ġretrofit Service ĠInstanti ates Ġthe Ġproject ĠAPI Ġservice Ġin Ġa Ġlazy Ġway Ċ Ġ*/ Ċ object ĠProject Api Ġ{ ĊĠĠĠ Ġval Ġretrofit Service : ĠProject ApiService Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġretrofit . create ( Project ApiService :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠProject ApiService . mock Put Project ( project : ĠApi Project ): ĠApi Project Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproject ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠProject ApiService . mock Delete Project ( project : ĠApi Project ): ĠApi Project Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproject ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġ[ K Serializer ] Ġsubclass . Ċ Ġ* ĠProvides Ġmethods Ġto Ġserialize Ġand Ġdeserialize ĠAPI Ġprojects Ċ Ġ*/ Ċ class ĠProject Serializer : ĠK Serializer < Api Project > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġdeserialize ( decoder : ĠDecoder ): ĠApi Project Ġ= Ġdecoder . decode Structure ( descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġid Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġna am Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġvar Ġstart Datum Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġvar Ġe ind Datum Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġvar Ġbudget Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġvar Ġstatus Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġvar Ġtype Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġwhile ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( val Ġindex Ġ= Ġdecode Element Index ( descriptor )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġid Ġ= Ġdecode Int Element ( descriptor , 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġna am Ġ= Ġdecode String Element ( descriptor , 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġstart Datum Ġ= Ġdecode String Element ( descriptor , 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġe ind Datum Ġ= Ġdecode String Element ( descriptor , 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 Ġ-> Ġbudget Ġ= Ġdecode Double Element ( descriptor , 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 5 Ġ-> Ġstatus Ġ= Ġdecode String Element ( descriptor , 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 6 Ġ-> Ġtype Ġ= Ġdecode String Element ( descriptor , 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComposite Decoder . DECODE _ DONE Ġ-> Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unexpected Ġindex : Ġ$ index ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠApi Project ( id , Ġna am , Ġstart Datum , Ġe ind Datum , Ġbudget , Ġstatus , Ġtype ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġdescriptor : ĠSerial Descriptor Ġ= Ġbuild Class Serial Descriptor (" Api Project ") Ġ{ ĊĠĠĠĠĠĠĠ Ġelement < Int >(" id ") ĊĠĠĠĠĠĠĠ Ġelement < String >(" na am ") ĊĠĠĠĠĠĠĠ Ġelement < String >(" start Datum ") ĊĠĠĠĠĠĠĠ Ġelement < String >(" e ind Datum ") ĊĠĠĠĠĠĠĠ Ġelement < Double >(" budget ") ĊĠĠĠĠĠĠĠ Ġelement < String >(" status ") ĊĠĠĠĠĠĠĠ Ġelement < String >(" type ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġserialize ( encoder : ĠEncoder , Ġvalue : ĠApi Project ) Ġ{ ĊĠĠĠĠĠĠĠ Ġencoder . encode Structure ( descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencode Int Element ( descriptor , 0 , value . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencode String Element ( descriptor , Ġ 1 , Ġvalue . na am ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencode String Element ( descriptor , Ġ 2 , Ġvalue . start Datum ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencode String Element ( descriptor , Ġ 3 , Ġvalue . e ind Datum ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencode Double Element ( descriptor , Ġ 4 , Ġvalue . budget ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencode String Element ( descriptor , Ġ 5 , Ġvalue . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencode String Element ( descriptor , Ġ 6 , Ġvalue . type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠObject Ġused Ġto Ġserialize Ġa ĠJSON Ġarray Ġof ĠAPI Ġprojects Ċ Ġ*/ Ċ object Ġ ĠProjects Serializer : ĠJson Transform ing Serializer < List < Api Project >>( List Serializer ( Project Serializer ())) Ċ Ċ /** Ċ Ġ* ĠAn Ġ[ Interceptor ] Ġsubclass Ċ Ġ* ĠUsed Ġto Ġdeal Ġwith ĠJSON Ġarrays Ġserialization Ċ Ġ*/ Ċ class Ġhttp Interceptor : ĠInter ceptor Ġ{ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġintercept ( chain : ĠInter ceptor . Chain ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Request : ĠRequest Ġ= Ġchain . request () ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Response : ĠResponse Ġ= Ġchain . proceed ( original Request ) ĊĠĠĠĠĠĠĠ Ġvar Ġresponse String : ĠString Ġ= Ġoriginal Response . body !!. string () ĊĠĠĠĠĠĠĠ Ġval Ġresponse Body : ĠResponse Body ĊĠĠĠĠĠĠĠ Ġval Ġaltered ResponseBody : ĠResponse Body ĊĠĠĠĠĠĠĠ Ġval Ġconvert Json String : ĠString ĊĠĠĠĠĠĠĠ Ġval ĠcontentType Ġ= Ġ" application / json ". to MediaType () ĊĊĠĠĠĠĠĠĠ Ġ// ĠCase Ġ 2 : ĠJson Array Ġis Ġpassed Ġby Ġmeans Ġof ĠAPI ĊĠĠĠĠĠĠĠ Ġif ( original Request . is Https Ġ&& Ġoriginal Response . is Successful Ġ&& Ġresponse String . startsWith (" [" )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Test Ġinterceptor Ġresponse Ġstring : Ġ$ response String ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Json String Ġ= Ġ""" { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" api Projects ": Ġ$ response String ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} """. trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaltered ResponseBody Ġ= Ġconvert Json String . to ResponseBody ( contentType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġoriginal Response . newBuilder (). body ( alter ed ResponseBody ). build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCase Ġ 1 : ĠJsonObject Ġis Ġpassed Ġby Ġmeans Ġof ĠAPI ĊĠĠĠĠĠĠĠ Ġresponse Body Ġ= Ġresponse String . to ResponseBody ( contentType ) ĊĠĠĠĠĠĠĠ Ġreturn Ġoriginal Response . newBuilder (). body ( response Body ). build () ĊĠĠĠ Ġ} Ċ Ċ }