package Ġcom . mp article . media Ċ Ċ import Ġcom . mp article . MP Event Ċ import Ġcom . mp article . MP article Ċ import Ġcom . mp article . media . events .* Ċ import Ġcom . mp article . media . internal . Logger Ċ import Ġjava . util .* Ċ Ċ // Summary ĠEvent Ċ const Ġval ĠMedia Session Summary Ġ= Ġ" Media ĠSession ĠSummary " Ċ const Ġval ĠMedia Segment Summary Ġ= Ġ" Media ĠSegment ĠSummary " Ċ const Ġval ĠMedia Ad Summary Ġ= Ġ" Media ĠAd ĠSummary " Ċ Ċ // ĠSession ĠSummary ĠAttributes Ċ const Ġval Ġmedia SessionId Key Ġ= Ġ" media _ session _ id " Ċ const Ġval Ġstart Timestamp Key Ġ= Ġ" media _ session _ start _ time " Ċ const Ġval Ġend Timestamp Key Ġ= Ġ" media _ session _ end _ time " Ċ const Ġval Ġcontent Id Key Ġ= Ġ" content _ id " Ċ const Ġval Ġcontent Title Key Ġ= Ġ" content _ title " Ċ const Ġval Ġmedia Time Sp ent Key Ġ= Ġ" media _ time _ spent " Ċ const Ġval Ġcontent Time Sp ent Key Ġ= Ġ" media _ content _ time _ spent " Ċ const Ġval Ġcontent Complete Key Ġ= Ġ" media _ content _ complete " Ċ const Ġval Ġtotal Segments Key Ġ= Ġ" media _ session _ segment _ total " Ċ const Ġval Ġtotal Ad Time Sp ent Key Ġ= Ġ" media _ total _ ad _ time _ spent " Ċ const Ġval Ġad Time Sp ent Rate Key Ġ= Ġ" media _ ad _ time _ spent _ rate " Ċ const Ġval Ġtotal Ads Key Ġ= Ġ" media _ session _ ad _ total " Ċ const Ġval Ġad IDs Key Ġ= Ġ" media _ session _ ad _ objects " Ċ Ċ // ĠAd ĠSummary ĠAttributes Ċ const Ġval Ġad Break Id Key Ġ= Ġ" ad _ break _ id " Ċ const Ġval Ġad Content Id Key Ġ= Ġ" ad _ content _ id " Ċ const Ġval Ġad Content Start Timestamp Key Ġ= Ġ" ad _ content _ start _ time " Ċ const Ġval Ġad Content End Timestamp Key Ġ= Ġ" ad _ content _ end _ time " Ċ const Ġval Ġad Content Title Key Ġ= Ġ" ad _ content _ title " Ċ const Ġval Ġad Content Skipped Key Ġ= Ġ" ad _ skipped " Ċ const Ġval Ġad Content Completed Key Ġ= Ġ" ad _ completed " Ċ Ċ // ĠSegment ĠSummary ĠAttributes Ċ const Ġval Ġsegment Index Key Ġ= Ġ" segment _ index " Ċ const Ġval Ġsegment Title Key Ġ= Ġ" segment _ title " Ċ const Ġval Ġsegment Start Timestamp Key Ġ= Ġ" segment _ start _ time " Ċ const Ġval Ġsegment End Timestamp Key Ġ= Ġ" segment _ end _ time " Ċ const Ġval Ġsegment Time Sp ent Key Ġ= Ġ" media _ segment _ time _ spent " Ċ const Ġval Ġsegment Skipped Key Ġ= Ġ" segment _ skipped " Ċ const Ġval Ġsegment Completed Key Ġ= Ġ" segment _ completed " Ċ Ċ class ĠMedia Session Ġprotected Ġconstructor ( builder : ĠBuilder ) Ġ{ ĊĠĠĠ Ġvar ĠsessionId : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġtitle : ĠString ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġmedia Content Id : ĠString ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġduration : ĠLong ? ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar ĠcontentType : ĠString ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġstream Type : ĠString ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġcurrent Play head Position : ĠLong ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġinternal Ġset ĊĠĠĠ Ġvar Ġsession Qo S Ġ= ĠMedia Qo S () ĊĊĠĠĠ Ġvar Ġattributes : ĠMutable Map < String , ĠString > Ġ= Ġmutable Map Of () ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠMedia Event ( this ). getSession Attributes () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġprivate Ġvar Ġmp article Instance : ĠM Particle ? ĊĠĠĠ Ġprivate Ġvar Ġlog MP Events : ĠBoolean ĊĠĠĠ Ġprivate Ġvar Ġlog Media Events : ĠBoolean ĊĊĠĠĠ Ġprivate Ġvar Ġad Content : ĠMedia Ad ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġsegment : ĠMedia Segment ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġmedia Session Start Timestamp : ĠLong Ġ// Timestamp Ġcreated Ġon Ġlog Media Session Start Ġevent ĊĠĠĠ Ġprivate Ġvar Ġmedia Session End Timestamp : ĠLong Ġ// Timestamp Ġupdated Ġwhen Ġany Ġevent Ġis Ġlogged ĊĠĠĠ Ġprivate Ġval Ġmedia Time Sp ent : ĠDouble ĊĠĠĠĠĠĠĠ Ġget () Ġ{ Ġ// total Ġseconds Ġbetween Ġmedia Ġsession Ġstart Ġand Ġend Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ(( this . media Session End Timestamp Ġ- Ġmedia Session Start Timestamp ) Ġ/ Ġ 1 0 0 0 ). toDouble () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġmedia Content Time Sp ent : ĠDouble ĊĠĠĠĠĠĠĠ Ġget () Ġ{ Ġ// total Ġseconds Ġspent Ġplaying Ġcontent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent Play head Position ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . stored Playback Time Ġ+ Ġ( System . currentTimeMillis (). minus ( it ) Ġ/ Ġ 1 0 0 0 ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthis . stored Playback Time ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġmedia Content Complete Limit : ĠInt Ġ= Ġ 1 0 0 ĊĠĠĠ Ġprivate Ġvar Ġmedia Content Complete : ĠBoolean Ġ= Ġfalse Ġ// Updates Ġto Ġtrue Ġtriggered Ġby Ġlog Media Content End Ġ( or Ġif Ġ 9 0 % Ġor Ġ 9 5 % Ġof Ġthe Ġcontent Ġplayed ), Ġ 0 Ġor Ġfalse Ġif Ġcomplete Ġmilestone Ġnot Ġreached Ġor Ġa Ġforced Ġquit . ĊĠĠĠ Ġprivate Ġvar Ġmedia Session Segment Total : ĠInt Ġ= Ġ 0 Ġ// number Ġincrement ed Ġwith Ġeach Ġlog Segment Start ĊĠĠĠ Ġprivate Ġvar Ġmedia Total Ad Time Sp ent : ĠDouble Ġ= Ġ 0 . 0 Ġ// total Ġsecond Ġsum Ġof Ġad Ġbreak Ġtime Ġspent ĊĠĠĠ Ġprivate Ġval Ġmedia Ad Time Sp ent Rate : ĠDouble ĊĠĠĠĠĠĠĠ Ġget () Ġ{ Ġ// ad Ġtime Ġspent Ġ/ Ġcontent Ġtime Ġspent Ġx Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( this . media Content Time Sp ent Ġ!= Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . media Total Ad Time Sp ent Ġ/ Ġthis . media Content Time Sp ent Ġ* Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġmedia Session Ad Total : ĠInt Ġ= Ġ 0 Ġ// number Ġof Ġads Ġplayed Ġin Ġthe Ġmedia Ġsession Ġ- Ġincrement Ġon Ġlog Ad Start ĊĠĠĠ Ġprivate Ġvar Ġmedia Session Ad Objects : ĠMutable List < String > Ġ= ĠArrayList () Ġ// array Ġof Ġunique Ġidentifiers Ġfor Ġads Ġplayed Ġin Ġthe Ġmedia Ġsession Ġ- Ġappend Ġad _ content _ ID Ġon Ġlog Ad Start ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Playback Start Timestamp : ĠLong ? Ġ= Ġnull Ġ// Timestamp Ġfor Ġbeginning Ġof Ġcurrent Ġplayback ĊĠĠĠ Ġprivate Ġvar Ġstored Playback Time : ĠDouble Ġ= Ġ 0 . 0 Ġ// On ĠPause Ġcalculate Ġplayback Ġtime Ġand Ġclear Ġcurrent Playback Time ĊĠĠĠ Ġprivate Ġvar Ġsession Summary Sent Ġ= Ġfalse Ġ// ĠEns ures Ġwe Ġonly Ġsend Ġsummary Ġevent Ġonce ĊĊĠĠĠ Ġprivate Ġvar Ġtesting Ġ= Ġfalse Ġ// ĠEnabled Ġfor Ġtest Ġcases ĊĊĠĠĠ Ġ@ Jvm Synt hetic ĊĠĠĠ Ġvar Ġmedia EventListener : Ġ(( Media Event ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( builder . mp article Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . mp article Ġ= ĠM Particle . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( builder . mp article Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . error (" MP article Ġmust Ġbe Ġstarted Ġin Ġorder Ġto Ġbuild Ġa ĠMedia Session ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmp article Instance Ġ= Ġbuilder . mp article ĊĠĠĠĠĠĠĠ Ġtitle Ġ= Ġbuilder . title . require (" title ") ĊĠĠĠĠĠĠĠ Ġmedia Content Id Ġ= Ġbuilder . media Content Id . require (" media Content Id ") ĊĠĠĠĠĠĠĠ Ġduration Ġ= Ġbuilder . duration ĊĠĠĠĠĠĠĠ ĠcontentType Ġ= Ġbuilder . contentType . require (" contentType ") ĊĠĠĠĠĠĠĠ Ġstream Type Ġ= Ġbuilder . stream Type . require (" stream Type ") ĊĠĠĠĠĠĠĠ Ġlog MP Events Ġ= Ġbuilder . log MP Events ĊĠĠĠĠĠĠĠ Ġlog Media Events Ġ= Ġbuilder . log Media Events ĊĠĠĠĠĠĠĠ Ġif Ġ( Ġ 1 0 0 Ġ>= Ġbuilder . media Content Complete Limit Ġ&& Ġbuilder . media Content Complete Limit Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Content Complete Limit Ġ= Ġbuilder . media Content Complete Limit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Timestamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġmedia Session Start Timestamp Ġ= Ġcurrent Timestamp ĊĠĠĠĠĠĠĠ Ġmedia Session End Timestamp Ġ= Ġcurrent Timestamp ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStart Ġthe ĠMedia Session . ĠThis Ġmethod Ġshould Ġbe Ġcalled Ġbefore Ġlogging Ġ Ġany Ġother Ġevents Ġagainst Ġthis ĊĠĠĠĠ Ġ* ĠMedia Session Ġinstance ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlog Media Session Start ( options : ĠOptions ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ ĠsessionId Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠ Ġmedia Session Start Timestamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġval Ġmedia Session Event Ġ= ĠMedia Event ( this , ĠMedia Event Name . SESSION _ START , Ġoptions Ġ= Ġoptions ) ĊĠĠĠĠĠĠĠ Ġlog Event ( media Session Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEnd Ġthe ĠMedia Session ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlog Media Session End ( options : ĠOptions ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmedia Session Event Ġ= ĠMedia Event ( this , ĠMedia Event Name . SESSION _ END , Ġoptions Ġ= Ġoptions ) ĊĠĠĠĠĠĠĠ Ġlog Event ( media Session Event ) ĊĠĠĠĠĠĠĠ Ġlog Session Summary () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndic ate Ġthat Ġthe Ġcontent Ġfor Ġthe ĠMedia Session Ġhas Ġended . ĠThis Ġwill ĠNOT Ġend Ġthe ĠMedia Session ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlog Media Content End ( options : ĠOptions ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmedia Content Complete Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġmedia Session Event Ġ= ĠMedia Event ( this , ĠMedia Event Name . CONTENT _ END , Ġoptions Ġ= Ġoptions ) ĊĠĠĠĠĠĠĠ Ġlog Event ( media Session Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġa ĠMedia Event Ġof Ġtype Ġ{@ link ĠMedia Event Name . PLAY } ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlog Play ( options : ĠOptions ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Playback Start Timestamp Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Playback Start Timestamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġplay Event Ġ= ĠMedia Event ( this , ĠMedia Event Name . PLAY , Ġoptions Ġ= Ġoptions ) ĊĠĠĠĠĠĠĠ Ġlog Event ( play Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġa ĠMedia Event Ġof Ġtype Ġ{@ link ĠMedia Event Name . PAUSE } ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlog Pause ( options : ĠOptions ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Playback Start Timestamp ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstored Playback Time Ġ+= Ġ(( System . currentTimeMillis () Ġ- Ġit ) Ġ/ Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Playback Start Timestamp Ġ= Ġnull ; ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpause Event Ġ= ĠMedia Event ( this , ĠMedia Event Name . PAUSE , Ġoptions Ġ= Ġoptions ) ĊĠĠĠĠĠĠĠ Ġlog Event ( pause Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġa ĠMedia Event Ġof Ġtype Ġ{@ link ĠMedia Event Name . SEEK _ START } ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġposition Ġthe Ġposition , Ġin Ġmilliseconds , Ġwhere Ġthe Ġseek Ġevent Ġstarted ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlog Seek Start ( position : ĠLong , Ġoptions : ĠOptions ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġseek Start Event Ġ= ĠMedia Event ( this , ĠMedia Event Name . SEEK _ START , Ġoptions Ġ= Ġoptions ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . seek Position Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog Event ( seek Start Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġa ĠMedia Event Ġof Ġtype Ġ{@ link ĠMedia Event Name . SEEK _ END } ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġposition Ġthe Ġposition , Ġin Ġmilliseconds , Ġwhere Ġthe Ġseek Ġevent Ġended ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlog Seek End ( position : ĠLong , Ġoptions : ĠOptions ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġseek End Event Ġ= ĠMedia Event ( this , ĠMedia Event Name . SEEK _ END , Ġoptions Ġ= Ġoptions ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . seek Position Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog Event ( seek End Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġa ĠMedia Event Ġof Ġtype Ġ{@ link ĠMedia Event Name . BUFFER _ START } ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġposition Ġthe Ġposition , Ġin Ġmilliseconds , Ġwhere Ġthe Ġbuffer Ġevent Ġstarted ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlog Buffer Start ( duration : ĠLong , Ġbuffer Percent : ĠDouble , Ġposition : ĠLong , Ġoptions : ĠOptions ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Start Ġ= ĠMedia Event ( this , ĠMedia Event Name . BUFFER _ START , Ġoptions Ġ= Ġoptions ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . buffer Duration Ġ= Ġduration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . buffer Position Ġ= Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . buffer Percent Ġ= Ġbuffer Percent ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog Event ( buffer Start ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġa ĠMedia Event Ġof Ġtype Ġ{@ link ĠMedia Event Name . BUFFER _ END } ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġposition Ġthe Ġposition , Ġin Ġmilliseconds , Ġwhere Ġthe Ġbuffer Ġevent Ġended ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlog Buffer End ( duration : ĠLong , Ġbuffer Percent : ĠDouble , Ġposition : ĠLong , Ġoptions : ĠOptions ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuffer End Ġ= ĠMedia Event ( this , ĠMedia Event Name . BUFFER _ END , Ġoptions Ġ= Ġoptions ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . buffer Duration Ġ= Ġduration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . buffer Percent Ġ= Ġbuffer Percent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . buffer Position Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog Event ( buffer End ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġa ĠMedia Event Ġof Ġtype Ġ{@ link ĠMedia Event Name . AD _ BREAK _ START } ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġbuilder Ġa Ġreceiver Ġtype Ġclosure Ġto Ġbuild Ġa ĠMedia Ad Break Ġinstance ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Synt hetic ĊĠĠĠ Ġfun Ġlog Ad Break Start ( builder : ĠMedia Ad Break . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Ad Break Start ( null , Ġbuilder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Synt hetic ĊĠĠĠ Ġfun Ġlog Ad Break Start ( options : ĠOptions ? Ġ= Ġnull , Ġbuilder : ĠMedia Ad Break . ()-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmedia Ad Break Ġ= ĠMedia Ad Break () ĊĠĠĠĠĠĠĠ Ġmedia Ad Break . builder () ĊĠĠĠĠĠĠĠ Ġlog Ad Break Start ( media Ad Break , Ġoptions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġa ĠMedia Event Ġof Ġtype Ġ{@ link ĠMedia Event Name . AD _ BREAK _ START } ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġad Break Ġthe Ġ{@ link ĠMedia Ad Break } Ġinstance ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlog Ad Break Start ( ad Break : ĠMedia Ad Break , Ġoptions : ĠOptions ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġad Break Event Ġ= ĠMedia Event ( this , ĠMedia Event Name . AD _ BREAK _ START , Ġoptions Ġ= Ġoptions ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . ad Break Ġ= Ġad Break ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog Event ( ad Break Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġa ĠMedia Event Ġof Ġtype Ġ{@ link ĠMedia Event Name . AD _ BREAK _ END } ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlog Ad Break End ( options : ĠOptions ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġad Break Event Ġ= ĠMedia Event ( this , ĠMedia Event Name . AD _ BREAK _ END , Ġoptions Ġ= Ġoptions ) ĊĠĠĠĠĠĠĠ Ġlog Event ( ad Break Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġa ĠMedia Event Ġof Ġtype Ġ{@ link ĠMedia Event Name . AD _ START } ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġbuilder Ġa Ġreceiver Ġtype Ġclosure Ġto Ġbuild Ġa ĠMedia Ad Ġinstance ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Synt hetic ĊĠĠĠ Ġfun Ġlog Ad Start ( builder : ĠMedia Ad . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Ad Start ( null , Ġbuilder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlog Ad Start ( options : ĠOptions ? Ġ= Ġnull , Ġbuilder : ĠMedia Ad . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmedia Ad Ġ= ĠMedia Ad () ĊĠĠĠĠĠĠĠ Ġmedia Ad . builder () ĊĠĠĠĠĠĠĠ Ġlog Ad Start ( media Ad , Ġoptions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġa ĠMedia Event Ġof Ġtype Ġ{@ link ĠMedia Event Name . AD _ START } ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġad Ġthe Ġ{@ link ĠMedia Ad } Ġinstance ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlog Ad Start ( ad : ĠMedia Ad , Ġoptions : ĠOptions ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġad . ad Start Timestamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġmedia Session Ad Total Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġad . id ?. let Ġ{ Ġmedia Session Ad Objects . add ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġad Content Ġ= Ġad ĊĠĠĠĠĠĠĠ Ġval Ġad Start Event Ġ= ĠMedia Event ( this , ĠMedia Event Name . AD _ START , Ġoptions Ġ= Ġoptions ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Ad Ġ= Ġad ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog Event ( ad Start Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġa ĠMedia Event Ġof Ġtype Ġ{@ link ĠMedia Event Name . AD _ END } ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlog Ad End ( options : ĠOptions ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġad Content ?. ad Start Timestamp ?. let Ġ{ startTime Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠendTime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġad Content ?. ad End Timestamp Ġ= ĠendTime ĊĠĠĠĠĠĠĠĠĠĠĠ Ġad Content ?. ad Completed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Total Ad Time Sp ent Ġ+= Ġ(( endTime Ġ- ĠstartTime ) Ġ/ Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġad End Event Ġ= ĠMedia Event ( this , ĠMedia Event Name . AD _ END , Ġoptions Ġ= Ġoptions ) ĊĠĠĠĠĠĠĠ Ġlog Event ( ad End Event ) ĊĊĠĠĠĠĠĠĠ Ġlog Ad Summary ( ad Content ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlog Ad Click ( options : ĠOptions ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMedia Event ( this , ĠMedia Event Name . AD _ CLICK , Ġoptions Ġ= Ġoptions ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . media Ad Ġ= Ġad Content ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Event ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġa ĠMedia Event Ġof Ġtype Ġ{@ link ĠMedia Event Name . AD _ SKIP } ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlog Ad Skip ( options : ĠOptions ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġad Content ?. ad Start Timestamp ?. let Ġ{ startTime Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠendTime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġad Content ?. ad End Timestamp Ġ= ĠendTime ĊĠĠĠĠĠĠĠĠĠĠĠ Ġad Content ?. ad Skipped Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Total Ad Time Sp ent Ġ+= Ġ(( endTime Ġ- ĠstartTime ) Ġ/ Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġad Skip Event Ġ= ĠMedia Event ( this , ĠMedia Event Name . AD _ SKIP , Ġoptions Ġ= Ġoptions ) ĊĠĠĠĠĠĠĠ Ġlog Event ( ad Skip Event ) ĊĊĠĠĠĠĠĠĠ Ġlog Ad Summary ( ad Content ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġa ĠMedia Event Ġof Ġtype Ġ{@ link ĠMedia Event Name . SEGMENT _ START } ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġbuilder Ġa Ġreceiver Ġtype Ġclosure Ġto Ġbuild Ġa ĠMedia Segment Ġinstance ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Synt hetic ĊĠĠĠ Ġfun Ġlog Segment Start ( builder : ĠMedia Segment . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Segment Start ( null , Ġbuilder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlog Segment Start ( options : ĠOptions ? Ġ= Ġnull , Ġbuilder : ĠMedia Segment . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmedia Session Segment Total Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġmedia Segment Ġ= ĠMedia Segment () ĊĠĠĠĠĠĠĠ Ġmedia Segment . builder () ĊĠĠĠĠĠĠĠ Ġsegment Ġ= Ġmedia Segment ĊĠĠĠĠĠĠĠ Ġsegment ?. segment Start Timestamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġlog Segment Start ( media Segment , Ġoptions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġa ĠMedia Event Ġof Ġtype Ġ{@ link ĠMedia Event Name . SEGMENT _ START } ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġad Ġthe Ġ{@ link ĠMedia Segment } Ġinstance ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlog Segment Start ( segment : ĠMedia Segment , Ġoptions : ĠOptions ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsegment Start Event Ġ= ĠMedia Event ( this , ĠMedia Event Name . SEGMENT _ START , Ġoptions Ġ= Ġoptions ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . segment Ġ= Ġsegment ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog Event ( segment Start Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġa ĠMedia Event Ġof Ġtype Ġ{@ link ĠMedia Event Name . SEGMENT _ SKIP } ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlog Segment Skip ( options : ĠOptions ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsegment ?. segment End Timestamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġsegment ?. segment Skipped Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġsegment Skip Event Ġ= ĠMedia Event ( this , ĠMedia Event Name . SEGMENT _ SKIP , Ġoptions Ġ= Ġoptions ) ĊĠĠĠĠĠĠĠ Ġlog Event ( segment Skip Event ) ĊĊĠĠĠĠĠĠĠ Ġlog Segment Summary ( segment ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġa ĠMedia Event Ġof Ġtype Ġ{@ link ĠMedia Event Name . SEGMENT _ END } ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlog Segment End ( options : ĠOptions ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsegment ?. segment End Timestamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġsegment ?. segment Completed Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġsegment End Event Ġ= ĠMedia Event ( this , ĠMedia Event Name . SEGMENT _ END , Ġoptions Ġ= Ġoptions ) ĊĠĠĠĠĠĠĠ Ġlog Event ( segment End Event ) ĊĊĠĠĠĠĠĠĠ Ġlog Segment Summary ( segment ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġa ĠMedia Event Ġof Ġtype Ġ{@ link ĠMedia Event Name . UPDATE _ PLAY HEAD _ POSITION }. ĠThis Ġwill Ġalso ĊĠĠĠĠ Ġ* Ġupdate Ġthe Ġinternal Ġcurrent Play head Position Ġstate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlog Play head Position ( play head Position : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Play head Position Ġ= Ġplay head Position ĊĠĠĠĠĠĠĠ Ġval Ġplay head Event Ġ= ĠMedia Event ( this , ĠMedia Event Name . UPDATE _ PLAY HEAD _ POSITION ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . play head Position Ġ= Ġplay head Position ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog Event ( play head Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġa ĠMedia Event Ġof Ġtype Ġ{@ link ĠMedia Event Name . UPDATE _ Q OS }. ĠThe ĠQ OS Ġobject Ġwill Ġbe Ġtreated Ġas ĊĠĠĠĠ Ġ* Ġstate less , Ġand Ġsome Ġk its Ġmay Ġreplace Ġ` null ` Ġvalues Ġwith Ġthe Ġdefault Ġprimitive ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġbuilder Ġa Ġreceiver Ġtype Ġclosure Ġto Ġbuild Ġa ĠMedia Qo S Ġinstance ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Synt hetic ĊĠĠĠ Ġfun Ġlog Q os ( builder : ĠMedia Qo S . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Q os ( null , Ġbuilder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlog Q os ( options : ĠOptions ? Ġ= Ġnull , Ġbuilder : ĠMedia Qo S . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmedia Q os Ġ= ĠMedia Qo S () ĊĠĠĠĠĠĠĠ Ġmedia Q os . builder () ĊĠĠĠĠĠĠĠ Ġlog Q os ( media Q os , Ġoptions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog Ġa ĠMedia Event Ġof Ġtype Ġ{@ link ĠMedia Event Name . UPDATE _ Q OS }. ĠThe ĠMedia Session Ġmaintains ĠQ oS Ġstate Ġinternally , ĊĠĠĠĠ Ġ* Ġand Ġwill Ġmerge Ġthe Ġprovided ĠMedia Qo S Ġargument Ġwith Ġthe Ġinternal Ġobject , Ġreplacing Ġany Ġnull Ġfields Ġin Ġthe Ġargument Ġobject Ġwith ĊĠĠĠĠ Ġ* Ġthe Ġvalue Ġof Ġthe Ġcorresponding Ġfield Ġin Ġthe Ġinternal Ġobject , Ġprovided Ġthe Ġinternal Ġobject 's Ġfield Ġis Ġnon Ġnull . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSome ĠK its Ġmay Ġreplace Ġ` null ` Ġvalues Ġwith Ġthe Ġdefault Ġprimitive ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġq os Ġthe Ġ{@ link ĠMedia Qo S } Ġinstance ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlog Q os ( qos : ĠMedia Qo S , Ġoptions : ĠOptions ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . session Qo S Ġ= ĠMedia Qo S ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstartup Time Ġ= Ġq os . startup Time Ġ?: Ġthis . session Qo S . startup Time , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbit Rate Ġ= Ġq os . bit Rate Ġ?: Ġthis . session Qo S . bit Rate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfps Ġ= Ġq os . fps Ġ?: Ġthis . session Qo S . fps , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdropped Frames Ġ= Ġq os . d ropped Frames Ġ?: Ġthis . session Qo S . d ropped Frames ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġq os Event Ġ= ĠMedia Event ( this , ĠMedia Event Name . UPDATE _ Q OS , Ġoptions Ġ= Ġoptions ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . qos Ġ= Ġsession Qo S ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog Event ( qos Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa ĠMP Event Ġin Ġthe Ġcurrent ĠMedia Session Ġcontext . ĠThe Ġ{@ link ĠBase Event # custom Attributes ()} ĊĠĠĠĠ Ġ* Ġwill Ġbe Ġpopulated Ġwith Ġthe Ġrelevant Ġ{@ link ĠMedia Content } Ġfields Ġwhich Ġbelong Ġto Ġthe ĠMedia Session ĊĠĠĠĠ Ġ* Ġinstance . ĠThis Ġincludes Ġ" title ", Ġ" media Content Id ", Ġ" duration ", Ġ" stream Type " Ġand Ġ" contentType " ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild MP Event ( eventName : ĠString , Ġcustom Attributes : ĠMap < String , ĠString >? ): ĠMP Event Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Attributes Ġ= Ġattributes ĊĠĠĠĠĠĠĠ Ġcustom Attributes ?. let Ġ{ Ġevent Attributes . put All ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠMP Event . Builder ( eventName , ĠM Particle . EventType . Media ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. custom Attributes ( custom Attributes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegister Ġa ĠMedia EventListener Ġinstance Ġwhich Ġwill Ġreceive Ġa Ġcallback Ġevery time Ġa Ġ{@ link ĠMedia Event } ĊĠĠĠĠ Ġ* Ġis Ġgenerated . ĠThe Ġcallback Ġwill Ġoccur Ġbefore Ġthe Ġ{@ link ĠMedia Event } Ġis Ġlogged Ġin Ġthe ĠCore ĠSDK ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Media EventListener ( listener : ĠMedia EventListener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmedia EventListener Ġ= Ġ{ Ġmedia Event Ġ-> Ġlistener . on Log Media Event ( media Event )} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog Session Summary () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! session Summary Sent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcustom Attributes : ĠMutable Map < String , ĠString > Ġ= Ġmutable Map Of () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsessionId ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ media SessionId Key ] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ start Timestamp Key ] Ġ= Ġmedia Session Start Timestamp . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ end Timestamp Key ] Ġ= Ġmedia Session End Timestamp . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ content Id Key ] Ġ= Ġmedia Content Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ content Title Key ] Ġ= Ġtitle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ media Time Sp ent Key ] Ġ= Ġmedia Time Sp ent . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ content Time Sp ent Key ] Ġ= Ġmedia Content Time Sp ent . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ content Complete Key ] Ġ= Ġmedia Content Complete . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ total Segments Key ] Ġ= Ġmedia Session Segment Total . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ total Ad Time Sp ent Key ] Ġ= Ġmedia Total Ad Time Sp ent . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ ad Time Sp ent Rate Key ] Ġ= Ġmedia Ad Time Sp ent Rate . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ total Ads Key ] Ġ= Ġmedia Session Ad Total . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ ad IDs Key ] Ġ= Ġmedia Session Ad Objects . toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsummary Event Ġ= Ġbuild MP Event ( Media Session Summary , Ġcustom Attributes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmp article Instance ?. log Event ( summary Event ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession Summary Sent Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog Segment Summary ( summary : ĠMedia Segment ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsegment ?. segment Start Timestamp ?. let Ġ{ Ġsegment Start Timestamp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsummary ?. let Ġ{ Ġsegment Summary Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsegment End Timestamp Ġ= Ġsegment ?. segment End Timestamp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( segment End Timestamp Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsegment End Timestamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsegment Summary . segment End Timestamp Ġ= Ġsegment End Timestamp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcustom Attributes : ĠMutable Map < String , ĠString > Ġ= Ġmutable Map Of () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsessionId ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ media SessionId Key ] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ media Content Id ] Ġ= Ġmedia Content Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ segment Index Key ] Ġ= Ġsegment Summary . index . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsegment Summary . title ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ segment Title Key ] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ segment Start Timestamp Key ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsegment Summary . segment Start Timestamp . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ segment End Timestamp Key ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsegment Summary . segment End Timestamp . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ segment Time Sp ent Key ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ((( segment End Timestamp Ġ- Ġsegment Start Timestamp ) Ġ/ Ġ 1 0 0 0 ). toDouble ()). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ segment Skipped Key ] Ġ= Ġsegment Summary . segment Skipped . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ segment Completed Key ] Ġ= Ġsegment Summary . segment Completed . toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsummary Event Ġ= Ġbuild MP Event ( Media Segment Summary , Ġcustom Attributes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmp article Instance ?. log Event ( summary Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsegment Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog Ad Summary ( content : ĠMedia Ad ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontent ?. let Ġ{ Ġad Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġad . ad Start Timestamp ?. let Ġ{ ĠstartTime Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠendTime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġad . ad End Timestamp Ġ= ĠendTime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Total Ad Time Sp ent Ġ+= Ġ(( endTime Ġ- ĠstartTime ) Ġ/ Ġ 1 0 0 0 ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcustom Attributes : ĠMutable Map < String , ĠString > Ġ= Ġmutable Map Of () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsessionId ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ media SessionId Key ] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġad . id ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ ad Content Id Key ] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġad . ad Start Timestamp ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ ad Content Start Timestamp Key ] Ġ= Ġit . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġad . ad End Timestamp ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ ad Content End Timestamp Key ] Ġ= Ġit . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġad . title ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ ad Content Title Key ] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ ad Content Skipped Key ] Ġ= Ġad . ad Skipped . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Attributes [ ad Content Completed Key ] Ġ= Ġad . ad Completed . toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsummary Event Ġ= Ġbuild MP Event ( Media Ad Summary , Ġcustom Attributes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmp article Instance ?. log Event ( summary Event ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġad Content Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġlog Event ( media Event : ĠMedia Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( mp article Instance Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmp article Instance Ġ= ĠM Particle . getInstance () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmedia Session End Timestamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġif Ġ( media Content Complete Limit Ġ< Ġ 1 0 0 Ġ&& Ġ( duration Ġ!= Ġnull Ġ&& Ġcurrent Play head Position Ġ!= Ġnull ) Ġ&& Ġ(( current Play head Position !! Ġ/ Ġduration !! ) Ġ>= Ġ( media Content Complete Limit Ġ/ Ġ 1 0 0 ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Content Complete Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmedia EventListener ?. invoke ( media Event ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( log Media Events ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmp article Instance ?. log Event ( media Event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠLogger . error (" MP article Ġinstance Ġis Ġnull , Ġunable Ġto Ġlog ĠMedia Event ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( log MP Events ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// never Ġlog ĠUPDATE _ PLAY HEAD _ POSITION ĠMedia ĠEvents , Ġfar Ġto Ġhigh Ġvolume Ġto Ġbe Ġlogging Ġto Ġour Ġserver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( media Event . eventName Ġ!= ĠMedia Event Name . UPDATE _ PLAY HEAD _ POSITION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmp Event Ġ= Ġmedia Event . to MP Event () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmp article Instance ?. log Event ( mp Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġbuilder ( mp article : ĠM Particle ? Ġ= Ġnull ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBuilder ( mp article ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġbuilder (): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBuilder () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuilder ( mp article : ĠM Particle ? Ġ= Ġnull , Ġbuilder Function : ĠBuilder . () Ġ-> ĠUnit ): ĠMedia Session Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbuilder Ġ= ĠBuilder ( mp article ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . builder Function () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuilder . build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBuilder Ġinternal Ġconstructor ( var Ġmp article : ĠM Particle ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtitle : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Jvm Synt hetic ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġmedia Content Id : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Jvm Synt hetic ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġduration : ĠLong ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Jvm Synt hetic ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġstream Type : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Jvm Synt hetic ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ĊĠĠĠĠĠĠĠ Ġvar ĠcontentType : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Jvm Synt hetic ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġlog Media Events : ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Jvm Synt hetic ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġlog MP Events : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Jvm Synt hetic ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġmedia Content Complete Limit Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Jvm Synt hetic ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġthe ĠTitle Ġof Ġthe Ġ{@ link ĠMedia Content } Ġfor Ġthis Ġ{@ link ĠMedia Session } ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġtitle ( title : ĠString ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . title Ġ= Ġtitle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġthe ĠMedia Content Id Ġof Ġthe Ġ{@ link ĠMedia Content } Ġfor Ġthis Ġ{@ link ĠMedia Session } ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġmedia Content Id ( media Content Id : ĠString ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . media Content Id Ġ= Ġmedia Content Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġthe ĠDuration Ġof Ġthe Ġ{@ link ĠMedia Content } Ġfor Ġthis Ġ{@ link ĠMedia Session } ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġduration ( duration : ĠLong ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . duration Ġ= Ġduration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġthe ĠStream Type Ġof Ġthe Ġ{@ link ĠMedia Content } Ġfor Ġthis Ġ{@ link ĠMedia Session } ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġstream Type ( stream Type : ĠString ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . stream Type Ġ= Ġstream Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġthe ĠContentType Ġof Ġthe Ġ{@ link ĠMedia Content } Ġfor Ġthis Ġ{@ link ĠMedia Session } ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun ĠcontentType ( contentType : ĠString ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . contentType Ġ= ĠcontentType ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠIndic ate Ġwhether Ġthis Ġ{@ link ĠMedia Session } Ġshould Ġautomatically Ġlog Ġgenerated Ġ{@ link ĠMedia Event } ĊĠĠĠĠĠĠĠĠ Ġ* Ġinstances Ġto ĠK its ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġlog Media Events ( should Log : ĠBoolean ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . log Media Events Ġ= Ġshould Log ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ; ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠIndic ate Ġwhether Ġthis Ġ{@ link ĠMedia Session } Ġshould Ġautomatically Ġlog Ġgenerated Ġ{@ link ĠMP Event } ĊĠĠĠĠĠĠĠĠ Ġ* Ġinstances Ġand Ġto Ġthe ĠM Particle ĠServer ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġlog MP Events ( should Log : ĠBoolean ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . log MP Events Ġ= Ġshould Log ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġthe ĠPer centage Ġof Ġthe Ġ{@ link ĠMedia Content } Ġthe Ġuser Ġneeds Ġto Ġprogress Ġto Ġfor Ġcontent Ġto Ġbe Ġmarked Ġcomplete ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġmedia Content Complete Limit ( content Complete Limit : ĠInt ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . media Content Complete Limit Ġ= Ġcontent Complete Limit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBuild Ġto Ġa Ġ{@ link ĠMedia Session } ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠMedia Session Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMedia Session ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ private Ġfun ĠString ?. require ( variable Name : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġif Ġ( this Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLogger . error ("\" $ variable Name \" Ġshould Ġnot Ġbe Ġnull ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis Ġ?: Ġ"" Ċ } Ċ Ċ interface ĠMedia EventListener Ġ{ ĊĠĠĠ Ġfun Ġon Log Media Event ( media Event : ĠMedia Event ) Ċ }