@ file : Jvm Name (" Notification Helper ") Ċ Ċ package Ġcom . z ulip mobile . notifications Ċ Ċ import Ġandroid . app . Notification Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . text . Sp ann able Ċ import Ġandroid . text . Sp ann able String Ċ import Ġandroid . text . style . Style Span Ċ import Ġandroid . util . Log Ċ import Ġandroid . util . Typed Value Ċ import Ġcom . z ulip mobile . R Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjava . net . URL Ċ import Ġjava . util .* Ċ Ċ @ Jvm Field Ċ val ĠTAG Ġ= Ġ" Z ulip Not if " Ċ Ċ /** Ċ Ġ* ĠThe ĠZ ulip Ġmessages Ġwe 're Ġshowing Ġas Ġa Ġnotification , Ġgrouped Ġby Ġconversation . Ċ Ġ* Ċ Ġ* ĠEach Ġkey Ġidentifies Ġa Ġconversation ; Ġsee Ġ[ build Key String ]. Ċ Ġ* Ċ Ġ* ĠEach Ġvalue Ġis Ġthe Ġmessages Ġin Ġthe Ġconversation , Ġin Ġthe Ġorder Ġwe Ċ Ġ* Ġreceived Ġthem . Ċ Ġ* Ċ Ġ* ĠWhen Ġwe Ġstart Ġshowing Ġa Ġseparate Ġnotification Ġfor Ġeach Ġ Ġ[ Identity ], Ċ Ġ* Ġthis Ġtype Ġwill Ġrepresent Ġthe Ġmessages Ġfor Ġjust Ġone Ġ[ Identity ]. Ċ Ġ* ĠSee Ġalso Ġ[ Conversation Map ]. Ċ Ġ*/ Ċ open Ġclass ĠBy Conversation Map Ġ: ĠLinkedHashMap < String , ĠMutable List < Message F cm Message >>() Ċ Ċ /** Ċ Ġ* ĠAll ĠZ ulip Ġmessages Ġwe 're Ġshowing Ġin Ġnotifications . Ċ Ġ* Ċ Ġ* ĠCurrently Ġan Ġalias Ġof Ġ[ By Conversation Map ]. Ġ ĠWhen Ġwe Ġstart Ġshowing Ċ Ġ* Ġa Ġseparate Ġnotification Ġfor Ġeach Ġ[ Identity ], Ġthis Ġtype Ġwill Ġbecome Ċ Ġ* Ġa Ġcollection Ġof Ġone Ġ[ By Conversation Map ] Ġper Ġ[ Identity ]. Ċ Ġ*/ Ċ class ĠCon versation Map Ġ: ĠBy Conversation Map () Ċ Ċ fun Ġfetch Bitmap ( url : ĠURL ): ĠBitmap ? Ġ{ ĊĠĠĠ ĠLog . i ( TAG , Ġ" GA FT . fetch : ĠGetting Ġgr avatar Ġfrom Ġurl : Ġ$ url ") ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġurl . open Connection () ĊĠĠĠĠĠĠĠ Ġconnection . use Caches Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ( connection . content Ġas ? ĠInputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĠBitmap Factory . decode Stream ( it ) Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" ERROR : Ġ$ e ") ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġsized URL ( context : ĠContext , Ġurl : ĠURL , Ġdp Size : ĠFloat ): ĠURL Ġ{ ĊĠĠĠ Ġ// ĠFrom Ġhttp :// stackoverflow . com / questions / 4 6 0 5 5 2 7 / ĊĠĠĠ Ġval Ġr Ġ= Ġcontext . resources ĊĠĠĠ Ġval Ġpx Ġ= ĠTyped Value . apply Dimension ( Typed Value . COMPLEX _ UNIT _ DIP , ĊĠĠĠĠĠĠĠ Ġdp Size , Ġr . display Metrics ) ĊĠĠĠ Ġval Ġquery Ġ= Ġif Ġ( url . query Ġ!= Ġnull ) Ġ"${ url . query }& s =$ px " Ġelse Ġ" s =$ px " ĊĠĠĠ Ġreturn ĠURL ( url , Ġ"? $ query ") Ċ } Ċ Ċ private Ġfun Ġextract Name ( key : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġkey . split (": ")[ 0 ] Ċ } Ċ Ċ fun Ġbuild Notification Content ( con versations : ĠBy Conversation Map , Ġin box Style : ĠNotification . Inbox Style , ĠmContext : ĠContext ) Ġ{ ĊĠĠĠ Ġfor Ġ(( key , Ġmessages ) Ġin Ġconversations ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġextract Name ( key ) ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠSp ann able String ( String . format ( Locale . EN GL ISH , Ġ"% s % s : Ġ% s ", Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmContext . resources . get Quantity String ( R . plurals . messages , Ġmessages . size , Ġmessages . size ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessages [ messages . size Ġ- Ġ 1 ]. content )) ĊĠĠĠĠĠĠĠ Ġsb . set Span ( Style Span ( android . graphics . Type face . BOLD ), Ġ 0 , Ġname . length , ĠSp ann able . SPAN _ EXCL USIVE _ EXCL USIVE ) ĊĠĠĠĠĠĠĠ Ġin box Style . add Line ( sb ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġextract Total Messages Count ( con versations : ĠBy Conversation Map ): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġtotal Number Ġ= Ġ 0 ĊĠĠĠ Ġfor Ġ(( _, Ġvalue ) Ġin Ġconversations ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtotal Number Ġ+= Ġvalue . size ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtotal Number Ċ } Ċ Ċ /** Ċ Ġ* ĠForm ats Ġ- Ċ Ġ* Ġstream Ġmessage Ġ- ĠfullName : stream Name :' stream ' Ċ Ġ* Ġgroup Ġmessage Ġ- ĠfullName : Recipients :' group ' Ċ Ġ* Ġprivate Ġmessage Ġ- ĠfullName : Email :' private ' Ċ Ġ*/ Ċ private Ġfun Ġbuild Key String ( fc m Message : ĠMessage F cm Message ): ĠString Ġ{ ĊĠĠĠ Ġval Ġrecipient Ġ= Ġf cm Message . recipient ĊĠĠĠ Ġreturn Ġwhen Ġ( recipient ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠRe cipient . Stream Ġ-> ĠString . format ("% s :% s : stream ", Ġf cm Message . sender . fullName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecipient . stream ) ĊĠĠĠĠĠĠĠ Ġis ĠRe cipient . Group Pm Ġ-> ĠString . format ("% s :% s : group ", Ġf cm Message . sender . fullName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecipient . get Pm Users String ()) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠString . format ("% s :% s : private ", Ġf cm Message . sender . fullName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf cm Message . sender . email ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġextract Names ( con versations : ĠBy Conversation Map ): ĠArrayList < String > Ġ{ ĊĠĠĠ Ġval Ġnames Ġ= Ġarray ListOf < String >() ĊĠĠĠ Ġfor Ġ(( key ) Ġin Ġconversations ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnames . add ( key . split (": ")[ 0 ]) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnames Ċ } Ċ Ċ fun Ġadd Conversation ToMap ( fc m Message : ĠMessage F cm Message , Ġconversations : ĠCon versation Map ) Ġ{ ĊĠĠĠ Ġval Ġkey Ġ= Ġbuild Key String ( fc m Message ) ĊĠĠĠ Ġvar Ġmessages : ĠMutable List < Message F cm Message >? Ġ= Ġconversations [ key ] ĊĠĠĠ Ġif Ġ( messages Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmessages Ġ= ĠArrayList () ĊĠĠĠ Ġ} ĊĠĠĠ Ġmessages . add ( fc m Message ) ĊĠĠĠ Ġconversations [ key ] Ġ= Ġmessages Ċ } Ċ Ċ fun Ġremove Messages From Map ( con versations : ĠCon versation Map , Ġremove F cm Message : ĠRemove F cm Message ) Ġ{ ĊĠĠĠ Ġ// ĠWe Ġdon 't Ġhave Ġthe Ġinformation Ġto Ġcompute Ġwhat Ġkey Ġwe Ġo ught Ġto Ġfind Ġeach Ġmessage Ġunder , ĊĠĠĠ Ġ// Ġso Ġjust Ġwalk Ġthe Ġwhole Ġthing . Ġ ĠIf Ġthe Ġuser Ġhas Ġ> 1 0 0 Ġnotifications , Ġthis Ġlinear Ġscan ĊĠĠĠ Ġ// Ġwon 't Ġbe Ġtheir Ġworst Ġproblem Ġanyway ... ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠTODO Ġre design Ġthis Ġwhole Ġdata Ġstructure , Ġfor Ġmany Ġreasons . ĊĠĠĠ Ġval Ġit Ġ= Ġconversations . values . iterator () ĊĠĠĠ Ġwhile Ġ( it . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessages : ĠMutable List < Message F cm Message > Ġ= Ġit . next () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġmessages . indices . reversed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( remove F cm Message . message Ids . contains ( messages [ i ]. z ulip MessageId )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessages . remove At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( messages . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . remove () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġclear Con versations ( con versations : ĠCon versation Map ) Ġ{ ĊĠĠĠ Ġconversations . clear () Ċ } Ċ