package Ġy uk u . alk it ab . songs Ċ Ċ import Ġandroid . media . MediaPlayer Ċ import Ġandroid . os . Handler Ċ import Ġcom . af ol le st ad . material dialogs . Material Dialog Ċ import Ġy uk u . alk it ab . base . App Ċ import Ġy uk u . alk it ab . base . util . App Log Ċ import Ġy uk u . alk it ab . base . util . Background Ċ import Ġy uk u . alk it ab . debug . R Ċ import Ġjava . io . File Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . io . IOException Ċ Ċ private Ġconst Ġval ĠTAG Ġ= Ġ" Midi Controller " Ċ Ċ /** Ċ Ġ* ĠWe Ġwill Ġuse Ġ[ Ex op layer Controller ] Ġfor Ġnon - MIDI Ġfiles . Ċ Ġ* ĠOne Ġof Ġthe Ġreason Ġis Ġthat ĠEx op layer Ġallows Ġus Ġto Ġuse ĠOk Http Ġas Ġthe Ġdown loader . Ċ Ġ*/ Ċ class ĠM idi Controller Ġ: ĠMedia Controller () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmp Ġ= ĠMedia Player () ĊĊĠĠĠ Ġoverride Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . reset () ĊĠĠĠĠĠĠĠ Ġmp . reset () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġplay Or Pause ( play In Loop : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState . reset Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState . reset _ media _ known _ to _ exist , ĠState . complete , ĠState . error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠHandler () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBackground . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . pre paring ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠApp . download Bytes ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache File Ġ= ĠFile ( App . context . cacheDir , Ġ" song _ player _ local _ cache . mid ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache File . write Bytes ( bytes ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġis Ġa Ġbackground Ġthread . ĠWe Ġmust Ġgo Ġback Ġto Ġmain Ġthread , Ġand Ġcheck Ġagain Ġif Ġstate Ġis ĠOK Ġto Ġprepare . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ== ĠState . pre paring ) Ġ{ Ġ// Ġthe Ġfollowing Ġshould Ġbe Ġsynchronous , Ġsince Ġwe Ġare Ġloading Ġfrom Ġlocal . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player Prepare ( cache File . absolute Path , Ġplay In Loop ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Log . d ( TAG , Ġ" wrong Ġstate Ġafter Ġdownloading Ġsong Ġfile : Ġ$ state ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Log . e ( TAG , Ġ" buffer ing Ġto Ġlocal Ġcache ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState . pre paring Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState . playing Ġ-> Ġ// Ġpause Ġbutton Ġpressed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( play In Loop ) Ġ{ Ġ// Ġlooping Ġplay Ġis Ġselected , Ġbut Ġwe Ġare Ġalready Ġplaying . ĠSo Ġjust Ġset Ġlooping Ġparameter . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmp . is Loop ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmp . pause () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . paused ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState . paused Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġplay Ġbutton Ġpressed Ġwhen Ġpaused ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmp . is Loop ing Ġ= Ġplay In Loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmp . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . playing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. let Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmedia Player Prepare ( local Filename : ĠString , Ġplay In Loop : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . pre paring ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmp . setOn Prepared Listener Ġ{ Ġplayer : ĠMedia Player Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġonly Ġstart Ġplaying Ġif Ġthe Ġcurrent Ġstate Ġis Ġpre paring , Ġi . e ., Ġnot Ġerror Ġor Ġreset . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ== ĠState . pre paring ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . is Loop ing Ġ= Ġplay In Loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . playing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmp . setOn Completion Listener Ġ{ Ġplayer : ĠMedia Player Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Log . d ( TAG , Ġ"@ @ on Completion Ġlooping =" Ġ+ Ġplayer . is Loop ing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! player . is Loop ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . reset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . complete ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmp . setOn Error Listener Ġ{ Ġ_: ĠMedia Player ?, Ġwhat : ĠInt , Ġextra : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Log . e ( TAG , Ġ"@ @ onError Ġcontroller _ state =$ state Ġwhat =$ what Ġextra =$ extra ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ!= ĠState . reset ) Ġ{ Ġ// ĠErrors Ġcan Ġhappen Ġif Ġwe Ġcall ĠMedia Player # reset Ġwhen ĠMedia Player Ġstate Ġis ĠPre paring . ĠIn Ġthis Ġcase , Ġdo Ġnot Ġshow Ġerror Ġmessage . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= Ġactivity Ref ?. get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( activity Ġ!= Ġnull Ġ&& Ġ! activity . is Finish ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Dialog . Builder ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. content ( activity . getString ( R . string . song _ player _ error _ description , Ġwhat , Ġextra )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. positive Text ( R . string . ok ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ// Ġlet ĠOn Completion Listener Ġbe Ġcalled . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfis Ġ= ĠFileInputStream ( local Filename ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfd Ġ= Ġfis . fd ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmp . reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmp . set DataSource ( fd ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfis . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmp . prepare () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp Log . e ( TAG , Ġ" mp Ġset DataSource ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . error ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġcurrent Ġposition Ġand Ġduration Ġin Ġms . ĠAny Ġof Ġthem Ġcan Ġbe Ġ- 1 Ġif Ġunknown . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget Progress (): ĠLong Array Ġ= Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠ ĠState . playing , ĠState . paused Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmp . current Position . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Log . e ( TAG , Ġ"@ @ get Progress ĠgetCurrent Position ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmp . duration . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Log . e ( TAG , Ġ"@ @ get Progress Ġget Duration ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlong ArrayOf ( position , Ġduration ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġlong ArrayOf (- 1 , Ġ- 1 ) ĊĠĠĠ Ġ} Ċ } Ċ