package Ġcom . st yling android . pref ek t . internal Ċ Ċ import Ġandroid . content . SharedPreferences Ċ import Ġcom . st yling android . pref ek t . Subscriber Ċ import Ġkotlinx . coroutines . experimental . async Ċ import Ġkotlinx . coroutines . experimental . launch Ċ Ċ internal Ġclass ĠShared Preference Provider < T Ġ: ĠAny >( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġowner : ĠPref ek t Owner , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġkey : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠdefaultValue : ĠT , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġgetter : ĠSharedPreferences .( String , ĠT ) Ġ-> ĠT , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsetter : ĠSharedPreferences . Editor .( String , ĠT ) Ġ-> ĠSharedPreferences . Editor Ċ ) Ġ: ĠProvider < T >, ĠLifecycle Listener , ĠPublisher < T >, ĠSharedPreferences . On Shared Preference ChangeListener Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġshared Preferences : ĠSharedPreferences ĊĠĠĠ Ġprivate Ġvar Ġsubscriber : ĠSubscriber < T >? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Initial ised ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Preferences Ġ= Ġowner . get SharedPreferences () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialise () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialise () Ġ{ ĊĠĠĠĠĠĠĠ Ġsubscriber ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Preferences . register On Shared Preference ChangeListener ( this @ Shared Preference Provider ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( owner . background Thread ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonChanged ( getValue ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġis Initial ised ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ:: shared Preferences . isInitialized ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠgetValue (): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Initial ised ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" You Ġcannot Ġcall ĠgetValue Ġuntil ĠonCreate () Ġhas Ġcompleted Ġsuccessfully ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġshared Preferences . getter ( key , ĠdefaultValue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠsetValue ( newValue : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Initial ised ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" You Ġcannot Ġcall ĠsetValue Ġuntil ĠonCreate () Ġhas Ġcompleted Ġsuccessfully ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġshared Preferences . edit (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetter ( key , ĠnewValue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsubscribe ( subscriber : ĠSubscriber < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Initial ised ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . subscriber Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared Preferences . register On Shared Preference ChangeListener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġasync ( owner . background Thread ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriber . on Changed ( getValue ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . subscriber Ġ= Ġsubscriber ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Shared Preference Changed ( shared Preferences : ĠSharedPreferences ?, Ġkey : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . key . take If Ġ{ Ġit Ġ== Ġkey Ġ} ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġasync ( owner . background Thread ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriber ?. on Changed ( getValue ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġunsubscribe ( subscriber : ĠSubscriber < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . subscriber ?. take If Ġ{ Ġit Ġ== Ġsubscriber Ġ} ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . subscriber Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Initial ised ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared Preferences . unregister On Shared Preference ChangeListener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsubscriber ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Preferences . unregister On Shared Preference ChangeListener ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġ< T Ġ: ĠAny > Ġcreate ( owner : ĠPref ek t Owner , Ġkey : ĠString , ĠdefaultValue : ĠT ): ĠShared Preference Provider < T > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( defaultValue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBoolean Ġ-> ĠShared Preference Provider ( owner , Ġkey , ĠdefaultValue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSharedPreferences :: getBoolean , ĠSharedPreferences . Editor :: put Boolean ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInt Ġ-> ĠShared Preference Provider ( owner , Ġkey , ĠdefaultValue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSharedPreferences :: getInt , ĠSharedPreferences . Editor :: put Int ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLong Ġ-> ĠShared Preference Provider ( owner , Ġkey , ĠdefaultValue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSharedPreferences :: getLong , ĠSharedPreferences . Editor :: put Long ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFloat Ġ-> ĠShared Preference Provider ( owner , Ġkey , ĠdefaultValue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSharedPreferences :: get Float , ĠSharedPreferences . Editor :: put Float ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ-> ĠShared Preference Provider ( owner , Ġkey , ĠdefaultValue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSharedPreferences :: getString , ĠSharedPreferences . Editor :: putString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Cannot Ġcreate ĠShared Preference Provider Ġfor Ġtype : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdefaultValue :: class . java . canonical Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġas ĠShared Preference Provider < T > ĊĊĊĠĠĠ Ġ} Ċ } ĊĊ