package Ġcom . micro te ars . orange . delegate Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . content . Context Ċ import Ġkotlin . properties . ReadWrite Property Ċ import Ġkotlin . reflect . K Property Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ", Ġ" unused ") Ċ open Ġclass ĠPreference < T >( private Ġval Ġdefault : ĠT ) Ġ: ĊĠĠĠ ĠRead Write Property < Any ?, ĠT > Ġ{ ĊĊĠĠĠ Ġconstructor ( filename : ĠString , Ġdefault : ĠT ) Ġ: Ġthis ( default ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . filename Ġ= Ġfilename ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġinit ( application : ĠApplication ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp anion . application Ġ= Ġapplication ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġapplication : ĠApplication ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcontext Ġget () Ġ= Ġapplication !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġfilename : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġprefs Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( filename Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . get SharedPreferences ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilename , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext . MODE _ PRIVATE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . get SharedPreferences ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . java Class . simple Name /* " default " */, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext . MODE _ PRIVATE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property < *> ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfind Preference ( property . name , Ġdefault ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠsetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >, Ġvalue : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġput Preference ( property . name , Ġvalue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġfind Preference ( name : ĠString , Ġdefault : ĠT ): ĠT Ġ= Ġwith ( prefs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( default Ġis ĠSet < *> Ġ/* && Ġdefault . any Ġ{ Ġit Ġis ĠString Ġ} */) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with ĠgetString Set ( name , Ġdefault Ġas ĠSet < String >) Ġas ĠT ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġres : ĠAny Ġ= Ġwhen Ġ( default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLong Ġ-> Ġget Long ( name , Ġdefault ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ-> ĠgetString ( name , Ġdefault ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInt Ġ-> Ġget Int ( name , Ġdefault ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBoolean Ġ-> Ġget Boolean ( name , Ġdefault ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFloat Ġ-> Ġget Float ( name , Ġdefault ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" This Ġtype Ġcan Ġbe Ġsaved Ġinto ĠPreferences ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġres Ġas ĠT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġput Preference ( name : ĠString , Ġvalue : ĠT ) Ġ= Ġwith ( prefs . edit ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( default Ġis ĠSet < *> Ġ/* && Ġdefault . any Ġ{ Ġit Ġis ĠString Ġ} */) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput String Set ( name , Ġvalue Ġas ĠSet < String >). apply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLong Ġ-> Ġput Long ( name , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġput String ( name , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInt Ġ-> Ġput Int ( name , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBoolean Ġ-> Ġput Boolean ( name , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFloat Ġ-> Ġput Float ( name , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" This Ġtype Ġcan Ġbe Ġsaved Ġinto ĠPreferences ") ĊĠĠĠĠĠĠĠ Ġ}. apply () ĊĠĠĠ Ġ} Ċ }