package Ġuk . co . jo ep al mer . data . repo Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . work . Backoff Policy Ċ import Ġandroidx . work . One Time Work Request Ċ import Ġandroidx . work . Work Info Ċ import Ġandroidx . work . Work Manager Ċ import Ġio . reactivex . Single Ċ import Ġretrofit 2 . Response Ċ import Ġuk . co . jo ep al mer . core . type . Comment Ċ import Ġuk . co . jo ep al mer . core . type . Post Ċ import Ġuk . co . jo ep al mer . core . type . User Ċ import Ġuk . co . jo ep al mer . data . repo . source . Data Router Ċ import Ġuk . co . jo ep al mer . data . repo . source . Data Sync Ċ import Ġuk . co . jo ep al mer . data . repo . source . local . db . Post Dao Ċ import Ġuk . co . jo ep al mer . data . repo . source . local . db . Posts Room Database Ċ import Ġuk . co . jo ep al mer . data . repo . source . remote . DataService Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjavax . inject . Inject Ċ Ċ const Ġval ĠWORK _ REQUEST _ TAG Ġ= Ġ" data _ sync " Ċ Ċ class ĠRepository Ġ@ Inject Ġconstructor ( context : ĠContext , Ġprivate Ġval Ġdata Service : ĠData Service ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdao : ĠPost Dao ĊĊĠĠĠ Ġval Ġdb : ĠPosts Room Database ĊĊĠĠĠ Ġval Ġdata Sync Status : ĠLive Data < Work Info > ĊĊĠĠĠ Ġval Ġusers : ĠSingle < Response < List < User >>> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdata Service . get Users () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠINSTANCE Ġ= Ġthis ĊĊĠĠĠĠĠĠĠ Ġdb Ġ= ĠPosts Room Database . getInstance ( context ) ĊĠĠĠĠĠĠĠ Ġdao Ġ= Ġdb . posts Dao () ĊĊĠĠĠĠĠĠĠ Ġval Ġ( work Manager : ĠWork Manager , Ġwork Id ) Ġ= Ġschedule Data Sync () ĊĠĠĠĠĠĠĠ Ġdata Sync Status Ġ= Ġwork Manager . get Work Info ById LiveData ( work Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSchedule Ġa Ġdata Ġsync ĊĠĠĠĠ Ġ* ĠIn Ġthe Ġresult Ġof Ġa Ġpartial Ġsuccess Ġthe Ġsync Ġwill Ġbe Ġanother Ġsync Ġwill Ġbe Ġscheduled ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġschedule Data Sync (): ĠPair < Work Manager , ĠUUID > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwork Manager : ĠWork Manager Ġ= ĠWork Manager . getInstance () ĊĠĠĠĠĠĠĠ Ġval Ġwork Request Ġ= ĠOne Time Work Request ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. Builder ( Data Sync :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Backoff Criteria ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBack off Policy . LINEAR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOne Time Work Request . MIN _ BACK OFF _ M ILL IS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . MILLISECONDS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Tag ( WORK _ REQUEST _ TAG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġwork Id Ġ= Ġwork Request . id ĊĠĠĠĠĠĠĠ Ġwork Manager . enqueue ( work Request ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( work Manager , Ġwork Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġuser ( userId : ĠInt ): ĠSingle < User > Ġ= ĠData Router ( dao ). getUser ( userId ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGET ĠPosts Ġand Ġthen ĠGET Ġthe ĠUser Ġand Ġreturn Ġboth Ġas Ġa ĠPair ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġposts (): ĠSingle < List < Pair < Post , ĠUser >>> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Router Ġ= ĠData Router ( dao ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdata Router ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Posts (). flatten As Observable Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . flatMap ({ Ġpost : ĠPost Ġ-> Ġuser ( post . userId ). to Observable () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġpost : ĠPost , Ġuser : ĠUser Ġ-> ĠPair ( post , Ġuser ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcomments ( post Id : ĠInt ): ĠSingle < List < Comment >> Ġ= Ġdata Service . getPost Comments ( post Id ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠINSTANCE : ĠRepository ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġget (): ĠRepository Ġ= ĠINSTANCE !! ĊĠĠĠ Ġ} Ċ } Ċ