package Ġcom . google . firebase . quickstart . firebase storage . kotlin Ċ Ċ 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 . os . Build Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġandroid . util . Log Ċ import Ġcom . google . firebase . quickstart . firebase storage . R Ċ Ċ /** Ċ Ġ* ĠBase Ġclass Ġfor ĠServices Ġthat Ġkeep Ġtrack Ġof Ġthe Ġnumber Ġof Ġactive Ġjobs Ġand Ġself - stop Ġwhen Ġthe Ċ Ġ* Ġcount Ġis Ġzero . Ċ Ġ*/ Ċ abstract Ġclass ĠMy Base Task Service Ġ: ĠService () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġnum Tasks Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġval Ġmanager Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġget System Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtask Started () Ġ{ ĊĠĠĠĠĠĠĠ Ġchange NumberOf Tasks ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtask Completed () Ġ{ ĊĠĠĠĠĠĠĠ Ġchange NumberOf Tasks (- 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġprivate Ġfun Ġchange NumberOf Tasks ( delta : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" change NumberOf Tasks :$ num Tasks :$ delta ") ĊĠĠĠĠĠĠĠ Ġnum Tasks Ġ+= Ġdelta ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere Ġare Ġno Ġtasks Ġleft , Ġstop Ġthe Ġservice ĊĠĠĠĠĠĠĠ Ġif Ġ( num Tasks Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" stopping ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Default Channel () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSince Ġandroid ĠO re o Ġnotification Ġchannel Ġis Ġneeded . ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠNotification Channel ( CHANNEL _ ID _ DEFAULT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Default ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Manager . IMPORT ANCE _ DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . create Notification Channel ( channel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShow Ġnotification Ġwith Ġa Ġprogress Ġbar . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġshow Progress Notification ( caption : ĠString , Ġcompleted Units : ĠLong , Ġtotal Units : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġpercent Complete Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( total Units Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpercent Complete Ġ= Ġ( 1 0 0 Ġ* Ġcompleted Units Ġ/ Ġtotal Units ). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcreate Default Channel () ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠNotification Compat . Builder ( this , ĠCHAN NEL _ ID _ DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . ic _ file _ upload _ white _ 2 4 dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( getString ( R . string . app _ name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( caption ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Progress ( 1 0 0 , Ġpercent Complete , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set O ngo ing ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAuto Cancel ( false ) ĊĊĠĠĠĠĠĠĠ Ġmanager . notify ( PROGRESS _ NOTIFICATION _ ID , Ġbuilder . build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShow Ġnotification Ġthat Ġthe Ġactivity Ġfinished . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġshow Finished Notification ( caption : ĠString , Ġintent : ĠIntent , Ġsuccess : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠMake ĠPending Intent Ġfor Ġnotification ĊĠĠĠĠĠĠĠ Ġval Ġpending Intent Ġ= ĠPending Intent . getActivity ( this , Ġ 0 Ġ/* Ġrequest Code Ġ*/, Ġintent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĊĠĠĠĠĠĠĠ Ġval Ġicon Ġ= Ġif Ġ( success ) ĠR . drawable . ic _ check _ white _ 2 4 Ġelse ĠR . drawable . ic _ error _ white _ 2 4 dp ĊĊĠĠĠĠĠĠĠ Ġcreate Default Channel () ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠNotification Compat . Builder ( this , ĠCHAN NEL _ ID _ DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( icon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( getString ( R . string . app _ name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( caption ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAuto Cancel ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( pending Intent ) ĊĊĠĠĠĠĠĠĠ Ġmanager . notify ( FINISHED _ NOTIFICATION _ ID , Ġbuilder . build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDis miss Ġthe Ġprogress Ġnotification . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġdismiss Progress Notification () Ġ{ ĊĠĠĠĠĠĠĠ Ġmanager . cancel ( PROGRESS _ NOTIFICATION _ ID ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCHAN NEL _ ID _ DEFAULT Ġ= Ġ" default " ĊĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠPROG RESS _ NOTIFICATION _ ID Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠFIN ISHED _ NOTIFICATION _ ID Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" My Base Task Service " ĊĠĠĠ Ġ} Ċ } Ċ