package Ġcom . tech be lo ved . h ym nb ook . t unes playback Ċ Ċ import Ġandroid . media . MediaPlayer Ċ import Ġandroid . media . Playback Params Ċ import Ġandroid . os . Build Ċ import Ġandroid . support . v 4 . media . Media Metadata Compat Ċ import Ġandroid . support . v 4 . media . session . Playback State Compat Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġio . reactivex . Maybe Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . subjects . Publish Subject Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . IOException Ċ Ċ class ĠMedia Player Adapter Ġ: ĠMedia Playback Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġplayer : ĠMedia Player ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcurrent Metadata : ĠMedia Metadata Compat ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġrepeat Times Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġvar Ġplay Count Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġplayer Ready Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval Ġplayback Status Subject Ġ= ĠPublish Subject . create < Playback Status >() ĊĊĠĠĠ Ġoverride Ġfun Ġon Play () Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer ?. start () ĊĠĠĠĠĠĠĠ Ġplayer ?. set Volume ( 1 . 0 f , Ġ 1 . 0 f ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer ?. pause () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer ?. stop () ĊĠĠĠĠĠĠĠ Ġplayer ?. release () ĊĠĠĠĠĠĠĠ Ġplayer Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Playing (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġplayer ?. is Playing Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdu ck () Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer ?. set Volume ( 0 . 3 f , Ġ 0 . 3 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprepare ( metadata : ĠMedia Metadata Compat ?): ĠMaybe < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( player Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Ġ= ĠMedia Player () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. reset () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent Metadata Ġ= Ġmetadata ĊĠĠĠĠĠĠĠ Ġplayer ?. setOn Completion Listener Ġ{ Ġmp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( play Count Ġ< Ġrepeat Times ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPlay Ġagain ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Play () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayback Status Subject . onNext ( Playback Status . Playback Complete ( metadata )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġwant Ġto Ġreset Ġthe Ġplay Ġcount Ġso Ġthat Ġwhen Ġa Ġuser Ġclicks Ġplay Ġafter Ġprevious Ġplayback Ġhas Ġcomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġcould Ġstart Ġplayback Ġwhile Ġstill Ġreporting Ġthe Ġcorrect Ġplayback Ġstate Ġsuch Ġas Ġplayback Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġplayer ?. setOn Error Listener Ġ{ Ġmp , Ġwhat , Ġextra Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayback Status Subject . onNext ( Playback Status . Playback Error ( Throwable (" MediaPlayer Ġerror : Ġ$ what , Ġextra : Ġ$ extra "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠMaybe . create Ġ{ Ġemitter Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( metadata Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. set DataSource ( metadata . media Uri . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. prepare () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . on Success ( player ?. duration !! Ġ* Ġrepeat Times ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Ready Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . on Success ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelease () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( e ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIllegalStateException Ġ-> Ġemitter . onError ( Throwable (" MediaPlayer Ġset DataSource Ġor Ġprepare Ġcalled Ġin Ġinvalid Ġstate !", Ġe )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIOException Ġ-> Ġemitter . onError ( Throwable (" Failure Ġaccessing Ġthe Ġspecified Ġfile ! Ġ${ metadata ?. media Uri }", Ġe )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIllegalArgumentException Ġ-> Ġemitter . onError ( Throwable (" Invalid Ġargument ! Ġ Ġ${ metadata ?. media Uri }", Ġe )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġemitter . onError ( Throwable (" Error Ġpre paring Ġmedia Ġfor Ġplayback ", Ġe )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelease () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġplayback Status (): ĠObservable < Playback Status > Ġ= Ġplayback Status Subject . hide () ĊĊĠĠĠ Ġprivate Ġfun Ġrelease () Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer ?. release () ĊĠĠĠĠĠĠĠ Ġplayer Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġplayer Ready Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . M ) ĊĠĠĠ Ġoverride Ġfun Ġset Playback Speed ( speed : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwas Playing Ġ= Ġplayer ?. is Playing Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġplayer ?. playback Params Ġ= ĠPlay back Params (). set Speed ( speed ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! was Playing Ġ&& Ġis Playing ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġplayback Ġspeed Ġis Ġset , Ġthe Ġplayback Ġresume s Ġautomatically Ġeven Ġif Ġit Ġwas Ġpaused . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTo Ġensure Ġthat Ġdoesn 't Ġhappen , Ġcache Ġthe Ġplaying Ġstate Ġbefore Ġsetting Ġthe Ġspeed , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthen Ġpause Ġhere Ġif Ġit Ġwas Ġnot Ġplaying Ġoriginally ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Pause () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWe Ġwant Ġto Ġcalculate Ġthe Ġtotal Ġtime Ġthe Ġsong Ġhas Ġplayed Ġadding Ġthe Ġcurrent Ġposition ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġcurrent Position (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġplayer ?. current Position ?. to Long () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġplayer ?. duration ?. to Long () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ ĠTim ber . i (" duration : Ġ% s , Ġplay Count : Ġ% s ", Ġduration , Ġplay Count ) ĊĠĠĠĠĠĠĠ Ġreturn Ġduration Ġ* Ġplay Count Ġ+ Ġposition ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . M ) ĊĠĠĠ Ġoverride Ġfun Ġplayback Rate (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Ready Ġ-> Ġplayer ?. playback Params ?. speed Ġ?: Ġ 1 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 1 . 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Repeat (@ Playback State Compat . Repeat Mode Ġrepeat Mode : ĠInt , Ġrepeat Times : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( repeat Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor Ġrepeat Ġmode Ġall , Ġit 's Ġbasically Ġgoing Ġto Ġplay Ġthe Ġsame Ġsong Ġa Ġspecified Ġnumber Ġof Ġtimes ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlay back State Compat . REPEAT _ MODE _ ALL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . repeat Times Ġ= Ġrepeat Times ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. is Loop ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlay back State Compat . REPEAT _ MODE _ ONE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. is Loop ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . repeat Times Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. is Loop ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }