package Ġcom . ar up ak aman . a ik on . services Ċ Ċ import Ġandroid . app . Notification Ċ import Ġandroid . app . Notification Channel Ċ import Ġandroid . app . Notification Manager Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . drawable . Icon Ċ import Ġandroid . media . Audio Attributes Ċ import Ġandroid . media . Ring tone Manager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġcom . ar up ak aman . a ik on . R Ċ import Ġcom . ar up ak aman . a ik on . utils . A ik on Res Ċ import Ġcom . ar up ak aman . a ik on . utils . App Icon Util Ċ import Ġcom . ar up ak aman . a ik on . utils . toast Ċ Ċ @ Requires Api ( Build . VERSION _ CODES . O ) Ċ class ĠFore ground Service Ġ: ĠService () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġby Ġlazy Ġ{ Ġ" Foreground Service " Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠACTION _ STOP Ġ= Ġ" stop _ action " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ APP _ NAME Ġ= Ġ" app _ name " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ APP _ ICON _ URI Ġ= Ġ" app _ icon _ uri " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNOT IFICATION _ ID Ġ= Ġ 1 0 1 ĊĊĠĠĠĠĠĠĠ Ġvar Ġis Running Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . O ) ĊĠĠĠĠĠĠĠ Ġfun Ġstart Or Stop Service ( mContext : ĠContext , Ġstart : ĠBoolean , ĠappName : ĠString ? Ġ= Ġnull , Ġapp Icon Uri : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" start Or Stop Ġstart Ġ-> Ġ$ start ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( mContext , ĠFore ground Service :: class . java ). let Ġ{ Ġintent -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isRunning ) ĠmContext . stop Service ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( EXTRA _ APP _ NAME , ĠappName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( EXTRA _ APP _ ICON _ URI , Ġapp Icon Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . start Foreground Service ( mContext , Ġintent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmContext . stop Service ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Running Ġ= Ġstart ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠappName : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġapp Icon : ĠBitmap ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( p 0 : ĠIntent ?): ĠI Binder ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" onCreate ") ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠ Ġprivate Ġfun Ġget Notification Builder (): ĠNotification . Builder { ĊĠĠĠĠĠĠĠ Ġreturn ĠNotification . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA ik on Res . getString ( R . string . notification _ channel _ name ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( appName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Ticker ( A ik on Res . getString ( R . string . app _ name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( Icon . create With Bitmap ( app Icon )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set O ngo ing ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Show When ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set V ibrate ( long ArrayOf ( 0 , Ġ 5 0 0 , Ġ 1 0 0 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Sound ( Ring tone Manager . getDefault Uri ( Ring tone Manager . TYPE _ NOTIFICATION )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set When ( System . currentTimeMillis ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setColor ( Context Compat . getColor ( application Context , ĠR . color . color Black Light X )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Category ( Notification Compat . CATEGORY _ SERVICE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setStyle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification . Big TextStyle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. big Text ( A ik on Res . getString ( R . string . msg _ notification _ preview )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent ?, Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" onStart Command () ") ĊĠĠĠĠĠĠĠ Ġif Ġ( intent ?. action Ġ== ĠACTION _ STOP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Received ĠACTION _ STOP ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Or Stop Service ( this , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent ?. run Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠappName Ġ= ĠgetString Extra ( EXTRA _ APP _ NAME ) ?: A ik on Res . getString ( R . string . app _ name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Icon Uri Ġ= ĠgetString Extra ( EXTRA _ APP _ ICON _ URI ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! app Icon Uri . isNull Or Blank ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= ĠApp Icon Util . uri To Bitmap ( application Context , ĠUri . parse ( app Icon Uri ), Ġ 5 1 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bitmap Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Icon Ġ= Ġbitmap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" get Intent N ĠappName Ġ-> Ġ$ appName Ġapp Icon Uri Ġ$ app Icon Uri ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! :: app Icon . isInitialized ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Icon Ġ= ĠApp Icon Util . vector Drawable To Bitmap ( application Context , ĠR . drawable . ic _ a ik on _ baseline _ logo , Ġ 5 1 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Extra Ġget ĠEx c Ġ: Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnot if Man Ġ= Ġget System Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaudio Attributes Ġ= ĠAudio Attributes . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ContentType ( Audio Attributes . CONTENT _ TYPE _ SON IFICATION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Usage ( Audio Attributes . USAGE _ NOTIFICATION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Channel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠA ik on Res . getString ( R . string . notification _ channel _ name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠA ik on Res . getString ( R . string . app _ name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Manager . IMPORT ANCE _ MIN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetShow Badge ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable V ibration ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable Lights ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Sound ( Ring tone Manager . getDefault Uri ( Ring tone Manager . TYPE _ NOTIFICATION ), Ġaudio Attributes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot if Man . create Notification Channel ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstop Intent Ġ= ĠIntent ( this , ĠFore ground Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Intent . action Ġ= ĠACTION _ STOP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpending Stop Intent Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . get Foreground Service ( this , Ġ 0 , Ġstop Intent , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . getService ( this , Ġ 0 , Ġstop Intent , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Ġ= Ġget Notification Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( A ik on Res . getString ( R . string . msg _ notification _ preview )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( pending Stop Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Public Version ( get Notification Builder (). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Foreground ( NOTIFICATION _ ID , Ġnotification ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoast ( A ik on Res . getString ( R . string . msg _ notification _ created )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠSTART _ STICK Y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Destroy () ") ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġis Running Ġ= Ġfalse ĊĠĠĠ Ġ} Ċ Ċ }