package Ġcom . example . wat to it . data Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġcom . example . wat to it . domain . entity . Recipe Ċ import Ġcom . example . wat to it . utils . is Ok Response Code Ċ import Ġcom . github . aj alt . tim ber kt . Tim ber Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Callback Ċ import Ġretrofit 2 . Response Ċ Ċ class ĠRecipe ViewModel Ġ( private Ġval Ġclient : ĠRest Client ): ĠViewModel () Ġ{ ĊĠĠĠ Ġclass ĠService Error ( message : ĠString ) Ġ: ĠRuntimeException ( message ) ĊĊĊĠĠĠ Ġprivate Ġvar Ġrecipes M ld Ġ= ĠMutable LiveData < List < Recipe >>() ĊĊĠĠĠ Ġval Ġrecipes ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġrecipes M ld . value Ġ?: throw ĠService Error (" No Ġrecipe Ġlist Ġset ") ĊĊĠĠĠ Ġfun Ġsearch ( context : ĠContext , Ġquery : ĠString , Ġcallback : Ġ( List < Recipe >) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclient . get Search Service ( context ). find Recipes ( query ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. enqueue ( object Ġ: ĠCallback < Recipe Search Response > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < Recipe Search Response >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d {" Error Ġwhile Ġgetting Ġrecipes "} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠService Error (" Search Ġrequest Ġfailed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall : ĠCall < Recipe Search Response >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse : ĠResponse < Recipe Search Response > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Ok Response Code ( response . code ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . body () Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d {" Response Ġhas Ġno Ġbody "} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠService Error (" Response Ġhas Ġno Ġbody ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . body () !!. recipes Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d {" No Ġrecipes Ġfound "} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠService Error (" No Ġrecipes Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipes M ld . value Ġ= Ġresponse . body () !!. recipes ?. map Ġ{ Ġe Ġ-> Ġe . recipe Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( recipes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d {" Error Ġwhile Ġgetting Ġrecipes : Ġ${ response . message ()} "} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠService Error (" Search Ġrequest Ġfailed Ġwith Ġcode Ġ${ response . code () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġlast Ac cessed Recipe M ld Ġ= ĠMutable LiveData < Recipe >() ĊĊĠĠĠ Ġvar Ġlast Ac cessed Recipe ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Ac cessed Recipe M ld . value Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġlast Ac cessed Recipe M ld . value Ġ?: Ġthrow ĠService Error (" No Ġlast Ġaccessed Ġrecipe Ġset ") Ċ } Ċ