/** Ċ Ġ* ĠDesign ed Ġand Ġdeveloped Ġby ĠA id an ĠFol le st ad Ġ(@ af ol le st ad ) Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . af ol le st ad . n ock n ock . ui . main Ċ Ċ import Ġandroidx . annotation . Check Result Ċ import Ġandroidx . lifecycle . Lifecycle . Event . ON _ RE SU ME Ċ import Ġandroidx . lifecycle . Lifecycle Observer Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . On Lifecycle Event Ċ import Ġcom . af ol le st ad . n ock n ock . data . App Database Ċ import Ġcom . af ol le st ad . n ock n ock . data . all Sites Ċ import Ġcom . af ol le st ad . n ock n ock . data . delete Site Ċ import Ġcom . af ol le st ad . n ock n ock . data . model . Site Ċ import Ġcom . af ol le st ad . n ock n ock . engine . validation . Validation Executor Ċ import Ġcom . af ol le st ad . n ock n ock . notifications . N ock Notification Manager Ċ import Ġcom . af ol le st ad . n ock n ock . ui . Scoped ViewModel Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ Ċ /** Ġ@ author ĠA id an ĠFol le st ad Ġ(@ af ol le st ad ) Ġ*/ Ċ class ĠMain ViewModel ( ĊĠ Ġprivate Ġval Ġdatabase : ĠApp Database , ĊĠ Ġprivate Ġval Ġnotification Manager : ĠN ock Notification Manager , ĊĠ Ġprivate Ġval Ġvalidation Manager : ĠValidation Executor , ĊĠ Ġmain Dispatcher : ĠCor outine Dispatcher , ĊĠ Ġprivate Ġval Ġio Dispatcher : ĠCor outine Dispatcher Ċ ) Ġ: ĠScoped ViewModel ( main Dispatcher ), ĠLifecycle Observer Ġ{ ĊĊĠ Ġprivate Ġval Ġsites Ġ= ĠMutable LiveData < List < Site >>() ĊĠ Ġprivate Ġval ĠisLoading Ġ= ĠMutable LiveData < Boolean >() ĊĠ Ġprivate Ġval Ġempty Text Visibility Ġ= ĠMutable LiveData < Boolean >() ĊĠ Ġprivate Ġval Ġtags Ġ= ĠMutable LiveData < List < String >>() ĊĠ Ġprivate Ġval Ġtags List Visibility Ġ= ĠMutable LiveData < Boolean >() ĊĊĠ Ġ@ Check Result Ġfun Ġon Sites (): ĠLive Data < List < Site >> Ġ= Ġsites ĊĊĠ Ġ@ Check Result Ġfun Ġon Is Loading (): ĠLive Data < Boolean > Ġ= ĠisLoading ĊĊĠ Ġ@ Check Result Ġfun Ġon Empty Text Visibility (): ĠLive Data < Boolean > Ġ= Ġempty Text Visibility ĊĊĠ Ġ@ Check Result Ġfun Ġon Tags (): ĠLive Data < List < String >> Ġ= Ġtags ĊĊĠ Ġ@ Check Result Ġfun Ġon Tags List Visibility (): ĠLive Data < Boolean > Ġ= Ġtags List Visibility ĊĊĠ Ġ@ On Lifecycle Event ( ON _ RE SU ME ) ĊĠ Ġfun Ġon Resume () Ġ= Ġload Sites ( emptyList ()) ĊĊĠ Ġfun Ġon Tag Selection ( tags : ĠList < String >) Ġ= Ġload Sites ( tags ) ĊĊĠ Ġfun Ġpost Site Update ( model : ĠSite ) Ġ{ ĊĠĠĠ Ġval Ġcurrent Sites Ġ= Ġsites . value Ġ?: Ġreturn ĊĠĠĠ Ġval Ġindex Ġ= Ġcurrent Sites . indexOf First Ġ{ Ġit . id Ġ== Ġmodel . id Ġ} ĊĠĠĠ Ġif Ġ( index Ġ== Ġ- 1 ) Ġreturn ĊĠĠĠ Ġsites . value Ġ= Ġcurrent Sites . to Mutable List () ĊĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthis [ index ] Ġ= Ġmodel ĊĠĠĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġrefresh Site ( model : ĠSite ) Ġ{ ĊĠĠĠ Ġvalidation Manager . schedule Validation ( ĊĠĠĠĠĠĠĠ Ġsite Ġ= Ġmodel , ĊĠĠĠĠĠĠĠ Ġright Now Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġcancel Previous Ġ= Ġtrue ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġfun Ġremove Site ( model : ĠSite ) Ġ{ ĊĠĠĠ Ġvalidation Manager . cancel Scheduled Validation ( model ) ĊĠĠĠ Ġnotification Manager . cancel Status Notification ( model ) ĊĊĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠ ĠisLoading . value Ġ= Ġtrue ĊĠĠĠĠĠ Ġwith Context ( io Dispatcher ) Ġ{ Ġdatabase . delete Site ( model ) Ġ} ĊĊĠĠĠĠĠ Ġval Ġcurrent Sites Ġ= Ġsites . value Ġ?: Ġreturn @ launch ĊĠĠĠĠĠ Ġval Ġindex Ġ= Ġcurrent Sites . indexOf First Ġ{ Ġit . id Ġ== Ġmodel . id Ġ} ĊĠĠĠĠĠ ĠisLoading . value Ġ= Ġfalse ĊĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ- 1 ) Ġreturn @ launch ĊĊĠĠĠĠĠ Ġval Ġnew Sites List Ġ= Ġcurrent Sites . to Mutable List () ĊĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove At ( index ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġsites . value Ġ= Ġnew Sites List ĊĠĠĠĠĠ Ġempty Text Visibility . value Ġ= Ġnew Sites List . isEmpty () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġload Sites ( for Tags : ĠList < String >) Ġ{ ĊĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠ Ġnotification Manager . cancel Status Notifications () ĊĠĠĠĠĠ Ġempty Text Visibility . value Ġ= Ġfalse ĊĠĠĠĠĠ ĠisLoading . value Ġ= Ġtrue ĊĊĠĠĠĠĠ Ġval Ġun filtered Ġ= Ġwith Context ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdatabase . all Sites () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġvar Ġresult Ġ= Ġun filtered ĊĊĠĠĠĠĠ Ġif Ġ( for Tags . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġresult . filter Ġ{ Ġsite Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġval Ġitem Tags Ġ= Ġsite . tags . toLowerCase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. split (",") ĊĠĠĠĠĠĠĠĠĠ Ġitem Tags . any Ġ{ Ġtag Ġ-> Ġfor Tags . contains ( tag ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġsites . value Ġ= Ġresult ĊĠĠĠĠĠ Ġensure Check Jobs () ĊĠĠĠĠĠ ĠisLoading . value Ġ= Ġfalse ĊĠĠĠĠĠ Ġempty Text Visibility . value Ġ= Ġresult . isEmpty () ĊĊĠĠĠĠĠ Ġval Ġtags Values Ġ= Ġpull Out Tags ( un filtered ) ĊĠĠĠĠĠ Ġtags . value Ġ= Ġtags Values ĊĠĠĠĠĠ Ġtags List Visibility . value Ġ= Ġtags Values . isNotEmpty () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġsuspend Ġfun Ġensure Check Jobs () Ġ{ ĊĠĠĠ Ġwith Context ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠ Ġvalidation Manager . ensure Scheduled Valid ations () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġpull Out Tags ( sites : ĠList < Site >): ĠList < String > Ġ{ ĊĠĠĠ Ġreturn Ġmutable ListOf < String >(). apply Ġ{ ĊĠĠĠĠĠ Ġfor Ġ( site Ġin Ġsites ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsplit Tags Ġ= Ġsite . tags . toLowerCase () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. split (',') ĊĠĠĠĠĠĠĠ Ġsplit Tags ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġtag Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! this . contains ( tag )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġsort () ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ