/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 Ġ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 Ġapp . t ivi . data . repositories . popular shows Ċ Ċ import Ġapp . t ivi . data . da os . Pop ular Dao Ċ import Ġapp . t ivi . data . da os . T ivi Show Dao Ċ import Ġapp . t ivi . data . entities . Pop ular Show Entry Ċ import Ġcom . dropbox . android . external . store 4 . Fetcher Ċ import Ġcom . dropbox . android . external . store 4 . Source Of Truth Ċ import Ġcom . dropbox . android . external . store 4 . Store Ċ import Ġcom . dropbox . android . external . store 4 . Store Builder Ċ import Ġdagger . Module Ċ import Ġdagger . Provides Ċ import Ġdagger . h ilt . Install In Ċ import Ġdagger . h ilt . components . Singleton Component Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġorg . th reet en . bp . Duration Ċ import Ġjavax . inject . Singleton Ċ Ċ type alias ĠPop ular Shows Store Ġ= ĠStore < Int , ĠList < Pop ular Show Entry >> Ċ Ċ @ Install In ( Singleton Component :: class ) Ċ @ Module Ċ internal Ġobject ĠPop ular Shows Module Ġ{ ĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ Singleton ĊĠĠĠ Ġfun Ġprovide Pop ular Shows Store ( ĊĠĠĠĠĠĠĠ Ġtr akt Pop ular Shows : ĠTr akt Pop ular Shows DataSource , ĊĠĠĠĠĠĠĠ Ġpopular Shows Dao : ĠPop ular Dao , ĊĠĠĠĠĠĠĠ Ġshow Dao : ĠT ivi Show Dao , ĊĠĠĠĠĠĠĠ Ġlast Request Store : ĠPop ular Shows Last Request Store ĊĠĠĠ Ġ): ĠPop ular Shows Store Ġ= ĠStore Builder . from ( ĊĠĠĠĠĠĠĠ Ġfetch er Ġ= ĠFetch er . of Ġ{ Ġpage : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtr akt Pop ular Shows ( page , Ġ 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( page Ġ== Ġ 0 ) Ġlast Request Store . update Last Request () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġsource Of Truth Ġ= ĠSource Of Truth . of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader Ġ= Ġ{ Ġpage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopular Shows Dao . entries Observable ( page ). map Ġ{ Ġentries Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStore Ġonly Ġtre ats Ġnull Ġas Ġ' no Ġvalue ', Ġso Ġconvert Ġto Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentries . isEmpty () Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġrequest Ġis Ġexpired , Ġour Ġdata Ġis Ġstale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Request Store . is Request Expired ( Duration . of Hours ( 3 )) Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOtherwise , Ġour Ġdata Ġis Ġfresh Ġand Ġvalid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġentries ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter Ġ= Ġ{ Ġpage , Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopular Shows Dao . with Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentries Ġ= Ġresponse . map Ġ{ Ġ( show , Ġentry ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry . copy ( show Id Ġ= Ġshow Dao . getId Or Save Placeholder ( show ), Ġpage Ġ= Ġpage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( page Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe 've Ġrequested Ġpage Ġ 0 , Ġremove Ġany Ġexisting Ġentries Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopular Shows Dao . delete All () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopular Shows Dao . insert All ( entries ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopular Shows Dao . update Page ( page , Ġentries ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Ġ= Ġpopular Shows Dao :: delete Page , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete All Ġ= Ġpopular Shows Dao :: delete All ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ). build () Ċ } Ċ