package Ġeu . z der ad ick a . aud ios er ve . fragments ĊĊ Ċ import Ġandroid . animation . Value Animator Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . preference . Preference Manager Ċ import Ġandroidx . core . content . Context 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 . Playback State Compat Ċ import Ġandroid . text . format . Date Utils Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . animation . Linear Interpolator Ċ import Ġandroid . widget .* Ċ import Ġeu . z der ad ick a . aud ios er ve .* Ċ import Ġeu . z der ad ick a . aud ios er ve . data . media Id To Position Path Ċ import Ġeu . z der ad ick a . aud ios er ve . net . ApiClient Ċ import Ġeu . z der ad ick a . aud ios er ve . ui .* Ċ import Ġjava . io . File Ċ Ċ // import Ġkotlinx . android . synt hetic . main . fragment _ controller .* ĊĊ Ċ private Ġconst Ġval ĠLOG _ TAG Ġ= Ġ" Controller Fragment " Ċ Ċ interface ĠController Holder Ġ{ ĊĠĠĠ Ġfun Ġon Controller Click () Ċ } Ċ Ċ class ĠController Fragment Ġ: ĠMedia Fragment (), ĠSharedPreferences . On Shared Preference ChangeListener Ġ{ ĊĊĠĠĠ Ġvar Ġcan Play Ġ= Ġfalse ĊĊĠĠĠ Ġ// ĠReceive Ġcallbacks Ġfrom Ġthe ĠMedia Controller . ĠHere Ġwe Ġupdate Ġour Ġstate Ġsuch Ġas Ġwhich Ġqueue ĊĠĠĠ Ġ// Ġis Ġbeing Ġshown , Ġthe Ġcurrent Ġtitle Ġand Ġdescription Ġand Ġthe ĠPlay back State . ĊĠĠĠ Ġoverride Ġval Ġm Callback Ġ= Ġobject Ġ: ĠMedia Controller Compat . Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Playback StateChanged ( state : ĠPlay back State Compat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Received Ġplayback Ġstate Ġchange Ġto Ġstate Ġ${ state . state }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( activity Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" on Playback StateChanged Ġcalled Ġwhen ĠgetActivity Ġnull ," Ġ+ Ġ" this Ġshould Ġnot Ġhappen Ġif Ġthe Ġcallback Ġwas Ġproperly Ġun registered . ĠIgn oring .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġenable Play Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( state . state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlay back State Compat . STATE _ NONE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Audio Service Ġis Ġstopped ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable Play Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlay back State Compat . STATE _ PA USED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlay back State Compat . STATE _ BUFFER ING , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlay back State Compat . STATE _ STOP PED Ġ-> Ġenable Play Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlay back State Compat . STATE _ ERROR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġstate . errorMessage Ġ?: Ġ" Playback Ġerror " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" error Ġplayback state : Ġ Ġ$ msg ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( activity , Ġmsg , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable Play Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enable Play ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Pause Button . setImage Drawable ( ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Drawable ( activity !! , ĠR . drawable . ic _ play _ white )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Pause Button . setImage Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Drawable ( activity !! , ĠR . drawable . ic _ pause _ white )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Controller Fragment . can Play Ġ= Ġenable Play ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcontrol Ġbuttons ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġenable Button ( btn : ĠView , Ġaction : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . actions Ġand Ġaction Ġ== Ġaction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbtn . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbtn . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġenable Button ( skip Next Button , ĠPlay back State Compat . ACTION _ SKIP _ TO _ NEXT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenable Button ( skip Previous Button , ĠPlay back State Compat . ACTION _ SKIP _ TO _ PREVIOUS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenable Button ( fast Forward Button , ĠPlay back State Compat . ACTION _ FAST _ FORWARD Ġor ĠPlay back State Compat . ACTION _ SEEK _ TO ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenable Button ( rewind Button , ĠPlay back State Compat . ACTION _ RE W IND Ġor ĠPlay back State Compat . ACTION _ SEEK _ TO ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġseek Bar Ġanimation ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// reset Ġcurrent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Progress Animator () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress Ġ= Ġstate . position . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġseek Bar . progress Ġ= Ġprogress ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . state Ġ== ĠPlay back State Compat . STATE _ PLAY ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtime ToEnd Ġ= Ġ( seek Bar . max Ġ- Ġprogress ) Ġ/ Ġstate . playback Speed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( time ToEnd Ġ< Ġ 0 ) Ġtime ToEnd Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Setting ĠAn imator Ġto Ġ${ seek Bar . progress } Ġto Ġ${ seek Bar . max } Ġtime ToEnd Ġ$ time ToEnd ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Animator Ġ= ĠValue Animator . of Int ( seek Bar . progress , Ġseek Bar . max ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Duration ( time ToEnd . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterpol ator Ġ= ĠLinear Interpolator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Update Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseek Bar . progress Ġ= Ġit . animated Value Ġas ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// enable Ġseek bar Ġonly Ġif Ġcan Ġseek ĊĠĠĠĠĠĠĠĠĠĠĠ Ġseek Bar . isEnabled Ġ= Ġstate . actions Ġand ĠPlay back State Compat . ACTION _ SEEK _ TO Ġ> Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Metadata Changed ( metadata : ĠMedia Metadata Compat ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( metadata Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Track Time ( metadata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Session Event ( event : ĠString ?, Ġextras : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSEEK _ WAIT ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Delayed Seek Progress ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSEEK _ WAIT ING _ DONE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Delayed Seek Progress ( false , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Delayed Seek Progress ( show : Boolean = true , Ġcancel : Boolean = true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( show ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelayed Seek ProgressBar . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelayed Seek ProgressBar . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cancel ) Ġmedia Controller ?. send Command ( CUSTOM _ COMMAND _ CANCEL _ DELAY ED _ SEEK , Ġnull , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġcancel Progress Animator () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( progress Animator Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Animator !!. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Animator Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Controller Fragment . onStart ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Controller Fragment . on Stop ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġplay Pause Button : ĠImageView ĊĠĠĠ Ġlateinit Ġvar Ġseek Bar : ĠSeek Bar ĊĠĠĠ Ġlateinit Ġvar ĠcurrentTime View : ĠTextView ĊĠĠĠ Ġlateinit Ġvar Ġtrack Time View : ĠTextView ĊĠĠĠ Ġlateinit Ġvar Ġskip Previous Button : ĠImageView ĊĠĠĠ Ġlateinit Ġvar Ġskip Next Button : ĠImageView ĊĠĠĠ Ġlateinit Ġvar Ġfast Forward Button : ĠLong Press Button ĊĠĠĠ Ġlateinit Ġvar Ġre wind Button : ĠLong Press Button ĊĠĠĠ Ġlateinit Ġvar Ġmain View : ĠView ĊĠĠĠ Ġlateinit Ġvar Ġspeed Bar : ĠSeek Bar ĊĠĠĠ Ġlateinit Ġvar Ġspeed Bar Listener : ĠDis crete Seek bar Listener ĊĠĠĠ Ġlateinit Ġvar Ġpitch Bar : ĠSeek Bar ĊĠĠĠ Ġlateinit Ġvar Ġpitch Bar Listener : ĠDis crete Seek bar Listener ĊĠĠĠ Ġlateinit Ġvar Ġspeed View : ĠTextView ĊĠĠĠ Ġlateinit Ġvar Ġpitch View : ĠTextView ĊĠĠĠ Ġlateinit Ġvar Ġsil ence Switch : ĠSwitch ĊĠĠĠ Ġlateinit Ġvar Ġvolume Boost Switch : ĠSwitch ĊĠĠĠ Ġlateinit Ġvar Ġdelayed Seek ProgressBar : ĠProgress Bar ĊĊĠĠĠ Ġvar Ġprogress Animator : ĠValue Animator ? Ġ= Ġnull ĊĊĠĠĠ Ġlateinit Ġvar Ġholder : ĠController Holder ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInf late Ġthe Ġlayout Ġfor Ġthis Ġfragment ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġinflater . inflate ( R . layout . fragment _ controller , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġmain View Ġ= Ġview ĊĠĠĠĠĠĠĠ Ġplay Pause Button Ġ= Ġview . findViewById ( R . id . play Pause Button ) ĊĠĠĠĠĠĠĠ Ġseek Bar Ġ= Ġview . findViewById ( R . id . seek Bar ) ĊĠĠĠĠĠĠĠ Ġpitch Bar Ġ= Ġview . findViewById ( R . id . pitch Bar ) ĊĠĠĠĠĠĠĠ ĠcurrentTime View Ġ= Ġview . findViewById ( R . id . currentTime View ) ĊĠĠĠĠĠĠĠ Ġtrack Time View Ġ= Ġview . findViewById ( R . id . track Time View ) ĊĠĠĠĠĠĠĠ Ġskip Next Button Ġ= Ġview . findViewById ( R . id . skip Next Button ) ĊĠĠĠĠĠĠĠ Ġskip Previous Button Ġ= Ġview . findViewById ( R . id . skip Previous Button ) ĊĠĠĠĠĠĠĠ Ġre wind Button Ġ= Ġview . findViewById ( R . id . rewind Button ) ĊĠĠĠĠĠĠĠ Ġfast Forward Button Ġ= Ġview . findViewById ( R . id . fast Forward Button ) ĊĠĠĠĠĠĠĠ Ġspeed Bar Ġ= Ġview . findViewById ( R . id . speed Bar ) ĊĠĠĠĠĠĠĠ Ġsil ence Switch Ġ= Ġview . findViewById ( R . id . sil ence Switch ) ĊĠĠĠĠĠĠĠ Ġvolume Boost Switch Ġ= Ġview . findViewById ( R . id . volume Boost Switch ) ĊĠĠĠĠĠĠĠ Ġspeed View Ġ= Ġview . findViewById ( R . id . speed View ) ĊĠĠĠĠĠĠĠ Ġpitch View Ġ= Ġview . findViewById ( R . id . pitch View ) ĊĠĠĠĠĠĠĠ Ġdelayed Seek ProgressBar Ġ= Ġview . findViewById ( R . id . delayed Seek ProgressBar ) ĊĠĠĠĠĠĠĠ Ġspeed Bar Listener Ġ= ĠDis crete Seek bar Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSPE ED _ RANGE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" pref _ playback _ speed ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeed View ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġpitch Bar Listener Ġ= ĠDis crete Seek bar Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP ITCH _ RANGE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" pref _ playback _ pitch ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpitch View ĊĠĠĠĠĠĠĠ Ġ) ĊĊĊĠĠĠĠĠĠĠ Ġ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 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime View . text Ġ= ĠDate Utils . format Elapsed Time ( progress . to Long () Ġ/ Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart Tracking Touch ( seek Bar : ĠSeek Bar ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Progress Animator () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stop Tracking Touch ( seek Bar : ĠSeek Bar ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġ- Ġtrans coded Ġmedia Ġseek Ġ- Ġlonger Ġterm Ġsolution Ġ- Ġ Ġuse Ġextra Ġdata Ġto Ġseek Ġon Ġserver Ġ- Ġe . g Ġstart Ġnew Ġmedia Ġwith Ġoffset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Controller ?. transport Controls ?. seek To ( seek Bar ?. progress !!. to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġplay Pause Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Delayed Seek Progress ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( can Play ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Controller ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia Id Ġ= Ġmetadata ?. description ?. media Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmain Activity Ġ= Ġactivity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi Ġ= ĠApi Client . getInstance ( context !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( media Id Ġ!= Ġnull Ġ&& Ġmain Activity Ġis ĠMainActivity Ġ&& Ġapi . is Position Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi . query Position For Media Id ( media Id , Ġcurrent Play Time ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres , Ġerr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( err Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" Error Ġreading Ġposition : Ġ$ err ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : Ġremove Ġdebug Ġtoast s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġ" C ann 't Ġget Ġremote Ġposition : Ġ$ err ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransport Controls ?. play () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ(! res . isNull OrEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Activity . check Remote Positions ( res , Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransport Controls ?. play () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Toast . makeText ( context , Ġ" No Ġmore Ġrecent Ġremote Ġpositions ", Toast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransport Controls ?. play () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransport Controls ?. play () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Controller ?. transport Controls ?. pause () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġskip Next Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Delayed Seek Progress ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Controller ?. transport Controls ?. skip To Next () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġskip Previous Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Delayed Seek Progress ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Controller ?. transport Controls ?. skip To Previous () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġre wind Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Controller ?. transport Controls ?. rewind () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġre wind Button . set Long Press Listener ( object : ĠLong Press Listener { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Controller ?. send Command ( CUSTOM _ COMMAND _ RE W IND _ PLAY _ START , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon End () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Controller ?. send Command ( CUSTOM _ COMMAND _ RE W IND _ PLAY _ END , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġfast Forward Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Controller ?. transport Controls ?. fast Forward () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfast Forward Button . set Long Press Listener ( object Ġ: ĠLong Press Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Controller ?. send Command ( CUSTOM _ COMMAND _ FAST _ PLAY _ START , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon End () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Controller ?. send Command ( CUSTOM _ COMMAND _ FAST _ PLAY _ END , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( context Ġis ĠController Holder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder Ġ= Ġcontext Ġas ĠController Holder ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Containing Ġactivity Ġmust Ġimplement ĠController Holder ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠcurrentTime View . setOnClickListener ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . on Controller Click () ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġtrack Time View . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . on Controller Click () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġspeed Bar . max Ġ= ĠSPE ED _ RANGE . steps ĊĠĠĠĠĠĠĠ Ġspeed Bar . setOn Seek Bar ChangeListener ( speed Bar Listener ) ĊĊĠĠĠĠĠĠĠ Ġpitch Bar . max Ġ= ĠP ITCH _ RANGE . steps ĊĠĠĠĠĠĠĠ Ġpitch Bar . setOn Seek Bar ChangeListener ( pitch Bar Listener ) ĊĊĠĠĠĠĠĠĠ Ġsil ence Switch . setOn Checked ChangeListener Ġ{ Ġbutton View , Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPreference Manager . getDefault SharedPreferences ( context ). edit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Boolean (" pref _ skip _ sil ence ", Ġis Checked ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvolume Boost Switch . setOn Checked ChangeListener Ġ{ Ġbutton View , Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPreference Manager . getDefault SharedPreferences ( context ). edit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Boolean (" pref _ volume _ boost ", Ġis Checked ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġview ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ ĠPreference Manager . getDefault SharedPreferences ( context ). register On Shared Preference ChangeListener ( this ) ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġsyn ch ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Speed Ġ= ĠPreference Manager . getDefault SharedPreferences ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Float (" pref _ playback _ speed ", Ġ 1 . 0 f ) ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Pitch Ġ= ĠPreference Manager . getDefault SharedPreferences ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Float (" pref _ playback _ pitch ", Ġ 1 . 0 f ) ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Sil ence Ġ= ĠPreference Manager . getDefault SharedPreferences ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getBoolean (" pref _ skip _ sil ence ", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Volume Boost Ġ= ĠPreference Manager . getDefault SharedPreferences ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getBoolean (" pref _ volume _ boost ", Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġspeed Bar Listener . update Seek Bar ( speed Bar , Ġcurrent Speed ) ĊĠĠĠĠĠĠĠ Ġpitch Bar Listener . update Seek Bar ( pitch Bar , Ġcurrent Pitch ) ĊĊĠĠĠĠĠĠĠ Ġsil ence Switch . isChecked Ġ= Ġcurrent Sil ence ĊĠĠĠĠĠĠĠ Ġvolume Boost Switch . isChecked Ġ= Ġcurrent Volume Boost ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ ĠPreference Manager . getDefault SharedPreferences ( context ). unregister On Shared Preference ChangeListener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Shared Preference Changed ( sp : ĠSharedPreferences , Ġkey : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" pref _ playback _ speed " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġsp . get Float ( key , Ġ 1 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeed Bar Listener . update Seek Bar ( speed Bar , v ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" pref _ playback _ pitch " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġsp . get Float ( key , Ġ 1 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpitch Bar Listener . update Seek Bar ( pitch Bar , v ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" pref _ skip _ sil ence " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsil ence Switch . isChecked Ġ= Ġsp . getBoolean ( key , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" pref _ volume _ boost " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvolume Boost Switch . isChecked Ġ= Ġsp . getBoolean ( key , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġupdate Track Time ( meta : ĠMedia Metadata Compat ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġmeta . getLong ( Media Metadata Compat . METADATA _ KEY _ DURATION ) ĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Track Ġtime Ġis Ġ$ duration ") ĊĠĠĠĠĠĠĠ Ġseek Bar . max Ġ= Ġduration . toInt () ĊĠĠĠĠĠĠĠ Ġtrack Time View . text Ġ= ĠDate Utils . format Elapsed Time ( duration Ġ/ Ġ 1 0 0 0 L ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġval Ġcurrent Play Time : ĠLong ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġseek Bar . progress . to Long () ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ } Ċ