/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 ĠNam ĠN gu yen , Ġnam @ ene . im Ċ Ġ* Ċ Ġ* Ġ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 Ġk oh ii . v 1 . core Ċ Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . annotation . Call Super Ċ import Ġandroidx . annotation . Float Range Ċ import Ġandroidx . core . view . View Compat Ċ import Ġandroidx . lifecycle . Lifecycle . State Ċ import Ġandroidx . lifecycle . Lifecycle . State . STARTED Ċ import Ġk oh ii . v 1 . Build Config Ċ import Ġk oh ii . v 1 . core . Bucket . Companion . BOTH _ AXIS Ċ import Ġk oh ii . v 1 . core . Bucket . Companion . HORIZONTAL Ċ import Ġk oh ii . v 1 . core . Bucket . Companion . NONE _ AXIS Ċ import Ġk oh ii . v 1 . core . Bucket . Companion . VERTICAL Ċ import Ġk oh ii . v 1 . core . Common . STATE _ BUFFER ING Ċ import Ġk oh ii . v 1 . core . Common . STATE _ ENDED Ċ import Ġk oh ii . v 1 . core . Common . STATE _ IDLE Ċ import Ġk oh ii . v 1 . core . Common . STATE _ READY Ċ import Ġk oh ii . v 1 . log Debug Ċ import Ġk oh ii . v 1 . media . Playback Info Ċ import Ġk oh ii . v 1 . media . Volume Info Ċ import Ġjava . util . Array Deque Ċ import Ġkotlin . Lazy Thread Safety Mode . NONE Ċ import Ġkotlin . math . max Ċ import Ġkotlin . properties . Deleg ates Ċ Ċ abstract Ġclass ĠPlay back ( ĊĠ Ġinternal Ġval Ġmanager : ĠManager , ĊĠ Ġinternal Ġval Ġbucket : ĠBucket , ĊĠ Ġval Ġcontainer : ĠViewGroup , ĊĠ Ġval Ġconfig : ĠConfig Ġ= ĠConfig () Ċ ) Ġ: ĠPlayer EventListener , ĊĠĠĠ ĠError Listener Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠ Ġconst Ġval ĠDEL AY _ INF IN ITE Ġ= Ġ- 1 L ĊĊĠĠĠ Ġinternal Ġval ĠC ENTER _ X : ĠComparator < Token > Ġby Ġlazy ( NONE ) Ġ{ ĊĠĠĠĠĠ ĠComparator < Token > Ġ{ Ġo 1 , Ġo 2 Ġ-> ĊĠĠĠĠĠĠĠ Ġcompare Values ( o 1 . container Rect . center X (), Ġo 2 . container Rect . center X ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġval ĠC ENTER _ Y : ĠComparator < Token > Ġby Ġlazy ( NONE ) Ġ{ ĊĠĠĠĠĠ ĠComparator < Token > Ġ{ Ġo 1 , Ġo 2 Ġ-> ĊĠĠĠĠĠĠĠ Ġcompare Values ( o 1 . container Rect . center Y (), Ġo 2 . container Rect . center Y ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġval ĠV ERT ICAL _ COMP AR ATOR Ġby Ġlazy ( NONE ) Ġ{ ĊĠĠĠĠĠ ĠComparator < Playback > Ġ{ Ġo 1 , Ġo 2 Ġ-> Ġo 1 . compare With ( o 2 , ĠV ERT ICAL ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġval ĠH ORIZONTAL _ COMP AR ATOR Ġby Ġlazy ( NONE ) Ġ{ ĊĠĠĠĠĠ ĠComparator < Playback > Ġ{ Ġo 1 , Ġo 2 Ġ-> Ġo 1 . compare With ( o 2 , ĠH ORIZONTAL ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġval ĠBOT H _ AXIS _ COMP AR ATOR Ġby Ġlazy ( NONE ) Ġ{ ĊĠĠĠĠĠ ĠComparator < Playback > Ġ{ Ġo 1 , Ġo 2 Ġ-> Ġo 1 . compare With ( o 2 , ĠBOT H _ AXIS ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠSTATE _ CREATED Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġconst Ġval ĠSTATE _ RE MOVED Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġconst Ġval ĠSTATE _ AD DED Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġconst Ġval ĠSTATE _ DET ACHED Ġ= Ġ 2 ĊĠĠĠ Ġprivate Ġconst Ġval ĠSTATE _ ATTACH ED Ġ= Ġ 3 ĊĠĠĠ Ġprivate Ġconst Ġval ĠSTATE _ IN ACTIVE Ġ= Ġ 4 ĊĠĠĠ Ġprivate Ġconst Ġval ĠSTATE _ ACTIVE Ġ= Ġ 5 ĊĠ Ġ} ĊĊĠ Ġclass ĠToken ( ĊĠĠĠ Ġprivate Ġval Ġthreshold : ĠFloat Ġ= Ġ 0 . 6 5 F , ĊĠĠĠ Ġ@ Float Range ( from Ġ= Ġ- 1 . 0 , Ġto Ġ= Ġ 1 . 0 ) ĊĠĠĠ Ġval Ġarea Offset : ĠFloat , Ġ// Ġ- 1 Ġ~ Ġ< Ġ 0 Ġ: Ġinactive Ġor Ġdet ached , Ġ 0 Ġ~ Ġ 1 : Ġactive ĊĠĠĠ Ġval Ġcontainer Rect : ĠRect Ġ// ĠRelative ĠRect Ġto Ġits ĠBucket 's Ġroot ĠView . ĊĠ Ġ) Ġ{ ĊĊĠĠĠ Ġfun Ġshould Prepare (): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġreturn Ġarea Offset Ġ>= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshould Play (): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġreturn Ġarea Offset Ġ>= Ġthreshold ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġdata Ġclass ĠConfig ( ĊĠĠĠ Ġval Ġtag : ĠAny Ġ= ĠMaster . NO _ TAG , ĊĠĠĠ Ġval Ġdelay : ĠInt Ġ= Ġ 0 , ĊĠĠĠ Ġval Ġthreshold : ĠFloat Ġ= Ġ 0 . 6 5 F , ĊĠĠĠ Ġval Ġpreload : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġval Ġrepeat Mode : ĠInt Ġ= ĠCommon . REPEAT _ MODE _ OFF , ĊĠĠĠ Ġval Ġcontroller : ĠController ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġart work Hint Listener : ĠArt work Hint Listener ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġcallbacks : ĠSet < Callback > Ġ= Ġempty Set () ĊĠ Ġ) ĊĊĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġ"${ super . toString ()}, Ġ[$ play able ], Ġ[ ${ token . area Offset }, Ġ${ token . container Rect }] " ĊĠ Ġ} ĊĊĠ Ġprotected Ġopen Ġfun Ġupdate Token (): ĠToken Ġ{ ĊĠĠĠ Ġ" Playback # update Token Ġ$ this ". log Debug () ĊĠĠĠ Ġval Ġcontainer Rect Ġ= ĠRect () ĊĠĠĠ Ġif Ġ(! lifecycle State . is At Least ( STARTED )) Ġreturn ĠToken ( ĊĠĠĠĠĠĠĠ Ġconfig . threshold , Ġ- 1 F , Ġcontainer Rect ĊĠĠĠ Ġ) ĊĠĠĠ Ġif Ġ(! View Compat . is Attached To Window ( container )) Ġ{ ĊĠĠĠĠĠ Ġreturn ĠToken ( config . threshold , Ġ- 1 F , Ġcontainer Rect ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġvisible Ġ= Ġcontainer . getGlobal Visible Rect ( container Rect ) ĊĠĠĠ Ġif Ġ(! visible ) Ġreturn ĠToken ( ĊĠĠĠĠĠĠĠ Ġconfig . threshold , Ġ- 1 F , Ġcontainer Rect ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġdraw Area Ġ= Ġwith ( Rect ()) Ġ{ ĊĠĠĠĠĠ Ġcontainer . get Drawing Rect ( this ) ĊĠĠĠĠĠ Ġcontainer . clip Bounds ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . intersect ( it ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġwidth () Ġ* Ġheight () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġoffset : ĠFloat Ġ= ĊĠĠĠĠĠ Ġif Ġ( draw Area Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ( container Rect . width () Ġ* Ġcontainer Rect . height ()) Ġ/ Ġdraw Area . toFloat () ĊĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠ 0 F ĊĠĠĠ Ġreturn ĠToken ( config . threshold , Ġoffset , Ġcontainer Rect ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġcallbacks Ġ= ĠArray Deque < Callback >() ĊĠ Ġprivate Ġval Ġlisteners Ġ= ĠArray Deque < State Listener >() ĊĠ Ġprivate Ġvar Ġart work Hint Listener : ĠArt work Hint Listener ? Ġ= Ġnull ĊĊĠ Ġinternal Ġopen Ġfun Ġacquire Renderer (): ĠAny ? Ġ{ ĊĠĠĠ Ġval Ġplay able Ġ= Ġthis . play able ĊĠĠĠ Ġrequire NotNull ( play able ) ĊĠĠĠ Ġval Ġprovider : ĠRenderer Provider Ġ= Ġmanager . find Renderer Provider ( play able ) ĊĠĠĠ Ġreturn Ġprovider . acquire Renderer ( this , Ġplay able . media ) ĊĠ Ġ} ĊĊĠ Ġinternal Ġopen Ġfun Ġrelease Renderer ( ĊĠĠĠ Ġrenderer : ĠAny ? ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġval Ġplay able Ġ= Ġthis . play able ĊĠĠĠ Ġrequire NotNull ( play able ) ĊĠĠĠ Ġval Ġprovider : ĠRenderer Provider Ġ= Ġmanager . find Renderer Provider ( play able ) ĊĠĠĠ Ġreturn Ġprovider . release Renderer ( this , Ġplay able . media , Ġrenderer ) ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġattach Renderer ( renderer : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠ Ġ" Playback # attach Renderer Ġ$ renderer Ġ$ this ". log Debug () ĊĠĠĠ Ġreturn Ġon Attach Renderer ( renderer ) ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġdetach Renderer ( renderer : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠ Ġ" Playback # detach Renderer Ġ$ renderer Ġ$ this ". log Debug () ĊĠĠĠ Ġreturn Ġon Detach Renderer ( renderer ) ĊĠ Ġ} ĊĊĠ Ġ// ĠReturn Ġ` true ` Ġto Ġindicate Ġthat Ġthe ĠRenderer Ġis Ġsafely Ġattached Ġto Ġcontainer Ġand ĊĠ Ġ// Ġcan Ġbe Ġused Ġby Ġthe ĠPlay able . ĊĠ Ġprotected Ġabstract Ġfun Ġon Attach Renderer ( renderer : ĠAny ?): ĠBoolean ĊĊĠ Ġ// ĠReturn Ġ` true ` Ġto Ġindicate Ġthat Ġthe ĠRenderer Ġis Ġsafely Ġdet ached Ġfrom Ġcontainer Ġand ĊĠ Ġ// ĠPlay able Ġshould Ġnot Ġuse Ġit Ġany Ġfurther . ĠRenderer Provider Ġwill Ġthen Ġrelease Ġthe ĠRenderer Ġwith ĊĠ Ġ// Ġproper Ġmechanism Ġ( eg : Ġput Ġit Ġback Ġto ĠPool Ġfor Ġreuse ). ĊĠ Ġprotected Ġabstract Ġfun Ġon Detach Renderer ( renderer : ĠAny ?): ĠBoolean ĊĊĠ Ġinternal Ġfun Ġon Added () Ġ{ ĊĠĠĠ Ġ" Playback # on Added Ġ$ this ". log Debug () ĊĠĠĠ Ġplayback State Ġ= ĠSTATE _ AD DED ĊĠĠĠ Ġcallbacks . forEach Ġ{ Ġit . on Added ( this ) Ġ} ĊĠĠĠ Ġart work Hint Listener Ġ= Ġconfig . art work Hint Listener ĊĠĠĠ Ġbucket . add Container ( this . container ) ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġon Removed () Ġ{ ĊĠĠĠ Ġ" Playback # on Removed Ġ$ this ". log Debug () ĊĠĠĠ Ġplayback State Ġ= ĠSTATE _ RE MOVED ĊĠĠĠ Ġbucket . remove Container ( this . container ) ĊĠĠĠ Ġart work Hint Listener Ġ= Ġnull ĊĠĠĠ Ġcallbacks . on Each Ġ{ Ġit . on Removed ( this ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. clear () ĊĠĠĠ Ġlisteners . clear () ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġon Attached () Ġ{ ĊĠĠĠ Ġ" Playback # on Attached Ġ$ this ". log Debug () ĊĠĠĠ Ġplayback State Ġ= ĠSTATE _ ATTACH ED ĊĠĠĠ Ġcallbacks . forEach Ġ{ Ġit . on Attached ( this ) Ġ} ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġon Detached () Ġ{ ĊĠĠĠ Ġ" Playback # on Detached Ġ$ this ". log Debug () ĊĠĠĠ Ġplayback State Ġ= ĠSTATE _ DET ACHED ĊĠĠĠ Ġcallbacks . forEach Ġ{ Ġit . on Detached ( this ) Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Call Super ĊĠ Ġinternal Ġopen Ġfun Ġon Active () Ġ{ ĊĠĠĠ Ġ" Playback # on Active Ġ$ this ". log Debug () ĊĠĠĠ Ġplayback State Ġ= ĠSTATE _ ACTIVE ĊĠĠĠ Ġcallbacks . forEach Ġ{ Ġit . on Active ( this ) Ġ} ĊĠĠĠ Ġart work Hint Listener ?. on Artwork Hint ( ĊĠĠĠĠĠĠĠ Ġplay able ?. is Playing () Ġ== Ġfalse , ĊĠĠĠĠĠĠĠ Ġplayback Info . resume Position , ĊĠĠĠĠĠĠĠ Ġplayer State ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġ@ Call Super ĊĠ Ġinternal Ġopen Ġfun Ġon In Active () Ġ{ ĊĠĠĠ Ġ" Playback # on In Active Ġ$ this ". log Debug () ĊĠĠĠ Ġplayback State Ġ= ĠSTATE _ IN ACTIVE ĊĠĠĠ Ġart work Hint Listener ?. on Artwork Hint ( true , Ġplayback Info . resume Position , Ġplayer State ) ĊĠĠĠ Ġplay able ?. consider Release Renderer ( this ) ĊĠĠĠ Ġcallbacks . forEach Ġ{ Ġit . on In Active ( this ) Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Call Super ĊĠ Ġinternal Ġopen Ġfun Ġon Play () Ġ{ ĊĠĠĠ Ġ" Playback # on Play Ġ$ this ". log Debug () ĊĠĠĠ Ġcontainer . keep Screen On Ġ= Ġtrue ĊĠĠĠ Ġart work Hint Listener ?. on Artwork Hint ( ĊĠĠĠĠĠĠĠ Ġplayer State Ġ== ĠSTATE _ ENDED , Ġplayback Info . resume Position , Ġplayer State ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġ@ Call Super ĊĠ Ġinternal Ġopen Ġfun Ġon Pause () Ġ{ ĊĠĠĠ Ġcontainer . keep Screen On Ġ= Ġfalse ĊĠĠĠ Ġ" Playback # on Pause Ġ$ this ". log Debug () ĊĠĠĠ Ġart work Hint Listener ?. on Artwork Hint ( true , Ġplayback Info . resume Position , Ġplayer State ) ĊĠ Ġ} ĊĊĠ Ġ// ĠWill Ġbe Ġupdated Ġevery time Ġ' on Refresh ' Ġis Ġcalled . ĊĠ Ġprivate Ġvar Ġ_ token : ĠToken Ġ= ĊĠĠĠ ĠToken ( config . threshold , Ġ- 1 F , ĠRect ()) ĊĊĠ Ġinternal Ġval Ġtoken : ĠToken ĊĠĠĠ Ġget () Ġ= Ġ_ token ĊĊĠ Ġinternal Ġfun Ġon Refresh () Ġ{ ĊĠĠĠ Ġ" Playback # on Refresh Ġ$ this ". log Debug () ĊĠĠĠ Ġ_ token Ġ= Ġupdate Token () ĊĠ Ġ} ĊĊĠ Ġprivate Ġvar Ġplayback State : ĠInt Ġ= ĠSTATE _ CREATED ĊĊĠ Ġinternal Ġval Ġis Attached : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġplayback State Ġ>= ĠSTATE _ ATTACH ED ĊĊĠ Ġinternal Ġval ĠisActive : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġplayback State Ġ>= ĠSTATE _ ACTIVE ĊĊĠ Ġinternal Ġvar Ġlifecycle State : ĠState Ġ= ĠState . INITIAL IZED ĊĊĠ Ġ// ĠThe Ġsmaller , Ġthe Ġcloser Ġit Ġis Ġto Ġbe Ġselected Ġto ĠPlay . ĊĠ Ġ// ĠConsider Ġto Ġprepare Ġthe Ġunderline ĠPlay able Ġfor Ġlow Ġenough Ġdistance , Ġand Ġrelease Ġit Ġotherwise . ĊĠ Ġ// ĠThis Ġvalue Ġis Ġupdated Ġby ĠGroup . ĠIn Ġactive ĠPlay back Ġalways Ġhas ĠInt . MAX _ VALUE Ġdistance . ĊĠ Ġinternal Ġvar Ġdistance To Play : ĠInt Ġby ĠDeleg ates . observable ( ĊĠĠĠĠĠ ĠInt . MAX _ VALUE , ĊĠĠĠĠĠ ĠonChange Ġ= Ġ{ Ġ_, Ġfrom , Ġto Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( from Ġ== Ġto ) Ġreturn @ observable ĊĠĠĠĠĠĠĠ Ġ" Playback # distance To Play Ġ$ from Ġ--> Ġ$ to , Ġ$ this ". log Debug () ĊĠĠĠĠĠĠĠ Ġplay able ?. on Distance Changed ( this , Ġfrom , Ġto ) ĊĠĠĠĠĠ Ġ}) ĊĊĠ Ġinternal Ġvar Ġvolume Info Updater : ĠVolume Info Ġby ĠDeleg ates . observable ( ĊĠĠĠĠĠ Ġinitial Value Ġ= Ġbucket . volume Info , ĊĠĠĠĠĠ ĠonChange Ġ= Ġ{ Ġ_, Ġfrom , Ġto Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( from Ġ== Ġto ) Ġreturn @ observable ĊĠĠĠĠĠĠĠ Ġ" Playback # volume Info Ġ$ from Ġ--> Ġ$ to , Ġ$ this ". log Debug () ĊĠĠĠĠĠĠĠ Ġplay able ?. on Volume Info Changed ( this , Ġfrom , Ġto ) ĊĠĠĠĠĠ Ġ} ĊĠ Ġ) ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġvolume Info Updater Ġ= Ġbucket . volume Info ĊĠ Ġ} ĊĊĠ Ġinternal Ġvar Ġplay able : ĠPlay able ? Ġ= Ġnull ĊĊĠ Ġinternal Ġfun Ġcompare With ( ĊĠĠĠ Ġother : ĠPlay back , ĊĠĠĠ Ġorientation : ĠInt ĊĠ Ġ): ĠInt Ġ{ ĊĠĠĠ Ġ" Playback # compare With Ġ$ this Ġ$ other , Ġ$ this ". log Debug () ĊĠĠĠ Ġval Ġthis Token Ġ= Ġthis . token ĊĠĠĠ Ġval Ġthat Token Ġ= Ġother . token ĊĊĠĠĠ Ġval Ġcompare Vert ically Ġby Ġlazy ( NONE ) Ġ{ ĠC ENTER _ Y . compare ( this Token , Ġthat Token ) Ġ} ĊĠĠĠ Ġval Ġcompare H orizontally Ġby Ġlazy ( NONE ) Ġ{ ĠC ENTER _ X . compare ( this Token , Ġthat Token ) Ġ} ĊĊĠĠĠ Ġvar Ġresult Ġ= Ġwhen Ġ( orientation ) Ġ{ ĊĠĠĠĠĠ ĠV ERT ICAL Ġ-> Ġcompare Vert ically ĊĠĠĠĠĠ ĠH ORIZONTAL Ġ-> Ġcompare H orizontally ĊĠĠĠĠĠ ĠBOT H _ AXIS Ġ-> Ġmax ( compare Vert ically , Ġcompare H orizontally ) ĊĠĠĠĠĠ ĠNONE _ AXIS Ġ-> Ġmax ( compare Vert ically , Ġcompare H orizontally ) ĊĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( result Ġ== Ġ 0 ) Ġresult Ġ= Ġcompare Values ( this Token . area Offset , Ġthat Token . area Offset ) ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġ// ĠPublic ĠAPIs ĊĊĠ Ġval Ġtag Ġ= Ġconfig . tag ĊĊĠ Ġprivate Ġval Ġplayer State : ĠInt ĊĠĠĠ Ġget () Ġ= Ġplay able ?. player State Ġ?: ĠSTATE _ IDLE ĊĊĠ Ġval Ġvolume Info : ĠVolume Info ĊĠĠĠ Ġget () Ġ= Ġvolume Info Updater ĊĊĠ Ġprivate Ġval Ġplayback Info : ĠPlay back Info ĊĠĠĠ Ġget () Ġ= Ġplay able ?. playback Info Ġ?: ĠPlay back Info () ĊĊĠ Ġval Ġcontainer Rect : ĠRect ĊĠĠĠ Ġget () Ġ= Ġtoken . container Rect ĊĊĠ Ġfun Ġadd Callback ( callback : ĠCallback ) Ġ{ ĊĠĠĠ Ġ" Playback # add Callback Ġ$ callback , Ġ$ this ". log Debug () ĊĠĠĠ Ġthis . callbacks . push ( callback ) ĊĠ Ġ} ĊĊĠ Ġfun Ġremove Callback ( callback : ĠCallback ?) Ġ{ ĊĠĠĠ Ġ" Playback # remove Callback Ġ$ callback , Ġ$ this ". log Debug () ĊĠĠĠ Ġthis . callbacks . remove ( callback ) ĊĠ Ġ} ĊĊĠ Ġfun Ġadd State Listener ( listener : ĠState Listener ) Ġ{ ĊĠĠĠ Ġ" Playback # add State Listener Ġ$ listener , Ġ$ this ". log Debug () ĊĠĠĠ Ġthis . listeners . add ( listener ) ĊĠ Ġ} ĊĊĠ Ġfun Ġremove State Listener ( listener : ĠState Listener ?) Ġ{ ĊĠĠĠ Ġ" Playback # remove State Listener Ġ$ listener , Ġ$ this ". log Debug () ĊĠĠĠ Ġthis . listeners . remove ( listener ) ĊĠ Ġ} ĊĊĠ Ġfun Ġun bind () Ġ{ ĊĠĠĠ Ġ" Playback # unbind , Ġ$ this ". log Debug () ĊĠĠĠ Ġcontainer . post Ġ{ ĊĠĠĠĠĠ Ġplay able ?. on Un bind ( this ) Ġ?: Ġmanager . remove Playback ( this ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġre wind ( refresh : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠ Ġplay able ?. on Reset () ĊĠĠĠ Ġif Ġ( refresh ) Ġmanager . refresh () ĊĠ Ġ} ĊĊĠ Ġ// ĠPlayer EventListener ĊĊĠ Ġoverride Ġfun Ġon Player StateChanged ( ĊĠĠĠ Ġplay When Ready : ĠBoolean , ĊĠĠĠ Ġplayback State : ĠInt ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġ" Playback # on Player StateChanged Ġ$ play When Ready Ġ- Ġ$ playback State , Ġ$ this ". log Debug () ĊĠĠĠ Ġwhen Ġ( playback State ) Ġ{ ĊĠĠĠĠĠ ĠSTATE _ IDLE Ġ-> Ġ{ ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠSTATE _ BUFFER ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit . on Buffer ing ( this @ Playback , Ġplay When Ready ) Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠSTATE _ READY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( play When Ready ) Ġit . on Playing ( this @ Playback ) Ġelse Ġit . on Paused ( this @ Playback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠSTATE _ ENDED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit . on Ended ( this @ Playback ) Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġart work Hint Listener ?. on Artwork Hint ( ĊĠĠĠĠĠĠĠ Ġplayer State Ġ== ĠSTATE _ ENDED Ġ|| Ġplayer State Ġ== ĠSTATE _ IDLE , ĊĠĠĠĠĠĠĠ Ġplayback Info . resume Position , Ġplayer State ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Video Size Changed ( ĊĠĠĠ Ġwidth : ĠInt , ĊĠĠĠ Ġheight : ĠInt , ĊĠĠĠ Ġun applied Rotation Degrees : ĠInt , ĊĠĠĠ Ġpixel Width Height Ratio : ĠFloat ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġ" Playback # on Video Size Changed Ġ$ width ĠÃĹ Ġ$ height , Ġ$ this ". log Debug () ĊĠĠĠ Ġlisteners . forEach Ġ{ ĊĠĠĠĠĠ Ġit . on Video Size Changed ( this , Ġwidth , Ġheight , Ġun applied Rotation Degrees , Ġpixel Width Height Ratio ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Rendered First Frame () Ġ{ ĊĠĠĠ Ġ" Playback # on Rendered First Frame , Ġ$ this ". log Debug () ĊĠĠĠ Ġlisteners . forEach Ġ{ Ġit . on Rendered ( this ) Ġ} ĊĠ Ġ} ĊĊĠ Ġ// ĠError Listener ĊĊĠ Ġoverride Ġfun ĠonError ( error : ĠException ) Ġ{ ĊĠĠĠ Ġ" Playback # onError Ġ$ error , Ġ$ this ". log Debug () ĊĠĠĠ Ġlisteners . forEach Ġ{ Ġit . onError ( this , Ġerror ) Ġ} ĊĠĠĠ Ġif Ġ( Build Config . DEBUG ) Ġerror . printStackTrace () ĊĠ Ġ} ĊĊĠ Ġinterface ĠState Listener Ġ{ ĊĊĠĠĠ Ġ/** ĠCalled Ġwhen Ġa ĠVideo Ġis Ġrendered Ġon Ġthe ĠSurface Ġfor Ġthe Ġfirst Ġtime Ġ*/ ĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġon Rendered ( playback : ĠPlay back ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġbuffer ing Ġstatus Ġof Ġthe Ġplayback Ġis Ġchanged . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġplay When Ready Ġtrue Ġif Ġthe ĠVideo Ġwill Ġstart Ġplaying Ġonce Ġbuffered Ġenough , Ġfalse Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġon Buffer ing ( ĊĠĠĠĠĠ Ġplayback : ĠPlay back , ĊĠĠĠĠĠ Ġplay When Ready : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠ Ġ} Ġ// ĠEx o Player Ġstate : Ġ 2 ĊĊĠĠĠ Ġ/** ĠCalled Ġwhen Ġthe ĠVideo Ġstarts Ġplaying Ġ*/ ĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġon Playing ( playback : ĠPlay back ) Ġ{ ĊĠĠĠ Ġ} Ġ// ĠEx o Player Ġstate : Ġ 3 , Ġplay Ġflag : Ġtrue ĊĊĠĠĠ Ġ/** ĠCalled Ġwhen Ġthe ĠVideo Ġis Ġpaused Ġ*/ ĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġon Paused ( playback : ĠPlay back ) Ġ{ ĊĠĠĠ Ġ} Ġ// ĠEx o Player Ġstate : Ġ 3 , Ġplay Ġflag : Ġfalse ĊĊĠĠĠ Ġ/** ĠCalled Ġwhen Ġthe ĠVideo Ġfinishes Ġits Ġplayback Ġ*/ ĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġon Ended ( playback : ĠPlay back ) Ġ{ ĊĠĠĠ Ġ} Ġ// ĠEx o Player Ġstate : Ġ 4 ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġon Video Size Changed ( ĊĠĠĠĠĠ Ġplayback : ĠPlay back , ĊĠĠĠĠĠ Ġwidth : ĠInt , ĊĠĠĠĠĠ Ġheight : ĠInt , ĊĠĠĠĠĠ Ġun Applied Rotation Degrees : ĠInt , ĊĠĠĠĠĠ Ġpixel Width Height Ratio : ĠFloat ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun ĠonError ( ĊĠĠĠĠĠ Ġplayback : ĠPlay back , ĊĠĠĠĠĠ Ġexception : ĠException ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinterface ĠCallback Ġ{ ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġon Active ( playback : ĠPlay back ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġon In Active ( playback : ĠPlay back ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġon Added ( playback : ĠPlay back ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġon Removed ( playback : ĠPlay back ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġon Attached ( playback : ĠPlay back ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġon Detached ( playback : ĠPlay back ) Ġ{ ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinterface ĠController Ġ{ ĊĠĠĠ Ġ// Ġfalse Ġ= Ġfull Ġmanual . ĊĠĠĠ Ġ// Ġtrue Ġ= Ġhalf Ġmanual . ĊĠĠĠ Ġ// ĠWhen Ġtrue : ĊĠĠĠ Ġ// Ġ- ĠIf Ġuser Ġstarts Ġa ĠPlay back , Ġit Ġwill Ġnot Ġbe Ġpaused Ġuntil ĠPlay back Ġis Ġnot Ġvisible Ġenough ĊĠĠĠ Ġ// Ġ( controlled Ġby ĠPlay back . Config ), Ġor Ġuser Ġstarts Ġother ĠPlay back Ġ( priority Ġoverridden ). ĊĠĠĠ Ġ// Ġ- ĠIf Ġuser Ġpause s Ġa ĠPlay back , Ġit Ġwill Ġnot Ġbe Ġplayed Ġuntil Ġuser Ġresume s Ġit . ĊĠĠĠ Ġ// Ġ- ĠIf Ġuser Ġscroll s Ġa ĠPlay back Ġso Ġthat Ġa Ġit Ġis Ġnot Ġvisible Ġenough , Ġsystem Ġwill Ġpause Ġthe ĠPlay back . ĊĠĠĠ Ġ// Ġ- ĠIf Ġuser Ġscroll s Ġa Ġpaused ĠPlay back Ġso Ġthat Ġit Ġis Ġvisible Ġenough , Ġsystem Ġwill : Ġplay Ġit Ġif Ġit Ġwas Ġpreviously Ġplayed Ġby ĠUser , ĊĠĠĠ Ġ// Ġor Ġpause Ġit Ġif Ġit Ġwas Ġpaused Ġby ĠUser Ġbefore Ġ(= Ġdo Ġnothing ). ĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġk oh ii Can Pause (): ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġ// Ġ- ĠAllow ĠSystem Ġto Ġstart Ġa ĠPlay back . ĊĠĠĠ Ġ// ĠWhen Ġtrue : ĊĠĠĠ Ġ// Ġ- ĠK oh ii Ġcan Ġstart Ġa ĠPlay back Ġautomatically . ĠBut Ġonce Ġuser Ġpause Ġit Ġmanually , ĠOnly Ġuser Ġcan Ġresume Ġit , ĊĠĠĠ Ġ// ĠK oh ii Ġshould Ġnever Ġstart / resume Ġthe ĠPlay back Ġautomatically . ĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġk oh ii Can Start (): ĠBoolean Ġ= Ġfalse ĊĠ Ġ} ĊĊĠ Ġinterface ĠArt work Hint Listener Ġ{ ĊĊĠĠĠ Ġfun Ġon Artwork Hint ( ĊĠĠĠĠĠ Ġshould Show : ĠBoolean , ĊĠĠĠĠĠ Ġposition : ĠLong , ĊĠĠĠĠĠ Ġstate : ĠInt ĊĠĠĠ Ġ) ĊĠ Ġ} Ċ } Ċ