package Ġcom . example . jean . jc player . service Ċ Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . res . Asset FileDescriptor Ċ import Ġandroid . media . Audio Manager Ċ import Ġandroid . media . MediaPlayer Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Binder Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . os . Looper Ċ import Ġandroid . tele phony . Phone State Listener Ċ import Ġandroid . tele phony . Tele phony Manager Ċ import Ġandroid . util . Log Ċ import Ġcom . example . jean . jc player . general . Jc Status Ċ import Ġcom . example . jean . jc player . general . Origin Ċ import Ġcom . example . jean . jc player . general . errors . Audio Assets Invalid Exception Ċ import Ġcom . example . jean . jc player . general . errors . Audio FilePath Invalid Exception Ċ import Ġcom . example . jean . jc player . general . errors . Audio Raw Invalid Exception Ċ import Ġcom . example . jean . jc player . general . errors . Audio Url Invalid Exception Ċ import Ġcom . example . jean . jc player . model . Jc Audio Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġis Ġan ĠAndroid Ġ[ Service ] Ġthat Ġhandles Ġall Ġplayer Ġchanges Ġon Ġbackground . Ċ Ġ* Ġ@ author ĠJean ĠCar los Ġ( Github : Ġ@ jean cs an che z ) Ċ Ġ* Ġ@ date Ġ 0 2 / 0 7 / 1 6 . Ċ Ġ* ĠJes us Ġlo ves Ġyou . Ċ Ġ*/ Ċ class ĠJ c Player Service Ġ: ĠService (), ĠMedia Player . On Prepared Listener , ĠMedia Player . On Completion Listener , ĊĠĠĠ ĠMedia Player . On Buffer ing Update Listener , ĠMedia Player . OnError Listener , ĠAudio Manager . On Audio Focus ChangeListener Ġ{ ĊĊĠ Ġprivate Ġval Ġbinder Ġ= ĠJ c Player Service Binder () ĊĊĠ Ġprivate Ġvar Ġmedia Player : ĠMedia Player ? Ġ= Ġnull ĊĊĠ Ġvar Ġis Playing : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġset ĊĊĠ Ġvar Ġis Paused : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġset ĊĊĠ Ġvar Ġcurrent Audio : ĠJ c Audio ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġset ĊĊĠ Ġvar Ġis Prepared : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġset ĊĊĠ Ġprivate Ġval Ġjc Status Ġ= ĠJ c Status () ĊĊĠ Ġprivate Ġvar Ġasset FileDescriptor : ĠAsset FileDescriptor ? Ġ= Ġnull Ġ// ĠFor ĠAsset Ġand ĠRaw Ġfile . ĊĊĠ Ġvar Ġservice Listener : ĠJ c Player Service Listener ? Ġ= Ġnull ĊĊĊĠ Ġinner Ġclass ĠJ c Player Service Binder Ġ: ĠB inder () Ġ{ ĊĠĠĠ Ġval Ġservice : ĠJ c Player Service ĊĠĠĠĠĠ Ġget () Ġ= Ġthis @ Jc Player Service ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent , Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĊĠĠĠ Ġreturn ĠService . START _ STICK Y ĊĠ Ġ} ĊĊĊĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ): ĠI Binder ? Ġ= Ġbinder ĊĊĠ Ġprivate Ġlateinit Ġvar Ġphone State Listener : ĠPhone State Listener ĊĊĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠ Ġsuper . onCreate () ĊĊĠĠĠ Ġ// ĠList ening Ġfor Ġphone Ġcall Ġring tone ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġphone State Listener Ġ= Ġobject Ġ: ĠPhone State Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Call StateChanged ( state : ĠInt , Ġincoming Number : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ== ĠTele phony Manager . CALL _ STATE _ RING ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Audio ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpause ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( state Ġ== ĠTele phony Manager . CALL _ STATE _ IDLE ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( state Ġ== ĠTele phony Manager . CALL _ STATE _ OFF HOOK ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġsuper . on Call StateChanged ( state , Ġincoming Number ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġmgr Ġ= Ġget System Service ( Context . TELE PHONY _ SERVICE ) Ġas ? ĠTele phony Manager ĊĠĠĠĠĠ Ġmgr ?. listen ( phone State Listener , ĠPhone State Listener . LIST EN _ CALL _ STATE ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ ĠLog . e (" t messages ", Ġe . toString ()) ĊĠĠĠ Ġ} ĊĊĠ Ġ} ĊĊĠ Ġfun Ġplay ( jc Audio : ĠJ c Audio ): ĠJ c Status Ġ{ ĊĠĠĠ Ġval Ġtemp Jc Audio Ġ= Ġcurrent Audio ĊĠĠĠ Ġcurrent Audio Ġ= Ġjc Audio ĊĠĠĠ Ġvar Ġstatus Ġ= ĠJ c Status () ĊĊĠĠĠ Ġif Ġ( is Audio File Valid ( jc Audio . path , Ġjc Audio . origin )) Ġ{ ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġmedia Player ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay ( jc Audio ) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( temp Jc Audio Ġ!== Ġjc Audio ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay ( jc Audio ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġupdate Status ( jc Audio , ĠJ c Status . Play State . CONTINUE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Time () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Listener ?. on Continue Listener ( status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġlet Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġmedia Player Ġ= ĠMedia Player (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjc Audio . origin Ġ== ĠOrigin . URL Ġ-> Ġit . set DataSource ( jc Audio . path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjc Audio . origin Ġ== ĠOrigin . RAW Ġ-> Ġasset FileDescriptor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . resources . open Raw Resource Fd ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInteger . parseInt ( jc Audio . path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). also Ġ{ Ġdescriptor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set DataSource ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . file Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset FileDescriptor Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjc Audio . origin Ġ== ĠOrigin . AS SETS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset FileDescriptor Ġ= Ġapplication Context . assets . open Fd ( jc Audio . path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġdescriptor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set DataSource ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . file Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset FileDescriptor Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjc Audio . origin Ġ== ĠOrigin . FILE _ PATH Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set DataSource ( application Context , ĠUri . parse ( jc Audio . path )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . prepare Async () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setOn Prepared Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setOn Buffer ing Update Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setOn Completion Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setOn Error Listener ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġupdate Status ( jc Audio , ĠJ c Status . Play State . PRE PAR ING ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġthrow Error ( jc Audio . path , Ġjc Audio . origin ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġstatus ĊĠ Ġ} ĊĊĠ Ġfun Ġpause ( jc Audio : ĠJ c Audio ): ĠJ c Status Ġ{ ĊĠĠĠ Ġval Ġstatus Ġ= Ġupdate Status ( jc Audio , ĠJ c Status . Play State . PAUSE ) ĊĠĠĠ Ġservice Listener ?. on Paused Listener ( status ) ĊĠĠĠ Ġreturn Ġstatus ĊĠ Ġ} ĊĊĠ Ġfun Ġstop (): ĠJ c Status Ġ{ ĊĠĠĠ Ġval Ġstatus Ġ= Ġupdate Status ( status Ġ= ĠJ c Status . Play State . STOP ) ĊĠĠĠ Ġservice Listener ?. on Stopped Listener ( status ) ĊĠĠĠ Ġreturn Ġstatus ĊĠ Ġ} ĊĊĊĠ Ġfun Ġseek To ( time : ĠInt ) Ġ{ ĊĠĠĠ Ġmedia Player ?. seek To ( time ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Buffer ing Update ( media Player : ĠMedia Player , Ġi : ĠInt ) Ġ{} ĊĊĠ Ġoverride Ġfun Ġon Completion ( media Player : ĠMedia Player ) Ġ{ ĊĠĠĠ Ġservice Listener ?. on Completed Listener () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠonError ( media Player : ĠMedia Player , Ġi : ĠInt , Ġi 1 : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Prepared ( media Player : ĠMedia Player ) Ġ{ ĊĠĠĠ Ġthis . media Player Ġ= Ġmedia Player ĊĠĠĠ Ġval Ġstatus Ġ= Ġupdate Status ( current Audio , ĠJ c Status . Play State . PLAY ) ĊĊĠĠĠ Ġupdate Time () ĊĠĠĠ Ġservice Listener ?. on Prepared Listener ( status ) ĊĠĠĠ Ġis Prepared Ġ= Ġtrue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġupdate Status ( jc Audio : ĠJ c Audio ? Ġ= Ġnull , Ġstatus : ĠJ c Status . Play State ): ĠJ c Status Ġ{ ĊĠĠĠ Ġcurrent Audio Ġ= Ġjc Audio ĊĠĠĠ Ġjc Status . jc Audio Ġ= Ġjc Audio ĊĠĠĠ Ġjc Status . play State Ġ= Ġstatus ĊĊĠĠĠ Ġmedia Player ?. let Ġ{ ĊĠĠĠĠĠ Ġjc Status . duration Ġ= Ġit . duration . to Long () ĊĠĠĠĠĠ Ġjc Status . current Position Ġ= Ġit . current Position . to Long () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġwhen Ġ( status ) Ġ{ ĊĠĠĠĠĠ ĠJ c Status . Play State . PLAY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġmedia Player ?. start () ĊĠĠĠĠĠĠĠĠĠ Ġis Playing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠ Ġis Paused Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġservice Listener ?. onError ( exception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠJ c Status . Play State . STOP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġmedia Player ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit . stop () ĊĠĠĠĠĠĠĠĠĠ Ġit . reset () ĊĠĠĠĠĠĠĠĠĠ Ġit . release () ĊĠĠĠĠĠĠĠĠĠ Ġmedia Player Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis Playing Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġis Paused Ġ= Ġtrue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠJ c Status . Play State . PAUSE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġmedia Player ?. pause () ĊĠĠĠĠĠĠĠ Ġis Playing Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġis Paused Ġ= Ġtrue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠJ c Status . Play State . PRE PAR ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġis Playing Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġis Paused Ġ= Ġtrue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠJ c Status . Play State . PLAY ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġis Playing Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġis Paused Ġ= Ġfalse ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġelse Ġ-> Ġ{ Ġ// ĠCONTINUE Ġcase ĊĠĠĠĠĠĠĠ Ġmedia Player ?. start () ĊĠĠĠĠĠĠĠ Ġis Playing Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġis Paused Ġ= Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġjc Status ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġupdate Time () Ġ{ ĊĠĠĠ Ġobject Ġ: ĠThread () Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Prepared ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġupdate Status ( current Audio , ĠJ c Status . Play State . PLAY ING ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Listener ?. on Time Changed Listener ( status ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( TimeUnit . SECONDS . to Millis ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNullPointerException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. start () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġis Audio File Valid ( path : ĠString , Ġorigin : ĠOrigin ): ĠBoolean Ġ{ ĊĠĠĠ Ġwhen Ġ( origin ) Ġ{ ĊĠĠĠĠĠ ĠOrigin . URL Ġ-> Ġreturn Ġpath . startsWith (" http ") Ġ|| Ġpath . startsWith (" https ") ĊĊĠĠĠĠĠ ĠOrigin . RAW Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġasset FileDescriptor Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġasset FileDescriptor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . resources . open Raw Resource Fd ( Integer . parseInt ( path )) ĊĠĠĠĠĠĠĠ Ġreturn Ġasset FileDescriptor Ġ!= Ġnull ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠOrigin . AS SETS Ġ-> Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġasset FileDescriptor Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġasset FileDescriptor Ġ= Ġapplication Context . assets . open Fd ( path ) ĊĠĠĠĠĠĠĠ Ġasset FileDescriptor Ġ!= Ġnull ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe . printStackTrace () Ġ// TODO : Ġneed Ġto Ġgive Ġuser Ġmore Ġreadable Ġerror . ĊĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠOrigin . FILE _ PATH Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠ Ġ// TODO : Ġfind Ġan Ġalternative Ġto Ġchecking Ġif Ġfile Ġis Ġexist , Ġthis Ġcode Ġis Ġslower Ġon Ġaverage . ĊĠĠĠĠĠĠĠ Ġ// read Ġmore : Ġhttp :// stackoverflow . com / a / 8 8 6 8 1 4 0 ĊĠĠĠĠĠĠĠ Ġreturn Ġfile . exists () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġelse Ġ-> Ġ// ĠWe Ġshould Ġnever Ġar rive Ġhere . ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse Ġ// ĠWe Ġdon 't Ġknow Ġwhat Ġthe Ġorigin Ġof Ġthe ĠAudio ĠFile ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġthrow Error ( path : ĠString , Ġorigin : ĠOrigin ) Ġ{ ĊĠĠĠ Ġwhen Ġ( origin ) Ġ{ ĊĠĠĠĠĠ ĠOrigin . URL Ġ-> Ġthrow ĠAudio Url Invalid Exception ( path ) ĊĊĠĠĠĠĠ ĠOrigin . RAW Ġ-> Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠAudio Raw Invalid Exception ( path ) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠAudio Raw Invalid Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠOrigin . AS SETS Ġ-> Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠAudio Assets Invalid Exception ( path ) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠAudio Assets Invalid Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠOrigin . FILE _ PATH Ġ-> Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠAudio FilePath Invalid Exception ( path ) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠAudio FilePath Invalid Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġget MediaPlayer (): ĠMedia Player ? Ġ{ ĊĠĠĠ Ġreturn Ġmedia Player ĊĠ Ġ} ĊĊĠ Ġfun Ġfinalize () Ġ{ ĊĠĠĠ ĠLog . d (" K iller ", Ġ" on Task Removed ") ĊĠĠĠ Ġon Destroy () ĊĠĠĠ Ġstop Foreground ( false ) ĊĠ Ġ} ĊĠ Ġoverride Ġfun Ġon Un bind ( intent : ĠIntent ?): ĠBoolean Ġ{ ĊĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Ġ{ ĊĠĠĠĠĠ Ġservice Listener ?. on Kill () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġsuper . on Un bind ( intent ) ĊĠ Ġ} ĊĠ Ġoverride Ġfun Ġon Task Removed ( root Intent : ĠIntent ?) Ġ{ ĊĠĠĠ Ġstop Foreground ( false ) Ċ // ĠĠĠ Ġservice Listener ?. on Kill () ĊĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Ġ{ ĊĠĠĠĠĠ ĠLog . d (" K iller ", Ġ" on Task Removed ") ĊĠĠĠĠĠ Ġservice Listener ?. on Kill () ĊĠĠĠ Ġ} ĊĠĠĠ Ġsuper . on Task Removed ( root Intent ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Ġ{ ĊĠĠĠĠĠ ĠLog . d (" K iller ", Ġ" on Task Removed ") ĊĠĠĠĠĠ Ġservice Listener ?. on Kill () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠRemoving Ġlistener Ġfor Ġcall Ġring tone Ġpause ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġmgr Ġ= Ġget System Service ( Context . TELE PHONY _ SERVICE ) Ġas ? ĠTele phony Manager ĊĠĠĠĠĠ Ġmgr ?. listen ( phone State Listener , ĠPhone State Listener . LIST EN _ NONE ) ĊĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠ Ġ} ĊĠĠĠ Ġsuper . on Destroy () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Audio Focus Change ( focus Change : ĠInt ) Ġ{ ĊĠĠĠ Ġif ( focus Change <= 0 ) Ġ{ ĊĠĠĠĠĠ Ġ// LO SS Ġ-> ĠPA USE ĊĠĠĠĠĠ Ġcurrent Audio ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġpause ( it ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġ// GAIN Ġ-> ĠP LAY ĊĠĠĠĠĠ Ġcurrent Audio ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġplay ( it ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ Ċ } Ċ