package Ġcom . example . foreground . service Ċ Ċ import Ġandroid . app .* Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . media . Audio Manager Ċ import Ġandroid . media . MediaPlayer Ċ import Ġandroid . media . MediaPlayer . On Buffer ing Update Listener Ċ import Ġandroid . media . MediaPlayer . On Prepared Listener Ċ import Ġandroid . net . Connectivity Manager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . net . wifi . Wifi Manager Ċ import Ġandroid . net . wifi . Wifi Manager . Wifi Lock Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . os . Power Manager Ċ import Ġandroid . os . Power Manager . Wake Lock Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Remote Views Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġcom . example . foreground . MainActivity Ċ import Ġcom . example . foreground . R Ċ import Ġcom . example . foreground . constant . Music Constants Ċ Ċ class ĠSound Service K Ġ: ĠService (), ĠMedia Player . OnError Listener , ĠOn Prepared Listener , ĠOn Buffer ing Update Listener Ġ{ ĊĠĠĠ Ġprivate Ġval Ġm Uri Radio Default Ġ= ĠUri . parse (" https :// n fw . ria . ru / fl v / audio . aspx ? ID = 7 5 6 5 1 1 2 9 & type = mp 3 ") ĊĠĠĠ Ġprivate Ġval Ġm Lock Ġ= ĠAny () ĊĠĠĠ Ġprivate Ġval Ġm Handler Ġ= ĠHandler () ĊĠĠĠ Ġprivate Ġvar Ġm Player : ĠMedia Player ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Uri Radio : ĠUri ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Notification Manager : ĠNotification Manager ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm WiFi Lock : ĠW ifi Lock ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Wake Lock : ĠW ake Lock ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġm Timer Update Handler Ġ= ĠHandler () ĊĠĠĠ Ġprivate Ġval Ġm Timer Update Runnable : ĠRunnable Ġ= Ġobject Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Notification Manager ?. notify ( Music Constants . NOTIFICATION _ ID _ FO REG ROUND _ SERVICE , Ġprepare Notification ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Timer Update Handler . post Delayed ( this , ĠMusic Constants . DELAY _ UPDATE _ NOTIFICATION _ FO REG ROUND _ SERVICE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Delayed Shutdown Ġ= Ġobject Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġunlock WiFi () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunlock CPU () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Foreground ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( arg 0 : ĠIntent ): ĠI Binder ? Ġ{ ĊĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĠĠĠĠĠĠĠ ĠLog . d ( Sound Service K :: class . java . simple Name , Ġ" onCreate () ") ĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠMusic Constants . STATE _ SERVICE . NOT _ INIT ĊĠĠĠĠĠĠĠ Ġm Notification Manager Ġ= Ġget System Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĠĠĠĠĠĠĠ Ġm Uri Radio Ġ= Ġm Uri Radio Default ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent , Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( intent . action Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Foreground ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSTART _ NOT _ STICK Y ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( intent . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMusic Constants . ACTION . START _ ACTION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Received Ġstart ĠIntent Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠMusic Constants . STATE _ SERVICE . PRE PARE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Foreground ( Music Constants . NOTIFICATION _ ID _ FO REG ROUND _ SERVICE , Ġprepare Notification ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy Player () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Player () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMusic Constants . ACTION . PAUSE _ ACTION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠMusic Constants . STATE _ SERVICE . PAUSE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Notification Manager !!. notify ( Music Constants . NOTIFICATION _ ID _ FO REG ROUND _ SERVICE , Ġprepare Notification ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Clicked ĠPause ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy Player () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Handler . post Delayed ( m Delayed Shutdown , ĠMusic Constants . DELAY _ SHUT DOWN _ FO REG ROUND _ SERVICE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMusic Constants . ACTION . PLAY _ ACTION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠMusic Constants . STATE _ SERVICE . PRE PARE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Notification Manager !!. notify ( Music Constants . NOTIFICATION _ ID _ FO REG ROUND _ SERVICE , Ġprepare Notification ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Clicked ĠPlay ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy Player () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Player () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMusic Constants . ACTION . STOP _ ACTION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Received ĠStop ĠIntent ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy Player () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Foreground ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Foreground ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠSTART _ NOT _ STICK Y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Destroy () ") ĊĠĠĠĠĠĠĠ Ġdestroy Player () ĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠMusic Constants . STATE _ SERVICE . NOT _ INIT ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Timer Update Handler . remove Callbacks And Messages ( null ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdestroy Player () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Player Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Player !!. reset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Player !!. release () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Player Ġdestroyed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Player Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġunlock WiFi () ĊĠĠĠĠĠĠĠ Ġunlock CPU () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonError ( mp : ĠMedia Player , Ġwhat : ĠInt , Ġextra : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Player ĠonError () Ġwhat :$ what ") ĊĠĠĠĠĠĠĠ Ġdestroy Player () ĊĠĠĠĠĠĠĠ Ġm Handler . post Delayed ( m Delayed Shutdown , ĠMusic Constants . DELAY _ SHUT DOWN _ FO REG ROUND _ SERVICE ) ĊĠĠĠĠĠĠĠ Ġm Notification Manager !!. notify ( Music Constants . NOTIFICATION _ ID _ FO REG ROUND _ SERVICE , Ġprepare Notification ()) ĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠMusic Constants . STATE _ SERVICE . PAUSE ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Player () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Player Ġ= ĠMedia Player () ĊĠĠĠĠĠĠĠ Ġm Player !!. set Audio Stream Type ( Audio Manager . STREAM _ M US IC ) ĊĠĠĠĠĠĠĠ Ġm Player !!. setOn Error Listener ( this ) ĊĠĠĠĠĠĠĠ Ġm Player !!. setOn Prepared Listener ( this ) ĊĠĠĠĠĠĠĠ Ġm Player !!. setOn Buffer ing Update Listener ( this ) ĊĠĠĠĠĠĠĠ Ġm Player !!. setOn Info Listener Ġ{ Ġmp , Ġwhat , Ġextra Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Player Ġon Info (), Ġwhat :$ what , Ġextra :$ extra ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlock WiFi () ĊĠĠĠĠĠĠĠ Ġlock CPU () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplay () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Handler . remove Callbacks And Messages ( null ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsynchronized ( m Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Player Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Player () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Player !!. reset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Player !!. set Volume ( 1 . 0 f , Ġ 1 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Player !!. set DataSource ( this , Ġm Uri Radio !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Player !!. prepare Async () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy Player () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprepare Notification (): ĠNotification Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Notification Manager !!. get Notification Channel ( FO REG ROUND _ CHANNEL _ ID ) Ġ== Ġnull ) Ġ{ Ġ// ĠThe Ġuser - visible Ġname Ġof Ġthe Ġchannel . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname : ĠCharSequence Ġ= ĠgetString ( R . string . text _ value _ radio _ notification ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimportance Ġ= ĠNotification Manager . IMPORT ANCE _ HIGH ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Channel Ġ= ĠNotification Channel ( FO REG ROUND _ CHANNEL _ ID , Ġname , Ġimportance ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Channel . set Sound ( null , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Channel . enable V ibration ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Notification Manager !!. create Notification Channel ( m Channel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnotification Intent Ġ= ĠIntent ( this , ĠMainActivity :: class . java ) ĊĠĠĠĠĠĠĠ Ġnotification Intent . action Ġ= ĠMusic Constants . ACTION . MAIN _ ACTION ĊĠĠĠĠĠĠĠ Ġnotification Intent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠĠĠĠĠ Ġval Ġpending Intent Ġ= ĠPending Intent . getActivity ( this , Ġ 0 , Ġnotification Intent , ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠ Ġval Ġl Pause Intent Ġ= ĠIntent ( this , ĠSound Service K :: class . java ) ĊĠĠĠĠĠĠĠ Ġl Pause Intent . action Ġ= ĠMusic Constants . ACTION . PAUSE _ ACTION ĊĠĠĠĠĠĠĠ Ġval Ġl Pending Pause Intent Ġ= ĠPending Intent . getService ( this , Ġ 0 , Ġl Pause Intent , ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠ Ġval Ġplay Intent Ġ= ĠIntent ( this , ĠSound Service K :: class . java ) ĊĠĠĠĠĠĠĠ Ġplay Intent . action Ġ= ĠMusic Constants . ACTION . PLAY _ ACTION ĊĠĠĠĠĠĠĠ Ġval Ġl Pending Play Intent Ġ= ĠPending Intent . getService ( this , Ġ 0 , Ġplay Intent , ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠ Ġval Ġl Stop Intent Ġ= ĠIntent ( this , ĠSound Service K :: class . java ) ĊĠĠĠĠĠĠĠ Ġl Stop Intent . action Ġ= ĠMusic Constants . ACTION . STOP _ ACTION ĊĠĠĠĠĠĠĠ Ġval Ġl Pending Stop Intent Ġ= ĠPending Intent . getService ( this , Ġ 0 , Ġl Stop Intent , ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠ Ġval Ġl Remote Views Ġ= ĠRemote Views ( packageName , ĠR . layout . radio _ notification ) ĊĠĠĠĠĠĠĠ Ġl Remote Views . setOn Click Pending Intent ( R . id . ui _ notification _ close _ button , Ġl Pending Stop Intent ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMusic Constants . STATE _ SERVICE . PAUSE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl Remote Views . setView Visibility ( R . id . ui _ notification _ progress _ bar , ĠView . IN VISIBLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl Remote Views . setOn Click Pending Intent ( R . id . ui _ notification _ player _ button , Ġl Pending Play Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl Remote Views . set ImageView Resource ( R . id . ui _ notification _ player _ button , ĠR . drawable . ic _ play _ arrow _ white ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMusic Constants . STATE _ SERVICE . PLAY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl Remote Views . setView Visibility ( R . id . ui _ notification _ progress _ bar , ĠView . IN VISIBLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl Remote Views . setOn Click Pending Intent ( R . id . ui _ notification _ player _ button , Ġl Pending Pause Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl Remote Views . set ImageView Resource ( R . id . ui _ notification _ player _ button , ĠR . drawable . ic _ pause _ white ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMusic Constants . STATE _ SERVICE . PRE PARE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl Remote Views . setView Visibility ( R . id . ui _ notification _ progress _ bar , ĠView . VISIBLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl Remote Views . setOn Click Pending Intent ( R . id . ui _ notification _ player _ button , Ġl Pending Pause Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl Remote Views . set ImageView Resource ( R . id . ui _ notification _ player _ button , ĠR . drawable . ic _ pause _ white ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġl Notification Builder : ĠNotification Compat . Builder Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Compat . Builder ( this , ĠFO REG ROUND _ CHANNEL _ ID ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Compat . Builder ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġl Notification Builder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent ( l Remote Views ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . mip map . ic _ launcher ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Category ( Notification Compat . CATEGORY _ SERVICE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Only Alert Once ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set O ngo ing ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAuto Cancel ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( pending Intent ) ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . LO L LI POP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl Notification Builder . setVisibility ( Notification Compat . VIS IBILITY _ PUBLIC ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġl Notification Builder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Prepared ( mp : ĠMedia Player ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Player Ġon Prepared () ") ĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠMusic Constants . STATE _ SERVICE . PLAY ĊĠĠĠĠĠĠĠ Ġm Notification Manager !!. notify ( Music Constants . NOTIFICATION _ ID _ FO REG ROUND _ SERVICE , Ġprepare Notification ()) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Player !!. set Wake Mode ( this , ĠPower Manager . PAR TIAL _ WAKE _ LOCK ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Player !!. start () ĊĠĠĠĠĠĠĠ Ġm Timer Update Handler . post Delayed ( m Timer Update Runnable , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Buffer ing Update ( mp : ĠMedia Player , Ġpercent : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Player Ġon Buffer ing Update (): $ percent ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlock CPU () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmgr Ġ= Ġget System Service ( Context . POWER _ SERVICE ) Ġas ĠPower Manager Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġm Wake Lock Ġ= Ġmgr . new Wake Lock ( Power Manager . PAR TIAL _ WAKE _ LOCK , Ġthis . java Class . simple Name ) ĊĠĠĠĠĠĠĠ Ġm Wake Lock ?. acquire () ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Player Ġlock CPU () ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġunlock CPU () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Wake Lock ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Hel d ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . release () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Player Ġunlock CPU () ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Wake Lock Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlock WiFi () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconn Manager Ġ= Ġapplication Context . getSystem Service ( Context . CONNECT IVITY _ SERVICE ) Ġas ĠConnect ivity Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġl Wifi Ġ= Ġconn Manager . get Network Info ( Connectivity Manager . TYPE _ WIFI ) ĊĠĠĠĠĠĠĠ Ġif Ġ( l Wifi Ġ!= Ġnull Ġ&& Ġl Wifi . isConnected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġapplication Context . getSystem Service ( Context . WIFI _ SERVICE ) Ġas ĠW ifi Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm WiFi Lock Ġ= Ġmanager . create Wifi Lock ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠW ifi Manager . WIFI _ MODE _ FULL , ĠSound Service K :: class . java . simple Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm WiFi Lock ?. acquire () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Player Ġlock WiFi () ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġunlock WiFi () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m WiFi Lock Ġ!= Ġnull Ġ&& Ġm WiFi Lock !!. is Hel d ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm WiFi Lock !!. release () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm WiFi Lock Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Player Ġunlock WiFi () ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFO REG ROUND _ CHANNEL _ ID Ġ= Ġ" foreground _ channel _ id " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠSound Service K :: class . java . simple Name ĊĠĠĠĠĠĠĠ Ġvar Ġstate Ġ= ĠMusic Constants . STATE _ SERVICE . NOT _ INIT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġ} Ċ }