/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// 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 . example . android dev challenge . data . repository Ċ Ċ import Ġcom . example . android dev challenge . data . map pers . Location Mapper Ċ import Ġcom . example . android dev challenge . data . source . user . Pre defined Preferences Ċ import Ġcom . example . android dev challenge . data . source . user . Preferences Cache Ċ import Ġcom . example . android dev challenge . data . source . user . Preferences Db Ċ import Ġcom . example . android dev challenge . domain . bridge . User Preferences Repository Ċ import Ġcom . example . android dev challenge . domain . entity . location . Location Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . flow . flow On Ċ import Ġkotlinx . coroutines . with Context Ċ Ċ class ĠUser Preferences Repository Impl ( ĊĠĠĠ Ġprivate Ġval Ġpreferences Cache : ĠPreferences Cache , ĊĠĠĠ Ġprivate Ġval Ġpreferences Db : ĠPreferences Db , ĊĠĠĠ Ġprivate Ġval Ġdefault Preferences : ĠPre defined Preferences , ĊĠĠĠ Ġprivate Ġval Ġlocation Mapper : ĠLocation Mapper , ĊĠĠĠ Ġprivate Ġval Ġio Dispatcher : ĠCor outine Dispatcher Ċ ) Ġ: ĠUser Preferences Repository Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠgetUser Locations (): ĠFlow < List < Location >> Ġ= Ġflow Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( preferences Cache . get Locations (). isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( location Mapper . map List To Domain ( preferences Cache . get Locations ())) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdb Locations Ġ= Ġpreferences Db . get Locations () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( db Locations . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( location Mapper . map List To Domain ( default Preferences . get ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences Cache . add Location ( db Locations ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( location Mapper . map List To Domain ( db Locations )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. flow On ( io Dispatcher ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġadd Location ( location : ĠLocation ) Ġ= Ġwith Context ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Location Ġ= Ġlocation Mapper . map To Data ( location ) ĊĠĠĠĠĠĠĠ Ġpreferences Db . store Location ( data Location ) ĊĠĠĠĠĠĠĠ Ġpreferences Cache . add Location ( data Location ) ĊĠĠĠ Ġ} Ċ } Ċ