package Ġcom . an es ab ml . product h unt . di Ċ Ċ import Ġandroid . app . Application Ċ import Ġcom . an es ab ml . product h unt . Build Config Ċ import Ġcom . an es ab ml . product h unt . api . ApiService Ċ import Ġcom . an es ab ml . product h unt . utils . Constant Ċ import Ġcom . an es ab ml . product h unt . utils . Shared Pref Ċ import Ġcom . ap ol log raph ql . apollo . A pol lo Client Ċ import Ġcom . ap ol log raph ql . apollo . api . Operation Ċ import Ġcom . ap ol log raph ql . apollo . api . Response Field Ċ import Ġcom . ap ol log raph ql . apollo . cache . normalized . CacheKey Ċ import Ġcom . ap ol log raph ql . apollo . cache . normalized . CacheKey Resolver Ċ import Ġcom . ap ol log raph ql . apollo . cache . normalized . sql . Sql Normalized Cache Factory Ċ import Ġcom . jak ew h art on . ret rofit 2 . adapter . kotlin . coroutines . Coroutine Call Adapter Factory Ċ import Ġdagger . Module Ċ import Ġdagger . Provides Ċ import Ġdagger . h ilt . Install In Ċ import Ġdagger . h ilt . android . components . Application Component Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . logging . Http Logging Interceptor Ċ import Ġretrofit 2 . Ret rofit Ċ import Ġretrofit 2 . converter . mos hi . M oshi Converter Factory Ċ import Ġjavax . inject . Singleton Ċ Ċ @ Module Ċ @ Install In ( Application Component :: class ) Ċ object ĠNetwork Module Ġ{ ĊĊĠĠĠ Ġ@ Singleton ĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġfun Ġprovide A pol lo Client ( application : ĠApplication , Ġshared Pref : ĠShared Pref ): ĠApollo Client Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCreate ĠNormal ized Cache Factory ĊĠĠĠĠĠĠĠ Ġ// ĠPlease Ġnote Ġthat Ġif Ġnull Ġis Ġpassed Ġin Ġas Ġthe Ġname , Ġyou Ġwill Ġget Ġan Ġin - memory ĠSQLite Ġdatabase Ġthat ĊĠĠĠĠĠĠĠ Ġ// Ġwill Ġnot Ġpersist Ġacross Ġrestart s Ġof Ġthe Ġapp . ĊĠĠĠĠĠĠĠ Ġval Ġcache Factory Ġ= ĠSql Normalized Cache Factory ( application , Ġ" h unt _ cache ") ĊĠĠĠĠĠĠĠ Ġval Ġresolver : ĠCache Key Resolver Ġ= Ġobject Ġ: ĠCache Key Resolver () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom Field Record Set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield : ĠResponse Field , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecord Set : ĠMap < String , ĠAny > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠCache Key Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġformat CacheKey ( record Set [" id "] Ġas ĠString ?) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom Field Arguments ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield : ĠResponse Field , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariables : ĠOperation . Variables ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠCache Key Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġformat CacheKey ( field . resolve Argument (" id ", Ġvariables ) Ġas ĠString ?) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġformat CacheKey ( id : ĠString ?) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid . isNull OrEmpty () Ġ-> ĠCache Key . NO _ KEY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠCache Key . from ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġif Ġ( shared Pref . token . isNotBlank ()) Ġshared Pref . token Ġelse ĠConstant . TOKEN ĊĊĠĠĠĠĠĠĠ Ġreturn ĠApollo Client . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. server Url ( Constant . GRAPH QL _ API ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. normalized Cache ( cache Factory , Ġresolver ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. ok HttpClient ( make HttpClient ( token Ġ= Ġtoken )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake HttpClient ( debug : ĠBoolean Ġ= ĠBuild Config . DEBUG , Ġtoken : ĠString ): ĠOk HttpClient Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclient Builder Ġ= ĠOk HttpClient . Builder () ĊĠĠĠĠĠĠĠ Ġif Ġ( debug ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhttp Logging Interceptor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Logging Interceptor ( Http Logging Interceptor . Logger . DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhttp Logging Interceptor . level Ġ= ĠHttp Logging Interceptor . Level . BODY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Builder . add Interceptor ( http Logging Interceptor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġclient Builder . add Network Interceptor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Ġ= Ġit . request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Http Url Ġ= Ġoriginal . url ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġoriginal Http Url . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add QueryParameter (" access _ token ", Ġtoken ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Builder Ġ= Ġoriginal . newBuilder (). url ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġrequest Builder . build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . proceed ( request ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġclient Builder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Singleton ĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġfun Ġprovide ApiService (): ĠApi Service Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġok HttpClient Ġ= ĠhttpClient () ĊĠĠĠĠĠĠĠ Ġreturn ĠRet rofit . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. baseUrl ( Constant . PRODUCT _ H UNT _ API ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. client ( ok HttpClient ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Converter Factory ( M oshi Converter Factory . create ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Call Adapter Factory ( Coroutine Call Adapter Factory . invoke ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create ( ApiService :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠhttpClient ( debug : ĠBoolean Ġ= ĠBuild Config . DEBUG ): ĠOk HttpClient Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhttp Logging Interceptor Ġ= ĠHttp Logging Interceptor ( Http Logging Interceptor . Logger . DEFAULT ) ĊĠĠĠĠĠĠĠ Ġval Ġclient Builder Ġ= ĠOk HttpClient . Builder () ĊĠĠĠĠĠĠĠ Ġif Ġ( debug ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhttp Logging Interceptor . level Ġ= ĠHttp Logging Interceptor . Level . BODY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Builder . add Interceptor ( http Logging Interceptor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġclient Builder . build () ĊĠĠĠ Ġ} Ċ } Ċ