package Ġcom . ray w ender lich . pod play . ui Ċ Ċ import Ġandroid . animation . Value Animator Ċ import Ġandroid . content . Component Name Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . v 4 . media . Media Browser Compat Ċ import Ġandroid . support . v 4 . media . Media Metadata Compat Ċ import Ġandroid . support . v 4 . media . session . Media Controller Compat Ċ import Ġandroid . support . v 4 . media . session . Media Session Compat Ċ import Ġandroid . support . v 4 . media . session . Playback State Compat Ċ import Ġandroid . text . format . Date Utils Ċ import Ġandroid . text . method . Scrolling Movement Method Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . animation . Linear Interpolator Ċ import Ġandroid . widget . Seek Bar Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . Fragment Activity Ċ import Ġandroidx . fragment . app . activity ViewModels Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . ray w ender lich . pod play . databinding . Fragment Episode Player Binding Ċ import Ġcom . ray w ender lich . pod play . service . Pod play Media Callback . Companion . CMD _ CHANG ES PE ED Ċ import Ġcom . ray w ender lich . pod play . service . Pod play Media Callback . Companion . CMD _ EXTRA _ SPEED Ċ import Ġcom . ray w ender lich . pod play . service . Pod play Media Service Ċ import Ġcom . ray w ender lich . pod play . util . Html Utils Ċ import Ġcom . ray w ender lich . pod play . view model . Pod cast ViewModel Ċ Ċ class ĠEp isode Player Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdatab ind ing : ĠFragment Episode Player Binding ĊĠĠĠ Ġprivate Ġval Ġpod cast ViewModel : ĠPod cast ViewModel Ġby Ġactivity ViewModels () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmedia Browser : ĠMedia Browser Compat ĊĠĠĠ Ġprivate Ġvar Ġmedia Controller Callback : ĠMedia Controller Callback ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġplayer Speed : ĠFloat Ġ= Ġ 1 . 0 f ĊĠĠĠ Ġprivate Ġvar Ġepisode Duration : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġdragging Sc rub ber : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġprogress Animator : ĠValue Animator ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġnext Prev Val Ġ= Ġ 0 ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance (): ĠEp isode Player Fragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠEp isode Player Fragment () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġinit Media Browser () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġdatab ind ing Ġ= ĠFragment Episode Player Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdatab ind ing . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġsetup Controls () ĊĠĠĠĠĠĠĠ Ġupdate Controls () ĊĠĠĠĠĠĠĠ Ġnext Prev Val Ġ= Ġpod cast ViewModel . int ial Episode Position ĊĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġon Next Click (){ ĊĠĠĠĠĠĠĠ Ġnext Prev Val ++ ĊĠĠĠĠĠĠĠ Ġpod cast ViewModel . active Episode ViewData Ġ= Ġpod cast ViewModel . episode List [ next Prev Val ] ĊĠĠĠĠĠĠĠ Ġupdate Controls () ĊĠĠĠĠĠĠĠ Ġcheck And Register Media Controller () ĊĠĠĠĠĠĠĠ Ġpod cast ViewModel . active Episode ViewData ?. let Ġ{ Ġstart Playing ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfragment Activity Ġ= Ġactivity Ġas ĠFragment Activity ĊĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= ĠMedia Controller Compat . get Media Controller ( fragment Activity ) ĊĠĠĠĠĠĠĠ Ġcontroller . transport Controls . skip To Next () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Play Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfragment Activity Ġ= Ġactivity Ġas ĠFragment Activity ĊĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= ĠMedia Controller Compat . get Media Controller ( fragment Activity ) ĊĠĠĠĠĠĠĠ Ġif Ġ( controller . playback State Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( controller . playback State . state Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlay back State Compat . STATE _ PLAY ING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . transport Controls . pause () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpod cast ViewModel . active Episode ViewData ?. let Ġ{ Ġstart Playing ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpod cast ViewModel . active Episode ViewData ?. let Ġ{ Ġstart Playing ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġchange Speed () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ 1 ĊĠĠĠĠĠĠĠ Ġplayer Speed Ġ+= Ġ 0 . 2 5 f ĊĠĠĠĠĠĠĠ Ġif Ġ( player Speed Ġ> Ġ 2 . 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Speed Ġ= Ġ 0 . 7 5 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġbundle Ġ= ĠBundle () ĊĠĠĠĠĠĠĠ Ġbundle . put Float ( CMD _ EXTRA _ SPEED , Ġplayer Speed ) ĊĠĠĠĠĠĠĠ Ġ// Ġ 3 ĊĠĠĠĠĠĠĠ Ġval Ġfragment Activity Ġ= Ġactivity Ġas ĠFragment Activity ĊĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= ĠMedia Controller Compat . get Media Controller ( fragment Activity ) ĊĠĠĠĠĠĠĠ Ġcontroller . send Command ( CMD _ CHANG ES PE ED , Ġbundle , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ// Ġ 4 ĊĠĠĠĠĠĠĠ Ġval Ġspeed ButtonText Ġ= Ġ"${ player Speed } x " ĊĠĠĠĠĠĠĠ Ġdatab ind ing . speed Button . text Ġ= Ġspeed ButtonText ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġseek By ( seconds : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfragment Activity Ġ= Ġactivity Ġas ĠFragment Activity ĊĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= ĠMedia Controller Compat . get Media Controller ( fragment Activity ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Position Ġ= Ġcontroller . playback State . position Ġ+ Ġseconds Ġ* Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġcontroller . transport Controls . seek To ( new Position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ 1 ĊĠĠĠ Ġprivate Ġfun Ġanimate Sc rub ber ( progress : ĠInt , Ġspeed : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġtime Remaining Ġ= Ġ(( episode Duration Ġ- Ġprogress ) Ġ/ Ġspeed ). toInt () ĊĠĠĠĠĠĠĠ Ġ// Ġ 3 ĊĠĠĠĠĠĠĠ Ġif Ġ( time Remaining Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ; ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġ 4 ĊĠĠĠĠĠĠĠ Ġprogress Animator Ġ= ĠValue Animator . of Int ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress , Ġepisode Duration . toInt () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġprogress Animator ?. let Ġ{ Ġanim ator Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 5 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . duration Ġ= Ġtime Remaining . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . interpol ator Ġ= ĠLinear Interpolator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 7 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . add Update Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( drag ging Sc rub ber ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 9 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatab ind ing . seek Bar . progress Ġ= Ġanim ator . animated Value Ġas ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Controls () Ġ{ ĊĠĠĠĠĠĠĠ Ġdatab ind ing . play ToggleButton . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Play Pause () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatab ind ing . speed Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Speed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatab ind ing . speed Button . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdatab ind ing . next Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Next Click () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdatab ind ing . forward Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġseek By ( 3 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdatab ind ing . replay Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġseek By (- 1 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 1 ĊĠĠĠĠĠĠĠ Ġdatab ind ing . seek Bar . setOn Seek Bar ChangeListener ( object Ġ: ĠSeek Bar . On Seek Bar ChangeListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress Changed ( seek Bar : ĠSeek Bar , Ġprogress : ĠInt , Ġfrom User : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatab ind ing . currentTime TextView . text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDate Utils . format Elapsed Time (( progress Ġ/ Ġ 1 0 0 0 ). to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart Tracking Touch ( seek Bar : ĠSeek Bar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdragging Sc rub ber Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stop Tracking Touch ( seek Bar : ĠSeek Bar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdragging Sc rub ber Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Activity Ġ= Ġactivity Ġas ĠFragment Activity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= ĠMedia Controller Compat . get Media Controller ( fragment Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( controller . playback State Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 6 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . transport Controls . seek To ( seek Bar . progress . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 7 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseek Bar . progress Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Controls () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ 1 ĊĠĠĠĠĠĠĠ Ġdatab ind ing . episode Title TextView . text Ġ= Ġpod cast ViewModel . active Episode ViewData ?. title ĊĠĠĠĠĠĠĠ Ġ// Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġhtml Desc Ġ= Ġpod cast ViewModel . active Episode ViewData ?. description Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġdesc Span Ġ= ĠHtml Utils . html To Sp ann able ( html Desc ) ĊĠĠĠĠĠĠĠ Ġdatab ind ing . episode Desc TextView . text Ġ= Ġdesc Span ĊĠĠĠĠĠĠĠ Ġdatab ind ing . episode Desc TextView . movement Method Ġ= ĠScroll ing Movement Method () ĊĠĠĠĠĠĠĠ Ġ// Ġ 3 ĊĠĠĠĠĠĠĠ Ġval Ġfragment Activity Ġ= Ġactivity Ġas ĠFragment Activity ĊĠĠĠĠĠĠĠ ĠG lide . with ( fragment Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( podcast ViewModel . podcast LiveData . value ?. imageUrl ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( databinding . episode ImageView ) ĊĊĠĠĠĠĠĠĠ Ġval Ġspeed ButtonText Ġ= Ġ"${ player Speed } x " ĊĠĠĠĠĠĠĠ Ġdatab ind ing . speed Button . text Ġ= Ġspeed ButtonText ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Controls From Metadata ( metadata : ĠMedia Metadata Compat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġepisode Duration Ġ= Ġmetadata . getLong ( Media Metadata Compat . METADATA _ KEY _ DURATION ) ĊĠĠĠĠĠĠĠ Ġdatab ind ing . endTime TextView . text Ġ= ĠDate Utils . format Elapsed Time (( episode Duration Ġ/ Ġ 1 0 0 0 )) ĊĠĠĠĠĠĠĠ Ġdatab ind ing . seek Bar . max Ġ= Ġepisode Duration . toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Controls From Controller () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfragment Activity Ġ= Ġactivity Ġas ĠFragment Activity ĊĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= ĠMedia Controller Compat . get Media Controller ( fragment Activity ) ĊĠĠĠĠĠĠĠ Ġif Ġ( controller Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= Ġcontroller . metadata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( metadata Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle StateChange ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . playback State . state , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . playback State . position , Ġplayer Speed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Controls From Metadata ( controller . metadata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Playing ( episode ViewData : ĠPod cast ViewModel . Episode ViewData ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfragment Activity Ġ= Ġactivity Ġas ĠFragment Activity ĊĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= ĠMedia Controller Compat . get Media Controller ( fragment Activity ) ĊĠĠĠĠĠĠĠ Ġval Ġview Data Ġ= Ġpod cast ViewModel . active Pod cast Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġbundle Ġ= ĠBundle () ĊĠĠĠĠĠĠĠ Ġbundle . putString ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Metadata Compat . METADATA _ KEY _ TITLE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġepisode ViewData . title ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġbundle . putString ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Metadata Compat . METADATA _ KEY _ AR TI ST , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Data . feed Title ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġbundle . putString ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Metadata Compat . METADATA _ KEY _ AL BU M _ ART _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Data . imageUrl ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġcontroller . transport Controls . play From Uri ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse ( episode ViewData . media Url ), Ġbundle ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle StateChange ( state : ĠInt , Ġposition : ĠLong , Ġspeed : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprogress Animator ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Animator Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġis Playing Ġ= Ġstate Ġ== ĠPlay back State Compat . STATE _ PLAY ING ĊĠĠĠĠĠĠĠ Ġdatab ind ing . play ToggleButton . is Activated Ġ= Ġis Playing ĊĊĠĠĠĠĠĠĠ Ġval Ġprogress Ġ= Ġposition . toInt () ĊĠĠĠĠĠĠĠ Ġdatab ind ing . seek Bar . progress Ġ= Ġprogress ĊĠĠĠĠĠĠĠ Ġval Ġspeed ButtonText Ġ= Ġ"${ player Speed } x " ĊĠĠĠĠĠĠĠ Ġdatab ind ing . speed Button . text Ġ= Ġspeed ButtonText ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Sc rub ber ( progress , Ġspeed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġcheck And Register Media Controller () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck And Register Media Controller () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( media Browser . isConnected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Activity Ġ= Ġactivity Ġas ĠFragment Activity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Media Controller Compat . get Media Controller ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( fragment Activity ) Ġ== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister Media Controller ( media Browser . session Token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Controls From Controller () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Browser . connect () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ Ġval Ġfragment Activity Ġ= Ġactivity Ġas ĠFragment Activity ĊĠĠĠĠĠĠĠ Ġif Ġ( Media Controller Compat . get Media Controller ( fragment Activity ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Controller Callback ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Controller Compat . get Media Controller ( fragment Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. unregister Callback ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprogress Animator ?. cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Media Browser () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfragment Activity Ġ= Ġactivity Ġas ĠFragment Activity ĊĠĠĠĠĠĠĠ Ġmedia Browser Ġ= ĠMedia Browser Compat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Activity , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComponent Name ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Activity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPod play Media Service :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Browser CallBack s (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġregister Media Controller ( token : ĠMedia Session Compat . Token ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġfragment Activity Ġ= Ġactivity Ġas ĠFragment Activity ĊĠĠĠĠĠĠĠ Ġ// Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġmedia Controller Ġ= ĠMedia Controller Compat ( fragment Activity , Ġtoken ) ĊĠĠĠĠĠĠĠ Ġ// Ġ 3 ĊĠĠĠĠĠĠĠ ĠMedia Controller Compat . set Media Controller ( fragment Activity , Ġmedia Controller ) ĊĠĠĠĠĠĠĠ Ġ// Ġ 4 ĊĠĠĠĠĠĠĠ Ġmedia Controller Callback Ġ= ĠMedia Controller Callback () ĊĠĠĠĠĠĠĠ Ġmedia Controller . register Callback ( media Controller Callback !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠMedia Controller Callback Ġ: ĠMedia Controller Compat . Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Metadata Changed ( metadata : ĠMedia Metadata Compat ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Metadata Changed ( metadata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" metadata Ġchanged Ġto Ġ${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata ?. getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Metadata Compat . METADATA _ KEY _ MEDIA _ URI ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata ?. let Ġ{ Ġupdate Controls From Metadata ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Playback StateChanged ( state : ĠPlay back State Compat ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Playback StateChanged ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" state Ġchanged Ġto Ġ$ state ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġstate Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle StateChange ( state . state , Ġstate . position , Ġstate . playback Speed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠMedia Browser CallBack s Ġ: ĊĠĠĠĠĠĠĠ ĠMedia Browser Compat . Connection Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ 1 ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Connected () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Connected () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Media Controller ( media Browser . session Token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" on Connected ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Controls From Controller () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Connection Sus pended () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Connection Sus pended () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" on Connection Sus pended ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDisable Ġtransport Ġcontrols ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Connection Failed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Connection Failed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" on Connection Failed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠF atal Ġerror Ġhandling ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ