/* Ċ Ġ* Ġ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 . lifecycle . Lifecycle . State Ċ import Ġandroidx . lifecycle . Lifecycle . State . STARTED Ċ import Ġcom . google . android . ex op layer 2 . Player Ċ 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 _ ENDED Ċ import Ġk oh ii . v 1 . core . Common . STATE _ IDLE Ċ import Ġk oh ii . v 1 . core . Playback . Controller Ċ import Ġk oh ii . v 1 . internal . Player Parameters ChangeListener Ċ 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 . math . max Ċ Ċ /** Ċ Ġ* ĠCommon Ġinterface Ġof Ġan Ġobject Ġthat Ġdefines Ġthe Ġconnection Ġbetween Ġa Ġ[ Play able ] Ġand Ġa Ġ[ ViewGroup ] Ċ Ġ* Ġas Ġan Ġ[ container ]. ĠWhen Ġthe Ġ[ Master ] Ġreceive Ġa Ġrequest Ġto Ġbind Ġa ĠVideo Ġto Ġa Ġ[ ViewGroup ], Ġit Ġfirst Ċ Ġ* Ġproduce Ġa Ġ[ Play able ] Ġ( either Ġby Ġac qu iring Ġfrom Ġcache , Ġor Ġcreating Ġa Ġnew Ġone ) Ġfor Ġthe ĠVideo , Ġand Ċ Ġ* Ġthen Ġcreating Ġa Ġnew Ġinstance Ġof Ġthis Ġobject Ġif Ġneeded . Ċ Ġ* Ċ Ġ* ĠA Ġ[ Playback ] Ġdoes Ġnot Ġonly Ġstore Ġthe Ġinformation Ġabout Ġthe Ġ[ ViewGroup ] Ġas Ġ[ container ], Ġand Ġthe Ċ Ġ* Ġ[ Play able ], Ġbut Ġalso Ġhelp Ġthe Ġ[ Master ] Ġto Ġknow Ġif Ġthe Ġ[ Play able ] Ġshould Ġbe Ġplayed Ġor Ġpaused , Ġby Ċ Ġ* Ġtelling Ġit Ġto Ġhow Ġmuch Ġthe Ġ[ container ] Ġis Ġvisible Ġand Ġother Ġconditions . Ċ Ġ* Ċ Ġ* Ġ@ see Ġ[ k oh ii . v 1 . internal . Static View Renderer Playback ] Ċ Ġ* Ġ@ see Ġ[ k oh ii . v 1 . internal . Dynamic View Renderer Playback ] Ċ Ġ* Ġ@ see Ġ[ k oh ii . v 1 . internal . Dynamic Fragment Renderer Playback ] Ċ Ġ*/ Ċ abstract Ġclass ĠPlay back ( ĊĠ Ġval Ġmanager : ĠManager , ĊĠ Ġval Ġbucket : ĠBucket , ĊĠ Ġval Ġcontainer : ĠViewGroup , ĊĠ Ġval Ġconfig : ĠConfig Ġ= ĠConfig () Ċ ) Ġ: ĠPlay able Container , ĠPlayer EventListener , ĠError Listener Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠ Ġconst Ġval ĠDEL AY _ INF IN ITE Ġ= Ġ- 1 L ĊĊĠĠĠ Ġinternal Ġval ĠC ENTER _ X : ĠComparator < Token > Ġ= ĠComparator Ġ{ Ġ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 > Ġ= ĠComparator Ġ{ Ġ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 Ġ= ĊĠĠĠĠĠ ĠComparator < Playback > Ġ{ Ġo 1 , Ġo 2 Ġ-> Ġo 1 . compare With ( o 2 , ĠV ERT ICAL ) Ġ} ĊĊĠĠĠ Ġinternal Ġval ĠH ORIZONTAL _ COMP AR ATOR Ġ= ĊĠĠĠĠĠ ĠComparator < Playback > Ġ{ Ġo 1 , Ġo 2 Ġ-> Ġo 1 . compare With ( o 2 , ĠH ORIZONTAL ) Ġ} ĊĊĠĠĠ Ġinternal Ġval ĠBOT H _ AXIS _ COMP AR ATOR Ġ= ĊĠĠĠĠĠ Ġ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 . ĊĠĠĠ Ġval Ġcontainer Width : ĠInt , ĊĠĠĠ Ġval Ġcontainer Height : ĠInt ĊĠ Ġ) Ġ{ ĊĊĠĠĠ Ġinternal Ġfun Ġshould Prepare (): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġreturn Ġarea Offset Ġ>= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġshould Play (): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġreturn Ġarea Offset Ġ>= Ġthreshold ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠ Ġreturn Ġ" Token ( a =$ area Offset , Ġr =$ container Rect , Ġw =$ container Width , Ġh =$ container Height )" ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ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 Ġcallbacks : ĠSet < Callback > Ġ= Ġempty Set (), ĊĠĠĠ Ġval Ġcontroller : ĠController ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġinitial Playback Info : ĠPlay back Info ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġart work Hint Listener : ĠArt work Hint Listener ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġtoken Update Listener : ĠToken Update Listener ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġnetwork Type ChangeListener : ĠNetwork Type ChangeListener ? Ġ= Ġnull ĊĠ Ġ) ĊĊĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġ"${ super . toString ()}, Ġ[$ play able ], Ġ[ ${ token }] " ĊĠ Ġ} ĊĊĠ Ġprotected Ġopen Ġfun Ġupdate Token (): ĠToken Ġ{ ĊĠĠĠ Ġ" Playback # update Token Ġ$ this ". log Debug () ĊĠĠĠ Ġtmp Rect . set Empty () ĊĠĠĠ Ġif Ġ(! lifecycle State . is At Least ( STARTED )) Ġ{ ĊĠĠĠĠĠ Ġreturn ĠToken ( config . threshold , Ġ- 1 F , Ġtmp Rect , Ġcontainer . width , Ġcontainer . height ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ(! container . is Attached To Window ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĠToken ( config . threshold , Ġ- 1 F , Ġtmp Rect , Ġcontainer . width , Ġcontainer . height ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ(! container . getGlobal Visible Rect ( tmp Rect )) Ġ{ ĊĠĠĠĠĠ Ġreturn ĠToken ( config . threshold , Ġ- 1 F , Ġtmp Rect , Ġcontainer . width , Ġcontainer . height ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ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 ) Ġ( tmp Rect . width () Ġ* Ġtmp Rect . height ()) Ġ/ Ġdraw Area . toFloat () ĊĠĠĠĠĠ Ġelse Ġ 0 F ĊĠĠĠ Ġreturn ĠToken ( config . threshold , Ġoffset , Ġtmp Rect , Ġcontainer . width , Ġcontainer . height ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġtmp Rect Ġ= ĠRect () ĊĠ Ġprivate Ġval Ġcallbacks Ġ= ĠArray Deque < Callback >() ĊĠ Ġprivate Ġval Ġlisteners Ġ= ĠArray Deque < State Listener >() ĊĊĠ Ġ// ĠCallback s Ġthose Ġwill Ġbe Ġsetup Ġwhen Ġthe ĠPlay back Ġis Ġadded , Ġand Ġcleared Ġwhen Ġit Ġis Ġremoved . ĊĠ Ġprivate Ġvar Ġcontroller : ĠController ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġart work Hint Listener : ĠArt work Hint Listener ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġtoken Update Listener : ĠToken Update Listener ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġnetwork Type ChangeListener : ĠNetwork Type ChangeListener ? Ġ= Ġnull ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġa Ġusable Ġrenderer Ġfor Ġthe Ġ[ play able ], Ġor Ġ` null ` Ġif Ġno Ġrenderer Ġis Ġavailable Ġor Ġneeded . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ see Ġ[ Renderer Provider ] ĊĠĠ Ġ* Ġ@ see Ġ[ Renderer Provider . acquire Renderer ] ĊĠĠ Ġ*/ ĊĠ Ġ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 ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠRelease s Ġthe Ġrenderer Ġback Ġto Ġthe ĠProvider Ġas Ġit Ġis Ġno Ġlonger Ġused Ġby Ġthis Ġ[ Playback ]. ĠReturn ĊĠĠ Ġ* Ġ` true ` Ġif Ġthe Ġrenderer Ġis Ġnull Ġ( so Ġnothing Ġneed Ġto Ġbe Ġdone ) Ġor Ġthe Ġoperation Ġfinishes ĊĠĠ Ġ* Ġsuccessfully ; Ġ` false ` Ġotherwise . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ see Ġ[ Renderer Provider ] ĊĠĠ Ġ* Ġ@ see Ġ[ Renderer Provider . release Renderer ] ĊĠĠ Ġ*/ ĊĠ Ġinternal Ġopen Ġfun Ġrelease Renderer ( renderer : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠ Ġ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 ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturn Ġ` true ` Ġif Ġthis ĠPlay back Ġsuccessfully Ġatt aches Ġthe Ġrenderer , Ġ` false ` Ġotherwise . ĊĠĠ Ġ*/ ĊĠ Ġinternal Ġfun Ġattach Renderer ( renderer : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠ Ġ" Playback # attach Renderer Ġ$ renderer Ġ$ this ". log Debug () ĊĠĠĠ Ġreturn Ġon Attach Renderer ( renderer ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturn Ġ` true ` Ġif Ġthis ĠPlay back Ġsuccessfully Ġdet aches Ġthe Ġrenderer , Ġ` false ` Ġotherwise . ĊĠĠ Ġ*/ ĊĠ Ġ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 Ġlonger . Ġ[ 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 Renderer Attached ( renderer : ĠAny ?) Ġ{ ĊĠĠĠ Ġcontroller ?. setup Renderer ( this , Ġrenderer ) ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġon Renderer Detached ( renderer : ĠAny ?) Ġ{ ĊĠĠĠ Ġcontroller ?. teardown Renderer ( this , Ġrenderer ) ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġon Added () Ġ{ ĊĠĠĠ Ġ" Playback # on Added Ġ$ this ". log Debug () ĊĠĠĠ Ġplayback State Ġ= ĠSTATE _ AD DED ĊĠĠĠ Ġcallbacks . forEach Ġ{ Ġit . on Added ( this ) Ġ} ĊĠĠĠ Ġcontroller Ġ= Ġconfig . controller ĊĠĠĠ Ġart work Hint Listener Ġ= Ġconfig . art work Hint Listener ĊĠĠĠ Ġtoken Update Listener Ġ= Ġconfig . token Update Listener ĊĠĠĠ Ġnetwork Type ChangeListener Ġ= Ġconfig . network Type ChangeListener ĊĠĠĠ Ġplayer Parameters Ġ= Ġnetwork Type ChangeListener ?. on Network Type Changed ( manager . master . network Type ) ĊĠĠĠĠĠĠĠ Ġ?: Ġplayer Parameters ĊĠĠĠ Ġ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 ) ĊĠĠĠ Ġcontroller Ġ= Ġnull ĊĠĠĠ Ġtoken Update Listener Ġ= Ġnull ĊĠĠĠ Ġart work Hint Listener Ġ= Ġnull ĊĠĠĠ Ġnetwork Type ChangeListener Ġ= Ġ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 ( ĊĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠ Ġ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 ( this , Ġtrue , Ġplayback Info . resume Position , Ġplayer State ) ĊĠĠĠ Ġplay able ?. teardown 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 ( ĊĠĠĠĠĠĠĠ Ġthis , Ġ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 ( this , Ġtrue , Ġplayback Info . resume Position , Ġplayer State ) ĊĠ Ġ} ĊĊĠ Ġ// ĠWill Ġbe Ġupdated Ġevery time Ġ' on Refresh ' Ġis Ġcalled . ĊĠ Ġprivate Ġvar Ġplayback Token : ĠToken Ġ= ĊĠĠĠ ĠToken ( config . threshold , Ġ- 1 F , ĠRect (), Ġ 0 , Ġ 0 ) ĊĊĠ Ġinternal Ġvar Ġlock : ĠBoolean Ġ= Ġbucket . lock ĊĠĠĠ Ġget () Ġ= Ġfield Ġ|| Ġbucket . lock ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠ Ġmanager . refresh () ĊĠĠĠ Ġ} ĊĊĠ Ġinternal Ġval Ġtoken : ĠToken ĊĠĠĠ Ġget () Ġ= Ġplayback Token ĊĊĠ Ġinternal Ġfun Ġon Refresh () Ġ{ ĊĠĠĠ Ġ" Playback # on Refresh Ġ$ this ". log Debug () ĊĠĠĠ Ġplayback Token Ġ= Ġupdate Token () ĊĠĠĠ Ġtoken Update Listener ?. on Token Update ( this , Ġtoken ) ĊĠĠĠ Ġ" Playback # on Refresh Ġtoken Ġupdated Ġ-> Ġ$ this ". log Debug () ĊĠ Ġ} ĊĊĠ Ġ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 ĊĊĠ Ġ// ĠSmall er Ġvalue Ġ= Ġhigher Ġpriority . ĠPriority Ġ 0 Ġis Ġthe Ġselected ĠPlay back . ĠThe Ġhigher Ġpriority , Ġthe ĊĠ Ġ// Ġcloser Ġit Ġis Ġto Ġthe Ġselected ĠPlay back . ĊĠ Ġ// ĠConsider Ġto Ġprepare Ġthe Ġunderline ĠPlay able Ġfor Ġhigh Ġenough Ġpriority , Ġand Ġrelease Ġit Ġotherwise . ĊĠ Ġ// ĠThis Ġvalue Ġis Ġupdated Ġby ĠGroup . ĠIn active ĠPlay back Ġalways Ġhas ĠInt . MAX _ VALUE Ġpriority . ĊĠ Ġinternal Ġvar Ġplayback Priority : ĠInt Ġ= ĠInt . MAX _ VALUE ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠ Ġval Ġold Priority Ġ= Ġfield ĊĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠ Ġval Ġnew Priority Ġ= Ġfield ĊĠĠĠĠĠ Ġ" Playback # playback Priority Ġ$ old Priority Ġ--> Ġ$ new Priority , Ġ$ this ". log Debug () ĊĠĠĠĠĠ Ġif Ġ( old Priority Ġ== Ġnew Priority ) Ġreturn ĊĠĠĠĠĠ Ġplay able ?. on Playback Priority Changed ( this , Ġold Priority , Ġnew Priority ) ĊĠĠĠ Ġ} ĊĊĠ Ġinternal Ġvar Ġplayback Volume Info : ĠVolume Info Ġ= Ġbucket . effective Volume Info ( bucket . volume Info ) ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠ Ġval Ġfrom Ġ= Ġfield ĊĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠ Ġval Ġto Ġ= Ġfield ĊĠĠĠĠĠ Ġ" Playback # volume Info Ġ$ from Ġ--> Ġ$ to , Ġ$ this ". log Debug () ĊĠĠĠĠĠ Ġplay able ?. on Volume Info Changed ( this , Ġfrom , Ġto ) ĊĠĠĠ Ġ} ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġplayback Volume Info Ġ= Ġbucket . effective Volume Info ( bucket . volume Info ) ĊĠ Ġ} ĊĊĠ Ġvar Ġplay able : ĠPlay able ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġset ( value ) Ġ{ ĊĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull Ġ&& Ġconfig . initial Playback Info Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue . playback Info Ġ= Ġconfig . initial Playback Info ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġinternal Ġvar Ġplayer Parameters ChangeListener : ĠPlayer Parameters ChangeListener ? Ġ= Ġ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 ĊĊĠĠĠ Ġvar Ġresult Ġ= Ġwhen Ġ( orientation ) Ġ{ ĊĠĠĠĠĠ ĠV ERT ICAL Ġ-> ĠC ENTER _ Y . compare ( this Token , Ġthat Token ) ĊĠĠĠĠĠ ĠH ORIZONTAL Ġ-> ĠC ENTER _ X . compare ( this Token , Ġthat Token ) ĊĠĠĠĠĠ ĠBOT H _ AXIS Ġ-> Ġmax ( ĊĠĠĠĠĠĠĠĠĠ ĠC ENTER _ Y . compare ( this Token , Ġthat Token ), ĠC ENTER _ X . compare ( this Token , Ġthat Token ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ ĠNONE _ AXIS Ġ-> Ġmax ( ĊĠĠĠĠĠĠĠĠĠ ĠC ENTER _ Y . compare ( this Token , Ġthat Token ), ĠC ENTER _ X . compare ( this Token , Ġthat Token ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( result Ġ== Ġ 0 ) Ġresult Ġ= Ġcompare Values ( this Token . area Offset , Ġthat Token . area Offset ) ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġon Network Type Changed ( network Type : ĠNetwork Type ) Ġ{ ĊĠĠĠ Ġthis . player Parameters Ġ= Ġnetwork Type ChangeListener ?. on Network Type Changed ( network Type ) ĊĠĠĠĠĠĠĠ Ġ?: Ġthis . player Parameters ĊĠ Ġ} ĊĊĠ Ġ// ĠPublic ĠAPIs ĊĊĠ Ġval Ġtag Ġ= Ġconfig . tag ĊĊĠ Ġprivate Ġval Ġplayer State : ĠInt ĊĠĠĠ Ġget () Ġ= Ġplay able ?. player State Ġ?: ĠSTATE _ IDLE ĊĊĠ Ġval Ġvolume Info : ĠVolume Info ĊĠĠĠ Ġget () Ġ= Ġplayback Volume Info ĊĊĠ Ġprivate Ġval Ġplayback Info : ĠPlay back Info ĊĠĠĠ Ġget () Ġ= Ġplay able ?. playback Info Ġ?: ĠPlay back Info () ĊĊĠ Ġval Ġcontainer Rect : ĠRect ĊĠĠĠ Ġget () Ġ= Ġtoken . container Rect ĊĊĠ Ġvar Ġplayer Parameters : ĠPlayer Parameters Ġ= ĠPlayer Parameters . DEFAULT ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠ Ġval Ġfrom Ġ= Ġfield ĊĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠ Ġval Ġto Ġ= Ġfield ĊĠĠĠĠĠ Ġif Ġ( from Ġ!= Ġto ) Ġplayer Parameters ChangeListener ?. on Player Parameters Changed ( to ) ĊĠĠĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġadd Callback ( callback : ĠCallback ) Ġ{ ĊĠĠĠ Ġ" Playback # add Callback Ġ$ callback , Ġ$ this ". log Debug () ĊĠĠĠ Ġthis . callbacks . push ( callback ) ĊĠ Ġ} ĊĊĠ Ġinternal Ġ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 () ĊĠĠĠ Ġmanager . master . dispatcher . post Ġ{ ĊĠĠĠĠĠ Ġplay able ?. on Un bind ( this ) Ġ?: Ġmanager . remove Playback ( this ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠRe sets Ġthe Ġ[ play able ] Ġto Ġits Ġoriginal Ġstate . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġrefresh ĠIf Ġ` true `, Ġalso Ġrefresh Ġeverything . ĊĠĠ Ġ*/ ĊĠ Ġ@ Jvm Over loads ĊĠ Ġ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 ) Ġ{ ĊĠĠĠĠĠ ĠPlayer . STATE _ IDLE Ġ-> Ġ{ ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠPlayer . STATE _ BUFFER ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit . on Buffer ing ( this @ Playback , Ġplay When Ready ) Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠPlayer . STATE _ READY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( play When Ready ) Ġit . on Playing ( this @ Playback ) Ġelse Ġit . on Paused ( this @ Playback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠPlayer . STATE _ ENDED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit . on Ended ( this @ Playback ) Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġplay able Ġ= Ġthis . play able ĊĠĠĠ Ġart work Hint Listener ?. on Artwork Hint ( ĊĠĠĠĠĠĠĠ Ġplayback Ġ= Ġthis , ĊĠĠĠĠĠĠĠ Ġshould Show Ġ= Ġif Ġ( play able Ġ!= Ġnull ) Ġ! play able . is Playing () Ġelse Ġtrue , ĊĠĠĠĠĠĠĠ Ġposition Ġ= Ġplayback Info . resume Position , ĊĠĠĠĠĠĠĠ Ġstate Ġ= Ġ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 ) Ġ= ĠUnit ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ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 ĊĠĠĠ Ġ) Ġ= ĠUnit Ġ// ĠEx o Player Ġstate : Ġ 2 ĊĊĠĠĠ Ġ/** ĠCalled Ġwhen Ġthe ĠVideo Ġstarts Ġplaying Ġ*/ ĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġon Playing ( playback : ĠPlay back ) Ġ= ĠUnit Ġ// ĠEx o Player Ġstate : Ġ 3 , Ġplay Ġflag : Ġtrue ĊĊĠĠĠ Ġ/** ĠCalled Ġwhen Ġthe ĠVideo Ġis Ġpaused Ġ*/ ĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġon Paused ( playback : ĠPlay back ) Ġ= ĠUnit Ġ// ĠEx o Player Ġstate : Ġ 3 , Ġplay Ġflag : Ġfalse ĊĊĠĠĠ Ġ/** ĠCalled Ġwhen Ġthe ĠVideo Ġfinishes Ġits Ġplayback Ġ*/ ĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġon Ended ( playback : ĠPlay back ) Ġ= ĠUnit Ġ// Ġ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 ĊĠĠĠ Ġ) Ġ= ĠUnit ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun ĠonError ( ĊĠĠĠĠĠ Ġplayback : ĠPlay back , ĊĠĠĠĠĠ Ġexception : ĠException ĊĠĠĠ Ġ) Ġ= ĠUnit ĊĠ Ġ} ĊĊĠ Ġinterface ĠCallback Ġ{ ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġon Active ( playback : ĠPlay back ) Ġ= ĠUnit ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġon In Active ( playback : ĠPlay back ) Ġ= ĠUnit ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġon Added ( playback : ĠPlay back ) Ġ= ĠUnit ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġon Removed ( playback : ĠPlay back ) Ġ= ĠUnit ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġon Attached ( playback : ĠPlay back ) Ġ= ĠUnit ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġon Detached ( playback : ĠPlay back ) Ġ= ĠUnit ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠProvides Ġnecessary Ġinformation Ġand Ġcallbacks Ġto Ġsetup Ġa Ġmanual Ġcontroller Ġfor Ġa Ġ[ Playback ]. ĊĠĠ Ġ*/ ĊĠ Ġinterface ĠController Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġ` true ` Ġif Ġthe Ġlibrary Ġcan Ġautomatically Ġpause Ġthe Ġ[ Playback ], Ġ` false ` Ġotherwise . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthis Ġmethod Ġreturns Ġ` true `: ĊĠĠĠĠ Ġ* Ġ- ĠOnce Ġthe Ġuser Ġstarts Ġa Ġ[ Playback ], Ġit Ġwill Ġnot Ġbe Ġpaused Ġ** until ** Ġits Ġcontainer Ġis Ġnot ĊĠĠĠĠ Ġ* Ġvisible Ġenough Ġ( controlled Ġby Ġ[ Playback . Config . threshold ]), Ġor Ġuser Ġstarts Ġother ĠPlay back ĊĠĠĠĠ Ġ* Ġ( priority Ġoverridden ). ĊĠĠĠĠ Ġ* Ġ- ĠOnce Ġthe Ġuser Ġpause s Ġa Ġ[ Playback ], Ġit Ġwill Ġnot Ġbe Ġplayed Ġuntil Ġthe Ġuser Ġmanually Ġresume s ĊĠĠĠĠ Ġ* Ġit . ĊĠĠĠĠ Ġ* Ġ- ĠOnce Ġthe Ġuser Ġinteract s Ġso Ġthat Ġthe Ġ[ Playback ]' s Ġcontainer Ġis Ġnot Ġvisible Ġenough , Ġthe ĊĠĠĠĠ Ġ* Ġlibrary Ġwill Ġpause Ġthe Ġit . ĊĠĠĠĠ Ġ* Ġ- ĠOnce Ġthe Ġuser Ġinteract s Ġso Ġthat Ġa Ġpaused Ġ[ Playback ]' s Ġcontainer Ġis Ġvisible Ġenough , Ġthe ĊĠĠĠĠ Ġ* Ġlibrary Ġwill : Ġplay Ġit Ġif Ġit Ġwas Ġnot Ġpaused Ġby Ġthe Ġuser , Ġor Ġpause Ġit Ġif Ġit Ġwas Ġpaused Ġby Ġthe ĊĠĠĠĠ Ġ* Ġuser Ġbefore Ġ( this Ġis Ġequal Ġto Ġdoing Ġnothing ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠDefault Ġresult Ġis Ġ` true `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġk oh ii Can Pause (): ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġ` true ` Ġto Ġtell Ġif Ġthe Ġlibrary Ġcan Ġstart Ġa Ġ[ Playback ] Ġautomatically Ġfor Ġthe Ġfirst Ġtime ĊĠĠĠĠ Ġ* Ġ, Ġor Ġ` false ` Ġotherwise . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthis Ġmethod Ġreturns Ġ` true `: Ġthe Ġlibrary Ġcan Ġstart Ġa Ġ[ Playback ] Ġautomatically Ġif Ġit Ġwas ĊĠĠĠĠ Ġ* Ġnever Ġbe Ġstarted Ġor Ġpaused Ġby Ġthe Ġuser . ĠOnce Ġthe Ġuser Ġpause s Ġit Ġmanually , Ġonly Ġuser Ġcan ĊĠĠĠĠ Ġ* Ġresume Ġit , Ġthe Ġlibrary Ġshould Ġnever Ġstart / resume Ġthe Ġ[ Playback ] Ġautomatically Ġagain . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠDefault Ġresult Ġis Ġ` false `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġk oh ii Can Start (): ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġis Ġcalled Ġonce Ġthe Ġrenderer Ġof Ġthe Ġ[ Playback ] Ġbecomes Ġavailable . ĠClient Ġshould ĊĠĠĠĠ Ġ* Ġuse Ġthis Ġcallback Ġto Ġsetup Ġthe Ġmanual Ġcontroller Ġmechanism Ġfor Ġthe Ġrenderer . ĠFor Ġexample : ĊĠĠĠĠ Ġ* Ġprovide Ġa Ġuser Ġinterface Ġfor Ġcontrolling Ġthe Ġplayback . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ Playback . on Renderer Attached ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġsetup Renderer ( playback : ĠPlay back , Ġrenderer : ĠAny ?) Ġ= ĠUnit ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġis Ġcalled Ġonce Ġthe Ġrenderer Ġof Ġthe Ġ[ Playback ] Ġbecomes Ġunavailable Ġto Ġit . ĠClient ĊĠĠĠĠ Ġ* Ġshould Ġuse Ġthis Ġcallback Ġto Ġclean Ġup Ġany Ġmanual Ġcontroller Ġmechanism Ġset Ġbefore . ĠNote Ġthat ĊĠĠĠĠ Ġ* Ġthe Ġlibrary Ġalso Ġdoes Ġsome Ġcleanup Ġby Ġitself Ġto Ġensure Ġthe Ġsanity Ġof Ġthe Ġrenderer . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ Playback . on Renderer Detached ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġfun Ġteardown Renderer ( playback : ĠPlay back , Ġrenderer : ĠAny ?) Ġ= ĠUnit ĊĠ Ġ} ĊĊĠ Ġinterface ĠArt work Hint Listener Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġposition Ġcurrent Ġposition Ġof Ġthe Ġplayback Ġin Ġmilliseconds . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Artwork Hint ( ĊĠĠĠĠĠ Ġplayback : ĠPlay back , ĊĠĠĠĠĠ Ġshould Show : ĠBoolean , ĊĠĠĠĠĠ Ġposition : ĠLong , ĊĠĠĠĠĠ Ġstate : ĠInt ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġinterface ĠToken Update Listener Ġ{ ĊĊĠĠĠ Ġfun Ġon Token Update ( playback : ĠPlay back , Ġtoken : ĠToken ) ĊĠ Ġ} ĊĊĠ Ġinterface ĠNetwork Type ChangeListener Ġ{ ĊĊĠĠĠ Ġfun Ġon Network Type Changed ( network Type : ĠNetwork Type ): ĠPlayer Parameters ĊĠ Ġ} Ċ } Ċ Ċ /** ĠExtension Ġfunctions Ġfor Ġa ĠPlay back Ġ*/ Ċ Ċ /** Ċ Ġ* ĠQuick ly Ġsetup Ġthe Ġ[ Controller ] Ġthat Ġonly Ġneeds Ġto Ġsetup Ġthe Ġrenderer . Ċ Ġ* Ċ Ġ* Ġ@ param Ġk oh ii Can Start Ġsame Ġas Ġ[ Controller . k oh ii Can Start ] Ċ Ġ* Ġ@ param Ġk oh ii Can Pause Ġsame Ġas Ġ[ Controller . k oh ii Can Pause ] Ċ Ġ* Ġ@ param Ġsetup Renderer Ġsame Ġas Ġ[ Controller . setup Renderer ] Ċ Ġ*/ Ċ inline Ġfun Ġcontroller ( ĊĠ Ġk oh ii Can Start : ĠBoolean Ġ= Ġtrue , ĊĠ Ġk oh ii Can Pause : ĠBoolean Ġ= Ġtrue , ĊĠ Ġcross inline Ġsetup Renderer : Ġ( playback : ĠPlay back , Ġrenderer : ĠAny ?) Ġ-> ĠUnit Ċ ): ĠController Ġ= Ġobject Ġ: ĠController Ġ{ ĊĠ Ġoverride Ġfun Ġk oh ii Can Start (): ĠBoolean Ġ= Ġk oh ii Can Start ĊĠ Ġoverride Ġfun Ġk oh ii Can Pause (): ĠBoolean Ġ= Ġk oh ii Can Pause ĊĠ Ġoverride Ġfun Ġsetup Renderer ( playback : ĠPlay back , Ġrenderer : ĠAny ?) Ġ= Ġsetup Renderer ( playback , Ġrenderer ) Ċ } Ċ