/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 3 ĠSimon ĠV ig ĠTh erk ild sen Ċ Ġ* Ċ Ġ* Ġ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 Ġnet . sim on vt . c ath ode . actions . user Ċ Ċ import Ġandroid . content . Content Provider Operation Ċ import Ġandroid . content . Content Values Ċ import Ġandroid . content . Context Ċ import Ġandroidx . work . Work Manager Ċ import Ġnet . sim on vt . c ath ode . actions . Call Action Ċ import Ġnet . sim on vt . c ath ode . actions . user . Sync W atched Shows . Params Ċ import Ġnet . sim on vt . c ath ode . api . entity . W atched Item Ċ import Ġnet . sim on vt . c ath ode . api . service . Sync Service Ċ import Ġnet . sim on vt . c ath ode . common . database . getInt Ċ import Ġnet . sim on vt . c ath ode . common . database . getLong Ċ import Ġnet . sim on vt . c ath ode . provider . Database Contract . Episode Columns Ċ import Ġnet . sim on vt . c ath ode . provider . Database Contract . Show Columns Ċ import Ġnet . sim on vt . c ath ode . provider . Provider S che matic . Episode s Ċ import Ġnet . sim on vt . c ath ode . provider . Provider S che matic . Shows Ċ import Ġnet . sim on vt . c ath ode . provider . batch Ċ import Ġnet . sim on vt . c ath ode . provider . helper . Episode Database Helper Ċ import Ġnet . sim on vt . c ath ode . provider . helper . Season Database Helper Ċ import Ġnet . sim on vt . c ath ode . provider . helper . Show Database Helper Ċ import Ġnet . sim on vt . c ath ode . provider . query Ċ import Ġnet . sim on vt . c ath ode . settings . Tr akt Timestamp s Ċ import Ġnet . sim on vt . c ath ode . work . enqueue Unique Now Ċ import Ġnet . sim on vt . c ath ode . work . shows . Sync Pending Shows Worker Ċ import Ġretrofit 2 . Call Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util . ArrayList Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠSync W atched Shows Ġ@ Inject Ġconstructor ( ĊĠ Ġprivate Ġval Ġcontext : ĠContext , ĊĠ Ġprivate Ġval Ġshow Helper : ĠShow Database Helper , ĊĠ Ġprivate Ġval Ġseason Helper : ĠSe ason Database Helper , ĊĠ Ġprivate Ġval Ġepisode Helper : ĠEp isode Database Helper , ĊĠ Ġprivate Ġval Ġsync Service : ĠSync Service , ĊĠ Ġprivate Ġval Ġwork Manager : ĠWork Manager Ċ ) Ġ: ĠCall Action < Params , ĠList < W atched Item >>() Ġ{ ĊĊĠ Ġoverride Ġfun Ġkey ( params : ĠParams ): ĠString Ġ= Ġ" Sync W atched Shows " ĊĊĠ Ġoverride Ġfun Ġget Call ( params : ĠParams ): ĠCall < List < W atched Item >> Ġ= Ġsync Service . get W atched Shows () ĊĊĠ Ġoverride Ġsuspend Ġfun Ġhandle Response ( params : ĠParams , Ġresponse : ĠList < W atched Item >) Ġ{ ĊĠĠĠ Ġval Ġc Ġ= Ġcontext . content Resolver . query ( ĊĠĠĠĠĠ ĠEp isode s . E PI SO DES , ĊĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠ ĠEp isode Columns . ID , ĊĠĠĠĠĠĠĠ ĠEp isode Columns . SHOW _ ID , ĊĠĠĠĠĠĠĠ ĠEp isode Columns . SE ASON , ĊĠĠĠĠĠĠĠ ĠEp isode Columns . SE ASON _ ID , ĊĠĠĠĠĠĠĠ ĠEp isode Columns . E PI SO DE , ĊĠĠĠĠĠĠĠ ĠEp isode Columns . LAST _ WATCH ED _ AT ĊĠĠĠĠĠ Ġ), ĊĠĠĠĠĠ ĠEp isode Columns . WATCH ED ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġshows Map Ġ= Ġmutable Map Of < Long , ĠW atched Show >() ĊĠĠĠ Ġval Ġshow Id To Tr akt Map Ġ= Ġmutable Map Of < Long , ĠLong >() ĊĠĠĠ Ġval Ġepisode Ids Ġ= Ġmutable ListOf < Long >() ĊĊĠĠĠ Ġwhile Ġ( c . moveTo Next ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġid Ġ= Ġc . getLong ( Episode Columns . ID ) ĊĠĠĠĠĠ Ġval Ġshow Id Ġ= Ġc . getLong ( Episode Columns . SHOW _ ID ) ĊĠĠĠĠĠ Ġval Ġseason Ġ= Ġc . getInt ( Episode Columns . SE ASON ) ĊĠĠĠĠĠ Ġval Ġseason Id Ġ= Ġc . getLong ( Episode Columns . SE ASON _ ID ) ĊĠĠĠĠĠ Ġval Ġlast W atched At Ġ= Ġc . getLong ( Episode Columns . LAST _ WATCH ED _ AT ) ĊĊĠĠĠĠĠ Ġval Ġw atched Show : ĠW atched Show ? ĊĠĠĠĠĠ Ġvar Ġshow Tr akt Id Ġ= Ġshow Id To Tr akt Map [ show Id ] ĊĠĠĠĠĠ Ġif Ġ( show Tr akt Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Tr akt Id Ġ= Ġshow Helper . get Tr akt Id ( show Id ) ĊĊĠĠĠĠĠĠĠ Ġshow Id To Tr akt Map [ show Id ] Ġ= Ġshow Tr akt Id ĊĊĠĠĠĠĠĠĠ Ġw atched Show Ġ= ĠW atched Show ( show Id ) ĊĠĠĠĠĠĠĠ Ġshows Map [ show Tr akt Id ] Ġ= Ġw atched Show ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġw atched Show Ġ= Ġshows Map [ show Tr akt Id ] ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġvar Ġsync Season Ġ= Ġw atched Show !!. se asons [ season ] ĊĠĠĠĠĠ Ġif Ġ( sync Season Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsync Season Ġ= ĠLocal W atched Season ( season Id ) ĊĠĠĠĠĠĠĠ Ġw atched Show . se asons [ season ] Ġ= Ġsync Season ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġnumber Ġ= Ġc . getInt ( Episode Columns . E PI SO DE ) ĊĊĠĠĠĠĠ Ġvar Ġsync Episode Ġ= Ġsync Season . episodes [ number ] ĊĠĠĠĠĠ Ġif Ġ( sync Episode Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsync Episode Ġ= ĠLocal W atched Episode ( id , Ġlast W atched At ) ĊĠĠĠĠĠĠĠ Ġsync Season . episodes [ number ] Ġ= Ġsync Episode ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġepisode Ids . add ( id ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġc . close () ĊĊĠĠĠ Ġval Ġops Ġ= Ġarray ListOf < Content Provider Operation >() ĊĊĠĠĠ ĠTim ber . d (" Processing Ġitems ") ĊĠĠĠ Ġfor Ġ( w atched Item Ġin Ġresponse ) Ġ{ ĊĠĠĠĠĠ Ġval Ġtr akt Id Ġ= Ġw atched Item . show !!. ids . tr akt !! ĊĠĠĠĠĠ ĠTim ber . d (" Processing : Ġ% d ", Ġtr akt Id ) ĊĊĠĠĠĠĠ Ġvar Ġw atched Show Ġ= Ġshows Map [ tr akt Id ] ĊĊĠĠĠĠĠ Ġval Ġshow Id : ĠLong ĊĠĠĠĠĠ Ġvar Ġmark Pending Ġ= Ġfalse ĊĠĠĠĠĠ Ġif Ġ( w atched Show Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġshow Result Ġ= Ġshow Helper . getId OrCreate ( tr akt Id ) ĊĠĠĠĠĠĠĠ Ġshow Id Ġ= Ġshow Result . show Id ĊĠĠĠĠĠĠĠ Ġmark Pending Ġ= Ġmark Pending Ġ|| Ġshow Result . did Create ĊĠĠĠĠĠĠĠ Ġw atched Show Ġ= ĠW atched Show ( show Id ) ĊĠĠĠĠĠĠĠ Ġshows Map [ tr akt Id ] Ġ= Ġw atched Show ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Id Ġ= Ġw atched Show . id ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġlast W atched Millis Ġ= Ġw atched Item . last _ w atched _ at . time In Millis ĊĊĠĠĠĠĠ Ġops . add ( ĊĠĠĠĠĠĠĠ ĠContent Provider Operation . new Update ( Shows . with Id ( w atched Show . id )) ĊĠĠĠĠĠĠĠĠĠ Ġ. with Value ( Show Columns . LAST _ WATCH ED _ AT , Ġlast W atched Millis ) ĊĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠ Ġfor Ġ(( season Number , Ġepisode s ) Ġin Ġw atched Item . se asons !! ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlocal W atched Season Ġ= Ġw atched Show . se asons [ season Number ] ĊĠĠĠĠĠĠĠ Ġif Ġ( local W atched Season Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġseason Result Ġ= Ġseason Helper . getId OrCreate ( w atched Show . id , Ġseason Number ) ĊĠĠĠĠĠĠĠĠĠ Ġval Ġseason Id Ġ= Ġseason Result . id ĊĠĠĠĠĠĠĠĠĠ Ġmark Pending Ġ= Ġmark Pending Ġ|| Ġseason Result . did Create ĊĠĠĠĠĠĠĠĠĠ Ġlocal W atched Season Ġ= ĠLocal W atched Season ( season Id ) ĊĠĠĠĠĠĠĠĠĠ Ġw atched Show . se asons [ season Number ] Ġ= Ġlocal W atched Season ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( w atched Episode Ġin Ġepisode s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġlast W atched At Ġ= Ġw atched Episode . last _ w atched _ at . time In Millis ĊĠĠĠĠĠĠĠĠĠ Ġval Ġsync Episode Ġ= Ġlocal W atched Season . episodes [ w atched Episode . number ] ĊĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( sync Episode Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġepisode Result Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġepisode Helper . getId OrCreate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw atched Show . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal W atched Season . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw atched Episode . number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġepisode Id Ġ= Ġepisode Result . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark Pending Ġ= Ġmark Pending Ġ|| Ġepisode Result . did Create ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠContent Provider Operation . new Update ( Episode s . with Id ( episode Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠContent Values () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . put ( Episode Columns . WATCH ED , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . put ( Episode Columns . LAST _ WATCH ED _ AT , Ġlast W atched At ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . with Values ( values ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġops . add ( builder . build ()) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġepisode Ids . remove ( sync Episode . id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last W atched At Ġ!= Ġsync Episode . last W atched ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠContent Provider Operation . new Update ( Episode s . with Id ( sync Episode . id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠContent Values () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . put ( Episode Columns . LAST _ WATCH ED _ AT , Ġlast W atched At ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . with Values ( values ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġops . add ( builder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( mark Pending ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Helper . mark Pending ( show Id ) ĊĠĠĠĠĠĠĠ Ġwork Manager . enqueue Unique Now ( Sync Pending Shows Worker . TAG , ĠSync Pending Shows Worker :: class . java ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġapply ( ops ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfor Ġ( episode Id Ġin Ġepisode Ids ) Ġ{ ĊĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠContent Provider Operation . new Update ( Episode s . with Id ( episode Id )) ĊĠĠĠĠĠ Ġval Ġvalues Ġ= ĠContent Values () ĊĠĠĠĠĠ Ġvalues . put ( Episode Columns . WATCH ED , Ġfalse ) ĊĠĠĠĠĠ Ġbuilder . with Values ( values ) ĊĠĠĠĠĠ Ġops . add ( builder . build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġapply ( ops ) ĊĊĠĠĠ Ġif Ġ( params . user Activity Time Ġ> Ġ 0 L ) Ġ{ ĊĠĠĠĠĠ ĠTr akt Timestamp s . get Settings ( context ) ĊĠĠĠĠĠĠĠ Ġ. edit () ĊĠĠĠĠĠĠĠ Ġ. put Long ( Tr akt Timestamp s . E PI SO DE _ WATCH ED , Ġparams . user Activity Time ) ĊĠĠĠĠĠĠĠ Ġ. apply () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġapply ( ops : ĠArrayList < Content Provider Operation >): ĠBoolean Ġ{ ĊĠĠĠ Ġcontext . content Resolver . batch ( ops ) ĊĠĠĠ Ġops . clear () ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġprivate Ġclass ĠW atched Show ( var Ġid : ĠLong ) Ġ{ ĊĠĠĠ Ġvar Ġse asons Ġ= Ġmutable Map Of < Int , ĠLocal W atched Season >() ĊĠ Ġ} ĊĊĠ Ġprivate Ġclass ĠLocal W atched Season ( var Ġid : ĠLong ) Ġ{ ĊĠĠĠ Ġvar Ġepisode s Ġ= Ġmutable Map Of < Int , ĠLocal W atched Episode >() ĊĠ Ġ} ĊĊĠ Ġprivate Ġclass ĠLocal W atched Episode ( var Ġid : ĠLong , Ġvar Ġlast W atched : ĠLong ) ĊĊĠ Ġdata Ġclass ĠParams ( val Ġuser Activity Time : ĠLong Ġ= Ġ 0 L ) Ċ } Ċ