package Ġcom . example . media Player Kotlin . modelo Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . media . MediaPlayer Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġjava . io . File Ċ import Ġjava . io . FileInputStream Ċ Ċ class ĠClass MediaPlayer : ĊĠĠĠĠĠĠĠ ĠMedia Player . On Completion Listener , MediaPlayer . OnError Listener , MediaPlayer . On Prepared Listener , ĊĠĠĠĠĠĠĠ ĠMedia Player . On Seek Complete Listener { ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġplayer Ġ= ĠMedia Player () ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠdataSource = Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġmus ica = ĠData ViewModel . mus ica ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġhandle : Handler = ĠHandler ( Looper . get Main Looper ()) ĊĊĠĠĠ Ġfun Ġplay () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( dataSource ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcaso Ġo Ġplayer ĠnÃ£o Ġten ha Ġuma Ġmus ica Ġassoci ada ĠÃł Ġele ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource Ġ= Ġset DataSource () Ġ// defin indo Ġuma Ġmus ica Ġao Ġplayer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dataSource ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . prepare () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . setOn Prepared Listener Ġ{ Ġon Prepared ( player ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . setOn Completion Listener Ġ{ Ġon Completion ( player ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . setOn Seek Complete Listener Ġ{ Ġon Seek Complete ( player ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// tro ca Ġde Ġmus ica Ġcaso Ġa Ġmus ica Ġselecion ada for Ġdifer ente Ġda Ġque Ġestar Ġem Ġexec uÃ§Ã£o ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData ViewModel . mus ica . nome Ġ!= Ġmus ica . nome Ġ-> Ġ Ġse lec in ou Out ra M us ica () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// play ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! player . is Playing Ġ-> Ġplayer . start () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// pause ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . pause () Ġ; Ġprogress Listener ()} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// env i ando Ġos Ġvalores Ġaos Ġobserv adores ĊĠĠĠĠĠĠĠ ĠData ViewModel . toc ando Ob serv ador . value = Ġplayer . is Playing ĊĠĠĠĠĠĠĠ ĠData ViewModel . mus ica Ob serv ador . value = Ġmus ica ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// par ando Ġa Ġmus ica Ġe Ġgrav ando Ġna Ġmem oria Ġa Ġult ima Ġmus ica Ġes cut ada ĊĠĠĠ Ġfun Ġpar ar ( context : ĠContext ){ ĊĠĠĠĠĠĠĠ ĠData ViewModel (). dao . grav ando Ult ima M us ica ( context . application Context , Ġmus ica ) ĊĠĠĠĠĠĠĠ ĠdataSource Ġ= false ĊĠĠĠĠĠĠĠ Ġplayer . stop () ĊĠĠĠĠĠĠĠ Ġprogress Listener () Ġ// par ando Ġrunnable ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// avan Ã§ ando Ġou Ġret roc end endo Ġa Ġmus ica ĊĠĠĠ Ġfun Ġseek To ( progress : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( player . is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . seek To ( progress ) ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . seek To ( progress ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// reset ando Ġo Ġplayer Ġpara Ġa Ġnova Ġmus ica Ġselecion ada ĊĠĠĠ Ġprivate Ġfun Ġse lec in ou Out ra M us ica () Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer . stop () ĊĠĠĠĠĠĠĠ Ġplayer . reset () ĊĠĠĠĠĠĠĠ ĠdataSource Ġ= false ĊĠĠĠĠĠĠĠ Ġplay () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprogress Listener (){ ĊĊĠĠĠĠĠĠĠ Ġval Ġrunnable Ġ= Ġobject Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// env i ando Ġo Ġprogress o Ġatual Ġao Ġobserv ador ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData ViewModel . progress o at ual Ob serv ador . value Ġ= Ġplayer . current Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle . post Delayed ( this , Ġ 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġremove Callback (){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle . remove Callbacks ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif ( player . is Playing ) Ġrunnable . run () ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrunnable . remove Callback () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset DataSource (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġmus ica Ġ= ĠData ViewModel . mus ica ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( mus ica . dire tor io ). absolute File ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( file . isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . set DataSource ( FileInputStream ( file ). fd ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} else Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠĠ Ġoverride Ġfun Ġon Completion ( mp : ĠMedia Player ) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġ// des ativ ando Ġloop Ġcaso Ġeste ja Ġat iv ado ĊĠĠĠĠĠĠĠĠ Ġval Ġloop = mp . is Loop ing ĊĠĠĠĠĠĠĠĠ Ġif ( mp . is Loop ing ) Ġmp . is Loop ing Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠ Ġmus ica Ġ= ĠData ViewModel (). prox ima M us ica ( prox imo Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠ Ġse lec in ou Out ra M us ica () ĊĊĠĠĠĠĠĠĠĠ Ġif Ġ( loop ) mp . is Loop ing = loop ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonError ( mp : ĠMedia Player ?, Ġwhat : ĠInt , Ġextra : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Prepared ( mp : ĠMedia Player ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmp . start () ĊĠĠĠĠĠĠĠ Ġ// env i ando Ġos Ġvalores Ġaos Ġobserv adores ĊĠĠĠĠĠĠĠ ĠData ViewModel . toc ando Ob serv ador . value = Ġplayer . is Playing ĊĠĠĠĠĠĠĠ ĠData ViewModel . mus ica Ob serv ador . value = Ġmus ica ĊĠĠĠĠĠĠĠ ĠData ViewModel . dur acao M us ica Ob serv ador . value = mp . duration ĊĠĠĠĠĠĠĠ Ġ// In ici ando Ġrunnable ĊĠĠĠĠĠĠĠ Ġprogress Listener () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Seek Complete ( mp : ĠMedia Player ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// env i ando Ġos Ġvalores Ġaos Ġobserv adores ĊĠĠĠĠĠĠĠ ĠData ViewModel . dur acao M us ica Ob serv ador . value = mp . duration ĊĠĠĠĠĠĠĠ ĠData ViewModel . progress o at ual Ob serv ador . value Ġ= Ġmp . current Position ĊĊĠĠĠ Ġ} Ċ }