/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 Ġli z ha ot ail ang Ċ Ġ* Ċ Ġ* Ġ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 . mark ton y . zhi h ud aily . data . source . remote Ċ Ċ import Ġandroid . support . annotation . Visible ForTesting Ċ import Ġcom . mark ton y . zhi h ud aily . Build Config Ċ import Ġcom . mark ton y . zhi h ud aily . data . Do ub an Moment News Ċ import Ġcom . mark ton y . zhi h ud aily . data . Do ub an Moment News Posts Ċ import Ġcom . mark ton y . zhi h ud aily . data . source . Remote Data NotFoundException Ċ import Ġcom . mark ton y . zhi h ud aily . data . source . Result Ċ import Ġcom . mark ton y . zhi h ud aily . data . source . datasource . Do ub an Moment News DataSource Ċ import Ġcom . mark ton y . zhi h ud aily . ret rofit . Ret rofit Service Ċ import Ġcom . mark ton y . zhi h ud aily . util . App Executors Ċ import Ġcom . mark ton y . zhi h ud aily . util . format Do ub an Moment Date Long ToString Ċ import Ġkotlinx . coroutines . experimental . with Context Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . logging . Http Logging Interceptor Ċ import Ġretrofit 2 . Ret rofit Ċ import Ġretrofit 2 . converter . gson . Gson Converter Factory Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġli z ha ot ail ang Ġon Ġ 2 0 1 7 / 5 / 2 1 . Ċ Ġ* Ċ Ġ* ĠImplementation Ġof Ġthe Ġ[ Do ub an Moment News ] Ġdata Ġsource Ġthat Ġaccesses Ġnetwork . Ċ Ġ*/ Ċ Ċ class ĠDo ub an Moment News Remote DataSource Ġprivate Ġconstructor ( private Ġval Ġm App Executors : ĠApp Executors ) Ġ: ĠDo ub an Moment News DataSource Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġm Do ub an Moment Service : ĠRet rofit Service . Do ub an Moment Service Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠhttpClient Builder Ġ= ĠOk HttpClient . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. connect Timeout ( 2 4 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. read Timeout ( 2 4 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. write Timeout ( 2 4 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build Config . DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠhttpClient Builder . add Interceptor ( Http Logging Interceptor (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Ġ= ĠHttp Logging Interceptor . Level . BODY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠhttpClient Builder . retry On Connection Failure ( true ) ĊĊĠĠĠĠĠĠĠ Ġval Ġretrofit Ġ= ĠRet rofit . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. baseUrl ( Ret rofit Service . DO UB AN _ MO MENT _ BASE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Converter Factory ( Gson Converter Factory . create ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. client ( httpClient Builder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġretrofit . create ( Ret rofit Service . Do ub an Moment Service :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠINSTANCE : ĠDo ub an Moment News Remote DataSource ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance ( app Executors : ĠApp Executors ): ĠDo ub an Moment News Remote DataSource Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( INSTANCE Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( Do ub an Moment News Remote DataSource :: java Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠINSTANCE Ġ= ĠDo ub an Moment News Remote DataSource ( app Executors ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠINSTANCE !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠĠĠĠĠ Ġfun Ġclear Instance () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠINSTANCE Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Do ub an Moment News ( force Update : ĠBoolean , Ġclear Cache : ĠBoolean , Ġdate : ĠLong ): ĠResult < List < Do ub an Moment News Posts >> Ġ= Ġwith Context ( m App Executors . io Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġm Do ub an Moment Service . get Do ub an List ( format Do ub an Moment Date Long ToString ( date )). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . posts . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . Success ( it . posts ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . Error ( Remote Data NotFoundException ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . Error ( Remote Data NotFoundException ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . Error ( Remote Data NotFoundException ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResult . Error ( Remote Data NotFoundException ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠNot Ġrequired Ġbecause Ġthe Ġ[ com . mark ton y . zhi h ud aily . data . source . repository . Do ub an Moment News Repository ] Ġhandles Ġthe Ġlogic Ġof Ġrefresh ing Ġthe ĊĠĠĠ Ġ// Ġnews Ġfrom Ġall Ġthe Ġavailable Ġdata Ġsources . ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget F avorites (): ĠResult < List < Do ub an Moment News Posts >> Ġ= ĠResult . Error ( Remote Data NotFoundException ()) ĊĊĠĠĠ Ġ// ĠNot Ġrequired Ġbecause Ġthe Ġ[ com . mark ton y . zhi h ud aily . data . source . repository . Do ub an Moment News Repository ] Ġhandles Ġthe Ġlogic Ġof Ġrefresh ing Ġthe ĊĠĠĠ Ġ// Ġnews Ġfrom Ġall Ġthe Ġavailable Ġdata Ġsources . ĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠgetItem ( id : ĠInt ): ĠResult < Do ub an Moment News Posts > Ġ= ĠResult . Error ( Remote Data NotFoundException ()) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġfavorite Item ( itemId : ĠInt , Ġfavorite : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠNot Ġrequired Ġbecause Ġthe Ġ[ com . mark ton y . zhi h ud aily . data . source . repository . Do ub an Moment News Repository ] Ġhandles Ġthe Ġlogic Ġof Ġrefresh ing Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġnews Ġfrom Ġall Ġthe Ġavailable Ġdata Ġsources . ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġsave All ( list : ĠList < Do ub an Moment News Posts >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠNot Ġrequired Ġbecause Ġthe Ġ[ com . mark ton y . zhi h ud aily . data . source . repository . Do ub an Moment News Repository ] Ġhandles Ġthe Ġlogic Ġof Ġrefresh ing Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġnews Ġfrom Ġall Ġthe Ġavailable Ġdata Ġsources . ĊĠĠĠ Ġ} Ċ Ċ } Ċ