package Ġcom . six th solution . eas ym ss ync adapter . mss ync adapter Ċ Ċ import Ġandroid . content .* Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . microsoft . graph . concurrency . IC allback Ċ import Ġcom . microsoft . graph . concurrency . Simple Wait er Ċ import Ġcom . microsoft . graph . core . ClientException Ċ import Ġcom . microsoft . graph . core . Default ClientConfig Ċ import Ġcom . microsoft . graph . core . IC lient Config Ċ import Ġcom . microsoft . graph . extensions .* Ċ import Ġcom . six th solution . eas ym ss ync adapter . Global Constant Ċ import Ġcom . six th solution . eas ym ss ync adapter . broadcast s . Sync Broadcast Ċ import Ġcom . six th solution . eas ym ss ync adapter . broadcast s . Sync Broadcast Status Ċ import Ġcom . six th solution . eas ym ss ync adapter . database . Database Client Ċ import Ġcom . six th solution . eas ym ss ync adapter . ms auth enticator . IM S Login Handler Ċ import Ġcom . six th solution . eas ym ss ync adapter . mss ync adapter . models . M SE vent Ċ import Ġcom . six th solution . eas ym ss ync adapter . utils . Content Provider Util Ċ import Ġcom . six th solution . mss ync adapter . models . MSC al endar Ċ import Ġjava . util . concurrent . atomic . Atomic Reference ĊĊ Ċ /** Ċ Ġ* Ġ@ author ĠMe h di ĠSo hr abi Ġ( me hd ok @ gmail . com ) Ġon Ġ 7 / 1 1 / 2 0 1 7 . Ċ Ġ*/ Ċ class ĠM SS ync Manager Ġconstructor ( val Ġlogin Handler : ĠI MS Login Handler , Ġval Ġcontext : ĠContext ) Ġ: ĠIM SS ync Manager Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcontent Resolver : ĠContent Resolver Ġ= Ġcontext . content Resolver ĊĠĠĠ Ġprivate Ġval Ġgson Ġ= ĠGson () ĊĠĠĠ Ġprivate Ġval Ġclient Config : ĠI ClientConfig Ġ= ĠDefault ClientConfig . create With Authentication Provider ( login Handler ) ĊĠĠĠ Ġprivate Ġval Ġclient : ĠI Graph ServiceClient ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġclient Ġ= ĠGraph ServiceClient . Builder (). from Config ( client Config ). build Client () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess Loc ally Deleted () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġget Ġlist Ġof Ġdeleted Ġevents Ġfrom Ġdatabase ĊĠĠĠĠĠĠĠ Ġval Ġdeleted Events Ġ= ĠContent Provider Util . get ListOf Deleted Events Id ( content Resolver , Ġgson ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠDelete Ġlist Ġof Ġdeleted Ġevents Ġfrom Ġdatabase ĊĠĠĠĠĠĠĠ Ġfor Ġ( eventId Ġin Ġdeleted Events ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . me . get Events ( eventId ). build Request (). delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġsync Local And Remote Cal endars ( sync Result : ĠSync Result ?): ĠArrayList < Calendar >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Cal endars : ĠHashMap < String , ĠCalendar > Ġ= Ġget ListOf Remote Calendar Blocking () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġlocal Cal endars : ĠMap < String , ĠM SC al endar > Ġ= ĠContent Provider Util . getMap Of Local Calendar ( content Resolver , Ġgson ) ĊĠĠĠĠĠĠĠ Ġval Ġto Update Ġ= ĠArrayList < Calendar >() ĊĠĠĠĠĠĠĠ Ġval Ġto Add Ġ= ĠArrayList < Calendar >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( local Cal Id Ġin Ġlocal Cal endars . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremote Cal Ġ= Ġremote Cal endars [ local Cal Id ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( remote Cal Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemote Ġcalendar Ġis Ġnot Ġon Ġserver Ġanymore , Ġdelete Ġit Ġon Ġlocal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Local Calendar ( local Cal Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsync Result ?. stats ?. num Deletes ?. inc () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcalendar Ġis Ġstill Ġon Ġserver , Ġcheck Ġwhether Ġit Ġhas Ġbeen Ġupdated Ġrem otely ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Cal Ġ= Ġlocal Cal endars [ local Cal Id ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( local Cal ?. change Key Ġ== Ġremote Cal . change Key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsync Result ?. stats ?. num Skipped Entries ?. inc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġcalendar Ġupdated Ġon Ġserver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Update . add ( remote Cal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġremote Ġentry Ġhas Ġbeen Ġseen , Ġremove Ġfrom Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremote Cal endars . remove ( local Cal Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġall Ġof Ġnew Ġcalendar Ġthat Ġadded Ġto Ġserver ĊĠĠĠĠĠĠĠ Ġif Ġ(! remote Cal endars . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Add . addAll ( remote Cal endars . values ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbatch Ġ= ĠArrayList < Content Provider Operation >() ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe Ġcalendar Ġdata , Ġmaybe Ġits Ġproperties Ġwas Ġchanged ĊĠĠĠĠĠĠĠ Ġfor Ġ( calendar Ġin Ġto Update ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbatch . add ( Content Provider Operation . new Update ( MSC al endar . Companion . CONTENT _ URI ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Selection ( Database Client . Companion . COLUMN _ CAL _ ID Ġ+ Ġ" ='" Ġ+ Ġcalendar . id Ġ+ Ġ"'", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Value ( Database Client . Companion . COLUMN _ CAL _ JSON , Ġgson . toJson ( calendar , ĠCalendar :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync Result ?. stats ?. num Updates ?. inc () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġinsert Ġany Ġnew Ġcalendar Ġinto Ġdatabase ĊĠĠĠĠĠĠĠ Ġfor Ġ( calendar Ġin Ġto Add ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbatch . add ( Content Provider Operation . new Insert ( MSC al endar . Companion . CONTENT _ URI ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Value ( Database Client . Companion . COLUMN _ CAL _ ID , Ġcalendar . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Value ( Database Client . Companion . COLUMN _ CAL _ JSON , Ġgson . toJson ( calendar , ĠCalendar :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync Result ?. stats ?. num Inser ts ?. inc () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontent Resolver . apply Batch ( Global Constant . CONTENT _ AUTH ORITY , Ġbatch ) ĊĠĠĠĠĠĠĠ Ġcontent Resolver . notify Change ( MSC al endar . Companion . CONTENT _ URI , Ġnull , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠMicrosoft Ġw ont Ġchange Ġcalendar Ġchange Ġkey Ġif Ġsome Ġof Ġevents Ġchanges , Ġso Ġwe Ġneed Ġto Ġsync Ġevents Ġof Ġall ĊĠĠĠĠĠĠĠ Ġ// Ġremote Ġcalendar ĊĠĠĠĠĠĠĠ Ġreturn ĠArrayList ( remote Cal endars . values ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget ListOf Remote Calendar Blocking (): ĠHashMap < String , ĠCalendar >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwait er : ĠSimple Wait er Ġ= ĠSimple Wait er () ĊĠĠĠĠĠĠĠ Ġval ĠreturnValue : ĠAtomic Reference < Mutable List < Calendar >> Ġ= ĠAtomic Reference () ĊĠĠĠĠĠĠĠ Ġval Ġexception Value : ĠAtomic Reference < Exception > Ġ= ĠAtomic Reference () ĊĊĠĠĠĠĠĠĠ Ġclient . me . cal endars . build Request () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( object Ġ: ĠI Callback < IC al endar Collection Page > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfailure ( p 0 : ĠClient Exception ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception Value . set ( p 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait er . signal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsuccess ( p 0 : ĠI Calendar Collection Page ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnValue . set ( p 0 ?. currentPage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait er . signal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġwait er . waitFor Signal () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( exception Value . get () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Value . get (). printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠHashMap < String , ĠCalendar >( returnValue . get (). size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( cal Ġin ĠreturnValue . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . put ( cal . id , Ġcal ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsync Local And Remote Events ( calendar Id : ĠString , Ġsync Result : ĠSync Result ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Events : ĠHashMap < String , ĠEvent > Ġ= Ġget ListOf Remote Events ( calendar Id ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġlocal Events : ĠMap < String , ĠM SE vent > Ġ= ĠContent Provider Util . getMap Of Local Events ( content Resolver , Ġgson , Ġcalendar Id ) ĊĠĠĠĠĠĠĠ Ġval Ġto Update Ġ= ĠArrayList < Event >() ĊĠĠĠĠĠĠĠ Ġval Ġto Add Ġ= ĠArrayList < Event >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( local EventId Ġin Ġlocal Events . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremote Event Ġ= Ġremote Events [ local EventId ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( remote Event Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemote Ġevent Ġis Ġnot Ġon Ġserver Ġanymore , Ġdelete Ġit Ġon Ġlocal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Local Event ( local EventId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsync Result ?. stats ?. num Deletes ?. inc () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEvent Ġis Ġstill Ġon Ġserver , Ġcheck Ġwhether Ġit Ġhas Ġbeen Ġupdated Ġrem otely ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Event Ġ= Ġlocal Events [ local EventId ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( local Event ?. change Key Ġ== Ġremote Event . change Key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsync Result ?. stats ?. num Skipped Entries ?. inc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe ĠEvent Ġupdated Ġon Ġserver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Update . add ( remote Event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġremote Ġentry Ġhas Ġbeen Ġseen , Ġremove Ġfrom Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremote Events . remove ( local EventId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġall Ġof Ġnew Ġevents Ġthat Ġadded Ġto Ġserver ĊĠĠĠĠĠĠĠ Ġif Ġ(! remote Events . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Add . addAll ( remote Events . values ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbatch Ġ= ĠArrayList < Content Provider Operation >() ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe Ġevent Ġdata ĊĠĠĠĠĠĠĠ Ġfor Ġ( event Ġin Ġto Update ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbatch . add ( Content Provider Operation . new Update ( M SE vent . Companion . CONTENT _ URI ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Selection ( Database Client . Companion . COLUMN _ EVENT _ ID Ġ+ Ġ" ='" Ġ+ Ġevent . id Ġ+ Ġ"'", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Value ( Database Client . Companion . COLUMN _ EVENT _ JSON , Ġgson . toJson ( event , ĠEvent :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync Result ?. stats ?. num Updates ?. inc () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġinsert Ġany Ġnew Ġevent Ġinto Ġdatabase ĊĠĠĠĠĠĠĠ Ġfor Ġ( event Ġin Ġto Add ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbatch . add ( Content Provider Operation . new Insert ( M SE vent . Companion . CONTENT _ URI ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Value ( Database Client . Companion . COLUMN _ CAL _ ID , Ġcalendar Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Value ( Database Client . Companion . COLUMN _ EVENT _ ID , Ġevent . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Value ( Database Client . Companion . COLUMN _ EVENT _ JSON , Ġgson . toJson ( event , ĠEvent :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync Result ?. stats ?. num Inser ts ?. inc () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontent Resolver . apply Batch ( Global Constant . CONTENT _ AUTH ORITY , Ġbatch ) ĊĠĠĠĠĠĠĠ Ġcontent Resolver . notify Change ( M SE vent . Companion . CONTENT _ URI , Ġnull , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget ListOf Remote Events ( calendar Id : ĠString ): ĠHashMap < String , ĠEvent >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwait er : ĠSimple Wait er Ġ= ĠSimple Wait er () ĊĠĠĠĠĠĠĠ Ġval ĠreturnValue : ĠAtomic Reference < Mutable List < Event >> Ġ= ĠAtomic Reference () ĊĠĠĠĠĠĠĠ Ġval Ġexception Value : ĠAtomic Reference < Exception > Ġ= ĠAtomic Reference () ĊĊĠĠĠĠĠĠĠ Ġclient . me . get Cal endars ( calendar Id ). events . build Request () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( object Ġ: ĠI Callback < I Event Collection Page > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsuccess ( p 0 : ĠI Event Collection Page ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnValue . set ( p 0 ?. currentPage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait er . signal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfailure ( p 0 : ĠClient Exception ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception Value . set ( p 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait er . signal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġwait er . waitFor Signal () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( exception Value . get () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Value . get (). printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠHashMap < String , ĠEvent >( returnValue . get (). size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( event Ġin ĠreturnValue . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . put ( event . id , Ġevent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd New Event To Remote ( calendar Id : ĠString , Ġevent Column Id : ĠString , Ġsync Result : ĠSync Result ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġinform Ġany Ġregistered Ġreceiver Ġof Ġsync Ġstatus ĊĠĠĠĠĠĠĠ ĠSync Broadcast . fire ( context , ĠSync Broadcast Status . Start Add Event _ Remote Server , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠContent Provider Util . getLocal Event ( content Resolver , Ġgson , Ġevent Column Id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( event Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġevent Ġis Ġnot Ġexist Ġand Ġi Ġcan 't Ġgo Ġforward , Ġthere Ġis Ġno Ġneed Ġto Ġre schedule Ġsync Ġfor Ġthis Ġevent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġi Ġjust Ġskip Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync Result ?. stats ?. num Skipped Entries ?. inc () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġwait er : ĠSimple Wait er Ġ= ĠSimple Wait er () ĊĠĠĠĠĠĠĠ Ġval ĠreturnValue : ĠAtomic Reference < Event > Ġ= ĠAtomic Reference () ĊĠĠĠĠĠĠĠ Ġval Ġexception Value : ĠAtomic Reference < Exception > Ġ= ĠAtomic Reference () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġnew Ġevents Ġto Ġserver ĊĠĠĠĠĠĠĠ Ġclient . me . get Cal endars ( calendar Id ). events . build Request () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. post ( event , Ġobject Ġ: ĠI Callback < Event > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfailure ( p 0 : ĠClient Exception ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception Value . set ( p 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait er . signal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsuccess ( p 0 : ĠEvent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnValue . set ( p 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait er . signal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġwait er . waitFor Signal () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( exception Value . get () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Value . get (). printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThere Ġis Ġan Ġexception Ġin Ġserver Ġside Ġ( maybe Ġinternet Ġproblem ), Ġso Ġi Ġtell Ġthe Ġsync Ġadapter Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthere Ġis Ġan Ġhard Ġerror Ġand Ġi Ġneed Ġto Ġre schedule Ġthis Ġsync Ġoperation Ġin Ġnear Ġfuture ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync Result ?. database Error Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync Result ?. stats ?. num Io Exceptions ?. inc () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinform Ġany Ġregistered Ġreceiver Ġof Ġsync Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSync Broadcast . fire ( context , ĠSync Broadcast Status . Sync Error , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġremote Event Ġ= ĠreturnValue . get () ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġdatabase Ġwith Ġvalid Ġids Ġvalue ĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠContent Values () ĊĠĠĠĠĠĠĠ Ġvalues . put ( Database Client . Companion . COLUMN _ EVENT _ ID , Ġremote Event . id ) ĊĠĠĠĠĠĠĠ Ġvalues . put ( Database Client . Companion . COLUMN _ EVENT _ JSON , Ġgson . toJson ( remote Event , ĠEvent :: class . java )) ĊĊĠĠĠĠĠĠĠ Ġval Ġupdated Row Ġ= Ġcontent Resolver . update ( M SE vent . Companion . CONTENT _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Database Client . Companion . COLUMN _ ID }= ?", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( event Column Id )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġupdate Ġoperation Ġdone Ġsuccessfully , Ġso Ġi Ġtell Ġthe Ġsync Ġadapter Ġthat Ġevery Ġthing Ġis Ġok Ġand Ġhe Ġcan ĊĠĠĠĠĠĠĠ Ġ// Ġnotify Ġany Ġregistered Ġlistener ĊĠĠĠĠĠĠĠ Ġsync Result ?. stats ?. num Inser ts ?. inc () ĊĠĠĠĠĠĠĠ Ġcontent Resolver . notify Change ( M SE vent . Companion . CONTENT _ URI , Ġnull , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġinform Ġany Ġregistered Ġreceiver Ġof Ġsync Ġstatus ĊĠĠĠĠĠĠĠ ĠSync Broadcast . fire ( context , ĠSync Broadcast Status . End Add Event _ Remote Server , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Remote Event ( calendar Id : ĠString , Ġevent Id : ĠString , Ġsync Result : ĠSync Result ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġinform Ġany Ġregistered Ġreceiver Ġof Ġsync Ġstatus ĊĠĠĠĠĠĠĠ ĠSync Broadcast . fire ( context , ĠSync Broadcast Status . Start Update Event _ Remote Server , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġ// Get Ġthe Ġevent Ġfrom Ġdatabase ĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġget Update Event From Database ( eventId ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( event Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġevent Ġis Ġnot Ġexist Ġand Ġi Ġcan 't Ġgo Ġforward , Ġthere Ġis Ġno Ġneed Ġto Ġre schedule Ġsync Ġfor Ġthis Ġevent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġi Ġjust Ġskip Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync Result ?. stats ?. num Skipped Entries ?. inc () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġwait er : ĠSimple Wait er Ġ= ĠSimple Wait er () ĊĠĠĠĠĠĠĠ Ġval ĠreturnValue : ĠAtomic Reference < Event > Ġ= ĠAtomic Reference () ĊĠĠĠĠĠĠĠ Ġval Ġexception Value : ĠAtomic Reference < Exception > Ġ= ĠAtomic Reference () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġnew Ġevents Ġto Ġserver ĊĠĠĠĠĠĠĠ Ġclient . me . get Cal endars ( calendar Id ). get Events ( eventId ). build Request () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. patch ( event , Ġobject Ġ: ĠI Callback < Event > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfailure ( p 0 : ĠClient Exception ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception Value . set ( p 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait er . signal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsuccess ( p 0 : ĠEvent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnValue . set ( p 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait er . signal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġwait er . waitFor Signal () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( exception Value . get () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Value . get (). printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThere Ġis Ġan Ġexception Ġin Ġserver Ġside Ġ( maybe Ġinternet Ġproblem ), Ġso Ġi Ġtell Ġthe Ġsync Ġadapter Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthere Ġis Ġan Ġhard Ġerror Ġand Ġi Ġneed Ġto Ġre schedule Ġthis Ġsync Ġoperation Ġin Ġnear Ġfuture ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync Result ?. database Error Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync Result ?. stats ?. num Io Exceptions ?. inc () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinform Ġany Ġregistered Ġreceiver Ġof Ġsync Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSync Broadcast . fire ( context , ĠSync Broadcast Status . Sync Error , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġremote Event Ġ= ĠreturnValue . get () ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġdatabase Ġwith Ġvalid Ġids Ġvalue ĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠContent Values () ĊĠĠĠĠĠĠĠ Ġvalues . put ( Database Client . Companion . COLUMN _ EVENT _ ID , Ġremote Event . id ) ĊĠĠĠĠĠĠĠ Ġvalues . put ( Database Client . Companion . COLUMN _ EVENT _ JSON , Ġgson . toJson ( remote Event , ĠEvent :: class . java )) ĊĊĠĠĠĠĠĠĠ Ġval Ġupdated Row Ġ= Ġcontent Resolver . update ( M SE vent . Companion . CONTENT _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Database Client . Companion . COLUMN _ EVENT _ ID }= ?", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( eventId )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġupdate Ġoperation Ġdone Ġsuccessfully , Ġso Ġi Ġtell Ġthe Ġsync Ġadapter Ġthat Ġevery Ġthing Ġis Ġok Ġand Ġhe Ġcan ĊĠĠĠĠĠĠĠ Ġ// Ġnotify Ġany Ġregistered Ġlistener ĊĠĠĠĠĠĠĠ Ġsync Result ?. stats ?. num Inser ts ?. inc () ĊĠĠĠĠĠĠĠ Ġcontent Resolver . notify Change ( M SE vent . Companion . CONTENT _ URI , Ġnull , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġinform Ġany Ġregistered Ġreceiver Ġof Ġsync Ġstatus ĊĠĠĠĠĠĠĠ ĠSync Broadcast . fire ( context , ĠSync Broadcast Status . End Update Event _ Remote Server , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Update Event From Database ( eventId : ĠString ): ĠM SE vent ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= Ġcontent Resolver . query ( M SE vent . Companion . CONTENT _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Database Client . Companion . COLUMN _ EVENT _ ID }= ?", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( eventId ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . moveTo First () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġgson . fromJson ( cursor . getString ( cursor . getColumnIndex ( Database Client . Companion . COLUMN _ EVENT _ JSON )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM SE vent :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġevent ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Event From Server ( calendar Id : ĠString , Ġevent Id : ĠString , Ġsync Result : ĠSync Result ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġinform Ġany Ġregistered Ġreceiver Ġof Ġsync Ġstatus ĊĠĠĠĠĠĠĠ ĠSync Broadcast . fire ( context , ĠSync Broadcast Status . Start Delete Event _ Remote Server , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġval Ġwait er : ĠSimple Wait er Ġ= ĠSimple Wait er () ĊĠĠĠĠĠĠĠ Ġval ĠreturnValue : ĠAtomic Reference < Void > Ġ= ĠAtomic Reference () ĊĠĠĠĠĠĠĠ Ġval Ġexception Value : ĠAtomic Reference < Exception > Ġ= ĠAtomic Reference () ĊĊĠĠĠĠĠĠĠ Ġ// ĠDelete Ġthe Ġevent Ġfrom Ġremote Ġserver ĊĠĠĠĠĠĠĠ Ġclient . me . get Cal endars ( calendar Id ). get Events ( eventId ). build Request () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. delete ( object Ġ: ĠI Callback < Void > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfailure ( p 0 : ĠClient Exception ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception Value . set ( p 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait er . signal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsuccess ( p 0 : ĠVoid ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnValue . set ( p 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait er . signal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġwait er . waitFor Signal () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( exception Value . get () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Value . get (). printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThere Ġis Ġan Ġexception Ġin Ġserver Ġside Ġ( maybe Ġinternet Ġproblem ), Ġso Ġi Ġtell Ġthe Ġsync Ġadapter Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthere Ġis Ġan Ġhard Ġerror Ġand Ġi Ġneed Ġto Ġre schedule Ġthis Ġsync Ġoperation Ġin Ġnear Ġfuture ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync Result ?. database Error Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync Result ?. stats ?. num Io Exceptions ?. inc () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinform Ġany Ġregistered Ġreceiver Ġof Ġsync Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSync Broadcast . fire ( context , ĠSync Broadcast Status . Sync Error , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġdelete Ġoperation Ġdone Ġsuccessfully , Ġso Ġi Ġtell Ġthe Ġsync Ġadapter Ġthat Ġevery Ġthing Ġis Ġok Ġand Ġhe Ġcan ĊĠĠĠĠĠĠĠ Ġ// Ġnotify Ġany Ġregistered Ġlistener ĊĠĠĠĠĠĠĠ Ġsync Result ?. stats ?. num Deletes ?. inc () ĊĠĠĠĠĠĠĠ Ġcontent Resolver . notify Change ( M SE vent . Companion . CONTENT _ URI , Ġnull , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġinform Ġany Ġregistered Ġreceiver Ġof Ġsync Ġstatus ĊĠĠĠĠĠĠĠ ĠSync Broadcast . fire ( context , ĠSync Broadcast Status . End Delete Event _ Remote Server , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġdelete Ġcalendar Ġand Ġall Ġof Ġit 's Ġevents Ġfrom Ġdatabase ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdelete Local Calendar ( calendar Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontent Resolver . delete ( MSC al endar . Companion . CONTENT _ URI , Ġ"${ Database Client . Companion . COLUMN _ CAL _ ID }= ?", ĠarrayOf ( calendar Id )) ĊĠĠĠĠĠĠĠ Ġcontent Resolver . delete ( M SE vent . Companion . CONTENT _ URI , Ġ"${ Database Client . Companion . COLUMN _ CAL _ ID }= ?", ĠarrayOf ( calendar Id )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġdelete Ġthe Ġlocal Ġevent Ġfrom Ġdatabase ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdelete Local Event ( eventId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontent Resolver . delete ( M SE vent . Companion . CONTENT _ URI , Ġ"${ Database Client . Companion . COLUMN _ EVENT _ ID }= ?", ĠarrayOf ( eventId )) ĊĠĠĠ Ġ} Ċ Ċ }