package Ġcom . fs ry an . tools . logging . android Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Resources Ċ import Ġandroidx . annotation . Any Thread Ċ import Ġandroidx . annotation . Call Super Ċ import Ġandroidx . annotation . MainThread Ċ import Ġcom . fs ry an . tools . logging . F SE vent Logger Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġjava . util . concurrent . Copy On Write Array Set Ċ Ċ internal Ġval Ġsession StartTime Millis Ġ= ĠSystem . currentTimeMillis () Ċ Ċ /** Ċ Ġ* ĠAn Ġinterface Ġto Ġenable ĠAndroid Ġapplication - specific Ġinitialization Ġof Ċ Ġ* Ġan Ġevent Ġlogger . Ċ Ġ*/ Ċ abstract Ġclass ĠContext Specific Event Logger Ġ: ĠF SE vent Logger Ġ{ ĊĊĠĠĠ Ġprotected Ġval Ġcount able Attrs : ĠMutable Map < String , ĠLong > Ġ= ĠConcurrent HashMap () ĊĠĠĠ Ġprotected Ġval Ġdouble Properties : ĠMutable Set < String > Ġ= ĠCopy On Write Array Set () ĊĠĠĠ Ġprotected Ġval Ġlong Properties : ĠMutable Set < String > Ġ= ĠCopy On Write Array Set () ĊĠĠĠ Ġprotected Ġval Ġboolean Properties : ĠMutable Set < String > Ġ= ĠCopy On Write Array Set () ĊĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġapp U ptime Attr Name : ĠString ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġtimestamp Attr Name : ĠString ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠImplement ations Ġshould Ġassume Ġthey Ġwill Ġbe Ġcalled Ġat Ġor Ġclose Ġto ĊĠĠĠĠ Ġ* Ġ` onCreate ()` Ġof Ġthe Ġ` Application `. ĠIn Ġthis Ġfunction , Ġimplementations ĊĠĠĠĠ Ġ* Ġshould Ġdo Ġany Ġinitialization . ĠAlso , Ġyou Ġcan Ġlook Ġfor Ġthe Ġfollowing ĊĠĠĠĠ Ġ* Ġ` string - array ` Ġvalues Ġin Ġorder Ġto Ġknow Ġwhich Ġattributes Ġcorrespond Ġto ĊĠĠĠĠ Ġ* Ġ` Long `, Ġ` Boolean `, Ġor Ġ` Double ` Ġtypes : ĊĠĠĠĠ Ġ* Ġ- Ġ` fs _ logging _ long _ properties ` ĊĠĠĠĠ Ġ* Ġ- Ġ` fs _ logging _ boolean _ properties ` ĊĠĠĠĠ Ġ* Ġ- Ġ` fs _ logging _ double _ properties ` ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThese Ġarrays Ġshould Ġtell Ġyou Ġthe Ġtypes Ġof Ġsome Ġproperties Ġso Ġthat Ġyou ĊĠĠĠĠ Ġ* Ġcan Ġlog Ġthem Ġas Ġspecific Ġtypes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġopen Ġfun Ġinitialize ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstore Property Names Into ( context , Ġ" fs _ logging _ double _ properties ", Ġdouble Properties ) ĊĠĠĠĠĠĠĠ Ġstore Property Names Into ( context , Ġ" fs _ logging _ long _ properties ", Ġlong Properties ) ĊĠĠĠĠĠĠĠ Ġstore Property Names Into ( context , Ġ" fs _ logging _ boolean _ properties ", Ġboolean Properties ) ĊĠĠĠĠĠĠĠ Ġapp U ptime Attr Name Ġ= Ġcontext . getString ( R . string . fs _ logging _ app _ uptime _ attr _ name ) ĊĠĠĠĠĠĠĠ Ġtimestamp Attr Name Ġ= Ġcontext . getString ( R . string . fs _ logging _ timestamp _ attr _ name ) ĊĠĠĠĠĠĠĠ Ġlong Properties . add ( app U ptime Attr Name ) ĊĠĠĠĠĠĠĠ Ġlong Properties . add ( timestamp Attr Name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Any Thread ĊĠĠĠ Ġoverride Ġfun Ġadd Attr ( attr Name : ĠString , Ġattr Value : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount able Attrs [ attr Name ] Ġ= Ġattr Value . to Long () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( n fe : ĠNumber FormatException ) Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Any Thread ĊĠĠĠ Ġoverride Ġfun Ġremove Attr ( attr Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcount able Attrs . remove ( attr Name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Any Thread ĊĠĠĠ Ġoverride Ġfun Ġincrement Attr Value ( attr Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġcount able Attrs [ attr Name ] Ġ?: Ġ 0 L ĊĠĠĠĠĠĠĠ Ġadd Attr ( attr Name , Ġ( current Ġ+ Ġ 1 ). toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġis Double Property ( attr Name : ĠString ) Ġ= Ġdouble Properties . contains ( attr Name ) ĊĠĠĠ Ġprotected Ġfun Ġis Long Property ( attr Name : ĠString ) Ġ= Ġlong Properties . contains ( attr Name ) ĊĠĠĠ Ġprotected Ġfun Ġis Boolean Property ( attr Name : ĠString ) Ġ= Ġboolean Properties . contains ( attr Name ) ĊĠĠĠ Ġprotected Ġfun Ġadd Default Attrs To ( attrs : ĠMap < String , ĠString >): ĠMap < String , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠcurrentTime Millis Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġval Ġdefault Attrs Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp U ptime Attr Name Ġto Ġ( currentTimeMillis Ġ- Ġsession StartTime Millis ). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Attr Name Ġto ĠcurrentTime Millis . toString () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġattrs Ġ+ Ġdefault Attrs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstore Property Names Into ( context : ĠContext , ĠstringArray Name : ĠString , Ġdest : ĠMutable Set < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarray Res Ġ= Ġcontext . resources . getIdentifier ( string Array Name , Ġ" array ", Ġcontext . packageName ) ĊĠĠĠĠĠĠĠ Ġif Ġ( array Res Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" must Ġhave Ġstring - array Ġresource Ġ$ string Array Name ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . addAll ( context . resources . getString Array ( array Res )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( rn fe Ġ: ĠResources . NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Error Ġfinding Ġstring - array Ġresource : Ġ'$ string Array Name ' Ġ($ array Res )") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }