package Ġio . github . wang yn g . simple _ audio _ player . player Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . os . Message Ċ import Ġcom . google . android . ex op layer 2 . C . CONTENT _ TYPE _ M US IC Ċ import Ġcom . google . android . ex op layer 2 . C . USAGE _ MEDIA Ċ import Ġcom . google . android . ex op layer 2 . Exo Playback Exception Ċ import Ġcom . google . android . ex op layer 2 . Media Item Ċ import Ġcom . google . android . ex op layer 2 . Player Ċ import Ġcom . google . android . ex op layer 2 . Simple Exo Player Ċ import Ġcom . google . android . ex op layer 2 . audio . Audio Attributes Ċ import Ġcom . google . android . ex op layer 2 . source . Progress ive Media Source Ċ import Ġcom . google . android . ex op layer 2 . upstream . DataSource Ċ import Ġcom . google . android . ex op layer 2 . upstream . Default Bandwidth Meter Ċ import Ġcom . google . android . ex op layer 2 . upstream . Default DataSource Factory Ċ import Ġcom . google . android . ex op layer 2 . util . Util Ċ Ċ class ĠEx o Player Manager ( private Ġval Ġcontext : ĠContext ) Ġ: ĠPlayer Manager Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġm EventListener Ġ= ĠEx o Player EventListener () ĊĠĠĠ Ġprivate Ġvar Ġm Exo Song State Callback : ĠPlayer Manager . Song State Callback ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar ĠmCurrent Uri : ĠUri ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Exo Player : ĠSimple Exo Player ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġm Update Progress Handler Ġ= Ġobject Ġ: ĠHandler ( Looper . get Main Looper ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Message ( msg : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Exo Player ?. is Playing Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduration : ĠLong Ġ= Ġm Exo Player ?. duration Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition : ĠLong Ġ= Ġm Exo Player ?. current Position Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Exo Song State Callback ?. on Position Change ( position , Ġduration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Messages ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Empty Message Delayed ( 0 , ĠUPDATE _ PROGRESS _ DELAY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Callback ( callback : ĠPlayer Manager . Song State Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Exo Song State Callback Ġ= Ġcallback ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetCurrent Position (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Exo Player ?. current Position Ġ?: Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Duration (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Exo Player ?. duration Ġ?: Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprepare ( uri : ĠUri ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġsong Has Changed Ġ= Ġuri Ġ!= ĠmCurrent Uri ĊĠĠĠĠĠĠĠ Ġif Ġ( song Has Changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmCurrent Uri Ġ= Ġuri ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( song Has Changed Ġ|| Ġm Exo Player Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Ġ= ĠmCurrent Uri ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Exo Player Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Exo Player Ġ= ĠSimple Exo Player . Builder ( context ). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Exo Player ?. addListener ( m EventListener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAndroid Ġ" O " Ġmakes Ġmuch Ġgreater Ġuse Ġof ĠAudio Attributes , Ġespecially ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwith Ġregards Ġto ĠAudio Focus . ĠAll Ġof Ġtracks Ġare Ġmusic , Ġbut ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġyour Ġcontent Ġincludes Ġspo ken Ġword Ġsuch Ġas Ġaudio Ġbooks Ġor Ġpod Ġcast s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthen Ġthe Ġcontent Ġtype Ġshould Ġbe Ġset Ġto ĠCONTENT _ TYPE _ SPE E CH Ġfor Ġthose ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtracks . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaudio Attributes Ġ= ĠAudio Attributes . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ContentType ( CONTENT _ TYPE _ M US IC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Usage ( USAGE _ MEDIA ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Exo Player ?. set Audio Attributes ( audio Attributes , Ġfalse ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPro duces ĠDataSource Ġinstances Ġthrough Ġwhich Ġmedia Ġdata Ġis Ġloaded . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdataSource Factory Ġ= Ġbuild DataSource Factory ( context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia Source Ġ= ĠProgress ive Media Source . Factory ( dataSource Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Media Source ( Media Item . Builder (). set Uri ( source ). build ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPrep ares Ġmedia Ġto Ġplay Ġ( happ ens Ġon Ġbackground Ġthread ) Ġand Ġtriggers ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ{@ code Ġon Player StateChanged } Ġcallback Ġwhen Ġthe Ġstream Ġis Ġready Ġto Ġplay . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Exo Player ?. set Media Source ( media Source ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Exo Player ?. prepare () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġplay () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Exo Player ?. play When Ready Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpause () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Exo Player ?. play When Ready Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Exo Player ?. release () ĊĠĠĠĠĠĠĠ Ġm Exo Player ?. remove Listener ( m EventListener ) ĊĠĠĠĠĠĠĠ Ġm Exo Player Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġseek To ( position : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Exo Player ?. seek To ( position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ---------- Ġutility Ġ---------- ĊĠĠĠ Ġprivate Ġfun Ġbuild DataSource Factory ( context : ĠContext ): ĠDataSource . Factory Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbandwidth Meter Ġ= ĠDefault Bandwidth Meter . Builder ( context ). build () ĊĠĠĠĠĠĠĠ Ġval ĠdataSource Factory Ġ= ĠDefault DataSource Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUtil . getUser Agent ( context , Ġ""), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbandwidth Meter ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĠDefault DataSource Factory ( context , Ġbandwidth Meter , ĠdataSource Factory ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠEx o Player EventListener Ġ: ĠPlayer . Listener Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Playback StateChanged ( playback State : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( playback State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer . STATE _ READY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Exo Song State Callback ?. on Ready () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Update Progress Handler . send Empty Message ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer . STATE _ ENDED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Update Progress Handler . remove Messages ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Exo Song State Callback ?. on Play End () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Player Error ( error : ĠEx o Playback Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwhat : ĠString Ġ= Ġwhen Ġ( error . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEx o Playback Exception . TYPE _ SOURCE Ġ-> Ġerror . source Exception . message Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEx o Playback Exception . TYPE _ RENDER ER Ġ-> Ġerror . renderer Exception . message Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEx o Playback Exception . TYPE _ UN EXPECTED Ġ-> Ġerror . unexpected Exception . message Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" on Player Error : Ġ$ error " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Exo Song State Callback ?. onError ( what ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠUPDATE _ PROGRESS _ DELAY Ġ= Ġ 5 0 0 L ĊĠĠĠ Ġ} Ċ }