/* Ċ Ġ* ĠUnless Ġexplicitly Ġstated Ġotherwise Ġall Ġfiles Ġin Ġthis Ġrepository Ġare Ġlicensed Ġunder Ġthe ĠApache ĠLicense ĠVersion Ġ 2 . 0 . Ċ Ġ* ĠThis Ġproduct Ġincludes Ġsoftware Ġdeveloped Ġat ĠDat adog Ġ( https :// www . datadog hq . com /). Ċ Ġ* ĠCopyright Ġ 2 0 1 6 - Present ĠDat adog , ĠInc . Ċ Ġ*/ Ċ Ċ package Ġcom . datadog . android . rum . internal . nd k Ċ Ċ import Ġandroid . content . Context Ċ import Ġcom . datadog . android . core . internal . persistence . Data Writer Ċ import Ġcom . datadog . android . core . internal . persistence . Deserializer Ċ import Ġcom . datadog . android . core . internal . persistence . file . exists Safe Ċ import Ġcom . datadog . android . core . internal . persistence . file . list Files Safe Ċ import Ġcom . datadog . android . core . internal . persistence . file . read Text Safe Ċ import Ġcom . datadog . android . core . internal . time . Time Provider Ċ import Ġcom . datadog . android . core . model . Network Info Ċ import Ġcom . datadog . android . core . model . UserInfo Ċ import Ġcom . datadog . android . log . Log Attributes Ċ import Ġcom . datadog . android . log . Logger Ċ import Ġcom . datadog . android . log . internal . domain . Log Generator Ċ import Ġcom . datadog . android . log . model . Log Event Ċ import Ġcom . datadog . android . rum . model . Error Event Ċ import Ġcom . datadog . android . rum . model . View Event Ċ import Ġjava . io . File Ċ import Ġjava . util . Locale Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Rejected ExecutionException Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ internal Ġclass ĠDat adog N dk Crash Handler ( ĊĠĠĠ Ġapp Context : ĠContext , ĊĠĠĠ Ġprivate Ġval Ġdata Persistence ExecutorService : ĠExecutor Service , ĊĠĠĠ Ġinternal Ġval Ġlog Generator : ĠLog Generator , ĊĠĠĠ Ġprivate Ġval Ġn dk Crash Log Deserializer : ĠDeserial izer < N dk Crash Log >, ĊĠĠĠ Ġprivate Ġval Ġr um Event Deserializer : ĠDeserial izer < Any >, ĊĠĠĠ Ġprivate Ġval Ġnetwork Info Deserializer : ĠDeserial izer < Network Info >, ĊĠĠĠ Ġprivate Ġval ĠuserInfo Deserializer : ĠDeserial izer < UserInfo >, ĊĠĠĠ Ġprivate Ġval Ġinternal Logger : ĠLogger , ĊĠĠĠ Ġprivate Ġval Ġtime Provider : ĠTime Provider Ċ ) Ġ: ĠN dk Crash Handler Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġn dk Crash Data Directory : ĠFile Ġ= Ġget N dk Granted Dir ( app Context ) ĊĊĠĠĠ Ġinternal Ġvar Ġlast Serialized R um View Event : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġlast Serialized User Information : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġlast Serialized N dk Crash Log : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġlast Serialized Network Information : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġ// Ġregion ĠN dk Crash Handler ĊĊĠĠĠ Ġoverride Ġfun Ġprepare Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" Unsafe Third Party Function Call ") Ġ// ĠN PE Ġcannot Ġhappen Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Persistence ExecutorService . submit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Crash Data () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠReject ed ExecutionException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Logger . e ( ERROR _ TASK _ RE JECT ED , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle N dk Crash ( ĊĠĠĠĠĠĠĠ Ġlog Writer : ĠData Writer < Log Event >, ĊĠĠĠĠĠĠĠ Ġr um Writer : ĠData Writer < Any > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" Unsafe Third Party Function Call ") Ġ// ĠN PE Ġcannot Ġhappen Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Persistence ExecutorService . submit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck And Handle N dk Crash Report ( log Writer , Ġr um Writer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠReject ed ExecutionException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Logger . e ( ERROR _ TASK _ RE JECT ED , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion ĠInternal ĊĊĠĠĠ Ġprivate Ġfun Ġread Crash Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! nd k Crash Data Directory . exists Safe ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn dk Crash Data Directory . list Files Safe ()?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCR ASH _ DATA _ FILE _ NAME Ġ-> Ġlast Serialized N dk Crash Log Ġ= Ġit . read Text Safe () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR UM _ VIEW _ EVENT _ FILE _ NAME Ġ-> Ġlast Serialized R um View Event Ġ= Ġit . read Text Safe () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUSER _ INFO _ FILE _ NAME Ġ-> Ġlast Serialized User Information Ġ= Ġit . read Text Safe () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNET WORK _ INFO _ FILE _ NAME Ġ-> Ġlast Serialized Network Information Ġ= Ġit . read Text Safe () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Logger . e ( ERROR _ READ _ N DK _ DIR , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear Crash Log () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck And Handle N dk Crash Report ( ĊĠĠĠĠĠĠĠ Ġlog Writer : ĠData Writer < Log Event >, ĊĠĠĠĠĠĠĠ Ġr um Writer : ĠData Writer < Any > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast Serialized R um View Event Ġ= Ġlast Serialized R um View Event ĊĠĠĠĠĠĠĠ Ġval Ġlast Serialized User Information : ĠString ? Ġ= Ġlast Serialized User Information ĊĠĠĠĠĠĠĠ Ġval Ġlast Serialized N dk Crash Log : ĠString ? Ġ= Ġlast Serialized N dk Crash Log ĊĠĠĠĠĠĠĠ Ġval Ġlast Serialized Network Information : ĠString ? Ġ= Ġlast Serialized Network Information ĊĠĠĠĠĠĠĠ Ġif Ġ( last Serialized N dk Crash Log Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast N dk Crash Log Ġ= Ġn dk Crash Log Deserializer . deserialize ( last Serialized N dk Crash Log ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast R um View Event Ġ= Ġlast Serialized R um View Event ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr um Event Deserializer . deserialize ( it ) Ġas ? ĠView Event ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast UserInfo Ġ= Ġlast Serialized User Information ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserInfo Deserializer . deserialize ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Network Info Ġ= Ġlast Serialized Network Information ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Info Deserializer . deserialize ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle N dk Crash Log ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Writer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr um Writer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast N dk Crash Log , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast R um View Event , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast UserInfo , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Network Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġclear All References () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear All References () Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Serialized N dk Crash Log Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġlast Serialized Network Information Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġlast Serialized R um View Event Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġlast Serialized User Information Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ SuppressWarnings (" Long Parameter List ") ĊĠĠĠ Ġprivate Ġfun Ġhandle N dk Crash Log ( ĊĠĠĠĠĠĠĠ Ġlog Writer : ĠData Writer < Log Event >, ĊĠĠĠĠĠĠĠ Ġr um Writer : ĠData Writer < Any >, ĊĠĠĠĠĠĠĠ Ġn dk Crash Log : ĠN dk Crash Log ?, ĊĠĠĠĠĠĠĠ Ġlast View Event : ĠView Event ?, ĊĠĠĠĠĠĠĠ Ġlast UserInfo : ĠUserInfo ?, ĊĠĠĠĠĠĠĠ Ġlast Network Info : ĠNetwork Info ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( nd k Crash Log Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġerror Log Message Ġ= ĠLOG _ CR ASH _ MSG . format ( Locale . US , Ġn dk Crash Log . signal Name ) ĊĠĠĠĠĠĠĠ Ġval Ġlog Attributes : ĠMap < String , ĠString > ĊĠĠĠĠĠĠĠ Ġif Ġ( last View Event Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Attributes Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Attributes . R UM _ SESSION _ ID Ġto Ġlast View Event . session . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Attributes . R UM _ APPLICATION _ ID Ġto Ġlast View Event . application . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Attributes . R UM _ VIEW _ ID Ġto Ġlast View Event . view . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Attributes . ERROR _ STACK Ġto Ġn dk Crash Log . stack trace ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate View Event And Send Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr um Writer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Log Message , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn dk Crash Log , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast View Event ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Attributes Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Attributes . ERROR _ STACK Ġto Ġn dk Crash Log . stack trace ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsend Crash Log Event ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Writer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Log Message , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Attributes , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn dk Crash Log , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Network Info , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast UserInfo ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate View Event And Send Error ( ĊĠĠĠĠĠĠĠ Ġr um Writer : ĠData Writer < Any >, ĊĠĠĠĠĠĠĠ Ġerror Log Message : ĠString , ĊĠĠĠĠĠĠĠ Ġn dk Crash Log : ĠN dk Crash Log , ĊĠĠĠĠĠĠĠ Ġlast View Event : ĠView Event ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġto Send Error Event Ġ= Ġresolve Error Event From View Event ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Log Message , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn dk Crash Log , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast View Event ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġr um Writer . write ( to Send Error Event ) ĊĠĠĠĠĠĠĠ Ġval Ġsessions Time Difference Ġ= ĠSystem . currentTimeMillis () Ġ- Ġlast View Event . date ĊĠĠĠĠĠĠĠ Ġif Ġ( sessions Time Difference Ġ< ĠVIEW _ EVENT _ AVAIL ABILITY _ TIME _ THRESHOLD ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated View Event Ġ= Ġupdate View Event ( last View Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr um Writer . write ( updated View Event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ SuppressWarnings (" Long Parameter List ") ĊĠĠĠ Ġprivate Ġfun Ġsend Crash Log Event ( ĊĠĠĠĠĠĠĠ Ġlog Writer : ĠData Writer < Log Event >, ĊĠĠĠĠĠĠĠ Ġerror Log Message : ĠString , ĊĠĠĠĠĠĠĠ Ġlog Attributes : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠ Ġn dk Crash Log : ĠN dk Crash Log , ĊĠĠĠĠĠĠĠ Ġlast Network Info : ĠNetwork Info ?, ĊĠĠĠĠĠĠĠ Ġlast UserInfo : ĠUserInfo ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlog Ġ= Ġlog Generator . generate Log ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Ġ= ĠLog Generator . CR ASH , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Log Message , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Attributes , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty Set (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn dk Crash Log . timestamp , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbundle With Tr aces Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbundle With R um Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Info Ġ= Ġlast Network Info , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserInfo Ġ= Ġlast UserInfo ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġlog Writer . write ( log ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate View Event ( last View Event : ĠView Event ): ĠView Event Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Crash Ġ= Ġlast View Event . view . crash ĊĠĠĠĠĠĠĠ Ġval Ġnew Crash Ġ= Ġcurrent Crash ?. copy ( count Ġ= Ġcurrent Crash . count Ġ+ Ġ 1 ) Ġ?: ĠView Event . Crash ( 1 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġlast View Event . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Ġ= Ġlast View Event . view . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrash Ġ= Ġnew Crash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisActive Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdd Ġ= Ġlast View Event . dd . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument Version Ġ= Ġlast View Event . dd . document Version Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresolve Error Event From View Event ( ĊĠĠĠĠĠĠĠ Ġerror Log Message : ĠString , ĊĠĠĠĠĠĠĠ Ġn dk Crash Log : ĠN dk Crash Log , ĊĠĠĠĠĠĠĠ Ġview Event : ĠView Event ĊĠĠĠ Ġ): ĠError Event Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconnectivity Ġ= Ġview Event . connectivity ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnectivity Status Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠError Event . Status . valueOf ( it . status . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnectivity Interfaces Ġ= Ġit . interfaces . map Ġ{ ĠError Event . Interface . valueOf ( it . name ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcell ular Ġ= ĠError Event . Cell ular ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . cell ular ?. technology , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . cell ular ?. carrier Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠError Event . Connectivity ( connectivity Status , Ġconnectivity Interfaces , Ġcell ular ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġadditional Properties Ġ= Ġview Event . context ?. additional Properties Ġ?: Ġempty Map () ĊĠĠĠĠĠĠĠ Ġval Ġadditional User Properties Ġ= Ġview Event . usr ?. additional Properties Ġ?: Ġempty Map () ĊĠĠĠĠĠĠĠ Ġreturn ĠError Event ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdate Ġ= Ġn dk Crash Log . timestamp Ġ+ Ġtime Provider . getServer Offset Millis (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Ġ= ĠError Event . Application ( view Event . application . id ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice Ġ= Ġview Event . service , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession Ġ= ĠError Event . Error Event Session ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Event . session . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠError Event . Error Event Session Type . USER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Ġ= ĠError Event . View ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġview Event . view . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġview Event . view . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref errer Ġ= Ġview Event . view . referrer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġview Event . view . url ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusr Ġ= ĠError Event . Us r ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Event . usr ?. id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Event . usr ?. name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Event . usr ?. email , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional User Properties ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnectivity Ġ= Ġconnectivity , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdd Ġ= ĠError Event . Dd ( session Ġ= ĠError Event . Dd Session ( plan Ġ= ĠError Event . Plan . PLAN _ 1 )), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= ĠError Event . Context ( additional Properties Ġ= Ġadditional Properties ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= ĠError Event . Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġerror Log Message , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= ĠError Event . Error Source . SOURCE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack Ġ= Ġn dk Crash Log . stack trace , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Crash Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġn dk Crash Log . signal Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Type Ġ= ĠError Event . Source Type . ANDROID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ SuppressWarnings (" Too Generic Exception Ca ught ") ĊĠĠĠ Ġprivate Ġfun Ġclear Crash Log () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( nd k Crash Data Directory . exists Safe ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn dk Crash Data Directory . list Files Safe ()?. forEach Ġ{ Ġit . delete Re cursively () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Logger . e ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unable Ġto Ġclear Ġthe ĠN DK Ġcrash Ġreport Ġfile :" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ${ nd k Crash Data Directory . absolute Path }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval ĠVIEW _ EVENT _ AVAIL ABILITY _ TIME _ THRESHOLD Ġ= ĠTimeUnit . HOUR S . to Millis ( 4 ) ĊĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠR UM _ VIEW _ EVENT _ FILE _ NAME Ġ= Ġ" last _ view _ event " ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠCR ASH _ DATA _ FILE _ NAME Ġ= Ġ" crash _ log " ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠUSER _ INFO _ FILE _ NAME Ġ= Ġ" user _ information " ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠNET WORK _ INFO _ FILE _ NAME Ġ= Ġ" network _ information " ĊĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠLOGGER _ NAME Ġ= Ġ" nd k _ crash " ĊĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠLOG _ CR ASH _ MSG Ġ= Ġ" N DK Ġcrash Ġdetected Ġwith Ġsignal : Ġ% s " ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠERROR _ READ _ N DK _ DIR Ġ= Ġ" Error Ġwhile Ġtrying Ġto Ġread Ġthe ĠN DK Ġcrash Ġdirectory " ĊĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠERROR _ TASK _ RE JECT ED Ġ= Ġ" Unable Ġto Ġschedule Ġoperation Ġon Ġthe Ġexecutor " ĊĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠN DK _ CR ASH _ REPORT S _ FOLDER _ NAME Ġ= Ġ" nd k _ crash _ reports " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠN DK _ CR ASH _ REPORT S _ PENDING _ FOLDER _ NAME Ġ= Ġ" nd k _ crash _ reports _ inter medi ary " ĊĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠDES ERIAL IZE _ CR ASH _ EVENT _ ERROR _ MESSAGE Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Error Ġwhile Ġtrying Ġto Ġdeserialize Ġthe Ġn dk Ġcrash Ġlog Ġevent " ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġget N dk Granted Dir ( context : ĠContext ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile ( context . cacheDir , ĠN DK _ CR ASH _ REPORT S _ FOLDER _ NAME ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġget N dk Pending Dir ( context : ĠContext ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile ( context . cacheDir , ĠN DK _ CR ASH _ REPORT S _ PENDING _ FOLDER _ NAME ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun ĠgetLast View Event File ( context : ĠContext ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile ( getN dk Granted Dir ( context ), ĠR UM _ VIEW _ EVENT _ FILE _ NAME ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġget Pending Network Info File ( context : ĠContext ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile ( getN dk Pending Dir ( context ), ĠNET WORK _ INFO _ FILE _ NAME ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġget Granted Network Info File ( context : ĠContext ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile ( getN dk Granted Dir ( context ), ĠNET WORK _ INFO _ FILE _ NAME ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġget Pending UserInfo File ( context : ĠContext ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile ( getN dk Pending Dir ( context ), ĠUSER _ INFO _ FILE _ NAME ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġget Granted UserInfo File ( context : ĠContext ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile ( getN dk Granted Dir ( context ), ĠUSER _ INFO _ FILE _ NAME ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ