package Ġcom . bern af err ari . change detection . data . source Ċ Ċ import Ġandroid . arch . paging . DataSource Ċ import Ġcom . bern af err ari . change detection . data . Diff Ċ import Ġcom . bern af err ari . change detection . data . Diff Without Value Ċ Ċ /** Ċ Ġ* Ċ Ġ* ĠFor Ġsimplicity , Ġthis Ġimplements Ġa Ġd umb Ġsynchron isation Ġbetween Ġlocally Ġpersisted Ġdata Ġand Ġdata Ċ Ġ* Ġobtained Ġfrom Ġthe Ġserver , Ġby Ġusing Ġthe Ġremote Ġdata Ġsource Ġonly Ġif Ġthe Ġlocal Ġdatabase Ġdoesn 't Ċ Ġ* Ġexist Ġor Ġis Ġempty . Ċ Ġ* Ċ Ġ* ĠIn sp ired Ġfrom ĠArchitecture ĠComponents ĠMV VM Ġsample Ġapp Ċ Ġ*/ Ċ class ĠD iffs Repository Ġ// ĠPrevent Ġdirect Ġinstantiation . Ċ private Ġconstructor ( ĊĠĠĠ Ġdiffs Local DataSource : ĠD iffs DataSource Ċ ) Ġ: ĠD iffs DataSource Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget Diff Pair ( ĊĠĠĠĠĠĠĠ Ġoriginal Id : ĠString , ĊĠĠĠĠĠĠĠ Ġnew Id : ĠString , ĊĠĠĠĠĠĠĠ Ġcallback : ĠD iffs DataSource . Get Pair Callback ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm D iffs Local DataSource . get Diff Pair ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Ġ= Ġobject Ġ: ĠD iffs DataSource . Get Pair Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Diff Loaded ( pair : ĠPair < Diff , ĠDiff >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Diff Loaded ( pair ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Not Available () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Data Not Available () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Diff For Paging ( id : ĠString ): ĠDataSource . Factory < Int , ĠDiff Without Value > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm D iffs Local DataSource . get Diff For Paging ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete All D iffs For Site ( site Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm D iffs Local DataSource . delete All D iffs For Site ( site Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Diff ( diff Id : ĠString , Ġcallback : ĠD iffs DataSource . Get Diff Callback ) Ġ{ ĊĠĠĠĠĠĠĠ ĠcheckNotNull ( diff Id ) ĊĠĠĠĠĠĠĠ ĠcheckNotNull ( callback ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠIs Ġthe Ġsite Ġin Ġthe Ġlocal Ġdata Ġsource ? ĠIf Ġnot , Ġquery Ġthe Ġnetwork . ĊĠĠĠĠĠĠĠ Ġm D iffs Local DataSource . get Diff ( diff Id , Ġobject Ġ: ĠD iffs DataSource . Get Diff Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Diff Loaded ( diff : ĠDiff ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Diff Loaded ( diff ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Not Available () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Data Not Available () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Diff ( diff Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm D iffs Local DataSource . delete Diff ( diff Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm D iffs Local DataSource : ĠD iffs DataSource Ġ= ĠcheckNotNull ( dif fs Local DataSource ) ĊĊĠĠĠ Ġoverride Ġfun Ġsave Diff ( diff : ĠDiff , Ġcallback : ĠD iffs DataSource . Get Diff Callback ) Ġ{ ĊĠĠĠĠĠĠĠ ĠcheckNotNull ( diff ) ĊĠĠĠĠĠĠĠ Ġm D iffs Local DataSource . save Diff ( diff , Ġobject Ġ: ĠD iffs DataSource . Get Diff Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Diff Loaded ( diff : ĠDiff ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Diff Loaded ( diff ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Not Available () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Data Not Available () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Volatile ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠINSTANCE : ĠD iffs Repository ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturns Ġthe Ġsingle Ġinstance Ġof Ġthis Ġclass , Ġcreating Ġit Ġif Ġnecessary . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtasks Remote DataSource Ġthe Ġbackend Ġdata Ġsource ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtasks Local DataSource Ġ Ġthe Ġdevice Ġstorage Ġdata Ġsource ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġ[ D iffs Repository ] Ġinstance ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiffs Local DataSource : ĠD iffs DataSource ĊĠĠĠĠĠĠĠ Ġ): ĠD iffs Repository Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( INSTANCE Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( D iffs Repository :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( INSTANCE Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠINSTANCE Ġ= ĠD iffs Repository ( dif fs Local DataSource ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠINSTANCE !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠUsed Ġto Ġforce Ġ[. getInstance ] Ġto Ġcreate Ġa Ġnew Ġinstance ĊĠĠĠĠĠĠĠĠ Ġ* Ġnext Ġtime Ġit 's Ġcalled . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġdestroy Instance () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠINSTANCE Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ