@ file : Jvm Name (" FC MP ush Notifications ") Ċ Ċ package Ġcom . z ulip mobile . notifications Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Notification Ċ import Ġandroid . app . Notification Channel Ċ import Ġandroid . app . Notification Manager Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . media . Audio Attributes Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . service . notification . StatusBar Notification Ċ import Ġandroid . util . Log Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġandroidx . core . app . Notification Manager Compat Ċ import Ġandroidx . core . app . Person Ċ import Ġandroidx . core . graphics . drawable . Icon Compat Ċ import Ġcom . facebook . react . React Application Ċ import Ġcom . z ulip mobile . Build Config Ċ import Ġcom . z ulip mobile . R Ċ import Ġcom . z ulip mobile . Z Log Ċ import Ġme . le olin . shortcut bad ger . Shortcut Bad ger Ċ Ċ private Ġval ĠCHAN NEL _ ID Ġ= Ġ" default " Ċ private Ġval ĠNOT IFICATION _ ID Ġ= Ġ 4 3 5 Ċ Ċ @ Jvm Field Ċ val ĠACTION _ CLEAR Ġ= Ġ" ACTION _ CLEAR " Ċ Ċ @ Jvm Field Ċ val ĠEX TRA _ NOTIFICATION _ DATA Ġ= Ġ" data " Ċ Ċ fun Ġcreate Notification Channel ( context : ĠContext ) Ġ{ ĊĠĠĠ Ġval Ġaudio Attr : ĠAudio Attributes Ġ= ĠAudio Attributes . Builder () ĊĠĠĠĠĠĠĠ Ġ. set Usage ( Audio Attributes . USAGE _ NOTIFICATION ). build () ĊĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= Ġ 2 6 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġcontext . getString ( R . string . notification _ channel _ name ) ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" Wrong Constant ") ĊĠĠĠĠĠĠĠ Ġ// ĠAndroid ĠStudio 's Ġlinter Ġdemand s ĠNotification Manager . IMPORT ANCE _* Ġand Ġreject s Ġany Ġother ĊĠĠĠĠĠĠĠ Ġ// Ġvalue , Ġhence Ġusing Ġ" Sup ress Lint ". ĊĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Channel ( CHANNEL _ ID , Ġname , ĠNotification Manager Compat . IMPORT ANCE _ HIGH ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable Lights ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable V ibration ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Sound ( get Notification Sound Uri (), Ġaudio Attr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠNotification Manager Compat . from ( context ). create Notification Channel ( channel ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġlog Notification Data ( msg : ĠString , Ġdata : ĠBundle ) Ġ{ ĊĠĠĠ Ġdata . keySet () Ġ// ĠHas Ġthe Ġside Ġeffect Ġof Ġmaking Ġ` data . toString ` Ġmore Ġinform ative . ĊĠĠĠ ĠLog . v ( TAG , Ġ"$ msg : Ġ$ data ") Ċ } Ċ Ċ internal Ġfun Ġon Received ( context : ĠContext , Ġmap Data : ĠMap < String , ĠString >) Ġ{ ĊĠĠĠ Ġ// ĠTODO Ġrefactor Ġto Ġnot Ġneed Ġthis ; Ġreflect s Ġa Ġj ux tap osition Ġof ĠF CM Ġwith Ġold ĠG CM Ġinterfaces . ĊĠĠĠ Ġval Ġdata Ġ= ĠBundle () ĊĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġmap Data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata . putString ( key , Ġvalue ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġlog Notification Data (" notif Ġreceived ", Ġdata ) ĊĊĠĠĠ Ġval Ġf cm Message : ĠF cm Message ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġf cm Message Ġ= ĠF cm Message . from F cm Data ( map Data ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠF cm Message ParseException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠZ Log . w ( TAG , Ġe ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( fc m Message Ġis ĠMessage F cm Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Notification ( context , Ġf cm Message ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( fc m Message Ġis ĠRemove F cm Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Notification ( context , Ġf cm Message ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġremove Notification ( context : ĠContext , Ġf cm Message : ĠRemove F cm Message ) Ġ{ ĊĠĠĠ Ġval Ġstatus Bar Notifications Ġ= Ġget Active Notifications ( context ) Ġ?: Ġreturn ĊĠĠĠ Ġval Ġgroup Key Ġ= Ġextract Group Key ( fc m Message . identity ) ĊĠĠĠ Ġ// ĠFind Ġany Ġconversations Ġwe Ġcan Ġcancel Ġthe Ġnotification Ġfor . ĊĠĠĠ Ġ// ĠThe ĠAPI Ġdoesn 't Ġl end Ġitself Ġto Ġremoving Ġindividual Ġmessages Ġas ĊĠĠĠ Ġ// Ġthey 're Ġread , Ġso Ġwe Ġwait Ġuntil Ġwe 're Ġready Ġto Ġremove Ġthe Ġwhole ĊĠĠĠ Ġ// Ġconversation 's Ġnotification . ĊĠĠĠ Ġ// ĠSee : Ġhttps :// github . com / z ulip / z ulip - mobile / pull / 4 8 4 2 # pull request review - 7 2 5 8 1 7 9 0 9 ĊĠĠĠ Ġfor Ġ( status Bar Notification Ġin Ġstatus Bar Notifications ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠEach Ġstatus Bar Notification Ġrepresents Ġone ĠZ ulip Ġconversation . ĊĠĠĠĠĠĠĠ Ġval Ġnotification Ġ= Ġstatus Bar Notification . notification ĊĠĠĠĠĠĠĠ Ġval Ġlast MessageId Ġ= Ġnotification . extras . getInt (" last Z ulip MessageId ") ĊĠĠĠĠĠĠĠ Ġif Ġ( fc m Message . message Ids . contains ( last MessageId )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġlatest ĠZ ulip Ġmessage Ġin Ġthis Ġconversation Ġwas Ġread . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThat 's Ġour Ġc ue Ġto Ġcancel Ġthe Ġnotification Ġfor Ġthe Ġconversation . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Manager Compat . from ( context ). cancel ( status Bar Notification . tag , Ġstatus Bar Notification . id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġcounter Ġ= Ġ 0 ĊĠĠĠ Ġfor Ġ( status Bar Notification Ġin Ġstatus Bar Notifications ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( status Bar Notification . notification . group Ġ== Ġgroup Key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcounter ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( counter Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcounter Ġwill Ġbe Ġ 2 Ġonly Ġwhen Ġsummary Ġnotification Ġand Ġlast Ġnotification Ġare ĊĠĠĠĠĠĠĠ Ġ// Ġpresent ; Ġin Ġthis Ġcase , Ġwe Ġremove Ġsummary Ġnotification . ĊĠĠĠĠĠĠĠ ĠNotification Manager Compat . from ( context ). cancel ( group Key , ĠNOT IFICATION _ ID ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġcreate View Pending Intent ( fc m Message : ĠMessage F cm Message , Ġcontext : ĠContext ): ĠPending Intent Ġ{ ĊĠĠĠ Ġval Ġuri Ġ= ĠUri . from Parts (" z ulip ", Ġ" msgid :${ fc m Message . z ulip MessageId }", Ġ"") ĊĠĠĠ Ġval Ġview Intent Ġ= ĠIntent ( Intent . ACTION _ VIEW , Ġuri , Ġcontext , ĠNotification Intent Service :: class . java ) ĊĠĠĠ Ġview Intent . putExtra ( EXTRA _ NOTIFICATION _ DATA , Ġf cm Message . data For Open ()) ĊĠĠĠ Ġreturn ĠPending Intent . getService ( context , Ġ 0 , Ġview Intent , Ġ 0 ) Ċ } Ċ Ċ private Ġfun Ġcreate Dismiss Action ( context : ĠContext ): ĠNotification Compat . Action Ġ{ ĊĠĠĠ Ġval Ġdismiss Intent Ġ= ĠIntent ( context , ĠNotification Intent Service :: class . java ) ĊĠĠĠ Ġdismiss Intent . action Ġ= ĠACTION _ CLEAR ĊĠĠĠ Ġval Ġpi Dismiss Ġ= ĠPending Intent . getService ( context , Ġ 0 , Ġdismiss Intent , Ġ 0 ) ĊĠĠĠ Ġreturn ĠNotification Compat . Action ( ĊĠĠĠĠĠĠĠ Ġandroid . R . drawable . ic _ menu _ close _ clear _ cancel , ĊĠĠĠĠĠĠĠ Ġ" Clear ", ĊĠĠĠĠĠĠĠ Ġpi Dismiss ĊĠĠĠ Ġ) Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ param Ġcontext Ċ Ġ* Ġ@ param Ġconversation Key ĠUnique ĠKey Ġidentifying Ġa Ġconversation , Ġthe Ġcurrent Ċ Ġ* Ġimplementation Ġassumes Ġthat Ġeach Ġnotification Ġcorresponds Ġto Ġ 1 Ġand Ġonly Ġ 1 Ċ Ġ* Ġconversation . Ċ Ġ* Ċ Ġ* ĠA Ġconversation Ġcan Ġbe Ġany Ġof : ĠTopic Ġin ĠStream , ĠGroup PM Ġor ĠPM Ġfor Ġa Ċ Ġ* Ġspecific Ġuser Ġin Ġa Ġspecific Ġrealm . Ċ Ġ*/ Ċ private Ġfun Ġget Active Notification ( context : ĠContext , Ġconversation Key : ĠString ): ĠNotification ? Ġ{ ĊĠĠĠ Ġ// Ġactive Notifications Ġare Ġnot Ġavailable Ġin ĠNotification Compat Manager ĊĠĠĠ Ġ// ĠHence Ġwe Ġhave Ġto Ġuse Ġinstance Ġof ĠNotification Manager . ĊĠĠĠ Ġval Ġnotification Manager Ġ= ĊĠĠĠĠĠĠĠ Ġcontext . getSystem Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ? ĊĊĠĠĠ Ġval Ġactive StatusBar Notifications Ġ= Ġnotification Manager ?. active Notifications ĊĠĠĠ Ġif Ġ( active StatusBar Notifications Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( status Bar Notification Ġin Ġactive StatusBar Notifications ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Bar Notification . tag Ġ== Ġconversation Key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstatus Bar Notification . notification ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull Ċ } ĊĊ Ċ private Ġfun Ġget Active Notifications ( context : ĠContext ): ĠArray < StatusBar Notification >? Ġ= ĊĠĠĠ Ġ( context . getSystem Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ?) ?. active Notifications Ċ Ċ private Ġfun Ġcreate Summary Notification ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġf cm Message : ĠMessage F cm Message , ĊĠĠĠ Ġgroup Key : ĠString Ċ ): ĠNotification Compat . Builder Ġ{ ĊĠĠĠ Ġval Ġrealm Uri Ġ= Ġf cm Message . identity . realm Uri . toString () ĊĠĠĠ Ġreturn ĠNotification Compat . Builder ( context , ĠCHAN NEL _ ID ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġcolor Ġ= Ġcontext . getColor ( R . color . brand Color ) ĊĠĠĠĠĠĠĠ Ġif Ġ( Build Config . DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Small Icon ( R . mip map . ic _ launcher ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Small Icon ( R . drawable . z ulip _ notification ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset Style ( Notification Compat . Inbox Style () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Summary Text ( realm Uri ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġset Group ( group Key ) ĊĠĠĠĠĠĠĠ Ġset Group Summary ( true ) ĊĠĠĠĠĠĠĠ Ġset Auto Cancel ( true ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġextract Group Key ( identity : ĠIdentity ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġ"${ identity . realm Uri . toString ()} | ${ identity . userId }" Ċ } Ċ Ċ private Ġfun Ġextract Conversation Key ( fc m Message : ĠMessage F cm Message ): ĠString Ġ{ ĊĠĠĠ Ġval Ġgroup Key Ġ= Ġextract Group Key ( fc m Message . identity ) ĊĠĠĠ Ġval Ġconversation Ġ= Ġwhen Ġ( fc m Message . recipient ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠRe cipient . Stream Ġ-> Ġ" stream :${ fc m Message . recipient . stream }\ u 0 0 0 0 ${ fc m Message . recipient . topic }" ĊĠĠĠĠĠĠĠ Ġis ĠRe cipient . Group Pm Ġ-> Ġ" group PM :${ fc m Message . recipient . pm Users . toString () }" ĊĠĠĠĠĠĠĠ Ġis ĠRe cipient . Pm Ġ-> Ġ" private :${ fc m Message . sender . id }" ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġ"$ group Key |$ conversation " Ċ } Ċ Ċ private Ġfun Ġupdate Notification ( ĊĠĠĠ Ġcontext : ĠContext , Ġf cm Message : ĠMessage F cm Message ) Ġ{ ĊĠĠĠ Ġval Ġself User Ġ= ĠPerson . Builder (). setName ( context . getString ( R . string . self User )). build () ĊĠĠĠ Ġval Ġsender Ġ= ĠPerson . Builder () ĊĠĠĠĠĠĠĠ Ġ. setName ( fc m Message . sender . fullName ) ĊĠĠĠĠĠĠĠ Ġ. setIcon ( Icon Compat . create With Bitmap ( fetch Bitmap ( fc m Message . sender . avatar URL ))) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġval Ġtitle Ġ= Ġwhen Ġ( fc m Message . recipient ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠRe cipient . Stream Ġ-> Ġ"# ${ fc m Message . recipient . stream } Ġ> Ġ${ fc m Message . recipient . topic }" ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġuse Ġproper Ġtitle Ġfor ĠGroup PM , Ġwe Ġwill Ġneed ĊĠĠĠĠĠĠĠ Ġ// Ġto Ġhave Ġa Ġway Ġto Ġget Ġnames Ġof ĠPM Ġusers Ġhere . ĊĠĠĠĠĠĠĠ Ġis ĠRe cipient . Group Pm Ġ-> Ġcontext . resources . get Quantity String ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . plurals . group _ pm , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf cm Message . recipient . pm Users . size Ġ- Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf cm Message . sender . fullName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf cm Message . recipient . pm Users . size Ġ- Ġ 2 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġis ĠRe cipient . Pm Ġ-> Ġf cm Message . sender . fullName ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġis Group Conversation Ġ= Ġwhen Ġ( fc m Message . recipient ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠRe cipient . Stream Ġ-> Ġtrue ĊĠĠĠĠĠĠĠ Ġis ĠRe cipient . Group Pm Ġ-> Ġtrue ĊĠĠĠĠĠĠĠ Ġis ĠRe cipient . Pm Ġ-> Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġgroup Key Ġ= Ġextract Group Key ( fc m Message . identity ) ĊĠĠĠ Ġval Ġconversation Key Ġ= Ġextract Conversation Key ( fc m Message ) ĊĠĠĠ Ġval Ġnotification Ġ= Ġget Active Notification ( context , Ġconversation Key ) ĊĊĠĠĠ Ġval Ġmessaging Style Ġ= Ġnotification ?. let Ġ{ ĊĠĠĠĠĠĠĠ ĠNotification Compat . Messaging Style . extract Messaging Style From Notification ( it ) ĊĠĠĠ Ġ} Ġ?: ĠNotification Compat . Messaging Style ( self User ) ĊĠĠĠ Ġmessaging Style ĊĠĠĠĠĠĠĠ Ġ. set Conversation Title ( title ) ĊĠĠĠĠĠĠĠ Ġ. set Group Conversation ( is Group Conversation ) ĊĠĠĠĠĠĠĠ Ġ. addMessage ( fc m Message . content , Ġf cm Message . time Ms , Ġsender ) ĊĊĠĠĠ Ġval Ġmessage Count Ġ= Ġmessaging Style . messages . size ĊĊĠĠĠ Ġval Ġbuilder Ġ= ĠNotification Compat . Builder ( context , ĠCHAN NEL _ ID ) ĊĠĠĠ Ġbuilder . apply Ġ{ ĊĠĠĠĠĠĠĠ Ġcolor Ġ= Ġcontext . getColor ( R . color . brand Color ) ĊĠĠĠĠĠĠĠ Ġif Ġ( Build Config . DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Small Icon ( R . mip map . ic _ launcher ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Small Icon ( R . drawable . z ulip _ notification ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset Auto Cancel ( true ) ĊĠĠĠĠĠĠĠ Ġset Style ( messaging Style ) ĊĠĠĠĠĠĠĠ Ġset Group ( group Key ) ĊĠĠĠĠĠĠĠ Ġset Sound ( get Notification Sound Uri ()) ĊĠĠĠĠĠĠĠ Ġset Content Intent ( create View Pending Intent ( fc m Message , Ġcontext )) ĊĠĠĠĠĠĠĠ Ġset Number ( message Count ) ĊĊĠĠĠĠĠĠĠ Ġval Ġextra Data Ġ= ĠBundle () ĊĠĠĠĠĠĠĠ Ġextra Data . put Int (" last Z ulip MessageId ", Ġf cm Message . z ulip MessageId ) ĊĠĠĠĠĠĠĠ Ġextras Ġ= Ġextra Data ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġsummary Notification Ġ= Ġcreate Summary Notification ( context , Ġf cm Message , Ġgroup Key ) ĊĊĠĠĠ ĠNotification Manager Compat . from ( context ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġuse Ġ` tag ` Ġparam Ġonly , Ġto Ġuniquely Ġidentify Ġnotifications , ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġhence Ġ` id ` Ġparam Ġis Ġprovided Ġas Ġan Ġarbitrary Ġconstant . ĊĠĠĠĠĠĠĠ Ġnotify ( group Key , ĠNOT IFICATION _ ID , Ġsummary Notification . build ()) ĊĠĠĠĠĠĠĠ Ġnotify ( conversation Key , ĠNOT IFICATION _ ID , Ġbuilder . build ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġget Notification Sound Uri (): ĠUri Ġ{ ĊĠĠĠ Ġ// ĠNote : ĠProvide Ġdefault Ġnotification Ġsound Ġuntil Ġwe Ġfound Ġa Ġgood Ġsound ĊĠĠĠ Ġ// Ġreturn ĠUri . parse ("${ Content Resolver . SCHEME _ ANDROID _ RESOURCE } ://${ context . packageName }/${ R . raw . z ulip }") ĊĠĠĠ Ġreturn ĠSettings . System . DEFAULT _ NOTIFICATION _ URI Ċ } Ċ Ċ internal Ġfun Ġon Opened ( application : ĠReact Application , Ġdata : ĠBundle ) Ġ{ ĊĠĠĠ Ġlog Notification Data (" notif Ġopened ", Ġdata ) ĊĠĠĠ Ġnotify React ( application , Ġdata ) ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ ĠShort cut Bad ger . remove Count ( application Ġas ĠContext ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠZ Log . e ( TAG , Ġe ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ