package Ġhu . m rol csi . mu z ik . data . service . media Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Notification Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . AsyncTask Ċ 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 . Media Session Compat Ċ import Ġandroid . support . v 4 . media . session . Playback State Compat Ċ import Ġandroid . util . Log Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . media . session . Media Button Receiver Ċ import Ġandroidx . navigation . Nav Deep Link Builder Ċ import Ġcom . bump tech . glide . request . target . Target Ċ import Ġcom . google . android . ex op layer 2 . Exo Playback Exception Ċ import Ġcom . google . android . ex op layer 2 . Player Ċ import Ġcom . google . android . ex op layer 2 . ui . Player Notification Manager Ċ import Ġhu . m rol csi . mu z ik . R Ċ import Ġhu . m rol csi . mu z ik . data . local . M uz ik Database Ċ import Ġhu . m rol csi . mu z ik . data . model . media . album Art Uri Ċ import Ġhu . m rol csi . mu z ik . data . model . media . is Skip To Next Enabled Ċ import Ġhu . m rol csi . mu z ik . data . model . media . prepare From Descriptions Ċ import Ġhu . m rol csi . mu z ik . data . model . media . set Queue Title Ċ import Ġhu . m rol csi . mu z ik . data . model . media . set Shuffle Mode Ċ import Ġhu . m rol csi . mu z ik . data . model . play Queue . Last Play ed Ċ import Ġhu . m rol csi . mu z ik . data . service . media . ex op layer . Exo Player Holder Ċ import Ġhu . m rol csi . mu z ik . data . service . media . ex op layer . notification . Exo Notification Manager Ċ import Ġhu . m rol csi . mu z ik . data . service . theme . Theme Service Ċ import Ġhu . m rol csi . mu z ik . ui . common . glide . G lide App Ċ import Ġhu . m rol csi . mu z ik . ui . common . glide . on Resource Ready Ċ import Ġorg . k oin . android . ext . android . inject ĊĊ Ċ class ĠM uz ik Player Service Ġ: ĠM uz ik Browser Service () Ġ{ ĊĊĠ Ġprivate Ġval Ġtheme Service : ĠTheme Service Ġby Ġinject () ĊĊĠ Ġ// ĠMedia Session Ġand ĠPlayer Ġimplementations ĊĠ Ġprivate Ġlateinit Ġvar Ġm Media Session : ĠMedia Session Compat ĊĠ Ġprivate Ġlateinit Ġvar Ġm Player Holder : ĠEx o Player Holder ĊĊĠ Ġ// ĠLast Ġplayed Ġposition ĊĠ Ġprivate Ġvar Ġm Last Play ed : ĠLast Play ed ? Ġ= Ġnull ĊĊĠ Ġ// ĠEx o Player ĠNotification ĊĠ Ġprivate Ġlateinit Ġvar Ġm Exo Notification Manager : ĠEx o Notification Manager ĊĠ Ġprivate Ġvar Ġm Is Foreground Ġ= Ġfalse ĊĊĠ Ġ@ Suppress Lint (" Wrong Constant ") ĊĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠ Ġsuper . onCreate () ĊĊĠĠĠ ĠLog . i ( LOG _ TAG , Ġ" onCreate () ") ĊĊĠĠĠ Ġ// ĠCreate Ġa ĠMedia Session Compat ĊĠĠĠ Ġm Media Session Ġ= ĠMedia Session Compat ( this , ĠLOG _ TAG ). apply Ġ{ ĊĠĠĠĠĠ Ġ// ĠPrepare ĠPending ĠIntent Ġto ĠPlayer ĊĠĠĠĠĠ Ġval Ġplayer Pending Intent Ġ= ĠNav Deep Link Builder ( this @ M uz ik Player Service ) ĊĠĠĠĠĠĠĠ Ġ. set Graph ( R . navigation . main _ navigation ) ĊĠĠĠĠĠĠĠ Ġ. set Destination ( R . id . nav Player ) ĊĠĠĠĠĠĠĠ Ġ. create Pending Intent () ĊĠĠĠĠĠ Ġset Session Activity ( player Pending Intent ) ĊĊĠĠĠĠĠ Ġ// ĠSet Ġthe Ġsession 's Ġtoken Ġso Ġthat Ġclient Ġactivities Ġcan Ġcommunicate Ġwith Ġit . ĊĠĠĠĠĠ Ġset Session Token ( session Token ) ĊĊĠĠĠĠĠ Ġ// ĠEnable Ġcallbacks Ġfrom ĠMedia Buttons Ġand ĠTransport Controls ĊĠĠĠĠĠ Ġset Flags ( Media Session Compat . FLAG _ HAND LES _ QUEUE _ COMMAND S ) ĊĊĠĠĠĠĠ Ġ// ĠConnect Ġthis Ġsession Ġwith Ġthe ĠEx o Player ĊĠĠĠĠĠ Ġm Player Holder Ġ= ĠEx o Player Holder ( application Context , Ġthis ). also Ġ{ Ġex o Ġ-> ĊĠĠĠĠĠĠĠ Ġm Exo Notification Manager Ġ= ĠEx o Notification Manager ( ĊĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠ Ġex o . getPlayer (), ĊĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠPlayer Notification Manager . Notification Listener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Notification Posted ( notification Id : ĠInt , Ġnotification : ĠNotification ?, Ġongoing : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exo . getPlayer (). play When Ready Ġ&& Ġ! m Is Foreground ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Service ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM uz ik Player Service :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Foreground ( notification Id , Ġnotification ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Foreground Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! exo . getPlayer (). play When Ready Ġ&& Ġm Is Foreground ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Foreground ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Foreground Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Notification Cancelled ( notification Id : ĠInt , Ġdis missed ByUser : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Foreground ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Foreground Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġex o . getPlayer (). addListener ( object Ġ: ĠPlayer . EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Player StateChanged ( play When Ready : ĠBoolean , Ġplayback State : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( LOG _ TAG , Ġ" on Player StateChanged ( play When Ready =$ play When Ready , Ġplayback State =$ playback State )") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġnotification Ġdismiss ible ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! play When Ready Ġ&& Ġm Is Foreground ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Foreground ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Foreground Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( playback State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer . STATE _ READY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġplayer Ġto Ġlast Ġplayed Ġsettings ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Last Play ed ?. let Ġ{ Ġlast Play ed Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Loaded Ġ' Last ĠPlay ed ' Ġfrom Ġdatabase : Ġ$ last Play ed ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSkip Ġto Ġlast Ġplayed Ġsong ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . transport Controls . skip To Queue Item ( last Play ed . queue Position . to Long ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSeek Ġto Ġsaved Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . transport Controls . seek To ( last Play ed . track Position ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġm Last Play ed Ġto Ġnull , Ġso Ġwe Ġwon 't Ġcall Ġthis Ġagain ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Last Play ed Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Player Error ( error : ĠEx o Playback Exception ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= Ġex o . getPlayer () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( controller . playback State . is Skip To Next Enabled Ġ&& Ġplayer . play When Ready ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSkip Ġto Ġnext Ġtrack ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . transport Controls . skip To Next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . transport Controls . prepare () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . transport Controls . play () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSend Ġerror Ġto Ġclient ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// ĠRegister Ġbasic Ġcallbacks ĊĠĠĠĠĠ Ġcontroller . register Callback ( object Ġ: ĠMedia Controller Compat . Callback () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Playback StateChanged ( state : ĠPlay back State Compat ?) Ġ{} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Metadata Changed ( metadata : ĠMedia Metadata Compat ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠG lide App . with ( this @ M uz ik Player Service ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Bitmap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( metadata ?. album Art Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. override ( Target . SIZE _ ORIGIN AL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Resource Ready Ġ{ Ġtheme Service . update Theme ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. preload () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠ Ġ// ĠCheck Ġpermissions Ġbefore Ġproceed ing ĊĠĠĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠ ĠManifest . permission . READ _ EXTERNAL _ STORAGE ĊĠĠĠĠĠĠĠ Ġ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAsync Task . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġlast Ġplayed Ġqueue Ġfrom Ġthe Ġdatabase ĊĠĠĠĠĠĠĠĠĠ Ġval Ġqueue Ġ= ĠM uz ik Database . getInstance ( application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Play Queue Dao () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Queue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to Description () Ġ} ĊĊĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Loaded Ġqueue Ġfrom Ġdatabase : Ġ$ queue ") ĊĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( queue . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġlast Ġplayed Ġpositions Ġfrom Ġthe Ġdatabase ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Last Play ed Ġ= ĠM uz ik Database . getInstance ( application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Play Queue Dao () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getLast Play ed () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Last Play ed ?. let Ġ{ Ġlast Play ed Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLoad Ġlast Ġplayed Ġsongs Ġ( starting Ġwith Ġlast Ġplayed Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqueue Position Ġ= Ġif Ġ( last Play ed . queue Position Ġin Ġqueue . indices ) Ġlast Play ed . queue Position Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . prepare From Descriptions ( queue , Ġqueue Position ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . transport Controls . set Repeat Mode ( last Play ed . repeat Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . transport Controls . set Shuffle Mode ( last Play ed . shuffle Mode , Ġlast Play ed . shuffle Seed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . set Queue Title ( last Play ed . queue Title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent ?, Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠ ĠMedia Button Receiver . handle Intent ( m Media Session , Ġintent ) ĊĠĠĠ Ġreturn ĠService . START _ STICK Y ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠ Ġ// ĠAvoid Ġcalling Ġstop Ġmultiple Ġtimes . ĊĊĠĠĠ ĠLog . i ( LOG _ TAG , Ġ" on Destroy () ") ĊĊĠĠĠ Ġ// ĠDe activate Ġthe Ġsession ĊĠĠĠ Ġm Media Session . run Ġ{ ĊĠĠĠĠĠ ĠisActive Ġ= Ġfalse ĊĠĠĠĠĠ Ġrelease () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠDet ach Ġthe Ġplayer Ġfrom Ġthe Ġnotification ĊĠĠĠ Ġm Exo Notification Manager . release () ĊĊĠĠĠ Ġ// ĠRelease Ġplayer Ġand Ġrelated Ġresources ĊĠĠĠ Ġm Player Holder . release () ĊĊĠĠĠ Ġ// ĠClose Ġdatabase ĊĠĠĠ Ġ// M uz ik Database . getInstance ( application Context ). close () ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠLOG _ TAG Ġ= Ġ" M uz ik Player Service " ĊĠ Ġ} Ċ }