package Ġcom . had iy ar aj esh . flow ers ample . data . repository Ċ Ċ import Ġandroid . util . Log Ċ import Ġcom . had iy ar aj esh . flower .* Ċ import Ġcom . had iy ar aj esh . flow ers ample . data . database . dao . Quote Dao Ċ import Ġcom . had iy ar aj esh . flow ers ample . data . database . entity . Quote Ċ import Ġcom . had iy ar aj esh . flow ers ample . data . network . Api Interface Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . flow On Ċ import Ġkotlinx . coroutines . flow . map Ċ Ċ class ĠQuote Repository ( ĊĠĠĠ Ġprivate Ġval Ġapi Interface : ĠApi Interface , ĊĠĠĠ Ġprivate Ġval Ġquote Dao : ĠQuote Dao Ċ ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG Ġ= Ġ" Repository " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetRandom Quote ( ĊĠĠĠĠĠĠĠ Ġpage No : ĠInt , ĊĠĠĠĠĠĠĠ Ġon Failed : Ġ( String ?, ĠInt ) Ġ-> ĠUnit Ġ= Ġ{ Ġ_: ĠString ?, Ġ_: ĠInt Ġ-> Ġ} ĊĠĠĠ Ġ): ĠFlow < Resource < Quote >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnetwork Bound Flow Ġ= Ġnetwork Bound Resource ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfetch From Local Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Fetching Ġfrom Ġlocal Ġcache ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Result Ġ= Ġquote Dao . get Quote ( page No ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshould Fetch From Remote Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Checking Ġif Ġremote Ġfetch Ġis Ġneeded ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfetch From Remote Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Fetching Ġfrom Ġremote Ġserver ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi Interface . getRandom Quote ( page No ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Remote Response Ġ= Ġ{}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Remote Data Ġ= Ġ{ Ġquotes Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Saving Ġfrom Ġremote Ġdata Ġto Ġlocal Ġcache ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopied Quotes Ġ= Ġquotes . map Ġ{ Ġit . copy ( primary Id Ġ= Ġpage No ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopied Quotes . forEach Ġ{ Ġquote Dao . insert OrUpdate Quote ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Fetch Failed Ġ= Ġ{ Ġerror Body , ĠstatusCode Ġ-> Ġon Failed ( error Body , ĠstatusCode ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResource . Status . LOADING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResource . loading ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResource . Status . SUCCESS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquote Ġ= Ġit . data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResource . success ( quote ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResource . Status . ERROR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResource . error ( it . message !! , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnetwork Bound Flow . flow On ( Dispatch ers . IO ) ĊĠĠĠ Ġ} Ċ }