/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 ĠPin aki ĠA ch ary a Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġdev . pin aki . de si pe . feature . listing Ċ Ċ import Ġandroidx . lifecycle .* Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġdev . pin aki . de si pe . common . connectivity . Connectivity Detector Ċ import Ġdev . pin aki . de si pe . common . coroutine . Dispatcher Provider Ċ import Ġdev . pin aki . de si pe . data . repository . Recipe Repository Ċ import Ġkotlinx . coroutines . launch Ċ import Ġtim ber . log . Tim ber Ċ import Ġjavax . inject . Inject Ċ Ċ @ H ilt ViewModel Ċ class ĠRecipe Listing ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġrecipe Repository : ĠRecipe Repository , ĊĠĠĠ Ġprivate Ġval Ġconnectivity Detector : ĠConnect ivity Detector , ĊĠĠĠ Ġprivate Ġval Ġdispatcher Provider : ĠDispatcher Provider Ċ ) Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġval Ġall Recipes Ġ= Ġrecipe Repository . getAll Recipes (). map Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync Recipes () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn @ map Ġit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ show Offline Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġval Ġshow Offline : ĠLive Data < Boolean > Ġ= Ġ_ show Offline . distinct Until Changed () ĊĊĠĠĠ Ġprivate Ġval Ġ_ show Loading Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġval Ġshow Loading : ĠLive Data < Boolean > Ġ= Ġ_ show Loading . distinct Until Changed () ĊĊĠĠĠ Ġprivate Ġval Ġ_ show Error Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġval Ġshow Error : ĠLive Data < Boolean > Ġ= Ġ_ show Error . distinct Until Changed () ĊĊĠĠĠ Ġfun Ġsync Recipes () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( show Loading . value Ġ== Ġtrue ) Ġreturn Ġ// Ġalready Ġloading ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! connectivity Detector . isConnected ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ show Offline . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ_ show Offline . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ_ show Loading . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( dispatcher Provider . io ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecipes From Server Ġ= Ġrecipe Repository . sync Recipes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġrecipes From Server . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipe Repository . delete All Recipes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipe Repository . save All Recipes ( recipes From Server ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ show Error . post Value (! success ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). e ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ show Error . post Value ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ show Loading . post Value ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG Ġ= Ġ" Recipe Listing ViewModel " ĊĠĠĠ Ġ} Ċ }