package Ġru . ns u . fit . as boost er . player . audio Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . net . Uri Ċ import Ġcom . google . android . ex op layer 2 .* Ċ import Ġcom . google . android . ex op layer 2 . audio . Aux Effect Info Ċ import Ġcom . google . android . ex op layer 2 . source . Concat en ating Media Source Ċ import Ġcom . google . android . ex op layer 2 . source . Media Source Ċ import Ġcom . google . android . ex op layer 2 . source . Progress ive Media Source Ċ import Ġcom . google . android . ex op layer 2 . upstream . Data Spec Ċ import Ġcom . google . android . ex op layer 2 . upstream . Default Http DataSource Factory Ċ import Ġcom . google . android . ex op layer 2 . upstream . Res olving DataSource Ċ import Ġcom . google . android . ex op layer 2 . util . Event Logger Ċ import Ġcom . google . android . ex op layer 2 . util . Util Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġru . ns u . fit . as boost er . base . APPLICATION _ NAME Ċ import Ġru . ns u . fit . as boost er . base . list enable . List enable Impl Ċ import Ġru . ns u . fit . as boost er . repository . Audio Repository Ċ import Ġru . ns u . fit . as boost er . repository . entity . Audio Info Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton ĊĊ Ċ private Ġconst Ġval ĠTR ACK ING _ DELAY Ġ= Ġ 1 0 0 0 L Ċ private Ġconst Ġval ĠMAX _ BUFFER _ MS Ġ= Ġ 3 6 0 0 0 0 Ċ Ċ @ Singleton Ċ class ĠEx o Audio Player Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġui Scope : ĠCor outine Scope , ĊĠĠĠ Ġprivate Ġval Ġapplication : ĠApplication , ĊĠĠĠ Ġprivate Ġval Ġrepository : ĠAudio Repository Ċ ) Ġ: ĠAudio Player , ĠPlay List Player , ĠList enable Impl < Audio Player . Listener >() Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġex o Player Ġ= ĠSimple Exo Player . Builder ( application ) ĊĠĠĠĠĠĠĠ Ġ. set Load Control ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDefault Load Control . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Buffer Dur ations Ms ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDefault Load Control . DEFAULT _ MIN _ BUFFER _ MS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMAX _ BUFFER _ MS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDefault Load Control . DEFAULT _ BUFFER _ FOR _ PLAY BACK _ MS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDefault Load Control . DEFAULT _ BUFFER _ FOR _ PLAY BACK _ AFTER _ RE BUFFER _ MS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Default Load Control () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ. init () ĊĊĠĠĠ Ġprivate Ġvar Ġeffect Id : ĠInt ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġpending Audio : ĠAudio Info ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġval Ġaudio : ĠAudio Info ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ( exo Player . current Tag Ġas ĠAudio Info ?) Ġ?: Ġpending Audio ĊĊĠĠĠ Ġoverride Ġval Ġloaded : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġex o Player . playback State Ġ!= ĠEx o Player . STATE _ IDLE ĊĊĠĠĠ Ġoverride Ġval Ġloading : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġex o Player . isLoading ĊĊĠĠĠ Ġoverride Ġval Ġplaying : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġex o Player . play When Ready ĊĊĠĠĠ Ġoverride Ġval ĠsessionId : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġex o Player . audio SessionId ĊĊĠĠĠ Ġoverride Ġvar Ġlooping : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġex o Player . repeat Mode Ġ== ĠEx o Player . REPEAT _ MODE _ ONE ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmode Ġ= Ġif Ġ( value ) ĠEx o Player . REPEAT _ MODE _ ONE Ġelse ĠEx o Player . REPEAT _ MODE _ ALL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex o Player . repeat Mode Ġ= Ġmode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Ġ{ Ġon Loop ingMode Changed ( value ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġstart ( audio Info : ĠAudio Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpending Audio Ġ= Ġaudio Info ĊĠĠĠĠĠĠĠ Ġval Ġmedia Source Ġ= Ġcreate Media Source ( audio Info ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġex o Player . prepare ( media Source ) ĊĠĠĠĠĠĠĠ Ġnotify Ġ{ Ġon Progress ( 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġplay () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart ( audio Infos : ĠList < Audio Info >, Ġstart Pos : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpending Audio Ġ= Ġaudio Infos [ start Pos ] ĊĠĠĠĠĠĠĠ Ġex o Player . prepare ( create Media Source ( audio Infos )) ĊĠĠĠĠĠĠĠ Ġex o Player . seek To Default Position ( start Pos ) ĊĠĠĠĠĠĠĠ Ġnotify Ġ{ Ġon Progress ( 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġplay () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġplay () Ġ{ ĊĠĠĠĠĠĠĠ Ġex o Player . play When Ready Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġnotify Ġ{ Ġon Play () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpause () Ġ{ ĊĠĠĠĠĠĠĠ Ġex o Player . play When Ready Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġnotify Ġ{ Ġon Pause () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdestroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġex o Player . release () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtry Seek To ( progress : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( progress Ġ> Ġex o Player . buffered Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġex o Player . seek To ( progress . to Long ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġattach Effect ( id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġeffect Id Ġ= Ġid ĊĠĠĠĠĠĠĠ Ġex o Player . set Aux Effect Info ( Aux Effect Info ( id , Ġ 1 . 0 f )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Aux Effect Level ( level : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġeffect Id ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex o Player . set Aux Effect Info ( Aux Effect Info ( it , Ġlevel )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġex o Player . stop ( true ) ĊĠĠĠĠĠĠĠ Ġnotify Ġ{ Ġon Audio Changed () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnext (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! exo Player . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġex o Player . next () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprevious (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! exo Player . has Previous ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġex o Player . previous () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Media Source ( audio Infos : ĠList < Audio Info >) Ġ= ĊĠĠĠĠĠĠĠ ĠConcat en ating Media Source ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ* audio Infos . map NotNull Ġ{ Ġcreate Media Source ( it ) Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Media Source ( audio Info : ĠAudio Info ): ĠMedia Source ? Ġ{ ĊĠĠĠĠĠĠĠ Ġaudio Info . url To Stream Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġdefault DataSource Factory Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDefault Http DataSource Factory ( Util . getUser Agent ( application , ĠAP PLICATION _ NAME )) ĊĊĠĠĠĠĠĠĠ Ġval Ġresolving DataSource Factory Ġ= ĠRes olving DataSource . Factory ( default DataSource Factory , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRes olving DataSource . Resolver Ġ{ Ġdata Spec Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl To Stream Ġ= Ġdata Spec . uri . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream Url Ġ= Ġrun Blocking Ġ{ Ġrepository . get Stream Url ( url To Stream ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Spec ( Uri . parse ( stream Url )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠProgress ive Media Source . Factory ( res olving DataSource Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTag ( audio Info ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Media Source ( Uri . parse ( audio Info . url To Stream )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠSimple Exo Player . init () Ġ= Ġthis . apply Ġ{ ĊĠĠĠĠĠĠĠ Ġrepeat Mode Ġ= ĠEx o Player . REPEAT _ MODE _ ALL ĊĊĠĠĠĠĠĠĠ Ġadd Analytics Listener ( Event Logger ( null )) ĊĊĠĠĠĠĠĠĠ Ġadd Listener ( object Ġ: ĠPlayer . EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Player StateChanged ( play When Ready : ĠBoolean , Ġplayback State : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( playback State Ġ== ĠEx o Player . STATE _ ENDED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Ġ{ ĠonComplete () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Position Dis continu ity ( reason : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( reason ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer . DIS CONT IN U ITY _ REASON _ PERIOD _ TRANS ITION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Ġ{ ĠonComplete () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Audio Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Play () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer . DIS CONT IN U ITY _ REASON _ SEEK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Ġ{ Ġon Audio Changed () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending Audio Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Loading Changed ( isLoading : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isLoading ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Ġ{ Ġon Loading Start () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Ġ{ Ġon Loading Finish () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Is Playing Changed ( is Playing : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Progress Tracking () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Progress Tracking () Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( exo Player . is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Progress ( exo Player . current Position . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Buffered ( exo Player . buffered Position . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( TRACK ING _ DELAY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ