package Ġcom . die gop arra . ve gg ie . core . android Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . datastore . core . DataStore Ċ import Ġandroidx . datastore . preferences . core . Preferences Ċ import Ġandroidx . datastore . preferences . core . edit Ċ import Ġandroidx . datastore . preferences . core . long Preferences Key Ċ import Ġandroidx . datastore . preferences . preferences DataStore Ċ import Ġcom . die gop arra . ve gg ie . core . internet . Is Internet Available UseCase Ċ import Ġcom . die gop arra . ve gg ie . core . kotlin .* Ċ import Ġkotlinx . coroutines . flow . first Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġtim ber . log . Tim ber Ċ Ċ private Ġval ĠContext . data Store : ĠData Store < Preferences > Ġby Ġpreferences DataStore ( name Ġ= Ġ" local _ update _ prefs ") Ċ Ċ class ĠLocal Update Helper < out ĠD to , Ġout ĠEntity >( ĊĠĠĠ Ġprivate Ġval Ġlast Successful Fetch Prefs : ĠTime Prefs Impl , ĊĠĠĠ Ġprivate Ġval Ġroom : ĠRoom Db < Entity >, ĊĠĠĠ Ġprivate Ġval Ġserver Api : ĠServer Api < Dto >, ĊĠĠĠ Ġprivate Ġval Ġmapper : ĠMapper < Dto , ĠEntity >, ĊĠĠĠ Ġprivate Ġval Ġis Internet Available UseCase : ĠIs Internet Available UseCase Ċ ) Ġ{ ĊĊĠĠĠ Ġclass ĠTime Prefs Impl ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġkey : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcontext : ĠContext ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠDefault Ġkey Ġwhen Ġcollecting Ġdata Ġdoes Ġnot Ġdepend Ġon Ġuser Ġ( i . e . Ġproducts ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEFAULT _ PRE FS _ KEY Ġ= Ġlong Preferences Key ( key ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠgetKey ( userId Str : ĠString ?): ĠPreferences . Key < Long > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( userId Str Ġ== Ġnull ) ĠDEFAULT _ PRE FS _ KEY Ġelse Ġlong Preferences Key ( key Ġ+ ĠuserId Str ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ ĠHEL PER ĠFUNCTIONS ĊĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġsave UpdatedAt ( updatedAt : ĠBasic Time , ĠuserId : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . data Store . edit Ġ{ Ġprefs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs [ getKey ( userId )] Ġ= ĠupdatedAt . millis Epoch UTC ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġget UpdatedAt ( userId : ĠString ?): ĠBasic Time ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontext . data Store . data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġpreferences Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences [ getKey ( userId )] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĠBasic Time ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠRoom Db < Entity > Ġ{ ĊĠĠĠĠĠĠĠ Ġsuspend Ġfun ĠgetLast Updated Time ( userId : ĠString ?): ĠLong ? ĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġupdate Items ( items Updated : ĠList < @ Jvm Suppress W ild cards ĠEntity >, Ġitems Deleted : ĠList < String >) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠServer Api < Dto > Ġ{ ĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġget Items Updated After ( basic Time : ĠBasic Time , ĠuserId : ĠString ?): ĠEither < Failure , ĠList < Dto >> ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠMapper < Dto , ĠEntity > Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġmap To Entity ( dto : ĠD to ): ĠEntity ĊĠĠĠĠĠĠĠ Ġfun Ġis Dto Deleted ( dto : ĠD to ): ĠBoolean ĊĠĠĠĠĠĠĠ Ġfun ĠgetId ( dto : ĠD to ): ĠString ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġsuspend Ġfun Ġupdate ( source : ĠSource , ĠuserId : ĠString ? Ġ= Ġnull ): ĠEither < Failure , ĠUnit > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( source . must Fetch From Server ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Successful Fetch Ġ= Ġlast Successful Fetch Prefs . get UpdatedAt ( userId ) Ġ?: ĠBasic Time ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Internet Available Ġ= Ġis Internet Available UseCase . invoke (). first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Last Update Ġ= ĠBasic Time ( room . getLast Updated Time ( userId ) Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Source Ġsays : ĠData Ġmust Ġbe Ġcollected Ġfrom Ġserver . ĠActual Last Update Ġ= Ġ$ actual Last Update ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Api . getItems Updated After ( actual Last Update , ĠuserId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Data Ġcollected Ġfrom Ġserver . Ġlist : Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom . update Items ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems Updated Ġ= Ġit . filter Not Ġ{ Ġmapper . is Dto Deleted ( it ) Ġ}. map Ġ{ Ġmapper . map To Entity ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems Deleted Ġ= Ġit . filter Ġ{ Ġmapper . is Dto Deleted ( it ) Ġ}. map Ġ{ Ġmapper . getId ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" List Ġupdated Ġlocally . ĠSetting Ġnew Ġlast Fetch Time Ġin Ġprefs : Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Successful Fetch Prefs . save UpdatedAt ( Basic Time . now (), ĠuserId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Source Ġsays : ĠDon 't Ġcollect Ġproducts Ġfrom Ġserver . ĠPossible Ġreasons : ĠThere Ġis Ġno Ġinternet Ġaccess , Ġdata Ġis Ġnot Ġexpired , Ġsource Ġwas Ġset Ġas Ġcache . ĠReturn ing Ġwithout Ġfailure ...") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEither . Right ( Unit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }