package Ġeu . kan ade . t ach iy omi . ui . library . sync Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġcom . google . gson . Json Parser Ċ import Ġeu . kan ade . t ach iy omi . R Ċ import Ġeu . kan ade . t ach iy omi . data . backup . Backup Manager Ċ import Ġeu . kan ade . t ach iy omi . data . database . Database Helper Ċ import Ġeu . kan ade . t ach iy omi . data . library sync . Library Sync Manager Ċ import Ġeu . kan ade . t ach iy omi . ui . base . presenter . Base Presenter Ċ import Ġrx . Observable Ċ import Ġrx . functions . Func 1 Ċ import Ġrx . schedul ers . Schedulers Ċ import Ġrx . subjects . Publish Subject Ċ import Ġu y . ko hes ive . in jekt . inject Lazy Ċ import Ġxyz . null dev . ts . sync . model . Sync Result Ċ Ċ class ĠLibrary Sync Presenter (): ĠBase Presenter < Library Sync Dialog Fragment >() Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSync Ġmanager . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġsync Manager : ĠLibrary Sync Manager Ġby Ġinject Lazy () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBackup Ġmanager ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġbackup Manager : ĠBackup Manager Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠBackup Manager ( db ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSubject Ġto Ġnotify Ġthe ĠUI Ġof Ġsync Ġprogress Ġupdates ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġsync Progress Subject : ĠPublish Subject < Library Sync Progress Event > Ġ= ĠPublish Subject . create () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDatabase . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġdb : ĠDatabase Helper Ġby Ġinject Lazy () ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( saved State : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( saved State ) ĊĊĠĠĠĠĠĠĠ Ġif ( saved State Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Sync () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRun Ġthe Ġsync Ġoperation ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrun Sync () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ensure Ġsync Ġis Ġavailable Ġand Ġenabled ĊĠĠĠĠĠĠĠ Ġif Ġ(! sync Manager . sync Available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġif Ġ(! sync Manager . enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Sync Ġnot Ġenabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . sync _ status _ not _ enabled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Sync Ġnot Ġsetup Ġproperly ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsync Manager . sync Error ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync Progress Subject . onNext ( Library Sync Progress Event . Error ( context . getString ( error ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsync Client Ġ= Ġsync Manager . sync Client !! ĊĠĠĠĠĠĠĠ Ġ// Get Ġlibrary ĊĠĠĠĠĠĠĠ Ġget Library Observable (). concat Map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Sync Ġlibrary ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync Client . sync Libraries With Progress ( it . first , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . second ). concat Map < Library Sync Progress Event > Ġ( Func 1 < Sync Result , ĠObservable < Library Sync Progress Event >> Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Update Ġprogress ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSync Result . Progress Ġ-> ĠObservable . just ( Library Sync Progress Event . Progress Updated ( result . status )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSync Result . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Report Ġto Ġuser Ġwe Ġare Ġsaving Ġchanges Ġ( it Ġmight Ġtake Ġa Ġwhile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsaved Observable Ġ= ĠObservable . just ( Library Sync Progress Event . Progress Updated ( context . getString ( R . string . saving _ changes ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompleted Observable Ġ= ĠObservable . from Callable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Everything Ġin Ġa Ġtransaction Ġto Ġensure Ġwe Ġdon 't Ġdelete Ġthe Ġuser 's Ġentire Ġlibrary Ġin Ġan Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . in Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Delete Ġold Ġm ang as ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold M ang as Ġ= Ġdb . getM ang as (). execute As Blocking () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old M ang as . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . delete M ang as ( old M ang as ). execute As Blocking () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . delete Old M ang as Categories ( old M ang as ). execute As Blocking () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Delete Ġold Ġcategories ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Categories Ġ= Ġdb . getC ategories (). execute As Blocking () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Categories . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . delete Categories ( old Categories ). execute As Blocking () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Write Ġnew Ġlibrary Ġto ĠDB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackup Manager . restore FromJson ( Json Parser (). parse ( result . serialized Library ). as JsonObject ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Save Ġnew Ġlibrary Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsync Manager . save Last Library State ( result . serialized Library ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Sync Ġwas Ġsuccessful Ġso Ġreset Ġlast Ġfailed Ġsync Ġcount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsync Manager . last Failed Sync Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Sync Ġok , Ġreport Ġconflicts ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLibrary Sync Progress Event . Completed ( result . conflict s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . merge ( saved Observable , Ġcompleted Observable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSync Result . Fail Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Log Ġthis Ġfailed Ġsync ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsync Manager . last Failed Sync Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just < Library Sync Progress Event >( Library Sync Progress Event . Error ( result . error Ġ?: Ġcontext . getString ( R . string . sync _ unknown _ error ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ}. subscribe On ( Schedulers . io ()). subscribe ( sync Progress Subject ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġlibrary Ġstates ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ returns ĠPair < OLD , ĠNEW > ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Library Observable (): Observable < Pair < String , ĠString >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObservable . from Callable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Get Ġlibraries ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Library Ġ= Ġsync Manager . getLast Library State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Library Ġ= Ġbackup Manager . backup ToJson ( favorites Only Ġ= Ġtrue ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( old Library , Ġnew Library ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }