package Ġorg . ny pl . simpl ified . profiles Ċ Ċ import Ġandroid . content . Context Ċ import Ġcom . google . common . base . Preconditions Ċ import Ġcom . io 7 m . j functional . Option Ċ import Ġcom . io 7 m . j functional . Option Type Ċ import Ġcom . io 7 m . jun reachable . Un reachable Code Exception Ċ import Ġio . reactivex . subjects . Subject Ċ import Ġorg . joda . time . LocalDateTime Ċ import Ġorg . ny pl . simpl ified . accounts . api . Account Authentication Credentials Store Type Ċ import Ġorg . ny pl . simpl ified . accounts . api . Account Bund led Credentials Type Ċ import Ġorg . ny pl . simpl ified . accounts . api . Account Event Ċ import Ġorg . ny pl . simpl ified . accounts . api . Account Provider Type Ċ import Ġorg . ny pl . simpl ified . accounts . database . api . Accounts Database Factory Type Ċ import Ġorg . ny pl . simpl ified . accounts . registry . api . Account Provider Registry Type Ċ import Ġorg . ny pl . simpl ified . analytics . api . Analytics Event Ċ import Ġorg . ny pl . simpl ified . analytics . api . Analytics Type Ċ import Ġorg . ny pl . simpl ified . books . formats . api . Book Format Support Type Ċ import Ġorg . ny pl . simpl ified . files . Directory Utilities Ċ import Ġorg . ny pl . simpl ified . profiles . api . Profile Anonymous Disabled Exception Ċ import Ġorg . ny pl . simpl ified . profiles . api . Profile Anonymous Enabled Exception Ċ import Ġorg . ny pl . simpl ified . profiles . api . Profile Create Duplicate Exception Ċ import Ġorg . ny pl . simpl ified . profiles . api . Profile Create Invalid Exception Ċ import Ġorg . ny pl . simpl ified . profiles . api . Profile Database Exception Ċ import Ġorg . ny pl . simpl ified . profiles . api . Profile ID Ċ import Ġorg . ny pl . simpl ified . profiles . api . Profile None Current Exception Ċ import Ġorg . ny pl . simpl ified . profiles . api . Profile Non existent Exception Ċ import Ġorg . ny pl . simpl ified . profiles . api . Profile Type Ċ import Ġorg . ny pl . simpl ified . profiles . api . Profiles Database Type Ċ import Ġorg . ny pl . simpl ified . profiles . api . Profiles Database Type . Anonymous Profile Enabled . AN ONY MO US _ PROFILE _ DISABLED Ċ import Ġorg . ny pl . simpl ified . profiles . api . Profiles Database Type . Anonymous Profile Enabled . AN ONY MO US _ PROFILE _ ENABLED Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . util . Collections Ċ import Ġjava . util . Sorted Map Ċ import Ġjava . util . UUID Ċ import Ġjava . util . concurrent . Concurrent Skip List Map Ċ import Ġjavax . annotation . concurrent . Gu arded By Ċ Ċ /** Ċ Ġ* ĠThe Ġdefault Ġimplementation Ġof Ġthe Ġ[ Profiles Database Type ] Ġinterface . Ċ Ġ*/ Ċ Ċ internal Ġclass ĠPro files Database Ġinternal Ġconstructor ( ĊĠ Ġprivate Ġval Ġaccount Bund led Credentials : ĠAccount Bund led Credentials Type , ĊĠ Ġprivate Ġval Ġaccount Events : ĠSubject < Account Event >, ĊĠ Ġprivate Ġval Ġaccount Providers : ĠAccount Provider Registry Type , ĊĠ Ġprivate Ġval Ġaccount Credentials Store : ĠAccount Authentication Credentials Store Type , ĊĠ Ġprivate Ġval Ġaccounts Databases : ĠAccounts Database Factory Type , ĊĠ Ġprivate Ġval Ġbook Format Support : ĠBook Format Support Type , ĊĠ Ġprivate Ġval Ġanalytics : ĠAnalytics Type , ĊĠ Ġprivate Ġval Ġanonymous Profile Enabled : ĠPro files Database Type . Anonymous Profile Enabled , ĊĠ Ġprivate Ġval Ġcontext : ĠContext , ĊĠ Ġprivate Ġval Ġdirectory : ĠFile , ĊĠ Ġprivate Ġval Ġprofiles : ĠConcurrent Skip List Map < Profile ID , ĠProfile > Ċ ) Ġ: ĠPro files Database Type Ġ{ ĊĊĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Profiles Database :: class . java ) ĊĊĠ Ġprivate Ġval Ġprofiles ReadOnly : ĠSorted Map < Profile ID , ĠProfile Type > ĊĠ Ġprivate Ġval Ġprofile Current Lock : ĠAny Ġ= ĠAny () ĊĠ Ġ@ Gu arded By (" profile Current Lock ") ĊĠ Ġprivate Ġvar Ġprofile Current : ĠProfile ID ? Ġ= Ġnull ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠPerform Ġan Ġunchecked Ġ( but Ġsafe ) Ġcast Ġof Ġthe Ġgiven Ġmap Ġtype . ĠThe Ġcast Ġis Ġsafe Ġbecause ĊĠĠ Ġ* Ġ` V Ġ<: ĠVB `. ĊĠĠ Ġ*/ ĊĊĠ Ġprivate Ġfun Ġ< K , ĠVB , ĠV Ġ: ĠVB > Ġcast Map ( m : ĠSorted Map < K , ĠV >): ĠSorted Map < K , ĠVB > Ġ{ ĊĠĠĠ Ġreturn Ġm Ġas ĠSorted Map < K , ĠVB > ĊĠ Ġ} ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġthis . profiles ReadOnly Ġ= Ġcast Map ( Collections . unmodifiable Sorted Map ( this . profiles )) ĊĠĠĠ Ġthis . profile Current Ġ= Ġnull ĊĊĠĠĠ Ġfor Ġ( profile Ġin Ġthis . profiles . values ) Ġ{ ĊĠĠĠĠĠ Ġprofile . set Owner ( this ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinternal Ġval Ġdefault Account Provider : ĠAccount Provider Type Ġ= ĊĠĠĠ Ġthis . account Providers . default Provider ĊĊĠ Ġoverride Ġfun Ġanonymous Profile Enabled (): ĠPro files Database Type . Anonymous Profile Enabled Ġ{ ĊĠĠĠ Ġreturn Ġthis . anonymous Profile Enabled ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( Profile Anonymous Disabled Exception :: class ) ĊĠ Ġoverride Ġfun Ġanonymous Profile (): ĠProfile Type Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( this . anonymous Profile Enabled ) Ġ{ ĊĠĠĠĠĠ ĠAN ONY MO US _ PROFILE _ ENABLED Ġ-> ĊĠĠĠĠĠĠĠ Ġthis . profiles [ Profiles Databases . AN ONY MO US _ PROFILE _ ID ] !! ĊĠĠĠĠĠ ĠAN ONY MO US _ PROFILE _ DISABLED Ġ-> ĊĠĠĠĠĠĠĠ Ġthrow ĠProfile Anonymous Disabled Exception (" The Ġanonymous Ġprofile Ġis Ġnot Ġenabled ") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġdirectory (): ĠFile Ġ{ ĊĠĠĠ Ġreturn Ġthis . directory ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġprofiles (): ĠSorted Map < Profile ID , ĠProfile Type > Ġ{ ĊĠĠĠ Ġreturn Ġthis . profiles ReadOnly ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( Profile Database Exception :: class ) ĊĠ Ġoverride Ġfun Ġcreate Profile ( ĊĠĠĠ Ġaccount Provider : ĠAccount Provider Type , ĊĠĠĠ ĠdisplayName : ĠString ĊĠ Ġ): ĠProfile Type Ġ{ ĊĠĠĠ Ġif Ġ( displayName . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠProfile Create Invalid Exception (" Display Ġname Ġcannot Ġbe Ġempty ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġexisting Ġ= Ġthis . find Profile With DisplayName ( displayName ) ĊĠĠĠ Ġif Ġ( existing . is Some ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠProfile Create Duplicate Exception (" Display Ġname Ġis Ġalready Ġused Ġby Ġan Ġexisting Ġprofile ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġnext Ġ= ĠProfile ID ( UUID . randomUUID ()) ĊĊĠĠĠ ĠPreconditions . check Argument ( ĊĠĠĠĠĠ Ġ! this . profiles . containsKey ( next ), ĊĠĠĠĠĠ Ġ" Profile ĠID Ġ% s Ġcannot Ġhave Ġbeen Ġused ", Ġnext ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġprofile Ġ= ĊĠĠĠĠĠ ĠPro files Databases . create Profile Actual ( ĊĠĠĠĠĠĠĠ Ġcontext Ġ= Ġthis . context , ĊĠĠĠĠĠĠĠ Ġanalytics Ġ= Ġthis . analytics , ĊĠĠĠĠĠĠĠ Ġaccount Bund led Credentials Ġ= Ġthis . account Bund led Credentials , ĊĠĠĠĠĠĠĠ Ġaccount Events Ġ= Ġthis . account Events , ĊĠĠĠĠĠĠĠ Ġaccount Providers Ġ= Ġthis . account Providers , ĊĠĠĠĠĠĠĠ Ġaccounts Databases Ġ= Ġthis . accounts Databases , ĊĠĠĠĠĠĠĠ Ġaccount Credentials Store Ġ= Ġthis . account Credentials Store , ĊĠĠĠĠĠĠĠ Ġaccount Provider Ġ= Ġaccount Provider , ĊĠĠĠĠĠĠĠ Ġbook Format Support Ġ= Ġthis . book Format Support , ĊĠĠĠĠĠĠĠ Ġdirectory Ġ= Ġthis . directory , ĊĠĠĠĠĠĠĠ ĠdisplayName Ġ= ĠdisplayName , ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġnext ĊĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġthis . profiles [ profile . id ] Ġ= Ġprofile ĊĠĠĠ Ġprofile . set Owner ( this ) ĊĊĠĠĠ Ġlog Profile Created ( profile ) ĊĠĠĠ Ġreturn Ġprofile ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġfind Profile With DisplayName ( displayName : ĠString ): ĠOption Type < Profile Type > Ġ{ ĊĠĠĠ Ġfor Ġ( profile Ġin Ġthis . profiles . values ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( profile . displayName Ġ== ĠdisplayName ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠOption . some ( profile ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠOption . none () ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( Profile Non existent Exception :: class , ĠProfile Anonymous Enabled Exception :: class ) ĊĠ Ġoverride Ġfun Ġset Profile Current ( profile : ĠProfile ID ) Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( this . anonymous Profile Enabled ) Ġ{ ĊĠĠĠĠĠ ĠAN ONY MO US _ PROFILE _ ENABLED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠProfile Anonymous Enabled Exception ( ĊĠĠĠĠĠĠĠĠĠ Ġ" The Ġanonymous Ġprofile Ġis Ġenabled ; Ġcannot Ġset Ġthe Ġcurrent Ġprofile " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠAN ONY MO US _ PROFILE _ DISABLED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! this . profiles . containsKey ( profile )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠProfile Non existent Exception (" Profile Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . setCurrent Profile ( profile ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun ĠsetCurrent Profile ( profile : ĠProfile ID ) Ġ{ ĊĠĠĠ Ġthis . logger . debug (" setCurrent Profile : Ġ{}", Ġprofile ) ĊĠĠĠ Ġsynchronized ( this . profile Current Lock ) Ġ{ ĊĠĠĠĠĠ Ġthis . profile Current Ġ= Ġprofile ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcurrent Profile (): ĠOption Type < Profile Type > Ġ{ ĊĠĠĠ Ġreturn Ġsynchronized ( this . profile Current Lock ) Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ( this . anonymous Profile Enabled ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAN ONY MO US _ PROFILE _ ENABLED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOption . some ( this . anonymous Profile ()) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠProfile Anonymous Disabled Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUn reachable Code Exception ( e ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠAN ONY MO US _ PROFILE _ DISABLED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠOption . of < Profile ID >( this . profile Current ). map Ġ{ Ġid Ġ-> Ġthis . profiles [ id ] Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( Profile None Current Exception :: class ) ĊĠ Ġoverride Ġfun Ġcurrent Profile Unsafe (): ĠProfile Type Ġ{ ĊĠĠĠ Ġreturn Ġthis . current Profile Get () ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( Profile None Current Exception :: class ) ĊĠ Ġprivate Ġfun Ġcurrent Profile Get (): ĠProfile Ġ{ ĊĠĠĠ Ġsynchronized ( this . profile Current Lock ) Ġ{ ĊĠĠĠĠĠ Ġval Ġid Ġ= Ġthis . profile Current ĊĠĠĠĠĠ Ġif Ġ( id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . profiles [ id ] !! ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġthrow ĠProfile None Current Exception (" No Ġprofile Ġis Ġcurrent ") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġinternal Ġfun Ġdelete Profile ( profile : ĠProfile ) Ġ{ ĊĠĠĠ Ġsynchronized ( this . profile Current Lock ) Ġ{ ĊĠĠĠĠĠ Ġthis . profiles . remove ( profile . id ) ĊĠĠĠĠĠ Ġif Ġ( this . profile Current Ġ== Ġprofile . id ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . profile Current Ġ= Ġnull ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠDirectory Utilities . directory Delete ( profile . directory ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġlog Profile Created ( profile : ĠProfile ) Ġ{ ĊĠĠĠ Ġthis . analytics . publish Event ( ĊĠĠĠĠĠ ĠAnalytics Event . Profile Created ( ĊĠĠĠĠĠĠĠ Ġtimestamp Ġ= ĠLocalDateTime . now (), ĊĠĠĠĠĠĠĠ Ġcredentials Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġprofile UUID Ġ= Ġprofile . id . uuid , ĊĠĠĠĠĠĠĠ ĠdisplayName Ġ= Ġprofile . displayName , ĊĠĠĠĠĠĠĠ Ġbirth Date Ġ= Ġprofile . preferences (). date OfBirth ?. show (), ĊĠĠĠĠĠĠĠ Ġattributes Ġ= Ġprofile . description (). attributes . attributes ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠ Ġ} Ċ } Ċ