/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠLINE ĠCorporation Ċ Ġ* Ċ Ġ* Ġ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 . line corp . lich . sample . repository Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġcom . line corp . lich . component . Component Factory Ċ import Ġcom . line corp . lich . component . getComponent Ċ import Ġcom . line corp . lich . sample . db . Counter Dao Ċ import Ġcom . line corp . lich . sample . db . Counter Database Ċ import Ġcom . line corp . lich . sample . entity . Counter Ċ import Ġcom . line corp . lich . sample . remote . Counter ServiceClient Ċ import Ġjava . io . IOException Ċ Ċ class ĠCounter Repository Ġ@ Visible ForTesting Ġinternal Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġcounter ServiceClient : ĠCounter ServiceClient , ĊĠĠĠ Ġprivate Ġval Ġcounter Dao : ĠCounter Dao Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġ[ Counter ] Ġfor Ġthe Ġgiven Ġname . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe ĠCounter Ġis Ġin Ġthe Ġlocal Ġstorage , Ġjust Ġreturns Ġit . ĠOtherwise , Ġf etches Ġthe Ġinitial Ġvalue ĊĠĠĠĠ Ġ* Ġof Ġthe ĠCounter Ġfrom Ġthe Ġserver , Ġthen Ġstores Ġit Ġinto Ġthe Ġlocal Ġstorage . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġget Counter ( counter Name : ĠString ): ĠCounter Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdb Counter Ġ= Ġcounter Dao . find ( counter Name ) ĊĠĠĠĠĠĠĠ Ġif Ġ( db Counter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" Counter Repository ", Ġ" Loaded Ġa Ġcounter Ġfrom Ġthe Ġlocal Ġstorage : Ġ$ db Counter ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCounter Result . Success ( db Counter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġinitial Value Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcounter ServiceClient . get Initial Counter Value ( counter Name ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUsually , ĠIOException s Ġshould Ġbe Ġhandled Ġby Ġ" Repository " Ġlayer . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Counter Repository ", Ġ" Failed Ġto Ġquery Ġthe Ġinitial Ġvalue Ġfor Ġ$ counter Name ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCounter Result . Network Error ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Counter Ġ= ĠCounter ( counter Name , Ġinitial Value ) ĊĠĠĠĠĠĠĠ Ġcounter Dao . replace ( new Counter ) ĊĠĠĠĠĠĠĠ ĠLog . i (" Counter Repository ", Ġ" Created Ġa Ġnew Ġcounter : Ġ$ new Counter ") ĊĊĠĠĠĠĠĠĠ Ġreturn ĠCounter Result . Success ( new Counter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStores Ġthe Ġgiven Ġcounter Ġinto Ġthe Ġlocal Ġstorage . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġstore Counter ( counter : ĠCounter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcounter Dao . replace ( counter ) ĊĠĠĠĠĠĠĠ ĠLog . i (" Counter Repository ", Ġ" Updated Ġthe Ġcounter : Ġ$ counter ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDeletes Ġthe Ġgiven Ġcounter Ġfrom Ġthe Ġlocal Ġstorage . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġdelete Counter ( counter : ĠCounter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcounter Dao . delete ( counter ) ĊĠĠĠĠĠĠĠ ĠLog . i (" Counter Repository ", Ġ" Deleted Ġthe Ġcounter : Ġ$ counter ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ: ĠComponent Factory < Counter Repository >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Component ( context : ĠContext ): ĠCounter Repository Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Client Ġ= Ġcontext . getComponent ( Counter ServiceClient ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdatabase Ġ= Ġcontext . getComponent ( Counter Database ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCounter Repository ( service Client , Ġdatabase . counter Dao ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ