/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 6 Ġ- Ġ 2 0 1 9 ĠEx o Media ĠContributors Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . dev br ackets . android . ex ome dia Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Uri Ċ import Ġcom . dev br ackets . android . ex ome dia . core . Listener Mux Ċ import Ġcom . dev br ackets . android . ex ome dia . core . audio . Audio Player Api Ċ import Ġcom . dev br ackets . android . ex ome dia . core . audio . Exo Audio Player Ċ import Ġcom . dev br ackets . android . ex ome dia . core . listener . Metadata Listener Ċ import Ġcom . dev br ackets . android . ex ome dia . listener .* Ċ import Ġcom . dev br ackets . android . ex ome dia . n mp . Exo MediaPlayer Ċ import Ġcom . dev br ackets . android . ex ome dia . n mp . config . Player Config Ċ import Ġcom . dev br ackets . android . ex ome dia . n mp . config . Player Config Builder Ċ import Ġcom . google . android . ex op layer 2 . analytics . Analytics Listener Ċ import Ġcom . google . android . ex op layer 2 . source . Media Source Ċ Ċ /** Ċ Ġ* ĠAn ĠAudio Player Ġthat Ġuses Ġthe ĠEx o Player Ġas Ġthe Ġbacking Ġarchitecture . Ġ ĠIf Ġthe Ġcurrent Ġdevice Ċ Ġ* Ġdoes Ġ* NOT * Ġpass Ġthe ĠAndroid ĠCompatibility ĠTest ĠSuite Ġ( CT S ) Ġthen Ġthe Ġbacking Ġarchitecture Ċ Ġ* Ġwill Ġfall Ġback Ġto Ġusing Ġthe Ġdefault ĠAndroid ĠMedia Player . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠTo Ġhelp Ġwith Ġquick Ġconversions Ġfrom Ġthe ĠAndroid ĠMedia Player Ġthis Ġclass Ġfollows Ġthe ĠAPIs Ċ Ġ* Ġthe ĠAndroid ĠMedia Player Ġprovides . Ċ Ġ*/ Ċ open Ġclass ĠAudio Player ( protected Ġval Ġaudio Player Impl : ĠAudio Player Api ) Ġ: ĠAudio Player Api Ġby Ġaudio Player Impl Ġ{ ĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġfun Ġget Player Implementation ( config : ĠPlayer Config ): ĠAudio Player Api Ġ{ ĊĠĠĠĠĠ Ġreturn Ġif ( config . fallback Manager . use Fallback ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġconfig . fallback Manager . get Fallback Audio Player ( config . context ) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠEx o Audio Player ( config ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprotected Ġval Ġlistener Mux Ġ= ĠListener Mux ( Mux Notifier ()) ĊĊĠ Ġprotected Ġvar Ġoverridden Duration : ĠLong Ġ= Ġ- 1 ĊĊĠ Ġconstructor ( context : ĠContext ): Ġthis ( Player Config Builder ( context ). build ()) ĊĠ Ġconstructor ( config : ĠPlayer Config ) Ġ: Ġthis ( getPlayer Implementation ( config )) ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġaudio Player Impl . set Listener Mux ( listener Mux ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠRetrieves Ġthe Ġduration Ġof Ġthe Ġcurrent Ġaudio Ġitem . Ġ ĠThis Ġshould Ġonly Ġbe Ġcalled Ġafter ĊĠĠ Ġ* Ġthe Ġitem Ġis Ġprepared Ġ( see Ġ[. setOn Prepared Listener ]). ĊĠĠ Ġ* ĠIf Ġ[. override Duration ] Ġis Ġset Ġthen Ġthat Ġvalue Ġwill Ġbe Ġreturned . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ return ĠThe Ġmilli second Ġduration Ġof Ġthe Ġvideo ĊĠĠ Ġ*/ ĊĠ Ġoverride Ġval Ġduration : ĠLong ĊĠĠĠ Ġget () Ġ= Ġif Ġ( over ridden Duration Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġoverridden Duration ĊĠĠĠ Ġ} Ġelse Ġaudio Player Impl . duration ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠRetrieves Ġthe Ġcurrent Ġbuffer Ġpercent Ġof Ġthe Ġaudio Ġitem . Ġ ĠIf Ġan Ġaudio Ġitem Ġis Ġnot Ġcurrently ĊĠĠ Ġ* Ġprepared Ġor Ġbuffer ing Ġthe Ġvalue Ġwill Ġbe Ġ 0 . Ġ ĠThis Ġshould Ġonly Ġbe Ġcalled Ġafter Ġthe Ġaudio Ġitem Ġis ĊĠĠ Ġ* Ġprepared Ġ( see Ġ[. setOn Prepared Listener ]) ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ return ĠThe Ġinteger Ġpercent Ġthat Ġis Ġbuffered Ġ[ 0 , Ġ 1 0 0 ] Ġinclusive ĊĠĠ Ġ*/ ĊĠ Ġval Ġbuffer Percentage : ĠInt ĊĠĠĠ Ġget () Ġ= Ġaudio Player Impl . buffered Percent ĊĊĠ Ġoverride Ġfun Ġset Media ( uri : ĠUri ?, Ġmedia Source : ĠMedia Source ?) Ġ{ ĊĠĠĠ Ġaudio Player Impl . set Media ( uri , Ġmedia Source ) ĊĠĠĠ Ġoverride Duration (- 1 ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSto ps Ġthe Ġcurrent Ġaudio Ġplayback Ġand Ġresets Ġthe Ġrepeat Listener Ġstates ĊĠĠ Ġ* Ġso Ġthat Ġwe Ġreceive Ġthe Ġcallbacks Ġfor Ġevents Ġlike Ġon Prepared ĊĠĠ Ġ*/ ĊĠ Ġoverride Ġfun Ġreset () Ġ{ ĊĠĠĠ Ġstop () ĊĠĠĠ Ġset Media ( null , Ġnull ) ĊĊĠĠĠ Ġaudio Player Impl . reset () ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSetting Ġthis Ġwill Ġoverride Ġthe Ġduration Ġthat Ġthe Ġitem Ġmay Ġactually Ġbe . Ġ ĠThis Ġmethod Ġshould ĊĠĠ Ġ* Ġonly Ġbe Ġused Ġwhen Ġthe Ġitem Ġdoesn 't Ġreturn Ġthe Ġcorrect Ġduration Ġsuch Ġas Ġwith Ġaudio Ġstreams . ĊĠĠ Ġ* ĠThis Ġonly Ġoverrides Ġthe Ġcurrent Ġaudio Ġitem . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġduration ĠThe Ġduration Ġfor Ġthe Ġcurrent Ġmedia Ġitem Ġor Ġ& lt ; Ġ 0 Ġto Ġdisable ĊĠĠ Ġ*/ ĊĠ Ġfun Ġoverride Duration ( duration : ĠLong ) Ġ{ ĊĠĠĠ Ġoverridden Duration Ġ= Ġduration ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSets Ġthe Ġrepeat Listener Ġto Ġinform Ġof ĠVideo Player Ġprepared Ġevents ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġlistener ĠThe Ġrepeat Listener ĊĠĠ Ġ*/ ĊĠ Ġfun Ġset On Prepared Listener ( listener : ĠOn Prepared Listener ?) Ġ{ ĊĠĠĠ Ġlistener Mux . setOn Prepared Listener ( listener ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSets Ġthe Ġrepeat Listener Ġto Ġinform Ġof ĠVideo Player Ġcompletion Ġevents ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġlistener ĠThe Ġrepeat Listener ĊĠĠ Ġ*/ ĊĠ Ġfun Ġset On Completion Listener ( listener : ĠOn Completion Listener ?) Ġ{ ĊĠĠĠ Ġlistener Mux . setOn Completion Listener ( listener ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSets Ġthe Ġrepeat Listener Ġto Ġinform Ġof ĠVideo Player Ġbuffer Ġupdate Ġevents ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġlistener ĠThe Ġrepeat Listener ĊĠĠ Ġ*/ ĊĠ Ġfun Ġset On Buffer Update Listener ( listener : ĠOn Buffer Update Listener ?) Ġ{ ĊĠĠĠ Ġlistener Mux . setOn Buffer Update Listener ( listener ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSets Ġthe Ġrepeat Listener Ġto Ġinform Ġof ĠVideo Player Ġseek Ġcompletion Ġevents ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġlistener ĠThe Ġrepeat Listener ĊĠĠ Ġ*/ ĊĠ Ġfun Ġset On Seek Completion Listener ( listener : ĠOn Seek Completion Listener ?) Ġ{ ĊĠĠĠ Ġlistener Mux . setOn Seek Completion Listener ( listener ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSets Ġthe Ġrepeat Listener Ġto Ġinform Ġof Ġplayback Ġerrors ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġlistener ĠThe Ġrepeat Listener ĊĠĠ Ġ*/ ĊĠ Ġfun Ġset OnError Listener ( listener : ĠOn Error Listener ?) Ġ{ ĊĠĠĠ Ġlistener Mux . setOn Error Listener ( listener ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSets Ġthe Ġrepeat Listener Ġto Ġinform Ġof ĠID 3 Ġmetadata Ġupdates ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġlistener ĠThe Ġrepeat Listener Ġto Ġinform ĊĠĠ Ġ*/ ĊĠ Ġfun Ġset Metadata Listener ( listener : ĠMetadata Listener ?) Ġ{ ĊĠĠĠ Ġlistener Mux . set Metadata Listener ( listener ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSets Ġthe Ġrepeat Listener Ġto Ġinform Ġof ĠAnalytics Ġupdates ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġlistener ĠThe Ġrepeat Listener Ġto Ġinform ĊĠĠ Ġ*/ ĊĠ Ġfun Ġset Analytics Listener ( listener : ĠAnalytics Listener ?) Ġ{ ĊĠĠĠ Ġlistener Mux . set Analytics Listener ( listener ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠPerforms Ġthe Ġfunctionality Ġto Ġstop Ġthe Ġprogress Ġpolling , Ġand Ġstop Ġany Ġother ĊĠĠ Ġ* Ġprocedures Ġfrom Ġrunning Ġthat Ġwe Ġno Ġlonger Ġneed . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġon Playback Ended () Ġ{ ĊĠĠĠ Ġpause () ĊĠ Ġ} ĊĊĠ Ġprivate Ġinner Ġclass ĠM ux Notifier Ġ: ĠListener Mux . Notifier () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġshould Notify Completion ( end Le ew ay : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġreturn Ġcurrent Position Ġ> Ġ 0 Ġ&& Ġduration Ġ> Ġ 0 Ġ&& Ġcurrent Position Ġ+ Ġend Le ew ay Ġ>= Ġduration ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Exo Player Error ( exo MediaPlayer : ĠEx o MediaPlayer , Ġe : ĠException ?) Ġ{ ĊĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠ Ġex o MediaPlayer . force Prepare () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Media Playback Ended () Ġ{ ĊĠĠĠĠĠ Ġon Playback Ended () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Prepared () Ġ{ ĊĠĠĠĠĠ Ġaudio Player Impl . on Media Prepared () ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ