/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠNew ĠVector ĠLtd Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġv arta . cd ac . app . features . r age shake Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Log Ċ import Ġv arta . cd ac . app . features . settings . Vector Preferences Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . matrix . android . sdk . api . extensions . try OrNull Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . File Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . io . String Writer Ċ import Ġjava . util . logging . File Handler Ċ import Ġjava . util . logging . Level Ċ import Ġjava . util . logging . Logger Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ Ċ @ Singleton Ċ class ĠVector File Logger Ġ@ Inject Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġvector Preferences : ĠVector Preferences Ċ ) Ġ: ĠTim ber . Tree () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSIZE _ 2 0 MB Ġ= Ġ 2 0 Ġ* Ġ 1 0 2 4 Ġ* Ġ 1 0 2 4 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSIZE _ 5 0 MB Ġ= Ġ 5 0 Ġ* Ġ 1 0 2 4 Ġ* Ġ 1 0 2 4 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmax Log Size Byte Ġ= Ġif Ġ( vector Preferences . lab Allowed Extended Logging ()) ĠSIZE _ 5 0 MB Ġelse ĠSIZE _ 2 0 MB ĊĠĠĠ Ġprivate Ġval Ġlog Rotation Count Ġ= Ġif Ġ( vector Preferences . lab Allowed Extended Logging ()) Ġ 1 5 Ġelse Ġ 7 ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLogger . getLogger ( context . packageName ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġtry OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse Parent Handlers Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Ġ= ĠLevel . ALL ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġfile Handler : ĠFile Handler ? ĊĠĠĠ Ġprivate Ġval Ġcache Directory Ġ= ĠFile ( context . cacheDir , Ġ" logs ") ĊĠĠĠ Ġprivate Ġvar ĠfileName Prefix Ġ= Ġ" logs " ĊĊĠĠĠ Ġprivate Ġval Ġpri o Prefixes Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . VERBOSE Ġto Ġ" V / Ġ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . DEBUG Ġto Ġ" D / Ġ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . INFO Ġto Ġ" I / Ġ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . WARN Ġto Ġ" W / Ġ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . ERROR Ġto Ġ" E / Ġ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . ASSERT Ġto Ġ" W TF / Ġ" ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! cache Directory . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Directory . mkdir s () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 1 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( cache Directory , Ġ" element Logs .$ i . txt ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry OrNull Ġ{ Ġfile . delete () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfile Handler Ġ= Ġtry OrNull (" Failed Ġto Ġinitialize ĠFile Logger ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Handler ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Directory . absolute Path Ġ+ Ġ"/" Ġ+ ĠfileName Prefix Ġ+ Ġ". % g . txt ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Log Size Byte , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Rotation Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġit . formatter Ġ= ĠLog Formatter () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġlogger . add Handler ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" EXPERIMENT AL _ API _ USAGE ") ĊĠĠĠ Ġoverride Ġfun Ġlog ( priority : ĠInt , Ġtag : ĠString ?, Ġmessage : ĠString , Ġt : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġfile Handler Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( skip Log ( priority )) Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( t Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog ToFile ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ToFile ( prio Prefixes [ priority ] Ġ?: Ġ"$ priority Ġ", Ġtag Ġ?: Ġ" Tag ", Ġmessage ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġskip Log ( priority : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( vector Preferences . lab Allowed Extended Logging ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExclude Ġverbose Ġlogs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpriority Ġ< ĠLog . DEBUG ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġour Ġown Ġlog Ġfiles Ġto Ġthe Ġprovided Ġlist Ġof Ġfiles . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġlist Ġof Ġfiles Ġwith Ġlogs . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Log Files (): ĠList < File > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry OrNull (" ## Ġget Log Files () Ġfailed ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Handler ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . flush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġ 0 Ġuntil Ġlog Rotation Count Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . map NotNull Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( cache Directory , Ġ"$ fileName Prefix .$ index . txt ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ Ġit . exists () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Empty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġan ĠThrowable ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġthrowable Ġthe Ġthrowable Ġto Ġlog ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġlog ToFile ( throwable : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrowable Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġerrors Ġ= ĠString Writer () ĊĠĠĠĠĠĠĠ Ġthrowable . printStackTrace ( PrintWriter ( errors )) ĊĊĠĠĠĠĠĠĠ Ġlogger . info ( errors . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog ToFile ( level : ĠString , Ġtag : ĠString , Ġcontent : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġb . append ( Thread . currentThread (). id ) ĊĠĠĠĠĠĠĠ Ġb . append (" Ġ") ĊĠĠĠĠĠĠĠ Ġb . append ( level ) ĊĠĠĠĠĠĠĠ Ġb . append ("/") ĊĠĠĠĠĠĠĠ Ġb . append ( tag ) ĊĠĠĠĠĠĠĠ Ġb . append (": Ġ") ĊĠĠĠĠĠĠĠ Ġb . append ( content ) ĊĠĠĠĠĠĠĠ Ġlogger . info ( b . toString ()) ĊĠĠĠ Ġ} Ċ } Ċ