package Ġcom . mapbox . navigation . core . replay . history Ċ Ċ import Ġcom . mapbox . android . core . location . Location Engine Ċ import Ġcom . mapbox . base . common . logger . Logger Ċ import Ġjava . util . Collections . singletonList Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġis Ġsimilar Ġto Ġa Ġmusic Ġplayer . ĠIt Ġwill Ġinclude Ġcontrols Ġlike Ġplay , Ġpause , Ġseek . Ċ Ġ*/ Ċ class ĠRe play History Player ( ĊĠĠĠ Ġlogger : ĠLogger Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġreplay Events Ġ= ĠRe play Events ( mutable ListOf ()) ĊĠĠĠ Ġprivate Ġval Ġreplay Event Simulator Ġ= ĠRe play Event Simulator ( replay Events , Ġlogger ) ĊĊĠĠĠ Ġprivate Ġval Ġreplay Events Observer s : ĠMutable List < Replay Events Observer > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠApp ends Ġevents Ġto Ġbe Ġreplay ed . ĠNotice Ġthe Ġbasis Ġof Ġyour Ġ[ Replay Event Base . event Timestamp ]. ĊĠĠĠĠ Ġ* ĠWhen Ġthey Ġare Ġdr astic ally Ġdifferent , Ġyou Ġmay Ġneed Ġto Ġ[ seek To ] Ġevents . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġevents Ġthe Ġevents Ġto Ġbe Ġreplay ed . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpush Events ( events : ĠList < Replay Event Base >): ĠRe play History Player Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . replay Events . events . addAll ( events ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClear Ġall Ġreplay Ġevents . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclear Events () Ġ{ ĊĠĠĠĠĠĠĠ Ġreplay Events . events . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegister Ġreplay Ġevent Ġob servers . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġobserver Ġthe Ġobserver Ġregistered ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġregister Observer ( observer : ĠRe play Events Observer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreplay Events Observer s . add ( observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġregistered Ġob servers . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġobserver Ġthe Ġobserver Ġbeing Ġremoved ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġobserver Ġwas Ġregistered , Ġfalse Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġunregister Observer ( observer : ĠRe play Events Observer ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreplay Events Observer s . remove ( observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġall Ġregistered Ġob servers . ĠIf Ġthe Ġplayer Ġis Ġstill Ġplaying , ĊĠĠĠĠ Ġ* Ġnone Ġof Ġthe Ġevents Ġwill Ġbe Ġobserved . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ finish ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġunregister Observer s () Ġ{ ĊĠĠĠĠĠĠĠ Ġreplay Events Observer s . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġwill Ġbegin Ġplaying Ġthe Ġ[ Replay Event Base ] Ġand Ġnotify ing Ġob servers ĊĠĠĠĠ Ġ* Ġregistered Ġvia Ġ[ register Observer ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġplay () Ġ{ ĊĠĠĠĠĠĠĠ Ġreplay Event Simulator . launch Simulator Ġ{ Ġreplay Events Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreplay Events Observer s . forEach Ġ{ Ġit . replay Events ( replay Events ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStop Ġplaying Ġall Ġremaining Ġand Ġincoming Ġevents . ĠTo Ġplay Ġevents , Ġyou Ġmust ĊĠĠĠĠ Ġ* Ġrestart Ġthe Ġplayer Ġby Ġcalling Ġ[ play ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ playback Speed ] Ġto Ġpause Ġthe Ġplayer ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ finish ] Ġto Ġclean Ġup Ġthe Ġplayer ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġreplay Event Simulator . stop Simulator () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġdetermines Ġthe Ġspeed Ġof Ġevent Ġplayback . ĠDefault Ġis Ġ 1 . 0 Ġfor Ġ 1 x Ġplayback Ġspeed . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFor Ġfaster Ġplayback , Ġuse Ġvalues Ġgreater Ġthan Ġone Ġsuch Ġas Ġ 2 x , Ġ 3 x Ġor Ġeven Ġ 4 x . ĊĠĠĠĠ Ġ* ĠFor Ġslower Ġplayback , Ġuse Ġvalues Ġbetween Ġ 0 Ġand Ġ 1 ; Ġ 0 . 2 5 Ġwill Ġreplay Ġat Ġ 1 / 4 th Ġspeed . ĊĠĠĠĠ Ġ* ĠTo Ġpause Ġplayback , Ġuse Ġ 0 . 0 ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNegative Ġ( going Ġbackwards ), Ġis Ġnot Ġsupported . ĠUse Ġ[ seek To ] Ġto Ġgo Ġback Ġin Ġtime . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġplayback Speed ( scale : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( scale Ġ>= Ġ 0 . 0 ) Ġ{ Ġ" Negative Ġplayback Ġis Ġnot Ġsupported : Ġ$ scale " Ġ} ĊĠĠĠĠĠĠĠ Ġreplay Event Simulator . playback Speed ( scale ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhen Ġinitializing Ġor Ġtesting Ġan Ġapp , Ġit Ġis Ġneeded Ġand Ġuseful Ġto Ġdecide Ġa Ġcode Ġlocation ĊĠĠĠĠ Ġ* Ġto Ġplay Ġthe Ġfirst Ġlocation Ġfrom ĠGPS . ĠWhen Ġit Ġis Ġearly , Ġyou Ġmay Ġcrash . ĠWhen Ġit ĊĠĠĠĠ Ġ* Ġis Ġlate , Ġyou Ġmay Ġstart Ġin Ġnull Ġis land Ġ- ĠLat Lng ( 0 , 0 ). ĊĠĠĠĠ Ġ* ĠUse Ġthis Ġfunction Ġto Ġplay Ġthe Ġfirst Ġlocation Ġreceived Ġfrom Ġyour Ġ[ Location Engine ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġplay First Location () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfirst Update Location Ġ= Ġreplay Events . events . first OrNull Ġ{ Ġreplay Event Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreplay Event Ġis ĠRe play Event Update Location ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfirst Update Location ?. let Ġ{ Ġreplay Event Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreplay Events Ġ= Ġsingleton List ( replay Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreplay Events Observer s . forEach Ġ{ Ġit . replay Events ( replay Events ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġduration Ġof Ġthe Ġreplay . ĠThis Ġvalue Ġwill Ġbe Ġbetween Ġ 0 . 0 Ġand Ġthe Ġtotal Ġduration . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġduration Ġin Ġseconds ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġduration Seconds (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfirst Event Ġ= Ġreplay Events . events . first () ĊĠĠĠĠĠĠĠ Ġval Ġlast Event Ġ= Ġreplay Events . events . last () ĊĠĠĠĠĠĠĠ Ġreturn Ġlast Event . event Timestamp Ġ- Ġfirst Event . event Timestamp ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSeek Ġto Ġa Ġtime Ġto Ġplay Ġfrom . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġreplay Time Ġtime Ġin Ġseconds Ġbetween Ġ 0 . 0 Ġto Ġ[ duration Seconds ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġseek To ( replay Time : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoffset Time Ġ= Ġreplay Time Ġ+ Ġreplay Events . events . first (). event Timestamp ĊĠĠĠĠĠĠĠ Ġval ĠindexOf Event Ġ= Ġreplay Events . events ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. indexOf First Ġ{ Ġoffset Time Ġ<= Ġit . event Timestamp Ġ} ĊĠĠĠĠĠĠĠ Ġcheck ( indexOf Event Ġ>= Ġ 0 ) Ġ{ Ġ" Make Ġsure Ġyour Ġreplay Time Ġis Ġless Ġthan Ġreplay Duration Seconds Ġ$ replay Time Ġ> Ġ${ duration Seconds ()} : Ġ" Ġ} ĊĊĠĠĠĠĠĠĠ Ġreplay Event Simulator . seek To ( indexOf Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSeek Ġto Ġthe Ġevent Ġyou Ġwant Ġto Ġplay Ġfrom . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġreplay Event Ġan Ġevent Ġthat Ġhas Ġbeen Ġpushed Ġto Ġ[ push Events ] ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġ[ replay Event ] Ġwas Ġnot Ġpushed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġseek To ( replay Event : ĠRe play Event Base ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠindexOf Event Ġ= Ġreplay Events . events . indexOf ( replay Event ) ĊĠĠĠĠĠĠĠ Ġcheck ( indexOf Event Ġ>= Ġ 0 ) Ġ{ Ġ" You Ġmust Ġfirst Ġpush Events Ġand Ġthen Ġseek To Ġan Ġevent " Ġ} ĊĊĠĠĠĠĠĠĠ Ġreplay Event Simulator . seek To ( indexOf Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvenience Ġfunction Ġto Ġstop , Ġremove Ġlisteners , Ġand Ġclean Ġup Ġthe Ġplayer . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfinish () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠ Ġunregister Observer s () ĊĠĠĠĠĠĠĠ Ġclear Events () ĊĠĠĠ Ġ} Ċ } Ċ