/* Ċ Ġ* Ġ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 . domain . scope Ċ Ċ import Ġcom . datadog . android . core . internal . Core Feature Ċ import Ġcom . datadog . android . core . internal . persistence . Data Writer Ċ import Ġcom . datadog . android . rum . Global R um Ċ import Ġcom . datadog . android . rum . R um ActionType Ċ import Ġcom . datadog . android . rum . internal . domain . R um Context Ċ import Ġcom . datadog . android . rum . internal . domain . Time Ċ import Ġcom . datadog . android . rum . model . ActionEvent Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġjava . util . UUID Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . math . max Ċ Ċ internal Ġclass ĠR um Action Scope ( ĊĠĠĠ Ġval Ġparent Scope : ĠR um Scope , ĊĠĠĠ Ġval ĠwaitFor Stop : ĠBoolean , ĊĠĠĠ Ġevent Time : ĠTime , ĊĠĠĠ Ġinitial Type : ĠR um ActionType , ĊĠĠĠ Ġinitial Name : ĠString , ĊĠĠĠ Ġinitial Attributes : ĠMap < String , ĠAny ? >, ĊĠĠĠ Ġserver Time Offset In Ms : ĠLong , ĊĠĠĠ Ġin activity Threshold Ms : ĠLong Ġ= ĠACTION _ IN ACTIVITY _ MS , ĊĠĠĠ Ġmax Duration Ms : ĠLong Ġ= ĠACTION _ MAX _ DURATION _ MS Ċ ) Ġ: ĠR um Scope Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġin activity Threshold Ns Ġ= ĠTimeUnit . MILLISECONDS . to Nan os ( in activity Threshold Ms ) ĊĠĠĠ Ġprivate Ġval Ġmax Duration Ns Ġ= ĠTimeUnit . MILLISECONDS . to Nan os ( max Duration Ms ) ĊĊĠĠĠ Ġinternal Ġval Ġevent Timestamp Ġ= Ġevent Time . timestamp Ġ+ Ġserver Time Offset In Ms ĊĠĠĠ Ġinternal Ġval Ġaction Id : ĠString Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠ Ġinternal Ġvar Ġtype : ĠR um ActionType Ġ= Ġinitial Type ĊĠĠĠ Ġinternal Ġvar Ġname : ĠString Ġ= Ġinitial Name ĊĠĠĠ Ġprivate Ġval Ġstarted Nan os : ĠLong Ġ= Ġevent Time . nano Time ĊĠĠĠ Ġprivate Ġvar Ġlast Interaction Nan os : ĠLong Ġ= Ġstarted Nan os ĊĊĠĠĠ Ġinternal Ġval Ġattributes : ĠMutable Map < String , ĠAny ?> Ġ= Ġinitial Attributes . to Mutable Map (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġput All ( Global R um . global Attributes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġongoing Resource Keys Ġ= Ġmutable ListOf < Weak Reference < Any >>() ĊĊĠĠĠ Ġinternal Ġvar Ġresource Count : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġinternal Ġvar Ġerror Count : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġinternal Ġvar Ġcrash Count : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġinternal Ġvar Ġlong Task Count : ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġsent Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġstopped Ġ= Ġfalse ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Event ( event : ĠR um Raw Event , Ġwriter : ĠData Writer < Any >): ĠR um Scope ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= Ġevent . event Time . nano Time ĊĠĠĠĠĠĠĠ Ġval Ġis Inactive Ġ= Ġnow Ġ- Ġlast Interaction Nan os Ġ> Ġin activity Threshold Ns ĊĠĠĠĠĠĠĠ Ġval Ġis Long Duration Ġ= Ġnow Ġ- Ġstarted Nan os Ġ> Ġmax Duration Ns ĊĠĠĠĠĠĠĠ Ġongoing Resource Keys . removeAll Ġ{ Ġit . get () Ġ== Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġis O ngo ing Ġ= ĠwaitFor Stop Ġ&& Ġ! stopped ĊĠĠĠĠĠĠĠ Ġval Ġshould Stop Ġ= Ġis Inactive Ġ&& Ġongoing Resource Keys . isEmpty () Ġ&& Ġ! is O ngo ing ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshould Stop Ġ-> Ġsend Action ( last Interaction Nan os , Ġwriter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Long Duration Ġ-> Ġsend Action ( now , Ġwriter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Ġis ĠR um Raw Event . Send Custom Action Now Ġ-> Ġsend Action ( last Interaction Nan os , Ġwriter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Ġis ĠR um Raw Event . Stop View Ġ-> Ġon Stop View ( now , Ġwriter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Ġis ĠR um Raw Event . Stop Action Ġ-> Ġon Stop Action ( event , Ġnow ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Ġis ĠR um Raw Event . Start Resource Ġ-> ĠonStart Resource ( event , Ġnow ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Ġis ĠR um Raw Event . Stop Resource Ġ-> Ġon Stop Resource ( event , Ġnow ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Ġis ĠR um Raw Event . Add Error Ġ-> ĠonError ( event , Ġnow , Ġwriter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Ġis ĠR um Raw Event . Stop Resource WithError Ġ-> Ġon Resource Error ( event , Ġnow ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Ġis ĠR um Raw Event . Add Long Task Ġ-> Ġon Long Task ( now ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( sent ) Ġnull Ġelse Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget R um Context (): ĠR um Context Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġparent Scope . getR um Context () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion ĠInternal ĊĊĠĠĠ Ġprivate Ġfun Ġon Stop View ( ĊĠĠĠĠĠĠĠ Ġnow : ĠLong , ĊĠĠĠĠĠĠĠ Ġwriter : ĠData Writer < Any > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġongoing Resource Keys . clear () ĊĠĠĠĠĠĠĠ Ġsend Action ( now , Ġwriter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Stop Action ( ĊĠĠĠĠĠĠĠ Ġevent : ĠR um Raw Event . Stop Action , ĊĠĠĠĠĠĠĠ Ġnow : ĠLong ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevent . type ?. let Ġ{ Ġtype Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġevent . name ?. let Ġ{ Ġname Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġattributes . put All ( event . attributes ) ĊĠĠĠĠĠĠĠ Ġstopped Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġlast Interaction Nan os Ġ= Ġnow ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonStart Resource ( ĊĠĠĠĠĠĠĠ Ġevent : ĠR um Raw Event . Start Resource , ĊĠĠĠĠĠĠĠ Ġnow : ĠLong ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Interaction Nan os Ġ= Ġnow ĊĠĠĠĠĠĠĠ Ġresource Count ++ ĊĠĠĠĠĠĠĠ Ġongoing Resource Keys . add ( Weak Reference ( event . key )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Stop Resource ( ĊĠĠĠĠĠĠĠ Ġevent : ĠR um Raw Event . Stop Resource , ĊĠĠĠĠĠĠĠ Ġnow : ĠLong ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ref Ġ= Ġongoing Resource Keys . first OrNull Ġ{ Ġit . get () Ġ== Ġevent . key Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( key Ref Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġongoing Resource Keys . remove ( key Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Interaction Nan os Ġ= Ġnow ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonError ( ĊĠĠĠĠĠĠĠ Ġevent : ĠR um Raw Event . Add Error , ĊĠĠĠĠĠĠĠ Ġnow : ĠLong , ĊĠĠĠĠĠĠĠ Ġwriter : ĠData Writer < Any > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Interaction Nan os Ġ= Ġnow ĊĠĠĠĠĠĠĠ Ġerror Count ++ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( event . is Fatal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrash Count ++ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Action ( now , Ġwriter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Resource Error ( event : ĠR um Raw Event . Stop Resource WithError , Ġnow : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ref Ġ= Ġongoing Resource Keys . first OrNull Ġ{ Ġit . get () Ġ== Ġevent . key Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( key Ref Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġongoing Resource Keys . remove ( key Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Interaction Nan os Ġ= Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresource Count -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Count ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Long Task ( now : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Interaction Nan os Ġ= Ġnow ĊĠĠĠĠĠĠĠ Ġlong Task Count ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Action ( ĊĠĠĠĠĠĠĠ Ġend Nan os : ĠLong , ĊĠĠĠĠĠĠĠ Ġwriter : ĠData Writer < Any > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( sent ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Type Ġ= Ġtype ĊĠĠĠĠĠĠĠ Ġattributes . put All ( Global R um . global Attributes ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġget R um Context () ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠCore Feature . userInfo Provider . getUser Info () ĊĊĠĠĠĠĠĠĠ Ġval Ġaction Event Ġ= ĠAction Event ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdate Ġ= Ġevent Timestamp , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠAction Event . Action ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġactual Type . to Schema Type (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġaction Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Ġ= ĠAction Event . Target ( name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= ĠAction Event . Error ( error Count ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrash Ġ= ĠAction Event . Crash ( crash Count ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlong Task Ġ= ĠAction Event . Long Task ( long Task Count ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource Ġ= ĠAction Event . Resource ( resource Count ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading Time Ġ= Ġmax ( end Nan os Ġ- Ġstarted Nan os , Ġ 1 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Ġ= ĠAction Event . View ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġcontext . view Id . or Empty (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġcontext . view Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġcontext . view Url . or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Ġ= ĠAction Event . Application ( context . application Id ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession Ġ= ĠAction Event . ActionEvent Session ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġcontext . sessionId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠAction Event . ActionEvent Session Type . USER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusr Ġ= ĠAction Event . Us r ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġuser . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġuser . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemail Ġ= Ġuser . email , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Properties Ġ= Ġuser . additional Properties ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= ĠAction Event . Context ( additional Properties Ġ= Ġattributes ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdd Ġ= ĠAction Event . Dd ( session Ġ= ĠAction Event . Dd Session ( plan Ġ= ĠAction Event . Plan . PLAN _ 1 )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġwriter . write ( action Event ) ĊĊĠĠĠĠĠĠĠ Ġsent Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠACTION _ IN ACTIVITY _ MS Ġ= Ġ 1 0 0 L ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠACTION _ MAX _ DURATION _ MS Ġ= Ġ 5 0 0 0 L ĊĊĠĠĠĠĠĠĠ Ġfun Ġfrom Event ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Scope : ĠR um Scope , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent : ĠR um Raw Event . Start Action , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Offset : ĠLong ĊĠĠĠĠĠĠĠ Ġ): ĠR um Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠR um Action Scope ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Scope , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . waitFor Stop , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . event Time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . attributes , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ