From d03581fea86aef5fc59fc338ffd67d42bc0bba4b Mon Sep 17 00:00:00 2001 From: Andrew Welker Date: Thu, 22 Dec 2022 08:54:24 -0700 Subject: [PATCH] fix: change contact message handling On some occasions when the Zoom Room restarted and Essentials did not, the directory could be requested while the Zoom Room had no contacts yet, as it hadn't received them from Zoom Cloud. This caused the directory to be empty, even though there may be valid contacts. Now, Essentials uses the Added Contact and Updated Contact methods to fire the directory changed event, allowing for directory updates to be propogated as necessary. --- .../VideoCodec/ZoomRoom/ZoomRoom.cs | 71 ++++++++++++------- 1 file changed, 45 insertions(+), 26 deletions(-) diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoom.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoom.cs index b5eba9c5..1a70b2af 100644 --- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoom.cs +++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoom.cs @@ -59,6 +59,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom private CameraBase _selectedCamera; private string _lastDialedMeetingNumber; + private CTimer contactsDebounceTimer; + private readonly ZoomRoomPropertiesConfig _props; @@ -1511,36 +1513,37 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom { case "phonebook": { + zStatus.Contact contact = new zStatus.Contact(); + if (responseObj["Updated Contact"] != null) - { - var updatedContact = - JsonConvert.DeserializeObject( - responseObj["Updated Contact"].ToString()); - - var existingContact = - Status.Phonebook.Contacts.FirstOrDefault(c => c.Jid.Equals(updatedContact.Jid)); - - if (existingContact != null) - { - // Update existing contact - JsonConvert.PopulateObject(responseObj["Updated Contact"].ToString(), - existingContact); - } + { + contact = responseObj["Updated Contact"].ToObject(); } else if (responseObj["Added Contact"] != null) { - var jToken = responseObj["Updated Contact"]; - if (jToken != null) - { - var newContact = - JsonConvert.DeserializeObject( - jToken.ToString()); - - // Add a new contact - Status.Phonebook.Contacts.Add(newContact); - } + contact = responseObj["Added Contact"].ToObject(); } + var existingContactIndex = Status.Phonebook.Contacts.FindIndex(c => c.Jid.Equals(contact.Jid)); + + if (existingContactIndex > 0) + { + Status.Phonebook.Contacts[existingContactIndex] = contact; + } + else + { + Status.Phonebook.Contacts.Add(contact); + } + + if(contactsDebounceTimer == null) + { + contactsDebounceTimer = new CTimer(o => UpdateDirectory(), 2000); + } + else + { + contactsDebounceTimer.Reset(); + } + break; } case "bookingslistresult": @@ -2239,8 +2242,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom private void UpdateDirectory() { - var directoryResults = - zStatus.Phonebook.ConvertZoomContactsToGeneric(Status.Phonebook.Contacts); + Debug.Console(2, this, "Updating directory"); + var directoryResults = zStatus.Phonebook.ConvertZoomContactsToGeneric(Status.Phonebook.Contacts); if (!PhonebookSyncState.InitialSyncComplete) { @@ -2255,6 +2258,22 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom DirectoryRoot = directoryResults; CurrentDirectoryResult = directoryResults; + + // + if (contactsDebounceTimer != null) + { + ClearContactDebounceTimer(); + } + } + + private void ClearContactDebounceTimer() + { + Debug.Console(2, this, "Clearing Timer"); + if (!contactsDebounceTimer.Disposed && contactsDebounceTimer != null) + { + contactsDebounceTimer.Dispose(); + contactsDebounceTimer = null; + } } ///