package Ġshort course . read ium . core . storage Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroidx . core . content . edit Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . reflect . Type Token Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġshort course . read ium . core . model . account . Account Ċ import Ġshort course . read ium . core . util . Entities Ċ import Ġshort course . read ium . core . util . Storage Util Ċ Ċ /** Ċ Ġ* ĠMaint ains Ġthe Ġuser 's Ġlogin Ġstate Ċ Ġ*/ Ċ class ĠAccount Prefs Ġprivate Ġconstructor ( context : ĠContext ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġprefs : ĠSharedPreferences Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . get SharedPreferences ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStorage Util . ACCOUNT _ PRE FS , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext . MODE _ PRIVATE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġcurrent ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġauth Token : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . edit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( Storage Util . Keys . ID , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ live State . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġ! value . isNull OrEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġprefs . getString ( Storage Util . Keys . ID , Ġnull ) ĊĊĠĠĠ Ġvar Ġroles : ĠMutable List < String > Ġ= Ġmutable ListOf ( Entities . Role . G UEST . label ) ĊĠĠĠĠĠĠĠ Ġprivate Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . edit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( Storage Util . Keys . RO LES , ĠGson (). toJson ( value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġgenerate Role Defaults () ĊĊĠĠĠ Ġ// ĠGets Ġthe Ġcurrent Ġlogin Ġstate ĊĠĠĠ Ġval Ġis LoggedIn : ĠBoolean Ġget () Ġ= Ġ! auth Token . isNull OrEmpty () ĊĊĠĠĠ Ġprivate Ġval Ġ_ live State : ĠFlow < Boolean > Ġ= Ġflow Ġ{ ĊĠĠĠĠĠĠĠ Ġemit ( is LoggedIn ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcurrent State : ĠFlow < Boolean > Ġget () Ġ= Ġ_ live State ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInitial Ġvalues ĊĠĠĠĠĠĠĠ Ġauth Token Ġ= Ġprefs . getString ( Storage Util . Keys . ID , Ġnull ) ĊĠĠĠĠĠĠĠ Ġroles Ġ= Ġgenerate Role Defaults () ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġflow Ġstate ĊĠĠĠĠĠĠĠ Ġ_ live State . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġ! auth Token . isNull OrEmpty () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLogin Ġuser ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlogin ( account : ĠAccount ) Ġ{ ĊĠĠĠĠĠĠĠ Ġroles Ġ= Ġaccount . roles ĊĠĠĠĠĠĠĠ Ġauth Token Ġ= Ġaccount . id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLogout Ġuser ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlogout () Ġ{ ĊĠĠĠĠĠĠĠ Ġprefs . edit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ_ live State . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠGenerates Ġthe Ġdefault Ġvalues Ġfor Ġthe Ġroles ĊĠĠĠ Ġprivate Ġfun Ġgenerate Role Defaults (): ĠMutable List < String > Ġ= ĠGson (). fromJson < List < String >>( ĊĠĠĠĠĠĠĠ Ġprefs . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStorage Util . Keys . RO LES , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGson (). toJson ( mutable ListOf ( Entities . Role . G UEST . label )) ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠType Token < List < String >>() Ġ{} . type ĊĠĠĠ Ġ). to Mutable List () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Volatile ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġinstance : ĠAccount Prefs ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance ( context : ĠContext ): ĠAccount Prefs Ġ= Ġinstance Ġ?: Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance Ġ?: ĠAccount Prefs ( context ). also Ġ{ Ġinstance Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }