package Ġcom . ba el . pin . base Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . content . Context Ċ import Ġcom . ba el . pin . ext . is Nullable Type Ċ import Ġcom . ba el . pin . implementation . Pin Property Encrypted Impl Ċ import Ġcom . ba el . pin . implementation . Pin Property Impl Ċ import Ġcom . ba el . pin . type . Pin NonNull Ċ import Ġcom . ba el . pin . type . Pin Nullable Ċ import Ġkotlinx . coroutines . Dispatch ers . IO Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . properties . Deleg ates Ċ import Ġkotlin . properties . ReadWrite Property Ċ import Ġkotlin . reflect . K Property Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġer ick sum argo Ġon Ġ 1 0 / 0 3 / 2 0 . Ċ Ġ*/ Ċ class ĠPin < T > Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġkey : ĠString , ĊĠĠĠ Ġprivate Ġval ĠdefaultValue : ĠT Ċ ) Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( key . isNotBlank ()) Ġ{ Ġ" key Ġcannot Ġbe Ġempty " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġoperator Ġfun Ġprovide Delegate ( ĊĠĠĠĠĠĠĠ Ġthis Ref : ĠAny , ĊĠĠĠĠĠĠĠ Ġproperty : ĠK Property < *> ĊĠĠĠ Ġ): ĠRead Write Property < Any , ĠT > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpin Type Ġ= Ġpin Types . get Or Put ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( property . is Nullable Type ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPin Nullable ( key , ĠdefaultValue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPin NonNull ( key , ĠdefaultValue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpin Type Ġas ĠRead Write Property < Any , ĠT > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġlateinit Ġvar Ġcontext : ĠContext ĊĠĠĠĠĠĠĠ Ġinternal Ġlateinit Ġvar ĠfileName : ĠString ĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġuse Encrypted Mode : ĠBoolean Ġby ĠDeleg ates . notNull () ĊĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġcoroutine Context : ĠCor outine Context Ġby Ġlazy Ġ{ ĠIO Ġ+ ĠJob () Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġpin : ĠPin Preferences Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use Encrypted Mode ) ĠPin Preferences ( Pin Property Encrypted Impl , Ġcoroutine Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠPin Preferences ( Pin Property Impl , Ġcoroutine Context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġpin Types : ĠHashMap < String , ĠRead Write Property < Any , Ġ* >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Map Of < String , ĠRead Write Property < Any , Ġ* >>() ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġinit ( context : ĠApplication , ĠfileName : ĠString , Ġuse Encrypted Mode : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . context Ġ= Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . fileName Ġ= ĠfileName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . use Encrypted Mode Ġ= Ġuse Encrypted Mode ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( fileName . isNotBlank ()) Ġ{ Ġ" file Ġname Ġcannot Ġbe Ġempty " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġif Ġkey Ġis Ġset , Ġremove Ġthe Ġassociated Ġvalue Ġalong Ġwith Ġthe Ġkey . ĊĠĠĠĠĠĠĠĠ Ġ* Ġelse , Ġclear Ġall Ġdata ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġclear ( key : ĠString Ġ= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpin Types . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key . isNotBlank ()) Ġremove ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġclear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpin . clear ( key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ