package Ġcom . k yle cor ry . trail _ sense . weather . infrastructure Ċ Ċ import Ġandroid . content . Context Ċ import Ġcom . k yle cor ry . and rome da . core . cache . Memory Cached Value Ċ import Ġcom . k yle cor ry . sol . science . meteor ology . Pressure T end ency Ċ import Ġcom . k yle cor ry . sol . science . meteor ology . Weather Ċ import Ġcom . k yle cor ry . trail _ sense . shared . User Preferences Ċ import Ġcom . k yle cor ry . trail _ sense . weather . domain . Pressure Alt itude Reading Ċ import Ġcom . k yle cor ry . trail _ sense . weather . domain . Pressure Reading Ċ import Ġcom . k yle cor ry . trail _ sense . weather . domain . Weather Service Ċ import Ġcom . k yle cor ry . trail _ sense . weather . domain . se ale vel . Sea Level Calibration Factory Ċ import Ġcom . k yle cor ry . trail _ sense . weather . infrastructure . persistence . Pressure Repo Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . time . Instant Ċ Ċ class ĠWeather Context ual Service Ġprivate Ġconstructor ( private Ġval Ġcontext : ĠContext ) Ġ{ ĊĊĠĠĠ Ġ// ĠTODO : ĠReset Ġwhen Ġany Ġof Ġthe Ġweather Ġpreferences Ġchanges Ġregarding Ġtend encies , Ġsea Ġlevel Ġpressure Ġand Ġcalibration ĊĊĠĠĠ Ġprivate Ġval Ġweather Repo Ġby Ġlazy Ġ{ ĠPress ure Repo . getInstance ( context ) Ġ} ĊĠĠĠ Ġprivate Ġval Ġprefs Ġby Ġlazy Ġ{ ĠUser Preferences ( context ) Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġweather Service : ĠWeather Service ĊĊĠĠĠ Ġprivate Ġvar Ġcached Value Ġ= ĠMemory Cached Value < Forecast Cache >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġreset Weather Service () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġget T end ency (): ĠPress ure T end ency Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Value . get Or Put Ġ{ Ġpopulate Cache () Ġ}. t end ency ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun ĠgetLast Reading (): ĠPress ure Reading ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Value . get Or Put Ġ{ Ġpopulate Cache () Ġ}. last Pressure ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġget Hour ly Forecast (): ĠWeather Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Value . get Or Put Ġ{ Ġpopulate Cache () Ġ}. hourly ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġget Daily Forecast (): ĠWeather Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Value . get Or Put Ġ{ Ġpopulate Cache () Ġ}. daily ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġget Pressure History (): ĠList < Pressure Reading > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread ings Ġ= Ġweather Repo . get Press ures Sync () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to Pressure Alt itude Reading () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . time Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . time Ġ<= ĠInstant . now () Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcal ibr ator Ġ= ĠSe a Level Calibration Factory (). create ( prefs ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcal ibr ator . cal ibrate ( read ings ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Sea Level Pressure ( ĊĠĠĠĠĠĠĠ Ġreading : ĠPress ure Alt itude Reading , ĊĠĠĠĠĠĠĠ Ġhistory : ĠList < Pressure Alt itude Reading > Ġ= ĠlistOf () ĊĠĠĠ Ġ): ĠPress ure Reading Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcal ibr ator Ġ= ĠSe a Level Calibration Factory (). create ( prefs ) ĊĠĠĠĠĠĠĠ Ġval Ġread ings Ġ= Ġcal ibr ator . cal ibrate ( history Ġ+ ĠlistOf ( reading )) ĊĠĠĠĠĠĠĠ Ġreturn Ġread ings . last OrNull () Ġ?: Ġreading . sea Level ( prefs . weather . sea Level Factor In Temp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun ĠsetData Changed () Ġ{ ĊĠĠĠĠĠĠĠ Ġcached Value . reset () ĊĠĠĠĠĠĠĠ Ġdelay ( 5 0 ) ĊĠĠĠĠĠĠĠ Ġreset Weather Service () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Hour ly Forecast ( read ings : ĠList < Pressure Reading >): ĠWeather Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġweather Service . get Hour ly Weather ( read ings ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Daily Forecast ( read ings : ĠList < Pressure Reading >): ĠWeather Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġweather Service . get Daily Weather ( read ings ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġpopulate Cache (): ĠFore cast Cache Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread ings Ġ= Ġget Pressure History () ĊĠĠĠĠĠĠĠ Ġval Ġdaily Ġ= Ġget Daily Forecast ( read ings ) ĊĠĠĠĠĠĠĠ Ġval Ġhourly Ġ= Ġget Hour ly Forecast ( read ings ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Ġ= Ġread ings . last OrNull () ĊĠĠĠĠĠĠĠ Ġval Ġtend ency Ġ= Ġweather Service . getT end ency ( read ings ) ĊĠĠĠĠĠĠĠ Ġreturn ĠFore cast Cache ( hourly , Ġdaily , Ġtend ency , Ġlast ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Weather Service () Ġ{ ĊĠĠĠĠĠĠĠ Ġweather Service Ġ= ĠWeather Service ( prefs . weather ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠFore cast Cache ( ĊĠĠĠĠĠĠĠ Ġval Ġhourly : ĠWeather , ĊĠĠĠĠĠĠĠ Ġval Ġdaily : ĠWeather , ĊĠĠĠĠĠĠĠ Ġval Ġtend ency : ĠPress ure T end ency , ĊĠĠĠĠĠĠĠ Ġval Ġlast Pressure : ĠPress ure Reading ? ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġinstance : ĠWeather Context ual Service ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ@ Synchron ized ĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance ( context : ĠContext ): ĠWeather Context ual Service Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( instance Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstance Ġ= ĠWeather Context ual Service ( context . application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinstance !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ }