package Ġtech . so it . quiet . player . service Ċ Ċ import Ġandroid . app .* Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . os . Build Ċ import Ġandroid . support . annotation . Visible ForTesting Ċ import Ġandroid . support . v 4 . app . Notification Compat Ċ import Ġcom . google . android . ex op layer 2 . Player Ċ import Ġtech . so it . quiet . AppContext Ċ import Ġtech . so it . quiet . MainActivity Ċ import Ġtech . so it . quiet . R Ċ import Ġtech . so it . quiet . player . Music Ċ import Ġtech . so it . quiet . player . Quiet Music Player ĊĊ Ċ /** Ċ Ġ* ĠUtils Ġfor Ġnotify ĠMedia Style Ġnotification Ġfor Ġmusic Ċ Ġ* Ċ Ġ* Ġsee Ġmore Ġat Ġ[ update ] Ċ Ġ*/ Ċ class ĠMusic Notification Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠID _ PLAY _ SERVICE Ġ= Ġ" music _ play _ service " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠID _ NOTIFICATION _ PLAY _ SERVICE Ġ= Ġ 0 x 3 0 3 1 2 ĊĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext Ġget () Ġ= ĠApp Context ĊĊĊĠĠĠ Ġprivate Ġval Ġnotification M anger : ĠNotification Manager Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . getSystem Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Music Service Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Channel ( ID _ PLAY _ SERVICE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" quiet _ music _ player ", ĠNotification Manager . IMPORT ANCE _ LOW ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Music Service . description Ġ= Ġ" music Ġplayer Ġservice " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Music Service . enable Lights ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Music Service . enable V ibration ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Manager Ġ= Ġcontext . getSystem Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . create Notification Channel ( channel Music Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġupdate Ġcurrent Ġmusic Ġnotification ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote : Ġthe Ġnotification Ġwill Ġnot Ġrefresh Ġif Ġmusic Ġor Ġplayer 's t ate Ġdo Ġnot Ġchanged ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġwhen Ġplayer Ġpaused , the Ġnotification Ġwill Ġbe Ġcancel Ab le Ġfor Ġuser Ġand Ġwill Ġstop Ġforeground Ġservice . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġservice Ġthe Ġtech . so it . quiet . ui . service . Quiet Player Service ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate ( service : ĠService ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Notification ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Cancel Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification M anger . cancel ( ID _ NOTIFICATION _ PLAY _ SERVICE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Notify Ġ= Ġ{ Ġbuilder , Ġcancel Ab le Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Ġ= Ġbuilder . build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice . notify ( notification , Ġcancel Ab le ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġfun Ġcheck Notification ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Notify : Ġ( builder : ĠNotification Compat . Builder , Ġcancel Ab le : ĠBoolean ) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Cancel : Ġ() Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= ĠQu iet Music Player . getInstance () ĊĠĠĠĠĠĠĠ Ġval Ġmusic Ġ= Ġplayer . current ĊĊĠĠĠĠĠĠĠ Ġif Ġ( music Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġis Playing : ĠBoolean ĊĠĠĠĠĠĠĠ Ġval Ġis Fav : ĠBoolean Ġ= Ġmusic . is Favorite () ĊĠĠĠĠĠĠĠ Ġval Ġcancel Ab le : ĠBoolean ĊĠĠĠĠĠĠĠ Ġif Ġ( player . playback State Ġ== ĠPlayer . STATE _ READY Ġ&& Ġplayer . play When Ready ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Playing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Ab le Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Ab le Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Playing Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠNotification Compat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. Builder ( context , ĠID _ PLAY _ SERVICE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build Step 1 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build Step 2 ( music , Ġis Fav , Ġis Playing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build Step 3 ( music . get Cover Bitmap (), Ġnull ) ĊĠĠĠĠĠĠĠ Ġon Notify ( builder , Ġcancel Ab le ) ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun ĠService . notify ( notification : ĠNotification , Ġcancel Ab le : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cancel Ab le . not ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Foreground ( ID _ NOTIFICATION _ PLAY _ SERVICE , Ġnotification ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Foreground ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification M anger . notify ( ID _ NOTIFICATION _ PLAY _ SERVICE , Ġnotification ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun ĠNotification Compat . Builder . build Step 1 (): ĠNotification Compat . Builder Ġ{ ĊĠĠĠĠĠĠĠ ĠsetShow When ( true ) ĊĠĠĠĠĠĠĠ Ġval Ġmedia Style Ġ= Ġandroid . support . v 4 . media . app . Notification Compat . Media Style () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Show Actions In Compact View ( 0 , Ġ 1 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġset Style ( media Style ) ĊĠĠĠĠĠĠĠ Ġset Small Icon ( R . drawable . ic _ music _ note _ black _ 2 4 dp ) ĊĠĠĠĠĠĠĠ Ġset Color ized ( true ) ĊĠĠĠĠĠĠĠ Ġset Content Intent ( build Content Intent ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠNotification Compat . Builder . build Step 2 ( music : ĠMusic , Ġis Favorite : ĠBoolean , Ġis Playing : ĠBoolean ): ĠNotification Compat . Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġset Content Title ( music . getTitle ()) ĊĠĠĠĠĠĠĠ Ġset Content Text ( music . getSub Title ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Favorite ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( R . drawable . ic _ favorite _ black _ 2 4 dp , Ġ" æĶ¶ èĹı ", Ġbuild Playback Action ( 0 )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( R . drawable . ic _ favorite _ border _ black _ 2 4 dp , Ġ" åıĸæ¶Ī æĶ¶ èĹı ", Ġbuild Playback Action ( 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd Action ( R . drawable . ic _ skip _ previous _ black _ 2 4 dp , Ġ" ä¸Ĭ ä¸Ģ é¦ĸ ", Ġbuild Playback Action ( 1 )) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( R . drawable . ic _ pause _ black _ 2 4 dp , Ġ" æļĤ åģľ ", Ġbuild Playback Action ( 2 )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( R . drawable . ic _ play _ arrow _ black _ 2 4 dp , Ġ" æĴŃæĶ¾ ", Ġbuild Playback Action ( 2 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd Action ( R . drawable . ic _ skip _ next _ black _ 2 4 dp , Ġ" ä¸ĭ ä¸Ģ é¦ĸ ", Ġbuild Playback Action ( 3 )) ĊĊĠĠĠĠĠĠĠ Ġadd Action ( R . drawable . ic _ close _ black _ 2 4 dp , Ġ" éĢĢåĩº ", Ġbuild Playback Action ( 4 )) ĊĊĊĠĠĠĠĠĠĠ Ġset Content Intent ( build Content Intent ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun ĠNotification Compat . Builder . build Step 3 ( image : ĠBitmap ?, Ġcolor : ĠInt ?): ĠNotification Compat . Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġimage ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Large Icon ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcolor ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Color ized ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Color ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġbuild Content Intent (): ĠPending Intent Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠMainActivity :: class . java ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( MainActivity . KEY _ DEST INATION , ĠMainActivity . DEST INATION _ PLAY ING _ PAGE ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPending Intent . getActivity ( context , Ġ 0 , Ġintent , ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Playback Action ( which : ĠInt ): ĠPending Intent Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠQu iet Player Service :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġaction : ĠPending Intent ĊĠĠĠĠĠĠĠ Ġwhen Ġ( which ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . action Ġ= ĠQu iet Player Service . action _ like ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠPending Intent . getService ( context , Ġ 0 , Ġintent , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . action Ġ= ĠQu iet Player Service . action _ play _ previous ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠPending Intent . getService ( context , Ġ 1 , Ġintent , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . action Ġ= ĠQu iet Player Service . action _ play _ pause ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠPending Intent . getService ( context , Ġ 2 , Ġintent , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . action Ġ= ĠQu iet Player Service . action _ play _ next ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠPending Intent . getService ( context , Ġ 3 , Ġintent , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . action Ġ= ĠQu iet Player Service . action _ exit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠPending Intent . getService ( context , Ġ 4 , Ġintent , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 5 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . action Ġ= ĠQu iet Player Service . action _ dis like ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠPending Intent . getService ( context , Ġ 5 , Ġintent , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror ("") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġaction ĊĠĠĠ Ġ} ĊĊ Ċ } Ċ