package Ġcom . ain ul . op rek . ui . view models Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġcom . ain ul . op rek . database . O pre k Database Ċ import Ġcom . ain ul . op rek . database . entities . Project Ċ import Ġcom . ain ul . op rek . database . entities . User Ċ import Ġcom . ain ul . op rek . repository . Database Repository Ċ import Ġcom . ain ul . op rek . util . Constants . Status Ċ import Ġcom . ain ul . op rek . util . Encrypt Manager Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . lang . IllegalArgumentException Ċ import Ġjava . util .* Ċ Ċ class ĠMain ViewModel ( app : ĠApplication ) Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdatabase Ġ= ĠO pre k Database . get Database ( app ) ĊĠĠĠ Ġprivate Ġval Ġrepository Ġ= ĠDatabase Repository ( database ) ĊĊĠĠĠ Ġ// Ġdefines Ġencrypt Manager Ġto Ġget Ġcurrent ĠuserId ĊĠĠĠ Ġprivate Ġval Ġencrypt Manager Ġ= ĠEncrypt Manager ( app ) ĊĠĠĠ Ġprivate Ġval Ġuser Session Ġ= Ġencrypt Manager . getSession () !! ĊĊĠĠĠ Ġprivate Ġval Ġui Scope Ġ= ĠCor outine Scope ( Dispatch ers . Main ) ĊĊĠĠĠ Ġprivate Ġval Ġ_ user Ġ= ĠMutable LiveData < User >() ĊĠĠĠ Ġval Ġuser : ĠLive Data < User > Ġget () Ġ= Ġ_ user ĊĊĠĠĠ Ġfun Ġrefresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ user . value Ġ= Ġrepository . getUser ( user Session . email , Ġuser Session . pin ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġenum Ġclass ĠData ToUpdate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUSER NAME , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOMP ANY , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPRO FILE _ PI CTURE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ data Updated Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġval Ġdata Updated : ĠLive Data < Boolean > Ġget () Ġ= Ġ_ data Updated ĊĊĠĠĠ Ġprivate Ġval ĠuserId Ġ= Ġuser Session . userId ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġupdate Ġuser Ġdata , Ġ[ data ToUpdate ] Ġwill Ġdecide Ġwhere Ġthe ĠnewValue Ġshould Ġbe Ġsaved Ġinto ĊĠĠĠĠ Ġ* Ġ@ param ĠnewValue Ġnew Ġdata Ġwhich Ġwill Ġbe Ġupdated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate Data ( data ToUpdate : ĠData ToUpdate , ĠnewValue : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( data ToUpdate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData ToUpdate . USERNAME Ġ-> Ġupdate Username ( userId , ĠnewValue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData ToUpdate . COMP ANY Ġ-> Ġupdate Company ( userId , ĠnewValue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData ToUpdate . PROFILE _ PI CTURE Ġ-> Ġupdate Profile Picture ( userId , ĠnewValue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ data Updated . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġno Ġneed Ġto Ġmake Ġthis Ġinto Ġa Ġmethod Ġin Ġrepo , Ġsince Ġit Ġreturns ĠLive Data ĊĠĠĠ Ġ// ĠLive Data Ġwill Ġautomatically Ġhandle Ġthe Ġproject Ġfrom Ġbackground - thread ĊĠĠĠ Ġval Ġprojects : ĠLive Data < List < Project > ?> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġdatabase . op rek Dao . get Projects ( userId ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ filter edList Ġ= ĠMutable LiveData < List < Project >>() ĊĠĠĠ Ġval Ġfilter edList : ĠLive Data < List < Project >> Ġget () Ġ= Ġ_ filter edList ĊĊĠĠĠ Ġfun Ġfilter Projects ( query : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠlistOf Projects Ġ= Ġprojects . value ĊĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġquery . toLowerCase ( Locale . ROOT ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( query . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ filter edList . value Ġ= ĠlistOf Projects ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( listOf Projects Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ filter edList . value Ġ= ĠlistOf Projects . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . customer Name . toLowerCase ( Locale . ROOT ). contains ( text ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . device Name . toLowerCase ( Locale . ROOT ). contains ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġproject Count , ĊĠĠĠĠ Ġ* Ġcount Ġhow Ġmany Ġprojects Ġfiltered Ġby Ġits Ġstatus ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject List Ġlist Ġof Ġ[ Project ], Ġit Ġis Ġnullable Ġin Ġcase Ġthere 's Ġno Ġproject Ġyet ĊĠĠĠĠ Ġ* Ġ@ return ĠString ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġproject Count ( project List : ĠList < Project > ?, Ġstatus : ĠStatus ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatus Filter : ĠInt Ġ= Ġproject List ?. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . status Ġ== Ġstatus . value ĊĠĠĠĠĠĠĠ Ġ} ?. size Ġ?: Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġreturn Ġstatus Filter . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġremove Ġcurrent Ġsession ĊĠĠĠ Ġfun Ġlogout () Ġ{ ĊĠĠĠĠĠĠĠ Ġencrypt Manager . remove Session () ĊĠĠĠĠĠĠĠ Ġ_ logout State . value Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ logout State Ġ= ĠMutable LiveData ( false ) ĊĠĠĠ Ġval Ġlogout State : ĠLive Data < Boolean > Ġget () Ġ= Ġ_ logout State ĊĊĠĠĠ Ġclass ĠFactory ( val Ġapp : ĠApplication ) Ġ: ĠViewModel Provider . Factory Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠViewModel ?> Ġcreate ( model Class : ĠClass < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( model Class . isAssignableFrom ( Main ViewModel :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMain ViewModel ( app ) Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" unable Ġto Ġconstruct Ġview model ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ }