package Ġcom . example . podcast player Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Seek Bar Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . example . podcast player . databinding . Activity Player Binding Ċ import Ġcom . example . podcast player . model . Pod cast VS Ċ import Ġcom . example . podcast player . view model . Pod cast ViewModel Ċ import Ġcom . google . android . ex op layer 2 . Media Item Ċ import Ġcom . google . android . ex op layer 2 . Player Ċ import Ġcom . google . android . ex op layer 2 . Simple Exo Player Ċ import Ġcom . google . android . ex op layer 2 . source . Media Source Ċ import Ġcom . google . android . ex op layer 2 . source . Progress ive Media Source Ċ import Ġcom . google . android . ex op layer 2 . source . Track Group Array Ċ import Ġcom . google . android . ex op layer 2 . track selection . Default Track Selector Ċ import Ġcom . google . android . ex op layer 2 . track selection . Track Selection Array Ċ import Ġcom . google . android . ex op layer 2 . ui . Time Bar Ċ import Ġcom . google . android . ex op layer 2 . upstream . DataSource Ċ import Ġcom . google . android . ex op layer 2 . upstream . Default DataSource Factory Ċ import Ġorg . k oin . android . ext . android . inject Ċ import Ġtw . k tr ss reader . kotlin . model . item . Auto Mix Item Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . util .* Ċ Ċ class ĠPlayer Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠActivity Player Binding ĊĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠPod cast ViewModel Ġby Ġinject () ĊĊĠĠĠ Ġprivate Ġvar Ġplayer : ĠSimple Exo Player ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġtrack Selector : ĠDefault Track Selector ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġis Playing Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġidx : ĠInt Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġitem List Ġ: ĠList < Auto Mix Item > ĊĠĠĠ Ġprivate Ġvar Ġis Loaded Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġhandler Ġ: ĠHandler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠARG _ IDX = Ġ" arg _ idx " ĊĠĠĠĠĠĠĠ Ġfun Ġcreate Instance ( context : ĠContext , Ġidx : ĠInt ): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIntent ( context , ĠPlayer Activity :: class . java ). put Extras ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Int ( ARG _ IDX , Ġidx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠActivity Player Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( binding . root ) ĊĊĠĠĠĠĠĠĠ Ġintent . extras . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidx Ġ= Ġit ?. getInt ( ARG _ IDX ) Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġobserve ViewModel () ĊĊĠĠĠĠĠĠĠ ĠviewModel . load Pod cast () ĊĊĠĠĠĠĠĠĠ Ġbinding . player Container . iv Play . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Loaded Ġ&& Ġ! item List . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Episode s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Play Pause (! is Playing ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . player Container . iv Next . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Episode () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . player Container . iv Prev . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Episode () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve ViewModel () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . view State . observe ( this @ Player Activity ) Ġ{ Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPod cast VS . Pod cast Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . podcast . items ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReverse ĠList ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem List Ġ= Ġthis . sorted By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse ( it . pub Date , ĠDateTime Formatter . RFC _ 1 1 2 3 _ DATE _ TIME ). to Epoch Day () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidx Ġ= Ġitem List . size Ġ- Ġidx Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Episode Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Episode s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPod cast VS . Show Loader Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . show Loader ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . pb Player . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . pb Player . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPod cast VS . Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġit . message , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Episode Info () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġitem List [ idx ] ĊĠĠĠĠĠĠĠ Ġbinding . tv Episode Title . text Ġ= Ġitem . title ĊĠĠĠĠĠĠĠ ĠG lide . with ( this @ Player Activity ). clear ( binding . iv Episode Cover ) ĊĠĠĠĠĠĠĠ ĠG lide . with ( this @ Player Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( item . image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. placeholder ( android . R . drawable . stat _ sys _ warning ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( binding . iv Episode Cover ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġinitialize Player () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġinitialize Player () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġrelease Player () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ Ġrelease Player () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize Player () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( player Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Selector Ġ= ĠDefault Track Selector ( this ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Ġ= ĠSimple Exo Player . Builder ( this @ Player Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Track Selector ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Media Source (): ĠList < Media Source > Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠdataSource Factory : ĠDataSource . Factory Ġ= ĠDefault DataSource Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ex op layer - code lab " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmedia Source Factory Ġ= ĠProgress ive Media Source . Factory ( dataSource Factory ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġitem List . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia Item Ġ= ĠMedia Item . from Uri ( Uri . parse ( it . enc lo sure ?. url )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Source Factory . create Media Source ( media Item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrelease Player () Ġ{ ĊĠĠĠĠĠĠĠ Ġhandler . remove Callbacks And Messages ( null ) ĊĠĠĠĠĠĠĠ Ġset Play Pause ( false ) ĊĠĠĠĠĠĠĠ Ġis Loaded Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġplayer ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidx Ġ= Ġcurrent Window Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Listener ( event Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġplayer Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Episode s () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Loaded Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġinit Default Time Bar () ĊĊĠĠĠĠĠĠĠ Ġval Ġmedia Sources Ġ= Ġbuild Media Source () ĊĊĠĠĠĠĠĠĠ Ġplayer ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Listener ( event Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Media Sources ( media Sources , Ġidx , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepare () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Play Pause ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Play Pause ( play : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis Playing Ġ= Ġplay ĊĠĠĠĠĠĠĠ Ġplayer ?. play When Ready Ġ= Ġplay ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . player Container . iv Play . setImage Resource ( R . drawable . ic _ play ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Progress () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . player Container . iv Play . setImage Resource ( R . drawable . ic _ pause ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstring For Time ( time Ms : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm Format Builder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġval Ġm Formatter Ġ= ĠFormatter ( m Format Builder , ĠLocale . getDefault ()) ĊĠĠĠĠĠĠĠ Ġval Ġtotal Seconds Ġ= Ġtime Ms Ġ/ Ġ 1 0 0 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġseconds Ġ= Ġtotal Seconds Ġ% Ġ 6 0 ĊĠĠĠĠĠĠĠ Ġval Ġminutes Ġ= Ġtotal Seconds Ġ/ Ġ 6 0 Ġ% Ġ 6 0 ĊĠĠĠĠĠĠĠ Ġval Ġhours Ġ= Ġtotal Seconds Ġ/ Ġ 3 6 0 0 ĊĊĠĠĠĠĠĠĠ Ġm Format Builder . set Length ( 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( hours Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Formatter . format ("% d :% 0 2 d :% 0 2 d ", Ġhours , Ġminutes , Ġseconds ). toString () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Formatter . format ("% 0 2 d :% 0 2 d ", Ġminutes , Ġseconds ). toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Progress () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . player Container . tv Current Time . text Ġ= Ġstring For Time ( player ?. current Position !!. toInt ()) ĊĠĠĠĠĠĠĠ Ġbinding . player Container . tv EndTime . text Ġ= Ġstring For Time ( player ?. duration !!. toInt ()) ĊĊĠĠĠĠĠĠĠ Ġhandler . post ( object : ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Time Bar Ġ= Ġbinding . player Container . default Time Bar ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( player Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Time Bar . set Duration (( player ?. duration !! Ġ/ Ġ 1 0 0 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmCurrent Position Ġ= Ġplayer ?. current Position !!. toInt () Ġ/ Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Time Bar . setPosition ( m Current Position . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . player Container . tv Current Time . text Ġ= Ġstring For Time ( player ?. current Position !!. toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . player Container . tv EndTime . text Ġ= Ġstring For Time ( player ?. duration !!. toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Delayed ( this , Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Default Time Bar () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdefault Time Bar Ġ= Ġbinding . player Container . default Time Bar ĊĠĠĠĠĠĠĠ Ġdefault Time Bar . request Focus () ĊĠĠĠĠĠĠĠ Ġdefault Time Bar . addListener ( time Bar Listener ) ĊĠĠĠĠĠĠĠ Ġdefault Time Bar . on Focus ChangeListener Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠSeek Bar . On Seek Bar ChangeListener , ĠView . On Focus ChangeListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Focus Change ( p 0 : ĠView ?, Ġp 1 : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo ĠNothing Ġfor ĠFocus ĠChange ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress Changed ( p 0 : ĠSeek Bar ?, Ġp 1 : ĠInt , Ġp 2 : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! p 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. seek To ( p 1 Ġ* Ġ 1 0 0 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart Tracking Touch ( p 0 : ĠSeek Bar ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. seek To (( p 0 ?. progress Ġ?: Ġ 0 ) Ġ* Ġ 1 0 0 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stop Tracking Touch ( p 0 : ĠSeek Bar ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. seek To (( p 0 ?. progress Ġ?: Ġ 0 ) Ġ* Ġ 1 0 0 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtime Bar Listener Ġ= Ġobject Ġ: ĠTime Bar . On Sc rub Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rub Move ( time Bar : ĠTime Bar , Ġposition : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. seek To ( position Ġ* Ġ 1 0 0 0 L ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rub Start ( time Bar : ĠTime Bar , Ġposition : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo ĠNothing Ġfor Ġstart ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rub Stop ( time Bar : ĠTime Bar , Ġposition : ĠLong , Ġcanceled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. seek To ( position Ġ* Ġ 1 0 0 0 L ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġevent Listener Ġ= Ġobject Ġ: ĠPlayer . Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tracks Changed ( track Groups : ĠTrack Group Array , Ġtrack Selections : ĠTrack Selection Array ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Tracks Changed ( track Groups , Ġtrack Selections ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. current Window Index ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidx Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Episode Info () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnext Episode () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhas Next Ġ= Ġplayer ?. hasNext () Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( hasNext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. next () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , ĠgetString ( R . string . no _ more _ new _ episodes ), ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprevious Episode () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhas Previous Ġ= Ġplayer ?. has Previous () Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( has Previous ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. previous () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , ĠgetString ( R . string . you _ are _ in _ first _ episode ), ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ