package Ġcom . z ulip mobile . notifications Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġjava . net . Malformed URLException Ċ import Ġjava . net . URL Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠAn Ġidentity Ġbelong ing Ġto Ġthis Ġuser Ġin Ġsome ĠZ ulip Ġorg / realm . Ċ Ġ*/ Ċ data Ġclass ĠIdentity ( ĊĠĠĠ Ġ/// ĠThe Ġserver 's Ġ` EXTERNAL _ HOST ` Ġsetting . Ġ ĠThis Ġis Ġa Ġhostname , ĊĠĠĠ Ġ/// Ġor Ġa Ġcolon - separated Ġhostname - plus - port . Ġ ĠFor Ġdocumentation , ĊĠĠĠ Ġ/// Ġsee Ġz ulip - server : z project / prod _ settings _ template . py Ġ. ĊĠĠĠ Ġval Ġserver Host : ĠString , ĊĊĠĠĠ Ġ/// ĠThe Ġrealm 's ĠID Ġwithin Ġthe Ġserver . ĊĠĠĠ Ġval Ġrealm Id : ĠInt , ĊĊĠĠĠ Ġ/// ĠThe Ġrealm 's Ġown ĠURL / URI . Ġ ĠThis Ġis Ġa Ġreal , Ġabsolute ĠURL Ġwhich Ġis ĊĠĠĠ Ġ/// Ġthe Ġbase Ġfor Ġall ĠURLs Ġa Ġclient Ġuses Ġwith Ġthis Ġrealm . Ġ ĠIt Ġcorresponds ĊĠĠĠ Ġ/// Ġto Ġ` realm _ uri ` Ġin Ġthe Ġ` server _ settings ` ĠAPI Ġresponse : ĊĠĠĠ Ġ/// ĠĠ Ġhttps :// z ulip . com / api / get - server - settings ĊĠĠĠ Ġval Ġrealm Uri : ĠURL , ĊĊĠĠĠ Ġ/// ĠThis Ġuser 's ĠID Ġwithin Ġthe Ġserver . Ġ ĠUseful Ġmainly Ġin Ġthe Ġcase Ġwhere ĊĠĠĠ Ġ/// Ġthe Ġuser Ġhas Ġmultiple Ġaccounts Ġin Ġthe Ġsame Ġorg . ĊĠĠĠ Ġval ĠuserId : ĠInt ? Ċ ) Ċ Ċ /** Ċ Ġ* ĠData Ġabout Ġthe ĠZ ulip Ġuser Ġthat Ġsent Ġa Ġmessage . Ċ Ġ*/ Ċ data Ġclass ĠSender ( ĊĠĠĠ Ġval Ġid : ĠInt , ĊĠĠĠ Ġval Ġemail : ĠString , ĊĠĠĠ Ġval Ġavatar URL : ĠURL , ĊĠĠĠ Ġval ĠfullName : ĠString Ċ ) Ċ Ċ /** Ċ Ġ* ĠData Ġidentifying Ġwhere Ġa ĠZ ulip Ġmessage Ġwas Ġsent . Ċ Ġ*/ Ċ sealed Ġclass ĠRe cipient Ġ{ ĊĠĠĠ Ġ/** ĠA Ġ 1 : 1 Ġprivate Ġmessage . Ġ ĠMust Ġhave Ġbeen Ġsent Ġto Ġthis Ġuser , Ġso Ġnothing Ġmore Ġto Ġsay . Ġ*/ ĊĠĠĠ Ġobject ĠP m Ġ: ĠRe cipient () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġgroup ĠPM . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġpm Users : Ġthe Ġuser ĠIDs Ġof Ġall Ġusers Ġin Ġthe Ġconversation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠGroup Pm ( val Ġpm Users : ĠSet < Int >) Ġ: ĠRe cipient () Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġget Pm Users String () Ġ= Ġpm Users . sorted (). join ToString ( separator =", ") Ġ{ Ġit . toString () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠA Ġstream Ġmessage . Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠStream ( val Ġstream : ĠString , Ġval Ġtopic : ĠString ) Ġ: ĠRe cipient () Ċ } Ċ Ċ /** Ċ Ġ* ĠParsed Ġversion Ġof Ġan ĠF CM Ġmessage , Ġof Ġany Ġtype . Ċ Ġ* Ċ Ġ* ĠThe Ġword Ġ" message " Ġcan Ġbe Ġconfusing Ġin Ġthis Ġcontext : Ċ Ġ* Ċ Ġ* Ġ Ġ* ĠF CM Ġdocs Ġsay Ġ" message " Ġto Ġrefer Ġto Ġone Ġof Ġthe Ġblobs Ġwe Ġreceive Ġover ĠF CM , Ċ Ġ* ĠĠĠ Ġa ka Ġa Ġ" data Ġnotification ". Ġ ĠOne Ġof Ġthese Ġmight Ġcorrespond Ġto Ġzero , Ġone , Ċ Ġ* ĠĠĠ Ġor Ġmore Ġactual Ġnotifications Ġwe Ġshow Ġin Ġthe ĠUI . Ċ Ġ* Ċ Ġ* Ġ Ġ* ĠA round ĠZ ulip Ġwe Ġof Ġcourse Ġsay Ġ" message " Ġall Ġthe Ġtime Ġto Ġmean Ġthe Ċ Ġ* ĠĠĠ Ġcentral Ġitem Ġin Ġthe Ġapp Ġmodel . Ċ Ġ* Ċ Ġ* ĠIn Ġour Ġnotification Ġcode Ġwe Ġoften Ġsay Ġ" F CM Ġmessage " Ġor Ġ" Z ulip Ġmessage " Ċ Ġ* Ġto Ġdis amb igu ate Ġbetween Ġthese Ġtwo . Ċ Ġ*/ Ċ sealed Ġclass ĠF cm Message Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfrom F cm Data ( data : ĠMap < String , ĠString >): ĠF cm Message Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val ĠeventType Ġ= Ġdata [" event "]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" message " Ġ-> ĠMessage F cm Message . from F cm Data ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" remove " Ġ-> ĠRemove F cm Message . from F cm Data ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġthrow ĠF cm Message ParseException (" missing Ġevent Ġtype ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠF cm Message ParseException (" unknown Ġevent Ġtype : Ġ$ eventType ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠParsed Ġversion Ġof Ġan ĠF CM Ġmessage Ġof Ġtype Ġ` message `. Ċ Ġ* Ċ Ġ* ĠThis Ġcorresponds Ġto Ġa ĠZ ulip Ġmessage Ġfor Ġwhich Ġthe Ġuser Ġwants Ġto Ċ Ġ* Ġsee Ġa Ġnotification . Ċ Ġ* Ċ Ġ* ĠThe Ġword Ġ" message " Ġcan Ġbe Ġconfusing Ġin Ġthis Ġcontext . Ċ Ġ* ĠSee Ġ` F cm Message ` Ġfor Ġdiscussion . Ċ Ġ*/ Ċ data Ġclass ĠMessage F cm Message ( ĊĠĠĠ Ġval Ġidentity : ĠIdentity , ĊĠĠĠ Ġval Ġsender : ĠSender , ĊĠĠĠ Ġval Ġz ulip MessageId : ĠInt , ĊĠĠĠ Ġval Ġrecipient : ĠRe cipient , ĊĠĠĠ Ġval Ġcontent : ĠString , ĊĠĠĠ Ġval Ġtime Ms : ĠLong Ċ ) Ġ: ĠF cm Message () Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAll Ġthe Ġdata Ġour ĠReact Ġcode Ġneeds Ġon Ġopening Ġthe Ġnotification . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFor Ġthe Ġcorresponding Ġtype Ġdefinition Ġon Ġthe ĠJS Ġside , Ġsee Ġ` Notification ` ĊĠĠĠĠ Ġ* Ġin Ġ` src / notification / types . js `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdata For Open (): ĠBundle Ġ= ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠNOTE : ĠKeep Ġthe ĠJS - side Ġtype Ġdefinition Ġin Ġsync Ġwith Ġthis Ġcode . ĊĠĠĠĠĠĠĠ Ġidentity . realm Uri . let Ġ{ Ġput String (" realm _ uri ", Ġit . toString ()) Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( recipient ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRe cipient . Stream Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String (" recipient _ type ", Ġ" stream ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String (" stream ", Ġrecipient . stream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String (" topic ", Ġrecipient . topic ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRe cipient . Group Pm Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String (" recipient _ type ", Ġ" private ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String (" pm _ users ", Ġrecipient . get Pm Users String ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRe cipient . Pm Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String (" recipient _ type ", Ġ" private ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String (" sender _ email ", Ġsender . email ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfrom F cm Data ( data : ĠMap < String , ĠString >): ĠMessage F cm Message Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecipient Type Ġ= Ġdata . require (" recipient _ type ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecipient Ġ= Ġwhen Ġ( recipient Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" stream " Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRe cipient . Stream ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . require (" stream "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . require (" topic ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" private " Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [" pm _ users "] ?. parse Comma Separ ated Ints (" pm _ users ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRe cipient . Group Pm ( it . toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠRe cipient . Pm ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠF cm Message ParseException (" unexpected Ġrecipient _ type : Ġ$ recipient Type ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġavatar URL Ġ= Ġdata . require (" sender _ avatar _ url "). parse Url (" sender _ avatar _ url ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMessage F cm Message ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentity Ġ= Ġextract Identity ( data ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsender Ġ= ĠSender ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġdata . require (" sender _ id "). parseInt (" sender _ id "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemail Ġ= Ġdata . require (" sender _ email "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavatar URL Ġ= Ġavatar URL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfullName Ġ= Ġdata . require (" sender _ full _ name ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġz ulip MessageId Ġ= Ġdata . require (" z ulip _ message _ id "). parseInt (" z ulip _ message _ id "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipient Ġ= Ġrecipient , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġdata . require (" content "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ms Ġ= Ġdata . require (" time "). parse Long (" time ") Ġ* Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠRemove F cm Message ( ĊĠĠĠ Ġval Ġidentity : ĠIdentity , ĊĠĠĠ Ġval Ġmessage Ids : ĠSet < Int > Ċ ) Ġ: ĠF cm Message () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfrom F cm Data ( data : ĠMap < String , ĠString >): ĠRemove F cm Message Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ids Ġ= ĠHashSet < Int >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [" z ulip _ message _ id "] ?. parseInt (" z ulip _ message _ id ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ids . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [" z ulip _ message _ ids "] ?. parse Comma Separ ated Ints (" z ulip _ message _ ids ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ids . addAll ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRemove F cm Message ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentity Ġ= Ġextract Identity ( data ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ids Ġ= Ġmessage Ids ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġextract Identity ( data : ĠMap < String , ĠString >): ĠIdentity Ġ= ĊĠĠĠ ĠIdentity ( ĊĠĠĠĠĠĠĠ Ġserver Host Ġ= Ġdata . require (" server "), ĊĠĠĠĠĠĠĠ Ġrealm Id Ġ= Ġdata . require (" realm _ id "). parseInt (" realm _ id "), ĊĠĠĠĠĠĠĠ Ġrealm Uri Ġ= Ġdata . require (" realm _ uri "). parse Url (" realm _ uri "), ĊĊĠĠĠĠĠĠĠ Ġ// ĠServer Ġversions Ġfrom Ġ 1 . 6 . 0 Ġthrough Ġ 2 . 0 . 0 Ġ( and Ġpossibly Ġearlier ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġlater ) Ġsend Ġthe Ġuser 's Ġemail Ġaddress , Ġas Ġ` user `. Ġ ĠWe Ġ* could * ĊĠĠĠĠĠĠĠ Ġ// Ġuse Ġthis Ġas Ġa Ġsubstitute Ġfor Ġ` user _ id ` Ġwhen Ġthat 's Ġmissing ... ĊĠĠĠĠĠĠĠ Ġ// Ġbut Ġit 'd Ġbe Ġin her ently Ġbug gy , Ġand Ġthe Ġbug Ġit 'd Ġintroduce Ġseems ĊĠĠĠĠĠĠĠ Ġ// Ġlikely Ġto Ġaffect Ġmore Ġusers Ġthan Ġthe Ġbug Ġit 'd Ġfix . Ġ ĠSo Ġjust Ġignore . ĊĠĠĠĠĠĠĠ Ġ// ĠTODO ( server - 2 . 0 ): ĠDelete Ġthis Ġcomment . ĊĠĠĠĠĠĠĠ Ġ// Ġ( data [" user "] Ġignored ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ` user _ id ` Ġwas Ġadded Ġin Ġserver Ġversion Ġ 2 . 1 . 0 Ġ( released Ġ 2 0 1 9 - 1 2 - 1 2 ; ĊĠĠĠĠĠĠĠ Ġ// Ġcommit Ġ 4 4 7 a 5 1 7 e 6 , ĠPR Ġ# 1 2 1 7 2 .) ĊĠĠĠĠĠĠĠ Ġ// ĠTODO ( server - 2 . 1 ): ĠRequire Ġthis . ĊĠĠĠĠĠĠĠ ĠuserId Ġ= Ġdata [" user _ id "] ?. parseInt (" user _ id ") ĊĠĠĠ Ġ) Ċ Ċ private Ġfun ĠMap < String , ĠString >. require ( key : ĠString ): ĠString Ġ= ĊĠĠĠ Ġthis [ key ] Ġ?: Ġthrow ĠF cm Message ParseException (" missing Ġexpected Ġfield : Ġ$ key ") Ċ Ċ private Ġfun ĠString . parseInt ( loc : ĠString ): ĠInt Ġ= Ġtry Ġ{ ĊĠĠĠ ĠInteger . parseInt ( this ) Ċ } Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠ Ġthrow ĠF cm Message ParseException (" invalid Ġint Ġat Ġ$ loc : Ġ$ this ") Ċ } Ċ Ċ private Ġfun ĠString . parse Long ( loc : ĠString ): ĠLong Ġ= Ġtry Ġ{ ĊĠĠĠ Ġto Long () Ċ } Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠ Ġthrow ĠF cm Message ParseException (" invalid Ġlong Ġat Ġ$ loc : Ġ$ this ") Ċ } Ċ Ċ private Ġfun ĠString . parse Url ( loc : ĠString ): ĠURL Ġ= Ġtry Ġ{ ĊĠĠĠ ĠURL ( this ) Ċ } Ġcatch Ġ( e : ĠMal formed URLException ) Ġ{ ĊĠĠĠ Ġthrow ĠF cm Message ParseException (" invalid ĠURL Ġat Ġ$ loc : Ġ$ this ") Ċ } Ċ Ċ private Ġfun ĠString . parse Comma Separ ated Ints ( loc : ĠString ): ĠSequence < Int > Ġ= ĊĠĠĠ Ġsplit To Sequence ("," ). map Ġ{ Ġit . parseInt ( loc ) Ġ} Ċ Ċ class ĠF cm Message ParseException ( errorMessage : ĠString ) Ġ: ĠRuntimeException ( errorMessage ) Ċ