package Ġcom . why wh om . soft . why radio box . services Ċ Ċ import Ġandroid . app . Notification Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . support . v 4 . media . session . Playback State Compat Ċ import Ġandroid . util . Log Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġcom . google . android . ex op layer 2 .* Ċ import Ġcom . google . android . ex op layer 2 . Player . EventListener Ċ 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 . Track Selection Array Ċ import Ġcom . google . android . ex op layer 2 . ui . Player Notification Manager Ċ import Ġcom . google . android . ex op layer 2 . upstream . DataSource Ċ import Ġcom . google . android . ex op layer 2 . upstream . Default DataSource Factory Ċ import Ġcom . google . android . ex op layer 2 . util . Util Ċ import Ġcom . why wh om . soft . why radio box . R Ċ import Ġcom . why wh om . soft . why radio box . rss . RSS Item Ċ import Ġcom . why wh om . soft . why radio box . utils . Player Util ĊĊ Ċ class ĠMedia Play Service Ġ: ĠService () Ġ{ ĊĠĠĠ Ġval ĠTAG Ġ= ĠMedia Play Service :: class . java . name ĊĠĠĠ Ġprivate Ġvar Ġplayer : ĠSimple Exo Player ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġplayer Notification Manager : ĠPlayer Notification Manager ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmedia Source : ĠMedia Source ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĠĠĠ Ġ} ĊĠĠĠ Ġcompanion Ġobject { ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġr ss Item : ĠRSS Item ĊĠĠĠĠĠĠĠ Ġfun Ġset DataSource ( media Data : ĠRSS Item ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr ss Item Ġ= Ġmedia Data ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent ?, Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer Ġ= ĠPlayer Util . getPlayer ( this ) ĊĠĠĠĠĠĠĠ Ġplayer ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( player !!. is Playing ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer !!. stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġmine Type : String ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġuri : ĠUri ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPro duces ĠDataSource Ġinstances Ġthrough Ġwhich Ġmedia Ġdata Ġis Ġloaded . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( rss Item . enc lo sure Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmine Type Ġ= Ġr ss Item . enc lo sure . mime Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= Ġr ss Item . enc lo sure . url ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmine Type Ġ= ĠUtil . getUser Agent ( this , Ġ" RB Application ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( rss Item . link Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= Ġr ss Item . link ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠdataSource Factory : ĠDataSource . Factory Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDefault DataSource Factory ( this , Ġmine Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġthe ĠMedia Source Ġrepresenting Ġthe Ġmedia Ġto Ġbe Ġplayed . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Source Ġ= ĠProgress ive Media Source . Factory ( dataSource Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Media Source ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPrepare Ġthe Ġplayer Ġwith Ġthe Ġsource . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer !!. play When Ready Ġ= Ġtrue Ċ // ĠĠĠĠĠĠĠ Ġplayer _ control _ view . show Timeout Ms Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer !!. prepare ( media Source ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Listener : ĠEvent Listener Ġ= Ġobject Ġ: ĠEvent Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġon Timeline Changed ( timeline : ĠTimeline ?, Ġmanifest : ĠAny ?) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tracks Changed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Groups : ĠTrack Group Array , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Selections : ĠTrack Selection Array ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Loading Changed ( isLoading : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG ," isLoading Ġ= Ġ" Ġ+ ĠisLoading ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Player StateChanged ( play When Ready : ĠBoolean , Ġplayback State : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( playback State . to Long () Ġ== ĠPlay back State Compat . ACTION _ SKIP _ TO _ NEXT ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ Video Activity , Ġ" next ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG ," next ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( playback State . to Long () Ġ== ĠPlay back State Compat . ACTION _ SKIP _ TO _ PREVIOUS ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ Video Activity , Ġ" previous ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG ," previous ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Repeat Mode Changed ( repeat Mode : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Player Error ( error : ĠEx o Playback Exception ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġon Position Dis continu ity () Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Playback Parameters Changed ( playback Parameters : ĠPlay back Parameters ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer !!. addListener ( event Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia Description Adapter Ġ= Ġobject Ġ: ĠPlayer Notification Manager . Media Description Adapter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetCurrent Sub Text ( player : ĠPlayer ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġr ss Item . description ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetCurrent Content Title ( player : ĠPlayer ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġr ss Item . title ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Current Content Intent ( player : ĠPlayer ): ĠPending Intent ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetCurrent Content Text ( player : ĠPlayer ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( rss Item . get Author () Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġr ss Item . get Author () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetCurrent Large Icon ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer : ĠPlayer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : ĠPlayer Notification Manager . Bitmap Callback ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠBitmap ? Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBitmap Factory . decode Resource ( resources , ĠR . drawable . radio _ station ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ?. let Ġ{ Ġinit Listener ( it , Ġmedia Description Adapter ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . onStart Command ( intent , Ġflags , Ġstart Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Media () ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġstop Media () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Util . SDK _ INT Ġ>= Ġ 2 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Foreground ( true ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠPlayer Util . reset Player () ĊĠĠĠĠĠĠĠ Ġplayer Notification Manager ?. set Player ( null ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ): ĠI Binder Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" Return Ġthe Ġcommunication Ġchannel Ġto Ġthe Ġservice .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Listener ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġmedia Description Adapter : ĠPlayer Notification Manager . Media Description Adapter ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplayer Notification Manager : ĠPlayer Notification Manager ĊĠĠĠĠĠĠĠ Ġval Ġnotification Id Ġ= Ġ 1 3 1 4 ĊĊĠĠĠĠĠĠĠ Ġplayer Notification Manager Ġ= ĠPlayer Notification Manager . create With Notification Channel ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" rb _ channel _ id ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . app _ name , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Description Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠPlayer Notification Manager . Notification Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Notification Posted ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Id : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification : ĠNotification , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġongoing : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Notification Cancelled ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Id : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdis missed ByUser : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġplayer Notification Manager . set Use Navigation Actions ( false ) ĊĠĠĠĠĠĠĠ Ġplayer Notification Manager . set Use Navigation Actions In Compact View ( false ) ĊĠĠĠĠĠĠĠ Ġplayer Notification Manager . setVisibility ( Notification Compat . VIS IBILITY _ PUBLIC ) ĊĠĠĠĠĠĠĠ Ġplayer Notification Manager . set Small Icon ( R . drawable . radio _ station ) ĊĠĠĠĠĠĠĠ Ġplayer Notification Manager . set Player ( player ) ĊĠĠĠ Ġ} Ċ } Ċ