package Ġio . homeassistant . comp anion . android . common . data . authentication . impl Ċ Ċ import Ġandroid . util . Log Ċ import Ġcom . fasterxml . jackson . databind . Deserialization Feature Ċ import Ġcom . fasterxml . jackson . databind . JsonNode Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . databind . Property Naming Str ategies Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġio . homeassistant . comp anion . android . common . data . LocalStorage Ċ import Ġio . homeassistant . comp anion . android . common . data . authentication . Authentication Repository Ċ import Ġio . homeassistant . comp anion . android . common . data . authentication . Authorization Exception Ċ import Ġio . homeassistant . comp anion . android . common . data . authentication . Session State Ċ import Ġio . homeassistant . comp anion . android . common . data . authentication . impl . entities . Login Flow Authentication Ċ import Ġio . homeassistant . comp anion . android . common . data . authentication . impl . entities . Login Flow Create Entry Ċ import Ġio . homeassistant . comp anion . android . common . data . authentication . impl . entities . Login Flow Form Ċ import Ġio . homeassistant . comp anion . android . common . data . authentication . impl . entities . Login Flow M fa Code Ċ import Ġio . homeassistant . comp anion . android . common . data . authentication . impl . entities . Login Flow Request Ċ import Ġio . homeassistant . comp anion . android . common . data . authentication . impl . entities . Login Flow Response Ċ import Ġio . homeassistant . comp anion . android . common . data . url . Url Repository Ċ import Ġokhttp 3 . Http Url . Companion . to Http Url OrNull Ċ import Ġokhttp 3 . ResponseBody Ċ import Ġjava . net . URL Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Named Ċ Ċ class ĠAuthentication Repository Impl Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġauthentication Service : ĠAuthentication Service , ĊĠĠĠ Ġ@ Named (" session ") Ġprivate Ġval ĠlocalStorage : ĠLocal Storage , ĊĠĠĠ Ġprivate Ġval Ġurl Repository : ĠUrl Repository Ċ ) Ġ: ĠAuthentication Repository Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Auth Repo " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP REF _ ACCESS _ TOKEN Ġ= Ġ" access _ token " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP REF _ EXPI RED _ DATE Ġ= Ġ" expires _ date " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP REF _ REFRESH _ TOKEN Ġ= Ġ" refresh _ token " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP REF _ TOKEN _ TYPE Ġ= Ġ" token _ type " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP REF _ BIO METRIC _ ENABLED Ġ= Ġ" bio metric _ enabled " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmapper Ġ= Ġj ack son ObjectMapper () ĊĠĠĠĠĠĠĠ Ġ. configure ( Deserialization Feature . FAIL _ ON _ UNKNOWN _ PROPERTIES , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ. setProperty Naming Strategy ( Property Naming Str ategies . S NA KE _ CASE ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġinitiate Login Flow (): ĠLogin Flow Form Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġurl Repository . getUrl ()?. to Http Url OrNull (). toString () ĊĠĠĠĠĠĠĠ Ġreturn Ġauthentication Service . initialize Login ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ+ Ġ" auth / login _ flow ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogin Flow Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuthentication Service . CLIENT _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuthentication Service . AUTH _ CALLBACK , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuthentication Service . HANDLER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġlogin Authentication ( flow Id : ĠString , Ġusername : ĠString , Ġpassword : ĠString ): ĠLogin Flow Response ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġurl Repository . getUrl ()?. to Http Url OrNull () ĊĠĠĠĠĠĠĠ Ġif Ġ( url Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Unable Ġto Ġauthenticate Ġwith Ġusername / password .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAuthorization Exception () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġauthentication Service . authenticate Password ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl . newBuilder (). add Path Segments ( Authentication Service . AUTHENT ICATE _ BASE _ PATH Ġ+ Ġflow Id ). build (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogin Flow Authentication ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuthentication Service . CLIENT _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusername , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful Ġ|| Ġresponse . body () Ġ== Ġnull ) Ġthrow ĠAuthorization Exception () ĊĠĠĠĠĠĠĠ Ġreturn Ġmap Login Flow Response ( response . body () !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġlogin Code ( flow Id : ĠString , Ġcode : ĠString ): ĠLogin Flow Response ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġurl Repository . getUrl ()?. to Http Url OrNull () ĊĠĠĠĠĠĠĠ Ġif Ġ( url Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Unable Ġto Ġauthenticate Ġwith ĠM FA Ġcode .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAuthorization Exception () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġauthentication Service . authenticate M fa ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl . newBuilder (). add Path Segments ( Authentication Service . AUTHENT ICATE _ BASE _ PATH Ġ+ Ġflow Id ). build (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogin Flow M fa Code ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuthentication Service . CLIENT _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful Ġ|| Ġresponse . body () Ġ== Ġnull ) Ġthrow ĠAuthorization Exception () ĊĠĠĠĠĠĠĠ Ġreturn Ġmap Login Flow Response ( response . body () !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġregister Authorization Code ( authorization Code : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġurl Repository . getUrl ()?. to Http Url OrNull () ĊĠĠĠĠĠĠĠ Ġif Ġ( url Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Unable Ġto Ġregister Ġauth Ġcode .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġauthentication Service . getToken ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl . newBuilder (). add Path Segments (" auth / token "). build (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuthentication Service . GRANT _ TYPE _ CODE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthorization Code , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuthentication Service . CLIENT _ ID ĊĠĠĠĠĠĠĠ Ġ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Session ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSession ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . accessToken , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . currentTimeMillis () Ġ/ Ġ 1 0 0 0 Ġ+ Ġit . expires In , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . refresh Token !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . token Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġretrieve External Authentication ( force Refresh : ĠBoolean ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconvert Session ( ensure Valid Session ( force Refresh )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġretrieve AccessToken (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġensure Valid Session ( false ). accessToken ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġre voke Session () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsession Ġ= Ġretrieve Session () ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġurl Repository . getUrl ()?. to Http Url OrNull () ĊĠĠĠĠĠĠĠ Ġif Ġ( session Ġ== Ġnull Ġ|| Ġurl Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Unable Ġto Ġre voke Ġsession .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġauthentication Service . revoke Token ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl . newBuilder (). add Path Segments (" auth / token "). build (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession . refresh Token , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuthentication Service . RE VOKE _ ACTION ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġsave Session ( null ) ĊĠĠĠĠĠĠĠ Ġurl Repository . save Url ("", Ġtrue ) ĊĠĠĠĠĠĠĠ Ġurl Repository . save Url ("", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġurl Repository . save Home Wifi Ss ids ( empty Set ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Session State (): ĠSession State Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( retrieve Session () Ġ!= Ġnull Ġ&& Ġurl Repository . getUrl () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSession State . CONNECTED ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSession State . AN ONY MO US ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġbuild Authentication Url ( callback Url : ĠString ): ĠURL Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġurl Repository . getUrl () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġurl !!. to Http Url OrNull () !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Path Segments (" auth / authorize ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Encoded QueryParameter (" response _ type ", Ġ" code ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Encoded QueryParameter (" client _ id ", ĠAuthentication Service . CLIENT _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Encoded QueryParameter (" redirect _ uri ", Ġcallback Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Url () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġbuild Bearer Token (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Bearer Ġ" Ġ+ Ġensure Valid Session (). accessToken ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmap Login Flow Response ( response Body : ĠResponse Body ): ĠLogin Flow Response ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse Text Ġ= Ġresponse Body . char Stream (). read Text () ĊĠĠĠĠĠĠĠ Ġval Ġmessage : ĠJsonNode ? Ġ= Ġmapper . readValue ( responseText ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( message ?. get (" type ") ?. text Value ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" form " Ġ-> Ġmapper . readValue ( responseText , ĠLogin Flow Form :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" create _ entry " Ġ-> Ġmapper . readValue ( responseText , ĠLogin Flow Create Entry :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Session ( session : ĠSession ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObjectMapper (). writeValue AsString ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" access _ token " Ġto Ġsession . accessToken , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" expires _ in " Ġto Ġsession . expires In () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġretrieve Session (): ĠSession ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠaccessToken Ġ= ĠlocalStorage . getString ( PRE F _ ACCESS _ TOKEN ) ĊĠĠĠĠĠĠĠ Ġval Ġexpired Date Ġ= ĠlocalStorage . getLong ( PRE F _ EXPI RED _ DATE ) ĊĠĠĠĠĠĠĠ Ġval Ġrefresh Token Ġ= ĠlocalStorage . getString ( PRE F _ REFRESH _ TOKEN ) ĊĠĠĠĠĠĠĠ Ġval Ġtoken Type Ġ= ĠlocalStorage . getString ( PRE F _ TOKEN _ TYPE ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( accessToken Ġ!= Ġnull Ġ&& Ġexpired Date Ġ!= Ġnull Ġ&& Ġrefresh Token Ġ!= Ġnull Ġ&& Ġtoken Type Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSession ( accessToken , Ġexpired Date , Ġrefresh Token , Ġtoken Type ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġensure Valid Session ( force Refresh : ĠBoolean Ġ= Ġfalse ): ĠSession Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsession Ġ= Ġretrieve Session () ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġurl Repository . getUrl ()?. to Http Url OrNull () ĊĠĠĠĠĠĠĠ Ġif Ġ( session Ġ== Ġnull Ġ|| Ġurl Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Unable Ġto Ġre voke Ġsession .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAuthorization Exception () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( session . is Expired () Ġ|| Ġforce Refresh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġauthentication Service . refresh Token ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl . newBuilder (). add Path Segments (" auth / token "). build (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuthentication Service . GRANT _ TYPE _ REFRESH , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession . refresh Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuthentication Service . CLIENT _ ID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref reshed Token Ġ= Ġit . body () Ġ?: Ġthrow ĠAuthorization Exception () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrefresh Session Ġ= ĠSession ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref reshed Token . accessToken , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . currentTimeMillis () Ġ/ Ġ 1 0 0 0 Ġ+ Ġref reshed Token . expires In , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession . refresh Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref reshed Token . token Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Session ( refresh Session ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ let Ġrefresh Session ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it . code () Ġ== Ġ 4 0 0 Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . error Body ()?. string ()?. contains (" invalid _ grant ") Ġ== Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre voke Session () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAuthorization Exception () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsession ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsave Session ( session : ĠSession ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠlocalStorage . putString ( PRE F _ ACCESS _ TOKEN , Ġsession ?. accessToken ) ĊĠĠĠĠĠĠĠ ĠlocalStorage . put Long ( PRE F _ EXPI RED _ DATE , Ġsession ?. expires Timestamp ) ĊĠĠĠĠĠĠĠ ĠlocalStorage . putString ( PRE F _ REFRESH _ TOKEN , Ġsession ?. refresh Token ) ĊĠĠĠĠĠĠĠ ĠlocalStorage . putString ( PRE F _ TOKEN _ TYPE , Ġsession ?. token Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġset Lock Enabled ( enabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠlocalStorage . put Boolean ( PRE F _ BIO METRIC _ ENABLED , Ġenabled ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġis Lock Enabled (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠlocalStorage . getBoolean ( PRE F _ BIO METRIC _ ENABLED ) ĊĠĠĠ Ġ} Ċ } Ċ