fix(essentials): Updates to resolve oddities with ZoomRoom directory browsing and dialing

This commit is contained in:
Neil Dorin
2021-08-13 13:45:46 -06:00
parent 2a37e44d7d
commit 87ab43c745
4 changed files with 136 additions and 53 deletions

View File

@@ -1080,10 +1080,12 @@ namespace PepperDash.Essentials.UIDrivers.VC
{ {
var codec = Codec as IHasDirectory; var codec = Codec as IHasDirectory;
SetCurrentDirectoryToRoot(); if (codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue)
{
SetCurrentDirectoryToRoot();
RefreshDirectory(); RefreshDirectory();
}
} }
/// <summary> /// <summary>
@@ -1161,10 +1163,23 @@ namespace PepperDash.Essentials.UIDrivers.VC
}); });
} }
else if (dc.ContactMethods.Count == 1)
{
var invitableContact = dc as IInvitableContact;
if (invitableContact != null)
{
DirectoryList.SetItemButtonAction(i, b => { if (!b) Codec.Dial(invitableContact); });
}
else
{
// If only one contact method, just dial that method
DirectoryList.SetItemButtonAction(i, b => { if (!b) Codec.Dial(dc.ContactMethods[0].Number); });
}
}
else else
{ {
// If only one contact method, just dial that method Debug.Console(1, "Unable to dial contact. No availble ContactMethod(s) specified");
DirectoryList.SetItemButtonAction(i, b => { if (!b) Codec.Dial(dc.ContactMethods[0].Number); });
} }
} }
else // is DirectoryFolder else // is DirectoryFolder

View File

@@ -69,6 +69,22 @@ namespace PepperDash.Essentials.Devices.Common.Codec
[JsonProperty("directoryResults")] [JsonProperty("directoryResults")]
public List<DirectoryItem> CurrentDirectoryResults { get; private set; } public List<DirectoryItem> CurrentDirectoryResults { get; private set; }
public List<DirectoryItem> Contacts
{
get
{
return CurrentDirectoryResults.OfType<DirectoryContact>().Cast<DirectoryItem>().ToList();
}
}
public List<DirectoryItem> Folders
{
get
{
return CurrentDirectoryResults.OfType<DirectoryFolder>().Cast<DirectoryItem>().ToList();
}
}
/// <summary> /// <summary>
/// Used to store the ID of the current folder for CurrentDirectoryResults /// Used to store the ID of the current folder for CurrentDirectoryResults
/// </summary> /// </summary>
@@ -104,6 +120,15 @@ namespace PepperDash.Essentials.Devices.Common.Codec
SortDirectory(); SortDirectory();
} }
/// <summary>
/// Filters the CurrentDirectoryResults by the predicate
/// </summary>
/// <param name="predicate"></param>
public void FilterContacts(Func<DirectoryItem, bool> predicate)
{
CurrentDirectoryResults = CurrentDirectoryResults.Where(predicate).ToList();
}
/// <summary> /// <summary>
/// Sorts the DirectoryResults list to display all folders alphabetically, then all contacts alphabetically /// Sorts the DirectoryResults list to display all folders alphabetically, then all contacts alphabetically
/// </summary> /// </summary>

View File

@@ -276,6 +276,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
if (zoomRooms.Count > 0) if (zoomRooms.Count > 0)
{ {
// If so, setup a rooms and contacts folder and add them. // If so, setup a rooms and contacts folder and add them.
directory.ResultsFolderId = "root";
roomFolder.Name = "Rooms"; roomFolder.Name = "Rooms";
roomFolder.ParentFolderId = "root"; roomFolder.ParentFolderId = "root";
roomFolder.FolderId = "rooms"; roomFolder.FolderId = "rooms";
@@ -292,22 +295,26 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
try try
{ {
if (zoomContacts.Count == 0) return directory; if (zoomContacts.Count == 0)
{
return directory;
}
foreach (Contact c in zoomContacts)
{ {
foreach (Contact c in zoomContacts) var contact = new ZoomDirectoryContact { Name = c.ScreenName, ContactId = c.Jid };
contact.ContactMethods.Add(new ContactMethod() { Number = c.Jid, Device = eContactMethodDevice.Video, CallType = eContactMethodCallType.Video, ContactMethodId = c.Jid });
if (folders.Count > 0)
{ {
var contact = new ZoomDirectoryContact { Name = c.ScreenName, ContactId = c.Jid }; contact.ParentFolderId = c.IsZoomRoom ? "rooms" : "contacts";
if (folders.Count > 0)
{
contact.ParentFolderId = c.IsZoomRoom ? "rooms" : "contacts";
}
contacts.Add(contact);
} }
directory.AddContactsToDirectory(contacts); contacts.Add(contact);
} }
directory.AddContactsToDirectory(contacts);
} }
catch (Exception e) catch (Exception e)
{ {

View File

@@ -361,6 +361,16 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
public CodecDirectory CurrentDirectoryResult public CodecDirectory CurrentDirectoryResult
{ {
get { return _currentDirectoryResult; } get { return _currentDirectoryResult; }
private set
{
_currentDirectoryResult = value;
Debug.Console(2, this, "CurrentDirectoryResult Updated. ResultsFolderId: {0}", _currentDirectoryResult.ResultsFolderId);
CurrentDirectoryResultIsNotDirectoryRoot.FireUpdate();
OnDirectoryResultReturned(_currentDirectoryResult);
}
} }
public CodecPhonebookSyncState PhonebookSyncState { get; private set; } public CodecPhonebookSyncState PhonebookSyncState { get; private set; }
@@ -374,9 +384,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
c => c.Name.IndexOf(searchString, 0, StringComparison.OrdinalIgnoreCase) > -1)); c => c.Name.IndexOf(searchString, 0, StringComparison.OrdinalIgnoreCase) > -1));
DirectoryBrowseHistoryStack.Clear(); DirectoryBrowseHistoryStack.Clear();
_currentDirectoryResult = directoryResults; CurrentDirectoryResult = directoryResults;
OnDirectoryResultReturned(directoryResults);
} }
public void GetDirectoryFolderContents(string folderId) public void GetDirectoryFolderContents(string folderId)
@@ -388,19 +397,16 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
DirectoryBrowseHistoryStack.Push(_currentDirectoryResult); DirectoryBrowseHistoryStack.Push(_currentDirectoryResult);
_currentDirectoryResult = directoryResults; CurrentDirectoryResult = directoryResults;
OnDirectoryResultReturned(directoryResults);
} }
public void SetCurrentDirectoryToRoot() public void SetCurrentDirectoryToRoot()
{ {
DirectoryBrowseHistoryStack.Clear(); DirectoryBrowseHistoryStack.Clear();
_currentDirectoryResult = DirectoryRoot; CurrentDirectoryResult = DirectoryRoot;
}
OnDirectoryResultReturned(DirectoryRoot);
}
public void GetDirectoryParentFolderContents() public void GetDirectoryParentFolderContents()
{ {
@@ -411,10 +417,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
var currentDirectory = DirectoryBrowseHistoryStack.Pop(); var currentDirectory = DirectoryBrowseHistoryStack.Pop();
_currentDirectoryResult = currentDirectory; CurrentDirectoryResult = currentDirectory;
}
OnDirectoryResultReturned(currentDirectory);
}
public BoolFeedback CurrentDirectoryResultIsNotDirectoryRoot { get; private set; } public BoolFeedback CurrentDirectoryResultIsNotDirectoryRoot { get; private set; }
@@ -680,16 +684,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
private void SetUpDirectory() private void SetUpDirectory()
{ {
DirectoryRoot = new CodecDirectory(); DirectoryRoot = new CodecDirectory() { ResultsFolderId = "root" };
_currentDirectoryResult = DirectoryRoot; CurrentDirectoryResultIsNotDirectoryRoot = new BoolFeedback(() => CurrentDirectoryResult.ResultsFolderId != "root");
CurrentDirectoryResult = DirectoryRoot;
DirectoryBrowseHistory = new List<CodecDirectory>(); DirectoryBrowseHistory = new List<CodecDirectory>();
DirectoryBrowseHistoryStack = new Stack<CodecDirectory>(); DirectoryBrowseHistoryStack = new Stack<CodecDirectory>();
CurrentDirectoryResultIsNotDirectoryRoot = new BoolFeedback(() => _currentDirectoryResult != DirectoryRoot);
CurrentDirectoryResultIsNotDirectoryRoot.FireUpdate();
} }
private void SetUpRouting() private void SetUpRouting()
@@ -1054,24 +1057,30 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
} }
case "phonebooklistresult": case "phonebooklistresult":
{ {
// This result will always be the complete contents of the directory and never
// A subset of the results via a search
JsonConvert.PopulateObject(responseObj.ToString(), Status.Phonebook); JsonConvert.PopulateObject(responseObj.ToString(), Status.Phonebook);
var directoryResults =
zStatus.Phonebook.ConvertZoomContactsToGeneric(Status.Phonebook.Contacts);
if (!PhonebookSyncState.InitialSyncComplete) if (!PhonebookSyncState.InitialSyncComplete)
{ {
PhonebookSyncState.InitialPhonebookFoldersReceived(); PhonebookSyncState.InitialPhonebookFoldersReceived();
PhonebookSyncState.PhonebookRootEntriesReceived(); PhonebookSyncState.PhonebookRootEntriesReceived();
PhonebookSyncState.SetPhonebookHasFolders(false); PhonebookSyncState.SetPhonebookHasFolders(true);
PhonebookSyncState.SetNumberOfContacts(Status.Phonebook.Contacts.Count); PhonebookSyncState.SetNumberOfContacts(Status.Phonebook.Contacts.Count);
} }
var directoryResults = if (directoryResults.ResultsFolderId != "root")
zStatus.Phonebook.ConvertZoomContactsToGeneric(Status.Phonebook.Contacts); {
directoryResults.ResultsFolderId = "root";
}
DirectoryRoot = directoryResults; DirectoryRoot = directoryResults;
_currentDirectoryResult = DirectoryRoot; CurrentDirectoryResult = directoryResults;
OnDirectoryResultReturned(directoryResults);
break; break;
} }
@@ -1227,7 +1236,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
{ {
Direction = eCodecCallDirection.Incoming, Direction = eCodecCallDirection.Incoming,
Status = eCodecCallStatus.Ringing, Status = eCodecCallStatus.Ringing,
Type = eCodecCallType.Unknown, Type = eCodecCallType.Video,
Name = incomingCall.callerName, Name = incomingCall.callerName,
Id = incomingCall.callerJID Id = incomingCall.callerJID
}; };
@@ -1580,8 +1589,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
var newCall = new CodecActiveCallItem var newCall = new CodecActiveCallItem
{ {
Name = Status.Call.Info.meeting_list_item.meetingName, Name = Status.Call.Info.meeting_list_item.meetingName,
Number = Status.Call.Info.meeting_id,
Id = Status.Call.Info.meeting_id, Id = Status.Call.Info.meeting_id,
Status = newStatus Status = newStatus,
Type = eCodecCallType.Video,
}; };
ActiveCalls.Add(newCall); ActiveCalls.Add(newCall);
@@ -1999,18 +2010,43 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
/// <param name="result"></param> /// <param name="result"></param>
private void OnDirectoryResultReturned(CodecDirectory result) private void OnDirectoryResultReturned(CodecDirectory result)
{ {
CurrentDirectoryResultIsNotDirectoryRoot.FireUpdate(); try
{
Debug.Console(2, this, "OnDirectoryResultReturned");
// This will return the latest results to all UIs. Multiple indendent UI Directory browsing will require a different methodology var directoryResult = new CodecDirectory();
var handler = DirectoryResultReturned;
if (handler != null) // If result is Root, create a copy and filter out contacts whose parent folder is not root
{ if (!CurrentDirectoryResultIsNotDirectoryRoot.BoolValue)
handler(this, new DirectoryEventArgs {
{ Debug.Console(2, this, "Filtering DirectoryRoot to remove contacts for display");
Directory = result,
DirectoryIsOnRoot = !CurrentDirectoryResultIsNotDirectoryRoot.BoolValue directoryResult.ResultsFolderId = result.ResultsFolderId;
}); directoryResult.AddFoldersToDirectory(result.Folders);
} directoryResult.AddContactsToDirectory(result.Contacts.Where((c) => c.ParentFolderId == result.ResultsFolderId).ToList());
}
else
{
directoryResult = result;
}
Debug.Console(2, this, "Updating directoryResult. IsOnRoot: {0}", !CurrentDirectoryResultIsNotDirectoryRoot.BoolValue);
// This will return the latest results to all UIs. Multiple indendent UI Directory browsing will require a different methodology
var handler = DirectoryResultReturned;
if (handler != null)
{
handler(this, new DirectoryEventArgs
{
Directory = directoryResult,
DirectoryIsOnRoot = !CurrentDirectoryResultIsNotDirectoryRoot.BoolValue
});
}
}
catch (Exception e)
{
Debug.Console(2, this, "Error: {0}", e);
}
//PrintDirectory(result); //PrintDirectory(result);
} }