package Ġorg . covid watch . android . data . pref Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Context . MODE _ PRIVATE Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroidx . annotation . Worker Thread Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġcom . google . gson . Gson Ċ import Ġorg . covid watch . android . data . Default Regions Ċ import Ġorg . covid watch . android . data . model .* Ċ import Ġjava . time . Instant Ċ import Ġkotlin . properties . ReadWrite Property Ċ import Ġkotlin . reflect . K Property Ċ Ċ /** Ċ Ġ* ĠStorage Ġfor Ġapp Ġand Ġuser Ġpreferences . Ċ Ġ*/ Ċ interface ĠPreference Storage Ġ{ ĊĠĠĠ Ġvar Ġlast Fetch Date : ĠLong ĊĠĠĠ Ġvar Ġon boarding Finished : ĠBoolean ĊĠĠĠ Ġvar Ġshow On boarding Home Animation : ĠBoolean ĊĊĠĠĠ Ġvar Ġlast Checked For Ex pos ures : ĠInstant ĊĠĠĠ Ġval Ġobservable Last Checked For Ex pos ures : ĠLive Data < Instant > ĊĊĠĠĠ Ġvar Ġrisk Metrics : ĠR isk Metrics ? ĊĠĠĠ Ġval Ġobservable Risk Metrics : ĠLive Data < Risk Metrics ?> ĊĊĠĠĠ Ġvar Ġregions : ĠReg ions ĊĠĠĠ Ġval Ġobservable Regions : ĠLive Data < Regions > ĊĠĠĠ Ġval Ġregion : ĠRegion ĊĠĠĠ Ġval Ġobservable Region : ĠLive Data < Region > ĊĠĠĠ Ġvar Ġselected Region : ĠInt ĊĊĠĠĠ Ġval Ġrisk Model Configuration : ĠR isk Model Configuration ĊĠĠĠ Ġval Ġexposure Configuration : ĠC ov id Exposure Configuration Ċ } Ċ Ċ class ĠShared Preference Storage ( context : ĠContext ) Ġ: ĠPreference Storage Ġ{ ĊĠĠĠ Ġprivate Ġval Ġgson : ĠGson ĊĊĠĠĠ Ġprivate Ġval Ġprefs Ġ= Ġcontext . application Context . get SharedPreferences ( NAME , ĠMODE _ PRIVATE ) ĊĠĠĠ Ġprivate Ġval Ġ_ last Checked For Ex pos ures Ġ= ĠMutable LiveData < Instant >() ĊĠĠĠ Ġprivate Ġval Ġ_ regions Ġ= ĠMutable LiveData < Regions >() ĊĠĠĠ Ġprivate Ġval Ġ_ risk Metrics Ġ= ĠMutable LiveData < Risk Metrics ?> () ĊĠĠĠ Ġprivate Ġval Ġ_ region Ġ= ĠMutable LiveData < Region >() ĊĊĠĠĠ Ġprivate Ġval Ġchange Listener Ġ= ĠSharedPreferences . On Shared Preference ChangeListener Ġ{ Ġ_, Ġkey Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLAST _ CHECK ED _ FOR _ EX POS URE S Ġ-> Ġ_ last Checked For Ex pos ures . value Ġ= Ġlast Checked For Ex pos ures ĊĠĠĠĠĠĠĠĠĠĠĠ ĠREG IONS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ regions . value Ġ= Ġregions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ region . value Ġ= Ġregion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSELECT ED _ REGION Ġ-> Ġ_ region . value Ġ= Ġregion ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR IS K _ METR ICS Ġ-> Ġ_ risk Metrics . value Ġ= Ġrisk Metrics ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġprefs . register On Shared Preference ChangeListener ( change Listener ) ĊĠĠĠĠĠĠĠ Ġgson Ġ= Ġgson With Instant Adapter () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġvar Ġlast Fetch Date Ġby ĠPreference ( prefs , ĠLAST _ FETCH _ DATE , Ġ 0 L ) ĊĊĠĠĠ Ġoverride Ġvar Ġon boarding Finished Ġby ĠPreference ( prefs , ĠON BOARD ING _ FINISHED , Ġfalse ) ĊĊĠĠĠ Ġoverride Ġvar Ġshow On boarding Home Animation Ġby ĠPreference ( ĊĠĠĠĠĠĠĠ Ġprefs , ĊĠĠĠĠĠĠĠ ĠSHOW _ ON BOARD ING _ HOME _ ANIM ATION , ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġvar Ġlast Checked For Ex pos ures : ĠInstant Ġby ĠObject Preference ( ĊĠĠĠĠĠĠĠ Ġprefs , ĊĠĠĠĠĠĠĠ ĠLAST _ CHECK ED _ FOR _ EX POS URE S , ĊĠĠĠĠĠĠĠ ĠInstant . now (), ĊĠĠĠĠĠĠĠ ĠInstant :: class . java , ĊĠĠĠĠĠĠĠ Ġgson Ġ= Ġgson ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġval Ġobservable Last Checked For Ex pos ures : ĠLive Data < Instant > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ last Checked For Ex pos ures . also Ġ{ Ġit . value Ġ= Ġlast Checked For Ex pos ures Ġ} ĊĊĠĠĠ Ġoverride Ġvar Ġrisk Metrics : ĠR isk Metrics ? Ġby ĠNullable Object Preference ( ĊĠĠĠĠĠĠĠ Ġprefs , ĊĠĠĠĠĠĠĠ ĠR IS K _ METR ICS , ĊĠĠĠĠĠĠĠ ĠR isk Metrics :: class . java , ĊĠĠĠĠĠĠĠ Ġgson Ġ= Ġgson ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġval Ġobservable Risk Metrics : ĠLive Data < Risk Metrics ?> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ risk Metrics . also Ġ{ Ġit . value Ġ= Ġrisk Metrics Ġ} ĊĊĠĠĠ Ġoverride Ġvar Ġregions : ĠReg ions Ġby ĠObject Preference ( ĊĠĠĠĠĠĠĠ Ġprefs , ĊĠĠĠĠĠĠĠ ĠREG IONS , ĊĠĠĠĠĠĠĠ ĠReg ions ( Default Regions . all ), ĊĠĠĠĠĠĠĠ ĠReg ions :: class . java ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġval Ġobservable Regions : ĠLive Data < Regions > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ regions . also Ġ{ Ġit . value Ġ= Ġregions Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġregion : ĠRegion ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġregions . regions . find Ġ{ Ġselected Region Ġ== Ġit . id Ġ} Ġ?: Ġregions . regions . first () ĊĊĠĠĠ Ġoverride Ġval Ġrisk Model Configuration : ĠR isk Model Configuration ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġregion . risk Model Configuration ĊĊĠĠĠ Ġoverride Ġvar Ġselected Region Ġby ĠPreference ( prefs , ĠSELECT ED _ REGION , Ġ 0 ) ĊĊĠĠĠ Ġoverride Ġval Ġobservable Region : ĠLive Data < Region > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ region . also Ġ{ Ġit . value Ġ= Ġregion Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġexposure Configuration : ĠC ov id Exposure Configuration ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġregion . ex posure Configuration . as Cov id Exposure Configuration () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNAME Ġ= Ġ" ag _ minimal _ prefs " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLAST _ FETCH _ DATE Ġ= Ġ" last _ fetch _ date " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLAST _ CHECK ED _ FOR _ EX POS URE S Ġ= Ġ" last _ checked _ for _ ex pos ures " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠR IS K _ METR ICS Ġ= Ġ" risk _ metrics " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠREG IONS Ġ= Ġ" regions " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSELECT ED _ REGION Ġ= Ġ" selected _ region " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠON BOARD ING _ FINISHED Ġ= Ġ" on boarding _ finished " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSHOW _ ON BOARD ING _ HOME _ ANIM ATION Ġ= Ġ" show _ on boarding _ home _ animation " ĊĠĠĠ Ġ} Ċ } Ċ Ċ open Ġclass ĠNullable Object Preference < T >( ĊĠĠĠ Ġprivate Ġval Ġpreferences : ĠSharedPreferences , ĊĠĠĠ Ġprivate Ġval Ġname : ĠString , ĊĠĠĠ Ġprivate Ġval Ġclazz : ĠClass < T >, ĊĠĠĠ Ġprivate Ġval ĠdefaultValue : ĠT ? Ġ= Ġnull , ĊĠĠĠ Ġprivate Ġval Ġgson : ĠGson Ġ= ĠGson () Ċ ) Ġ: ĠRead Write Property < Any , ĠT ?> Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġvalue : ĠT ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠAny , Ġproperty : ĠK Property < *> ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpreferences . getString ( name , Ġnull )?. let Ġ{ Ġjson Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ?: Ġgson . fromJson ( json , Ġclazz ). also Ġ{ Ġvalue Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: ĠdefaultValue ?. also Ġ{ ĠsetValue ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠsetValue ( this Ref : ĠAny , Ġproperty : ĠK Property <* >, Ġvalue : ĠT ?) Ġ= ĠsetValue ( value ) ĊĊĠĠĠ Ġprivate Ġfun ĠsetValue ( value : ĠT ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . value Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġpreferences . edit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( name , Ġgson . toJson ( value )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠObject Preference < T >( ĊĠĠĠ Ġpreferences : ĠSharedPreferences , ĊĠĠĠ Ġname : ĠString , ĊĠĠĠ ĠdefaultValue : ĠT , ĊĠĠĠ Ġclazz : ĠClass < T >, ĊĠĠĠ Ġgson : ĠGson Ġ= ĠGson () Ċ ) Ġ: ĠNullable Object Preference < T >( preferences , Ġname , Ġclazz , ĠdefaultValue , Ġgson ) Ġ{ ĊĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠAny , Ġproperty : ĠK Property <* >) Ġ= ĊĠĠĠĠĠĠĠ Ġsuper . getValue ( this Ref , Ġproperty ) !! Ċ } Ċ Ċ open Ġclass ĠNullable Preference < T >( ĊĠĠĠ Ġprivate Ġval Ġpreferences : ĠSharedPreferences , ĊĠĠĠ Ġprivate Ġval Ġname : ĠString , ĊĠĠĠ Ġprivate Ġval ĠdefaultValue : ĠT ? Ċ ) Ġ: ĠRead Write Property < Any , ĠT ?> Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġvalue : ĠT ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠAny , Ġproperty : ĠK Property < *> ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue Ġ?: Ġpreferences . get ( name , ĠdefaultValue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠsetValue ( this Ref : ĠAny , Ġproperty : ĠK Property <* >, Ġvalue : ĠT ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . value Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġpreferences . put ( name , Ġvalue ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠPreference < T >( ĊĠĠĠ Ġpreferences : ĠSharedPreferences , ĊĠĠĠ Ġname : ĠString , ĊĠĠĠ ĠdefaultValue : ĠT Ċ ) Ġ: ĠNullable Preference < T >( preferences , Ġname , ĠdefaultValue ) Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠAny , Ġproperty : ĠK Property <* >) Ġ= ĊĠĠĠĠĠĠĠ Ġsuper . getValue ( this Ref , Ġproperty ) !! Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun Ġ< T > ĠSharedPreferences . get ( name : ĠString , ĠdefaultValue : ĠT ? Ġ= Ġnull ): ĠT ? Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( defaultValue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠBoolean Ġ-> Ġget Boolean ( name , ĠdefaultValue ) Ġas ĠT ĊĠĠĠĠĠĠĠ Ġis ĠFloat Ġ-> Ġget Float ( name , ĠdefaultValue ) Ġas ĠT ĊĠĠĠĠĠĠĠ Ġis ĠLong Ġ-> Ġget Long ( name , ĠdefaultValue ) Ġas ĠT ĊĠĠĠĠĠĠĠ Ġis ĠInt Ġ-> Ġget Int ( name , ĠdefaultValue ) Ġas ĠT ĊĠĠĠĠĠĠĠ Ġis ĠString Ġ-> ĠgetString ( name , ĠdefaultValue ) Ġas ĠT ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠdefaultValue ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun Ġ< T > ĠSharedPreferences . put ( name : ĠString , Ġvalue : ĠT ) Ġ{ ĊĠĠĠ Ġval Ġeditor Ġ= Ġedit () ĊĊĠĠĠ Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠBoolean Ġ-> Ġeditor . put Boolean ( name , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġis ĠFloat Ġ-> Ġeditor . put Float ( name , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġis ĠLong Ġ-> Ġeditor . put Long ( name , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġis ĠInt Ġ-> Ġeditor . put Int ( name , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġeditor . putString ( name , Ġvalue ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġeditor . apply () Ċ }