package Ġcom . github . flo rent 3 7 . assets _ audio _ player . notification Ċ Ċ import Ġandroid . app . Notification Ċ import Ġandroid . app . Notification Channel Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . media . Media Metadata Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . support . v 4 . media . Media Metadata Compat Ċ import Ġandroid . support . v 4 . media . session . Playback State Compat Ċ import Ġandroid . support . v 4 . media . session . Playback State Compat . ACTION _ SEEK _ TO Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġandroidx . core . app . Notification Manager Compat Ċ import Ġandroidx . media . session . Media Button Receiver Ċ import Ġcom . github . flo rent 3 7 . assets _ audio _ player . R Ċ import Ġcom . google . android . ex op layer 2 . C Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlin . math . abs Ċ Ċ class ĠNotification Service Ġ: ĠService () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNOT IFICATION _ ID Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCHAN NEL _ ID Ġ= Ġ" assets _ audio _ player " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMED IA _ SESSION _ TAG Ġ= Ġ" assets _ audio _ player " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ PLAYER _ ID Ġ= Ġ" player Id " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ NOTIFICATION _ ACTION Ġ= Ġ" notification Action " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTR ACK _ ID Ġ= Ġ" track ID "; ĊĊĠĠĠĠĠĠĠ Ġconst Ġval Ġmanifest Icon Ġ= Ġ" assets . audio . player . notification . icon " ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġmanifest Icon Play Ġ= Ġ" assets . audio . player . notification . icon . play " ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġmanifest Icon Pause Ġ= Ġ" assets . audio . player . notification . icon . pause " ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġmanifest Icon Prev Ġ= Ġ" assets . audio . player . notification . icon . prev " ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġmanifest Icon Next Ġ= Ġ" assets . audio . player . notification . icon . next " ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġmanifest Icon Stop Ġ= Ġ" assets . audio . player . notification . icon . stop " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġstate Compat Ġ: ĠPlay back State Compat ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġtime Differ ( old : ĠPlay back State Compat ?, Ġnew : ĠPlay back State Compat , Ġmin Difference MS : ĠLong ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( old Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Pos Ġ= Ġold . position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġabs ( new . position Ġ- Ġcurrent Pos ) Ġ> Ġmin Difference MS ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġupdate Position ( context : ĠContext , Ġis Playing : ĠBoolean , Ġcurrent Position Ms : ĠLong , Ġspeed : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Buttons Receiver . get Media Session Compat ( context ). let Ġ{ Ġmedia Session Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġif Ġ( is Playing ) ĠPlay back State Compat . STATE _ PLAY ING Ġelse ĠPlay back State Compat . STATE _ PA USED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewState Ġ= ĠPlay back State Compat . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Actions ( ACTION _ SEEK _ TO ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setState ( state , Ġcurrent Position Ms , Ġif Ġ( is Playing ) Ġspeed Ġelse Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// pause Ġ-> Ġplay , Ġplay -> Ġpause ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Compat ?. state Ġ!= ĠnewState . state Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// speed Ġchanged ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Compat ?. playback Speed Ġ!= Ġspeed Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// seek ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Differ ( state Compat , ĠnewState , Ġ 2 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Compat Ġ= ĠnewState ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Session . set Playback State ( state Compat ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠMedia Metadata Compat . Builder . putString If NotNull ( key : ĠString , Ġvalue : ĠString ?) Ġ: ĠMedia Metadata Compat . Builder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif ( value Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . putString ( key , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġupdate Not if MetaData ( context : ĠContext , Ġdisplay : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ms : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalbum : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia Session Ġ= ĠMedia Buttons Receiver . get Media Session Compat ( context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . LO L LI POP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠMedia Metadata Compat . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// for Ġs amsung Ġdevices Ġhttps :// github . com / flo rent 3 7 / Flutter - Assets Audio Player / issues / 2 0 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString If NotNull ( Media Metadata . METADATA _ KEY _ TITLE , Ġtitle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString If NotNull ( Media Metadata . METADATA _ KEY _ AR TI ST , Ġartist ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString If NotNull ( Media Metadata . METADATA _ KEY _ AL BU M , Ġalbum ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! display Ġ|| Ġduration Ms Ġ== Ġ 0 L Ġ/* Ġli vest ream Ġ*/) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . put Long ( Media Metadata . METADATA _ KEY _ DURATION , ĠC . TIME _ UN SET ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . put Long ( Media Metadata . METADATA _ KEY _ DURATION , Ġduration Ms ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Session . set Metadata ( builder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent , Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( intent . action Ġ== ĠIntent . ACTION _ MEDIA _ BUTTON ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Buttons Receiver . get Media Session Compat ( application Context ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Button Receiver . handle Intent ( it , Ġintent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġnotification Action Ġ= Ġintent . get Serializable Extra ( EXTRA _ NOTIFICATION _ ACTION )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNotification Action . Show Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Notification ( notification Action ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNotification Action . Hide Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide Not if () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠSTART _ NOT _ STICK Y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Return Intent ( for Action : ĠString , Ġfor Player : ĠString , Ġaudio Met as : ĠAudio Met as ): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠIntent ( this , ĠNotification Action Receiver :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( for Action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra ( EXTRA _ PLAYER _ ID , Ġfor Player ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra ( TRACK _ ID , Ġaudio Met as . track ID ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisplay Notification ( action : ĠNotification Action . Show ) Ġ{ ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Ġ= ĠImage Downloader . load Bitmap ( context Ġ= Ġapplication Context , Ġimage Met as Ġ= Ġaction . audio Met as . image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( image Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Notification ( action , Ġimage ) Ġ// display Ġwithout Ġimage Ġfor Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage OnLoad Error Ġ= ĠImage Downloader . load Bitmap ( context Ġ= Ġapplication Context , Ġimage Met as Ġ= Ġaction . audio Met as . image OnLoad Error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( image OnLoad Error Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Notification ( action , Ġimage OnLoad Error ) Ġ// display Ġwithout Ġimage Ġfor Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage From Manifest Ġ= ĠImage Downloader . load Holder Bitmap From Manifest ( context Ġ= Ġapplication Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( image From Manifest Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Notification ( action , Ġimage From Manifest ) Ġ// display Ġwithout Ġimage Ġfor Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Notification ( action , Ġnull ) Ġ// display Ġwithout Ġimage ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Small Icon ( context : ĠContext ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Custom Icon OrDefault ( context , Ġmanifest Icon , Ġnull , ĠR . drawable . exo _ icon _ circular _ play ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Play Icon ( context : ĠContext , Ġresource Name : ĠString ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Custom Icon OrDefault ( context , Ġmanifest Icon Play , Ġresource Name , ĠR . drawable . exo _ icon _ play ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Pause Icon ( context : ĠContext , Ġresource Name : ĠString ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Custom Icon OrDefault ( context , Ġmanifest Icon Pause , Ġresource Name , ĠR . drawable . exo _ icon _ pause ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetNext Icon ( context : ĠContext , Ġresource Name : ĠString ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Custom Icon OrDefault ( context , Ġmanifest Icon Next , Ġresource Name , ĠR . drawable . exo _ icon _ next ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Prev Icon ( context : ĠContext , Ġresource Name : ĠString ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Custom Icon OrDefault ( context , Ġmanifest Icon Prev , Ġresource Name , ĠR . drawable . exo _ icon _ previous ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Stop Icon ( context : ĠContext , Ġresource Name : ĠString ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Custom Icon OrDefault ( context , Ġmanifest Icon Stop , Ġresource Name , ĠR . drawable . exo _ icon _ stop ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Custom Icon OrDefault ( context : ĠContext , Ġmanifest Name : ĠString , Ġresource Name : ĠString ?, Ġdefault Icon : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġby Ġresource Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcustom Icon FromName Ġ= ĠgetResource ID ( resourceName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( custom Icon FromName Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcustom Icon FromName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// by Ġmanifest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Infos Ġ= Ġcontext . package Manager . getApplication Info ( context . packageName , ĠPackage Manager . GET _ META _ DATA ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcustom Icon From Manifest Ġ= Ġapp Infos . metaData . get ( manifest Name ) Ġas ? ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( custom Icon From Manifest Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcustom Icon From Manifest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// print ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// if Ġcustom Icon FromName Ġis Ġnull Ġor Ġcustom Icon From Manifest Ġis Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġdefault Icon ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetResource ID ( icon Name : ĠString ?): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġicon Name ?. let Ġ{ Ġname Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresources . getIdentifier ( name , Ġ" drawable ", Ġapplication Context . packageName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisplay Notification ( action : ĠNotification Action . Show , Ġbitmap : ĠBitmap ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Notification Channel () ĊĠĠĠĠĠĠĠ Ġval Ġmedia Session Ġ= ĠMedia Buttons Receiver . get Media Session Compat ( application Context ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnotification Settings Ġ= Ġaction . notification Settings ĊĊĠĠĠĠĠĠĠ Ġupdate Not if MetaData ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Ġ= Ġnotification Settings . seek Bar Enabled , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġaction . audio Met as . title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist Ġ= Ġaction . audio Met as . artist , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalbum Ġ= Ġaction . audio Met as . album , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ms Ġ= Ġaction . duration Ms ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtoggle Intent Ġ= Ġcreate Return Intent ( for Action Ġ= ĠNotification Action . ACTION _ TO GGLE , Ġfor Player Ġ= Ġaction . player Id , Ġaudio Met as Ġ= Ġaction . audio Met as ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra ( EXTRA _ NOTIFICATION _ ACTION , Ġaction . copy With ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Playing Ġ= Ġ! action . is Playing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġval Ġpending Toggle Intent Ġ= ĠPending Intent . get Broadcast ( this , Ġ 0 , Ġtoggle Intent , ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠ ĠMedia Button Receiver . handle Intent ( media Session , Ġtoggle Intent ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġthis ĊĊĠĠĠĠĠĠĠ Ġval Ġnotification Ġ= ĠNotification Compat . Builder ( this , ĠCHAN NEL _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// prev ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( notification Settings . prev Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( get Prev Icon ( context , Ġaction . notification Settings . previous Icon ), Ġ" prev ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . get Broadcast ( context , Ġ 0 , Ġcreate Return Intent ( for Action Ġ= ĠNotification Action . ACTION _ PREV , Ġfor Player Ġ= Ġaction . player Id , Ġaudio Met as Ġ= Ġaction . audio Met as ), ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// play / pause ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( notification Settings . play Pause Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action . is Playing ) Ġget Pause Icon ( context , Ġaction . notification Settings . pause Icon ) Ġelse Ġget Play Icon ( context , Ġaction . notification Settings . play Icon ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action . is Playing ) Ġ" pause " Ġelse Ġ" play ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending Toggle Intent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// next ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( notification Settings . next Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( getNext Icon ( context , Ġaction . notification Settings . next Icon ), Ġ" next ", ĠPending Intent . get Broadcast ( context , Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Return Intent ( for Action Ġ= ĠNotification Action . ACTION _ NEXT , Ġfor Player Ġ= Ġaction . player Id , Ġaudio Met as Ġ= Ġaction . audio Met as ), ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// stop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( notification Settings . stop Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( get Stop Icon ( context , Ġaction . notification Settings . stop Icon ), Ġ" stop ", ĠPending Intent . get Broadcast ( context , Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Return Intent ( for Action Ġ= ĠNotification Action . ACTION _ STOP , Ġfor Player Ġ= Ġaction . player Id , Ġaudio Met as Ġ= Ġaction . audio Met as ), ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setStyle ( android x . media . app . Notification Compat . Media Style () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( notification Settings . number Enabled ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġit . set Show Actions In Compact View ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġit . set Show Actions In Compact View ( 0 , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġit . set Show Actions In Compact View ( 0 , Ġ 1 , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġit . set Show Actions In Compact View () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Show Cancel Button ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Media Session ( media Session . session Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( get Small Icon ( context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setVisibility ( Notification Compat . VIS IBILITY _ PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Priority ( Notification Compat . PRIORITY _ MAX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( action . audio Met as . title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( action . audio Met as . artist ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Only Alert Once ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! action . audio Met as . album . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Sub Text ( action . audio Met as . album ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( Pending Intent . get Broadcast ( this , Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Return Intent ( for Action Ġ= ĠNotification Action . ACTION _ SELECT , Ġfor Player Ġ= Ġaction . player Id , Ġaudio Met as Ġ= Ġaction . audio Met as ), ĠPending Intent . FLAG _ CANCEL _ CURRENT )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bitmap Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Large Icon ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Show When ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġstart Foreground ( NOTIFICATION _ ID , Ġnotification ) ĊĊĠĠĠĠĠĠĠ Ġ// fix Ġfor Ġhttps :// github . com / flo rent 3 7 / Flutter - Assets Audio Player / issues / 1 3 9 ĊĠĠĠĠĠĠĠ Ġ// if Ġ(! action . is Playing ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġstop Foreground ( false ) ĊĠĠĠĠĠĠĠ Ġ//} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Notification Channel () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Channel Ġ= ĠNotification Channel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCHAN NEL _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Foreground ĠService ĠChannel ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . app . Notification Manager . IMPORT ANCE _ LOW ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" assets _ audio _ player " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetShow Badge ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock screen Visibility Ġ= ĠNotification . VIS IBILITY _ PUBLIC ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Manager Compat . from ( application Context ). create Notification Channel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Channel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide Not if () Ġ{ ĊĠĠĠĠĠĠĠ ĠNotification Manager Compat . from ( application Context ). cancel ( NOTIFICATION _ ID ) ĊĠĠĠĠĠĠĠ Ġstop Foreground ( true ) ĊĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Task Removed ( root Intent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhide Not if () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ?): ĠI Binder ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} Ċ Ċ } Ċ