/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠF ab rice ĠTh il aw Ġ(@ th il aw fab ) Ċ Ġ* Ċ Ġ* Ġ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 . th il aw fab rice . inventory app . view models Ċ Ċ import Ġandroidx . lifecycle .* Ċ import Ġcom . th il aw fab rice . inventory app . format Date Ċ import Ġcom . th il aw fab rice . inventory app . format ToDate Ċ import Ġcom . th il aw fab rice . inventory app . models . Product Ċ import Ġcom . th il aw fab rice . inventory app . repository . Repository Ċ import Ġcom . th il aw fab rice . inventory app . repository . api . Food Details Ċ import Ġcom . th il aw fab rice . inventory app . take Ol dest Ċ import Ġcom . th il aw fab rice . inventory app . views . Product View Item Ċ import Ġcom . th il aw fab rice . inventory app . views . as View Items Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch ĊĊ Ċ class ĠProduct ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġrepository : ĠRepository , ĊĠĠĠ Ġprivate Ġval Ġlifecycle Owner : ĠLifecycle Owner Ċ ) Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠFactory Ġfor Ġcreating Ġ[ Product ViewModel ] ĊĠĠĠĠĠĠĠĠ Ġ* ĠPass Ġrepository Ġto Ġ[ Product ViewModel ] ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠF ACT ORY Ġ= Ġsingle Arg ViewModel Factory (:: Product ViewModel ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġget Product List (): ĠLive Data < List < Product View Item >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġraw Data Ġ= Ġrepository . load Saved Products () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠMutable LiveData < List < Product View Item >>() ĊĠĠĠĠĠĠĠ Ġif Ġ( raw Data . has Active Observer s (). not ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġraw Data . observe ( owner Ġ= Ġlifecycle Owner ) Ġ{ Ġdata Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . post Value ( data . as View Items ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġsuspend Ġfun Ġcheck Reference Online ( code : ĠString ): ĠLive Data < Food Details ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrepository . resolve Product Details ( code ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Product ( valid Data : ĠFood Details , Ġnew Expiry Date : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . Main ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( valid Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . find Product ( valid Data . code !! ). also Ġ{ Ġlook For Already Saved Product Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlook For Already Saved Product . observe ( owner Ġ= Ġlifecycle Owner ) Ġ{ Ġmatches Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSave Ġnew Ġproduct Ġif Ġno Ġmatch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matches . isEmpty ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproduct Ġ= ĠProduct ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreference Ġ= Ġcode !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpicture Ġ= ĠimageUrl !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpiry Date Ġ= Ġnew Expiry Date ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstop Ġob serving Ġto Ġprevent Ġlooping ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlook For Already Saved Product . remove Observer s ( lifecycle Owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . save ( product ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġotherwise Ġupdate Ġexisting Ġproduct ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstop Ġob serving Ġto Ġprevent Ġlooping ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlook For Already Saved Product . remove Observer s ( lifecycle Owner ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Expiry Date Ġ= Ġnew Expiry Date , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Product Ġ= Ġmatches . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġupdate ( ĊĠĠĠĠĠĠĠ Ġprevious Product : ĠProduct , ĊĠĠĠĠĠĠĠ Ġnew Expiry Date : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// otherwise Ġ Ġonly Ġupdate Ġthe Ġold Ġone ĊĊĠĠĠĠĠĠĠ Ġwith ( previous Product ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġa Ġ Ġcopy Ġof Ġthe Ġold Ġproduct Ġwith Ġthe Ġclosest Ġdate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Date Ġ= Ġnew Expiry Date . format ToDate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Date Ġ= Ġexpiry Date . format ToDate () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Date Ġ!= Ġnull Ġ&& Ġnew Date Ġ!= Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġcopy ( expiry Date Ġ= Ġold Date . take Ol dest ( new Date ). format Date ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthen Ġupdate Ġolder Ġrecord ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . save ( update ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ