package Ġme . ec he ung . mo emo ek yun . service Ċ Ċ import Ġandroid . app . Notification Channel Ċ import Ġandroid . app . Notification Manager Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . media . Audio Manager Ċ import Ġandroid . net . Connectivity Manager Ċ import Ġandroid . os . Binder Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . support . v 4 . media . Media Metadata Compat Ċ import Ġandroid . support . v 4 . media . Rating Compat Ċ import Ġandroid . support . v 4 . media . session . Media Session Compat Ċ import Ġandroid . support . v 4 . media . session . Playback State Compat Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . KeyEvent Ċ import Ġme . ec he ung . mo emo ek yun . App Ċ import Ġme . ec he ung . mo emo ek yun . Build Config Ċ import Ġme . ec he ung . mo emo ek yun . R Ċ import Ġme . ec he ung . mo emo ek yun . client . api . callback . Favorite Song Callback Ċ import Ġme . ec he ung . mo emo ek yun . client . api . library . J pop Ċ import Ġme . ec he ung . mo emo ek yun . client . api . library . K pop Ċ import Ġme . ec he ung . mo emo ek yun . client . socket . Socket Ċ import Ġme . ec he ung . mo emo ek yun . client . socket . response . Update Response Ċ import Ġme . ec he ung . mo emo ek yun . client . stream . Stream Ċ import Ġme . ec he ung . mo emo ek yun . util . Album Art Util Ċ import Ġme . ec he ung . mo emo ek yun . util . Auth Activity Util Ċ import Ġme . ec he ung . mo emo ek yun . util . Preference Util Ċ import Ġme . ec he ung . mo emo ek yun . util . Song Actions Util Ċ import Ġme . ec he ung . mo emo ek yun . util . system . Time Util Ċ import Ġme . ec he ung . mo emo ek yun . util . system . is Car Ui Mode Ċ import Ġme . ec he ung . mo emo ek yun . util . system . notification Manager Ċ import Ġme . ec he ung . mo emo ek yun . util . system . toast Ċ import Ġjava . text . ParseException Ċ import Ġjava . util . Calendar Ċ Ċ class ĠRadio Service Ġ: ĠService (), ĠSocket . Listener , ĠAlbum Art Util . Callback , ĠSharedPreferences . On Shared Preference ChangeListener Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġbinder Ġ= ĠService Binder () ĊĊĠĠĠ Ġprivate Ġvar Ġnotification : ĠApp Notification ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġstream : ĠStream ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġsocket : ĠSocket ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġvar Ġmedia Session : ĠMedia Session Compat ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġprivate Ġval Ġmedia Session Lock Ġ= ĠAny () ĊĊĠĠĠ Ġprivate Ġvar Ġaudio Manager : ĠAudio Manager ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġaudio Focus ChangeListener : ĠAudio Manager . On Audio Focus ChangeListener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġwas Playing Before Loss : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġintent Receiver : ĠBroadcast Receiver ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġreceiver Registered Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġis First Connectivity Change Ġ= Ġtrue ĊĊĠĠĠ Ġval Ġis Stream Started : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstream !!. is Started ĊĊĠĠĠ Ġval Ġis Playing : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstream !!. is Playing ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ): ĠI Binder ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbinder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ ĠAlbum Art Util . register Listener ( this ) ĊĊĠĠĠĠĠĠĠ Ġinit Notification Channels () ĊĊĠĠĠĠĠĠĠ Ġinit Broadcast Receiver () ĊĠĠĠĠĠĠĠ Ġinit Media Session () ĊĠĠĠĠĠĠĠ Ġinit Audio Manager () ĊĊĠĠĠĠĠĠĠ Ġstream Ġ= ĠApp . radio Client !!. stream ĊĠĠĠĠĠĠĠ Ġsocket Ġ= ĠApp . radio Client !!. socket ĊĊĠĠĠĠĠĠĠ Ġstream !!. set Listener ( object Ġ: ĠStream . Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stream Play () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp . radio ViewModel !!. is Playing Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Notification () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Media Session Playback State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stream Pause () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp . radio ViewModel !!. is Playing Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Notification () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Media Session Playback State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stream Stop () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Manager !!. ab and on Audio Focus ( audio Focus ChangeListener ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Foreground ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp . preference Util !!. clear Sleep Timer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp . radio ViewModel !!. is Playing Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Media Session Playback State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġsocket !!. set Listener ( this ) ĊĠĠĠĠĠĠĠ Ġsocket !!. connect () ĊĊĠĠĠĠĠĠĠ ĠApp . preference Util !!. register Listener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent , Ġflags : ĠInt , Ġstart ID : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle Intent ( intent ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSTART _ NOT _ STICK Y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Task Removed ( root Intent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ ĠAlbum Art Util . unregister Listener ( this ) ĊĊĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠ Ġsocket !!. disconnect () ĊĠĠĠĠĠĠĠ Ġstream !!. remove Listener () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( receiver Registered ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunregister Receiver ( intent Receiver ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Registered Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdestroy Media Session () ĊĊĠĠĠĠĠĠĠ ĠApp . preference Util !!. unregister Listener ( this ) ĊĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Socket Receive ( info : ĠUpdate Response . Details ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠviewModel Ġ= ĠApp . radio ViewModel ĊĊĠĠĠĠĠĠĠ ĠviewModel !!. listeners Ġ= Ġinfo !!. listeners ĊĠĠĠĠĠĠĠ ĠviewModel . setRequest er ( info . requester ) ĊĠĠĠĠĠĠĠ ĠviewModel . event Ġ= Ġinfo . event ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġget Ġqueue Ġinfo Ċ // ĠĠĠĠĠĠĠ ĠviewModel . queue Size Ġ= Ġinfo . queue . in Queue Ċ // ĠĠĠĠĠĠĠ ĠviewModel . in Queue ByUser Ġ= Ġinfo . queue . in Queue ByUser Ċ // ĠĠĠĠĠĠĠ ĠviewModel . queue Position Ġ= Ġinfo . queue . in Queue Before User ĊĊĠĠĠĠĠĠĠ Ġvar ĠstartTime : ĠCalendar ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartTime Ġ= ĠTime Util . to Calendar ( info . startTime !! ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠParseException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . setCurrent Song ( info . song , ĠstartTime ) ĊĠĠĠĠĠĠĠ ĠviewModel . last Song Ġ= Ġinfo . last Play ed ! ![ 0 ] ĊĠĠĠĠĠĠĠ ĠviewModel . second Last Song Ġ= Ġinfo . last Play ed [ 1 ] ĊĊĠĠĠĠĠĠĠ Ġupdate Media Session () ĊĠĠĠĠĠĠĠ Ġupdate Notification () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Socket Failure () Ġ{ ĊĠĠĠĠĠĠĠ ĠApp . radio ViewModel !!. reset () ĊĠĠĠĠĠĠĠ Ġupdate Notification () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Media Session () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Song Ġ= ĠApp . radio ViewModel !!. current Song ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current Song Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Session !!. set Metadata ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠmetaData Ġ= ĠMedia Metadata Compat . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( Media Metadata Compat . METADATA _ KEY _ TITLE , Ġcurrent Song . title String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( Media Metadata Compat . METADATA _ KEY _ AR TI ST , Ġcurrent Song . artists String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( Media Metadata Compat . METADATA _ KEY _ AL BU M , Ġcurrent Song . albums String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Long ( Media Metadata Compat . METADATA _ KEY _ DURATION , Ġ( current Song . duration Ġ* ĠMIL LI SECONDS _ IN _ SECOND ). to Long ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( App . preference Util !!. should Show Lock screen Album Art ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalbum Art Ġ= ĠAlbum Art Util . current Album Art ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( album Art Ġ!= Ġnull Ġ&& Ġ! Album Art Util . is Default Album Art ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmetaData . put Bitmap ( Media Metadata Compat . METADATA _ KEY _ AL BU M _ ART , Ġalbum Art ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Notification () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsynchronized ( media Session Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Session !!. set Metadata ( metaData . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Media Session Playback State () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Media Session Playback State () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠPlay / pause Ġstate ĊĠĠĠĠĠĠĠ Ġval Ġstate Builder Ġ= ĠPlay back State Compat . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Actions ( MEDIA _ SESSION _ ACTION S ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setState ( if Ġ( is Stream Started ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Playing ) ĠPlay back State Compat . STATE _ PLAY ING Ġelse ĠPlay back State Compat . STATE _ PA USED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlay back State Compat . STATE _ STOP PED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp . radio ViewModel !!. current Song Progress , Ġ 1 f ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠF avorite Ġaction ĊĠĠĠĠĠĠĠ Ġif Ġ( App . auth Token Util . is Authenticated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Song Ġ= ĠApp . radio ViewModel !!. current Song ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfavorite Icon Ġ= Ġif Ġ( current Song Ġ== Ġnull Ġ|| Ġ! current Song . favorite ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . ic _ star _ border _ 2 4 dp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . ic _ star _ 2 4 dp ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Builder . add Custom Action ( Playback State Compat . Custom Action . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTO GGLE _ FA V OR ITE , ĠgetString ( R . string . favorite ), Ġfavorite Icon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( media Session !!. isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Session !!. set Playback State ( state Builder . build ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Album Art Ready ( bitmap : ĠBitmap ) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Media Session () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Notification () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Stream Started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( notification Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Ġ= ĠApp Notification ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification !!. update () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Foreground ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Intent ( intent : ĠIntent ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( intent Ġ== Ġnull ) Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġintent . action ĊĠĠĠĠĠĠĠ Ġif Ġ( action Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP LAY _ PAUSE Ġ-> Ġtoggle Play Pause () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTOP Ġ-> Ġstop () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTO GGLE _ FA V OR ITE Ġ-> Ġfavorite Current Song () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUPDATE , ĠSong Actions Util . REQUEST _ EVENT Ġ-> Ġsocket !!. update () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTIMER _ STOP Ġ-> Ġtimer Stop () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPause Ġwhen Ġhead phones Ġun plug ged ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . ACTION _ AUDIO _ BE COM ING _ NO IS Y Ġ-> Ġif Ġ( App . preference Util !!. should Pause On No isy ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpause () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHead phone Ġmedia Ġbutton Ġaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ MEDIA _ BUTTON Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextras Ġ= Ġintent . extras Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Event Ġ= Ġextras . get ( Intent . EXTRA _ KEY _ EVENT ) Ġas ĠKeyEvent ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Event Ġ== Ġnull Ġ|| Ġkey Event . action Ġ!= ĠKeyEvent . ACTION _ DOWN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( key Event . keyCode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyEvent . KEYCODE _ HEAD SE TH O OK , ĠKeyEvent . KEYCODE _ MEDIA _ PLAY _ PAUSE Ġ-> Ġtoggle Play Pause () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyEvent . KEYCODE _ MEDIA _ PLAY Ġ-> Ġplay () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyEvent . KEYCODE _ MEDIA _ PAUSE Ġ-> Ġpause () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyEvent . KEYCODE _ MEDIA _ STOP Ġ-> Ġstop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyEvent . KEYCODE _ MEDIA _ NEXT , ĠKeyEvent . KEYCODE _ MEDIA _ PREVIOUS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ// ĠDo Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuth Activity Util . AUTH _ EVENT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket !!. reconnect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! App . auth Token Util . is Authenticated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp . radio ViewModel !!. is F avor ited Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Notification () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnect ivity Manager . CONNECT IVITY _ ACTION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIgnore Ġthe Ġinitial Ġsticky Ġbroadcast Ġon Ġapp Ġstart ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is First Connectivity Change ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis First Connectivity Change Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket !!. reconnect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate Notification () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Media Session () Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( media Session Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Session Ġ= ĠMedia Session Compat ( this , ĠAPP _ PACKAGE _ NAME , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Session !!. set Rating Type ( Rating Compat . RAT ING _ HE ART ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Session !!. set Callback ( object Ġ: ĠMedia Session Compat . Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Play () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpause () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Skip To Next () Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Skip To Previous () Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Seek To ( pos : ĠLong ) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Set Rating ( rating : ĠRating Compat ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfavorite Current Song () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Media Button Event ( media Button Event : ĠIntent ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhandle Intent ( media Button Event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Custom Action ( action : ĠString ?, Ġextras : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTO GGLE _ FA V OR ITE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfavorite Current Song () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Media Session Playback State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠLog . d ( TAG , Ġ" Unsupported Ġaction : Ġ" Ġ+ Ġaction !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Play From Search ( query : ĠString ?, Ġextras : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! query . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( query . toLowerCase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" j pop ", Ġ" j - pop " Ġ-> Ġon Play From Media Id ( LIBRARY _ J POP , Ġextras ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" k pop ", Ġ" k - pop " Ġ-> Ġon Play From Media Id ( LIBRARY _ K POP , Ġextras ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Play From Media Id ( media Id : ĠString ?, Ġextras : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Play From Media Id ( media Id , Ġextras ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHandles Ġchanging Ġlibrary Ġmode Ġvia ĠAndroid ĠAuto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( media Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLIB R ARY _ J POP Ġ-> ĠApp . radio Client !!. change Library ( J pop . NAME ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLIB R ARY _ K POP Ġ-> ĠApp . radio Client !!. change Library ( K pop . NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Session !!. set Flags ( Media Session Compat . FLAG _ HAND LES _ TRANSPORT _ CONTRO LS Ġor ĠMedia Session Compat . FLAG _ HAND LES _ MEDIA _ BUTTON S ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Session !!. isActive Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdestroy Media Session () Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( media Session Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( media Session Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Session !!. isActive Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Session !!. release () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Broadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġintent Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Intent ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġintent Filter Ġ= ĠIntent Filter () ĊĠĠĠĠĠĠĠ Ġintent Filter . addAction ( PLAY _ PAUSE ) ĊĠĠĠĠĠĠĠ Ġintent Filter . addAction ( STOP ) ĊĠĠĠĠĠĠĠ Ġintent Filter . addAction ( TO GGLE _ FA V OR ITE ) ĊĠĠĠĠĠĠĠ Ġintent Filter . addAction ( UPDATE ) ĊĠĠĠĠĠĠĠ Ġintent Filter . addAction ( Song Actions Util . REQUEST _ EVENT ) ĊĠĠĠĠĠĠĠ Ġintent Filter . addAction ( Audio Manager . ACTION _ AUDIO _ BE COM ING _ NO IS Y ) ĊĠĠĠĠĠĠĠ Ġintent Filter . addAction ( Intent . ACTION _ MEDIA _ BUTTON ) ĊĠĠĠĠĠĠĠ Ġintent Filter . addAction ( Auth Activity Util . AUTH _ EVENT ) ĊĠĠĠĠĠĠĠ Ġintent Filter . addAction ( Connectivity Manager . CONNECT IVITY _ ACTION ) ĊĊĠĠĠĠĠĠĠ Ġregister Receiver ( intent Receiver , Ġintent Filter ) ĊĠĠĠĠĠĠĠ Ġreceiver Registered Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Audio Manager () Ġ{ ĊĠĠĠĠĠĠĠ Ġaudio Manager Ġ= Ġget System Service ( Context . AUDIO _ SERVICE ) Ġas ĠAudio Manager ĊĠĠĠĠĠĠĠ Ġaudio Focus ChangeListener Ġ= ĠAudio Manager . On Audio Focus ChangeListener Ġ{ Ġfocus Change Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( focus Change ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . AUDIO FOCUS _ GAIN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream !!. und uck () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( was Playing Before Loss ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . AUDIO FOCUS _ LO SS , ĠAudio Manager . AUDIO FOCUS _ LO SS _ TRAN SI ENT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwas Playing Before Loss Ġ= Ġis Playing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( was Playing Before Loss Ġ&& Ġ( App . preference Util !!. should Pause Audio On Loss () Ġ|| Ġis Car Ui Mode ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpause () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . AUDIO FOCUS _ LO SS _ TRAN SI ENT _ CAN _ DU CK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwas Playing Before Loss Ġ= Ġis Playing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( App . preference Util !!. should Duck Audio ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream !!. duck () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Play Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpause () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplay () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRequest Ġaudio Ġfocus Ġfor Ġplayback ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġaudio Manager !!. request Audio Focus ( audio Focus ChangeListener , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . STREAM _ M US IC , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . AUDIO FOCUS _ GAIN ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== ĠAudio Manager . AUDIO FOCUS _ REQUEST _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream !!. play () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpause () Ġ{ ĊĠĠĠĠĠĠĠ Ġstream !!. pause () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġstream !!. stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtimer Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġstream !!. fadeOut () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfavorite Current Song () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsong Ġ= ĠApp . radio ViewModel !!. current Song Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġsong Id Ġ= Ġsong . id ĊĠĠĠĠĠĠĠ Ġif Ġ( song Id Ġ== Ġ- 1 ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! App . auth Token Util . is Authenticated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Login Required Toast () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġis Currently Favorite Ġ= Ġsong . favorite ĊĊĠĠĠĠĠĠĠ ĠApp . radio Client !!. api . toggle Favorite ( song Id , Ġobject Ġ: ĠF avorite Song Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Song Ġ= ĠApp . radio ViewModel !!. current Song ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Song !!. id Ġ== Ġsong Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp . radio ViewModel !!. is F avor ited Ġ= Ġ! is Currently Favorite ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsong . favorite Ġ= Ġ! is Currently Favorite ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfav Intent Ġ= ĠIntent ( Song Actions Util . FA V OR ITE _ EVENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Broadcast ( fav Intent ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Notification () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Media Session Playback State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( message : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . toast ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Login Required Toast () Ġ{ ĊĠĠĠĠĠĠĠ Ġapplication Context . toast ( R . string . login _ required ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Notification Channels () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplaying Channel Ġ= ĠNotification Channel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Notification . NOTIFICATION _ CHANNEL _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Notification . NOTIFICATION _ CHANNEL _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Manager . IMPORT ANCE _ LOW ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . create Notification Channel ( playing Channel ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Channel Ġ= ĠNotification Channel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Notification . NOTIFICATION _ CHANNEL _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Notification . NOTIFICATION _ CHANNEL _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Manager . IMPORT ANCE _ DEFAULT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . create Notification Channel ( event Channel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Shared Preference Changed ( shared Preferences : ĠSharedPreferences , Ġkey : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPreference Util . PRE F _ M US IC _ LOCK SCREEN _ AL BU M ART , ĠPreference Util . PRE F _ GENERAL _ RO MA JI Ġ-> Ġupdate Media Session () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠService Binder Ġ: ĠB inder () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġservice : ĠRadio Service ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis @ Radio Service ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠRadio Service :: class . java . simple Name ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAPP _ PACKAGE _ NAME Ġ= ĠBuild Config . APPLICATION _ ID ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMIL LI SECONDS _ IN _ SECOND Ġ= Ġ 1 0 0 0 ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠP LAY _ PAUSE Ġ= Ġ"$ APP _ PACKAGE _ NAME . play _ pause " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSTOP Ġ= Ġ"$ APP _ PACKAGE _ NAME . stop " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTO GGLE _ FA V OR ITE Ġ= Ġ"$ APP _ PACKAGE _ NAME . toggle _ favorite " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLIB R ARY _ J POP Ġ= Ġ"$ APP _ PACKAGE _ NAME . library _ j pop " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLIB R ARY _ K POP Ġ= Ġ"$ APP _ PACKAGE _ NAME . library _ k pop " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠUPDATE Ġ= Ġ"$ APP _ PACKAGE _ NAME . update " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTIMER _ STOP Ġ= Ġ"$ APP _ PACKAGE _ NAME . timer _ stop " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMED IA _ SESSION _ ACTION S Ġ= Ġ( Playback State Compat . ACTION _ PLAY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor ĠPlay back State Compat . ACTION _ PAUSE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor ĠPlay back State Compat . ACTION _ PLAY _ PAUSE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor ĠPlay back State Compat . ACTION _ STOP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor ĠPlay back State Compat . ACTION _ SET _ RAT ING ) ĊĠĠĠ Ġ} Ċ } Ċ