// ĠCopyright Ġ 2 0 2 0 ĠGoogle ĠLLC Ċ // Ċ // Ġ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 Ġapp . ever green . data Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build .* Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . Any Thread Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġapp . ever green . R Ċ import Ġapp . ever green . config . E ver green Config Ċ import Ġapp . ever green . extensions . md 5 Ċ import Ġapp . ever green . services . App Services . httpClient Ċ import Ġapp . ever green . services . log Ċ import Ġcom . squareup . mos hi . Json EncodingException Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ Ċ class ĠRepo ( private Ġval Ġcontext : ĠContext ) Ġ{ ĊĠ Ġprivate Ġval Ġever green Config LiveData : ĠMutable LiveData < E ver green Config > Ġ= ĠMutable LiveData () ĊĊĠ Ġprivate Ġval Ġerrors LiveData : ĠMutable LiveData < Fetch Error > Ġ= ĠMutable LiveData () ĊĊĠ Ġval Ġdevice UniqueId Ġ= ĠMODEL ĊĊĠ Ġ@ get : Any Thread ĊĠ Ġval Ġever green Config : ĠLive Data < E ver green Config > ĊĠĠĠ Ġget () Ġ= Ġever green Config LiveData ĊĊĠ Ġ@ get : Any Thread ĊĠ Ġval Ġerrors : ĠLive Data < Fetch Error > ĊĠĠĠ Ġget () Ġ= Ġerrors LiveData ĊĊĠ Ġfun Ġrefresh From Server () Ġ{ ĊĠĠĠ Ġlog ( TAG , Ġ" refresh From Server ") ĊĠĠĠ ĠCor outine Scope ( Dispatch ers . Main ). launch Ġ{ ĊĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Url Ġ= ĠgetConfig Url ( device UniqueId ) ĊĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ"| Ġ$ config Url Ġ| Ġ$ device UniqueId Ġ| ") ĊĠĠĠĠĠĠĠ Ġvar Ġjson String Ġ= ĠhttpClient . http Get ( config Url ) ĊĠĠĠĠĠĠĠ Ġif Ġ( json String Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġdevice UniqueId ) ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġdon âĢĻ t Ġhave Ġa Ġdevice - specific Ġconfig Ġfor Ġthis Ġdevice , Ġthen Ġuse Ġa Ġdefault Ġconfig . ĠIt âĢĻ ll Ġinclude ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġlist Ġof Ġapps Ġof Ġinterest , Ġbut Ġwithout Ġspecific Ġpinned Ġversions Ġlisted . ĊĠĠĠĠĠĠĠĠĠ Ġjson String Ġ= ĠhttpClient . http Get ( context . getString ( R . string . default _ config _ url )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġdefault . json Ġcould Ġnot Ġbe Ġlocated , Ġthen Ġstill Ġdon âĢĻ t Ġraise Ġa ĠFetch Error , Ġsince ĠE ver green âĢĻ s ĠTools ĊĠĠĠĠĠĠĠ Ġ// Ġcan Ġbe Ġused Ġsuccessfully Ġeven Ġwithout Ġnetwork Ġconnectivity . ĊĠĠĠĠĠĠĠ Ġif Ġ( json String Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġdevice UniqueId ) ĊĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlog ( TAG , Ġjson String ) ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠE ver green Config . mos hi Adapter (). fromJson ( json String ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJson EncodingException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġerrors LiveData . post Value ( Fetch Error ( device UniqueId , Ġe . message Ġ?: Ġcontext . getString ( R . string . unknown ))) ĊĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn @ with Context ĊĊĠĠĠĠĠĠĠ Ġever green Config LiveData . post Value ( json ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun ĠgetConfig Url ( device UniqueId : ĠString ) Ġ= ĊĠĠĠ Ġcontext . getString ( R . string . device _ config _ url , Ġdevice UniqueId . md 5 ()) ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Repo " ĊĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠFetch Error ( val Ġdevice UniqueId : ĠString , Ġval Ġmessage : ĠString ) Ċ