/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠGoogle ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" DE PREC ATION ") Ċ Ċ package Ġcom . google . android . apps . mu ze i . legacy Ċ Ċ import Ġandroid . app . Notification Channel Ċ import Ġandroid . app . Notification Manager Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Component Name Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . os . Build Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġandroidx . core . app . Notification Manager Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . content . edit Ċ import Ġandroidx . core . net . to Uri Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . navigation . Nav Deep Link Builder Ċ import Ġcom . google . android . apps . mu ze i . api . Mu ze i Art Source Ċ import Ġcom . google . android . apps . mu ze i . settings . Prefs Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġnet . nur ik . roman . mu ze i . R Ċ Ċ class ĠLegacy Source Package Listener ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġapplication Context : ĠContext Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Legacy Source Package " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP REF _ LAST _ NOT IFI ED Ġ= Ġ" legacy _ last _ not ified " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNOT IFICATION _ CHANNEL Ġ= Ġ" legacy " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNOT IFICATION _ ID Ġ= Ġ 1 9 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNOT IFICATION _ SUM MARY _ TAG Ġ= Ġ" summary " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNOT IFICATION _ GROUP _ KEY Ġ= Ġ" legacy " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġval Ġunsupported Source Count : ĠMutable LiveData < Int > Ġ= ĠMutable LiveData () ĊĊĠĠĠ Ġprivate Ġval Ġlarge Icon Size Ġ= Ġapplication Context . resources . get Dimension Pixel Size ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . dim en . notification _ large _ icon _ height ) ĊĠĠĠ Ġprivate Ġvar Ġlast Not ified Sources Ġ= Ġmutable Set Of < Source Info >() ĊĠĠĠ Ġprivate Ġval Ġprefs Ġ= ĠP refs . get SharedPreferences ( application Context ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġprefs . getString Set ( PRE F _ LAST _ NOT IFI ED , Ġmutable Set Of ()) ?. forEach Ġ{ ĠpackageName Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Not ified Sources . add ( Source Info ( packageName )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( last Not ified Sources . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . Main . immediate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunsupported Source Count . value Ġ= Ġlast Not ified Sources . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġregistered Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval Ġsource Package Change Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent ?. data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġintent . data ?. scheme Specific Part ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe Ġsources Ġfrom Ġthe Ġchanged Ġpackage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build Config . DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Package Ġ$ packageName Ġchanged ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Legacy Sources () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Listening () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( registered ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠRegister Ġfor Ġpackage Ġchange Ġevents ĊĠĠĠĠĠĠĠ Ġval Ġpackage Change Filter Ġ= ĠIntent Filter (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Data Scheme (" package ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Intent . ACTION _ PACKAGE _ AD DED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Intent . ACTION _ PACKAGE _ CHANGED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Intent . ACTION _ PACKAGE _ REPL AC ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Intent . ACTION _ PACKAGE _ RE MOVED ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġapplication Context . register Receiver ( source Package Change Receiver , Ġpackage Change Filter ) ĊĠĠĠĠĠĠĠ Ġregistered Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġquery Legacy Sources () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġquery Legacy Sources () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Intent Ġ= ĠIntent ( Mu ze i Art Source . ACTION _ MU ZE I _ ART _ SOURCE ) ĊĠĠĠĠĠĠĠ Ġval Ġpm Ġ= Ġapplication Context . package Manager ĊĠĠĠĠĠĠĠ Ġval Ġresolve Infos Ġ= Ġpm . query Intent Services ( query Intent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . GET _ META _ DATA ) ĊĠĠĠĠĠĠĠ Ġval Ġlegacy Sources Ġ= Ġmutable Set Of < Source Info >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( ri Ġin Ġresolve Infos ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġri . service Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info ?. metaData ?. containsKey (" replacement ") Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSkip ĠMu ze i Art Sources Ġthat Ġhave Ġa Ġreplacement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build Config . DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlegacy Source Ġ= ĠComponent Name ( ri . service Info . packageName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġri . service Info . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Found Ġlegacy Ġsource Ġ$ legacy Source ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Info Ġ= ĠSource Info ( ri . service Info . packageName ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġinfo . application Info . load Label ( pm ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Ġ= Ġgenerate Source Image ( info . application Info . load Icon ( pm )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlegacy Sources . add ( source Info ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġunsupported Source Count . value Ġ= Ġlegacy Sources . size ĊĠĠĠĠĠĠĠ Ġif Ġ( last Not ified Sources Ġ== Ġlegacy Sources ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNothing Ġchanged , Ġso Ġthere 's Ġnothing Ġto Ġupdate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnotification Manager Ġ= Ġapplication Context . getSystem Service ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCancel Ġthe Ġnotification Ġassociated Ġwith Ġsources Ġthat Ġhave Ġsince Ġbeen Ġremoved ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremoved Packages Ġ= Ġlast Not ified Sources . filter Not Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġin Ġlegacy Sources ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . packageName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . active Notifications . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . id Ġ== ĠNOT IFICATION _ ID Ġ&& Ġit . tag Ġin Ġremoved Packages ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ Ġsb n Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . cancel ( sb n . tag , Ġsb n . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlast Not ified Sources Ġ= Ġlegacy Sources ĊĠĠĠĠĠĠĠ Ġprefs . edit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput String Set ( PRE F _ LAST _ NOT IFI ED , Ġlast Not ified Sources . map Ġ{ Ġit . packageName Ġ}. toSet ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( legacy Sources . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere 's Ġno ĠLegacy ĠS ources , Ġcancel Ġany Ġsummary Ġnotification Ġstill Ġpresent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . cancel ( NOTIFICATION _ SUM MARY _ TAG , ĠNOT IFICATION _ ID ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Notification Channel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Intent Ġ= ĠNav Deep Link Builder ( application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Graph ( R . navigation . main _ navigation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Destination ( R . id . main _ choose _ provider ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Pending Intent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlearn More Pending Intent Ġ= ĠPending Intent . getActivity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( Intent . ACTION _ VIEW , ĠLegacy Source Manager . LE ARN _ MORE _ LINK ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Flags ( Intent . FLAG _ ACTIVITY _ NEW _ TASK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSend Ġa Ġnotification Ġfor Ġeach ĠLegacy ĠSource ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( info Ġin Ġlegacy Sources ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsend Feedback Pending Intent Ġ= ĠPending Intent . getActivity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( Intent . ACTION _ VIEW , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// play . google . com / store / apps / details ? id =${ info . packageName }". to Uri ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Ġ= ĠNotification Compat . Builder ( application Context , ĠNOT IFICATION _ CHANNEL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . ic _ stat _ mu ze i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setColor ( Context Compat . getColor ( application Context , ĠR . color . notification )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( application Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . legacy _ notification _ title , Ġinfo . title )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( application Context . getString ( R . string . legacy _ notification _ text )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( content Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setStyle ( Notification Compat . Big TextStyle (). big Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . getString ( R . string . legacy _ notification _ text ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Large Icon ( info . icon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Group ( NOTIFICATION _ GROUP _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Local Only ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Priority ( Notification Compat . PRIORITY _ DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Defaults ( Notification Compat . DEFAULT _ ALL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Only Alert Once ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addAction ( Notification Compat . Action . Builder ( R . drawable . ic _ notif _ info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . getString ( R . string . legacy _ action _ learn _ more ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlearn More Pending Intent ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addAction ( Notification Compat . Action . Builder ( R . drawable . ic _ notif _ feedback , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . getString ( R . string . legacy _ action _ send _ feedback ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Feedback Pending Intent ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . notify ( info . packageName , ĠNOT IFICATION _ ID , Ġnotification ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSend Ġa Ġsummary Ġnotification ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsummary Text Ġ= Ġapplication Context . resources . get Quantity String ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . plurals . legacy _ summary _ text , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlegacy Sources . size , Ġlegacy Sources . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsummary Notification Ġ= ĠNotification Compat . Builder ( application Context , ĠNOT IFICATION _ CHANNEL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . ic _ stat _ mu ze i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setColor ( Context Compat . getColor ( application Context , ĠR . color . notification )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( application Context . getString ( R . string . legacy _ summary _ title )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( summary Text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( content Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Show When ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setStyle ( Notification Compat . Inbox Style () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Summary Text ( summary Text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( info Ġin Ġlegacy Sources ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . add Line ( info . title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Group ( NOTIFICATION _ GROUP _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Group Summary ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Local Only ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Priority ( Notification Compat . PRIORITY _ DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Defaults ( Notification Compat . DEFAULT _ ALL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Only Alert Once ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addAction ( Notification Compat . Action . Builder ( R . drawable . ic _ notif _ info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . getString ( R . string . legacy _ action _ learn _ more ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlearn More Pending Intent ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . notify ( NOTIFICATION _ SUM MARY _ TAG , ĠNOT IFICATION _ ID , Ġsummary Notification ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Source Image ( image : ĠDrawable ?) Ġ= Ġimage ?. run Ġ{ ĊĠĠĠĠĠĠĠ ĠBitmap . create Bitmap ( large Icon Size , Ġlarge Icon Size , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap . Config . ARGB _ 8 8 8 8 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage . setBounds ( 0 , Ġ 0 , Ġlarge Icon Size , Ġlarge Icon Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage . draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . O ) ĊĠĠĠ Ġprivate Ġfun Ġcreate Notification Channel () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnotification Manager Ġ= ĠNotification Manager Compat . from ( application Context ) ĊĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠNotification Channel ( NOTIFICATION _ CHANNEL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . getString ( R . string . legacy _ notification _ channel _ name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Manager . IMPORT ANCE _ DEFAULT ) ĊĠĠĠĠĠĠĠ Ġnotification Manager . create Notification Channel ( channel ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Listening () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! registered ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġregistered Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġapplication Context . unregister Receiver ( source Package Change Receiver ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġdata Ġclass ĠSource Info ( val ĠpackageName : ĠString ) Ġ{ ĊĠĠĠ Ġlateinit Ġvar Ġtitle : ĠString ĊĠĠĠ Ġvar Ġicon : ĠBitmap ? Ġ= Ġnull Ċ } Ċ