package Ġinc . bro dy . words . ui . words Ċ Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġcom . google . firebase . firestore . Write Batch Ċ import Ġinc . bro dy . words . data . db . entity . Word Entry Ċ import Ġinc . bro dy . words . data . providers . Preference Provider Ċ import Ġinc . bro dy . words . data . repository . Database Repository Ċ import Ġinc . bro dy . words . data . utils . Firebase Util Ċ import Ġinc . bro dy . words . internal .* Ċ import Ġkotlinx . coroutines .* Ċ Ċ class ĠWord s ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġdatabase Repository : ĠDatabase Repository , ĊĠĠĠ Ġval Ġprefs Provider : ĠPreference Provider Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġfun Ġadd Word ( word : ĠWord Entry ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( prefs Provider . is Part icular Sync Needed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Util . setCurrent Word ( word ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Successful ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs Provider . is Sync Needed Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Scoped Word ( word ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġprefs Provider . set Sync Conditions Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Scoped Word ( word ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete Words ( ĊĠĠĠĠĠĠĠ Ġword : ĠWord Entry ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġwords : ĠList < Word Entry >? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( prefs Provider . is Part icular Sync Needed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( word Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Util . delete Current Word ( word ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Successful ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs Provider . set Sync Conditions Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Scoped Word ( word . copy ( is Alive Ġ= Ġfalse ), Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Scoped Word ( word ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( words Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbatch Ġ= ĠFirebase Util . firestore . batch () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwords . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbatch . delete Word ( it . word ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbatch . commit Words Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwords . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Scoped Word ( it . copy ( is Alive Ġ= Ġfalse ), Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġprefs Provider . set Sync Conditions Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġword ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Scoped Word ( word . copy ( is Alive Ġ= Ġfalse ), Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwords ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Scoped Word ( it . copy ( is Alive Ġ= Ġfalse ), Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcommit Synchronization Async ( words : ĠList < Word Entry > ?) Ġ= ĠGlobal Scope . async Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( prefs Provider . is Full Sync Needed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbatch Ġ= ĠFirebase Util . firestore . batch () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwords ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! it . is Alive Ġ-> Ġbatch . delete Word ( it . word ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . uid Ġ== Ġprefs Provider . current Sync Uid Ġ-> Ġbatch . set Word ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . uid Ġ== Ġnull Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbatch . set Word ( it . copy ( uid Ġ= Ġprefs Provider . current Sync Uid )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbatch . commit Words Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs Provider . is Sync Needed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwords ?. forEach Ġ{ Ġword Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! word . is Alive Ġ|| Ġ( word . uid Ġ!= Ġnull Ġ&& Ġword . uid Ġ!= ĠFirebase Util . uid )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Scoped Word ( word ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwords ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġwords ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd ListOf Words ( words : ĠList < Word Entry >, Ġis Fire store Needed : ĠBoolean Ġ= Ġfalse ) Ġ= ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Fire store Needed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbatch Ġ= ĠFirebase Util . firestore . batch () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwords . forEach Ġ{ Ġbatch . set Word ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbatch . commit Words Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Scoped ListOf Words ( words ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs Provider . is Sync Needed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Repository . add ListOf Words ( words ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Scoped ListOf Words ( words : ĠList < Word Entry >) Ġ= ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġdatabase Repository . add ListOf Words ( words ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Scoped Word ( word : ĠWord Entry ) Ġ= ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġdatabase Repository . add Word ( word ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelete Scoped Word ( word : ĠWord Entry , Ġis Delete : ĠBoolean Ġ= Ġtrue ) Ġ= ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġdatabase Repository . delete Word ( word , Ġis Delete ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġwords Ġby Ġlazy Deferred Ġ{ ĊĠĠĠĠĠĠĠ Ġdatabase Repository . get ListOf Words () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġfire store Words ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠGlobal Scope . async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Repository . getList From Firebase () ĊĠĠĠĠĠĠĠ Ġ} ĊĊ Ċ }